[Mesa-dev] [PATCH 09/25] radeonsi: add code for combining and uploading shaders from 3 shader parts

Marek Olšák maraeo at gmail.com
Tue Feb 16 16:10:01 UTC 2016


On Tue, Feb 16, 2016 at 4:53 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> On 15.02.2016 18:59, Marek Olšák wrote:
>>
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>   src/gallium/drivers/radeonsi/si_shader.c | 35
>> ++++++++++++++++++++++++--------
>>   src/gallium/drivers/radeonsi/si_shader.h |  9 ++++++++
>>   2 files changed, 36 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_shader.c
>> b/src/gallium/drivers/radeonsi/si_shader.c
>> index dbb9217..a6a0984 100644
>> --- a/src/gallium/drivers/radeonsi/si_shader.c
>> +++ b/src/gallium/drivers/radeonsi/si_shader.c
>> @@ -4036,26 +4036,45 @@ void si_shader_apply_scratch_relocs(struct
>> si_context *sctx,
>>
>>   int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader
>> *shader)
>>   {
>> -       const struct radeon_shader_binary *binary = &shader->binary;
>> -       unsigned code_size = binary->code_size + binary->rodata_size;
>> +       const struct radeon_shader_binary *prolog =
>> +               shader->prolog ? &shader->prolog->binary : NULL;
>> +       const struct radeon_shader_binary *epilog =
>> +               shader->epilog ? &shader->epilog->binary : NULL;
>> +       const struct radeon_shader_binary *mainb = &shader->binary;
>> +       unsigned bo_size =
>> +               (prolog ? prolog->code_size : 0) +
>> +               mainb->code_size +
>> +               (epilog ? epilog->code_size : mainb->rodata_size);
>>         unsigned char *ptr;
>>
>> +       assert(!prolog || !prolog->rodata_size);
>> +       assert((!prolog && !epilog) || !mainb->rodata_size);
>> +       assert(!epilog || !epilog->rodata_size);
>
>
> Strictly speaking it should be possible for main to have rodata if there is
> a prolog but no epilog, right? In any case, patches 1-9 are

Yes. The thing is, the epilog is always present and can't be removed.
If it's empty, it must contain s_endpgm at least.

On the other hand, empty prologs aren't even compiled and
shader->prolog is NULL in that case.

We could support rodata for main if the compiler reserved some free
space for the epilog between the code and rodata.

Marek


More information about the mesa-dev mailing list