<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<div id="compose" contenteditable="true" style="padding-left: 16px; padding-right: 16px; padding-bottom: 8px;">
<div>I don't like adding explicit IR arguments for ABI arguments, especially this one. Adding a special case for the first index feels dirty. The rest of llvm also won't be aware of the specialness of the argument. It would be problematic because bugpoint would
 eliminate the unused argument and then codegen would have to fail in some way when the argument is missing<br>
<div class="acompli_signature"></div>
<br>
</div>
</div>
<div class="gmail_quote">_____________________________<br>
From: Nicolai Hähnle <<a dir="ltr" href="mailto:nhaehnle@gmail.com" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="0">nhaehnle@gmail.com</a>><br>
Sent: Monday, October 10, 2016 16:07<br>
Subject: Re: [Mesa-dev] [PATCH 2/2] [RFC] radv: add scratch support for spilling.<br>
To: Arsenault, Matthew <<a dir="ltr" href="mailto:matthew.arsenault@amd.com" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="2">matthew.arsenault@amd.com</a>>, Dave Airlie <<a dir="ltr" href="mailto:airlied@gmail.com" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="3">airlied@gmail.com</a>>,
 <<a dir="ltr" href="mailto:mesa-dev@lists.freedesktop.org" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="4">mesa-dev@lists.freedesktop.org</a>><br>
<br>
<br>
On 10.10.2016 05:45, Dave Airlie wrote:<br>
> On 10 October 2016 at 13:25, Dave Airlie <<a dir="ltr" href="mailto:airlied@gmail.com" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="6">airlied@gmail.com</a>> wrote:<br>
>> From: Dave Airlie <<a dir="ltr" href="mailto:airlied@redhat.com" x-apple-data-detectors="true" x-apple-data-detectors-type="link" x-apple-data-detectors-result="7">airlied@redhat.com</a>><br>
>><br>
>> This is a bit of a hack due to how llvm currently handles<br>
>> spilling in it's shader ABI. Currently llvm amdgpu backend<br>
>> uses relocations to patch the shader with the address of<br>
>> the tmpring. The driver loads the shader and patches the<br>
>> relocations.<br>
>><br>
>> However for vulkan this doesn't work so well for a few reasons<br>
>> a) when we build/load the shaders we aren't constructing the<br>
>> command stream yet, and the same shader could be using in multiple<br>
>> command streams.<br>
>><br>
>> b) multiple command execution engines for compute shaders.<br>
>><br>
>> So ideally we'd fix LLVM to understand the ABI convention, possibly<br>
>> we'd fix it so user sgpr 0,1 are used (this hack uses 10/11).<br>
>><br>
>> This patch when it gets the shader back from llvm it patches<br>
>> the relocation dword to a nop, and patches to previous mov command<br>
>> to move from SGPR 10 and 11. This works usually as it seems the<br>
>> SGPR loading of the spill stuff is at the start of shaders always<br>
>> so the 10/11 user sgprs haven't been trashed yet. I'm not 100%<br>
>> sure this will work all the time, but for now this should allow<br>
>> us to pass a bunch more CTS tests and make the Sascha computeshader<br>
>> demo to work.<br>
><br>
> So I found a shader that this doesn't work so well with unfortunately, so<br>
> while I'd like this as a temporary solution I probably need to start<br>
> digging into llvm.<br>
><br>
> My current plan is to add a flag to llvm to denote ability to spill to<br>
> the address<br>
> in userdata sgpr 0/1, have llvm preload those and use them instead.<br>
><br>
> Now the other question I have is, should I be killing two user data sgprs for<br>
> this purpose, or should we define a better ABI, so that the first descriptor<br>
> in the buffer pointed to by these is the scratch buffer, and other things<br>
> could be queued after it, (like push constants and dynamic descriptor).<br>
><br>
> Bas, nha? not sure if Matt is on this list.<br>
<br>
Getting rid of the relocations would be nice for OpenGL as well. It <br>
always feels like a bit of a hack.<br>
<br>
For OpenGL, it's important that non-monolithic shaders work. In <br>
practice, this means that it must be possible to pass the scratch buffer <br>
pointer through the prolog shader into the main part.<br>
<br>
It seems to me the simplest way to ensure this is to add an explicit <br>
function argument. Something like:<br>
<br>
define amdgpu_XX TYPE @prolog(i64 inreg %spillptr, ....) <br>
"amdgpu-spill-ptr"="0" {<br>
...<br>
%retval = insertvalue TYPE %prev, i64 %spillptr, 0<br>
ret TYPE %retval<br>
}<br>
<br>
amdgpu-spill-ptr would be a function attribute indicating which function <br>
argument (by position) holds the base pointer for spilling.<br>
<br>
I also think that loading the spill pointer indirectly makes a lot of <br>
sense. After all, user data is scarce and most shaders don't spill. This <br>
could easily fit in the function attribute scheme. Something like <br>
"amdgpu-spill-ptr=1:16" to indicate that the second function argument is <br>
a 64-bit pointer, and the spill pointer should be loaded from there with <br>
a 16 byte offset.<br>
<br>
FWIW, even with the indirect load, I think we should only load a 64-bit <br>
pointer instead of a full descriptor. This is because we should really <br>
set the size limit of the spill descriptor correctly to implement <br>
robustness semantics (this is relevant because the spill descriptor is <br>
also used for temporary arrays; not sure if Vulkan cares, but OpenGL <br>
definitely does).<br>
<br>
Cheers,<br>
Nicolai<br>
<br>
<br>
</div>
</body>
</html>