[Mesa-dev] [PATCH 11/25] radeonsi: first bits for non-monolithic shaders

Nicolai Hähnle nhaehnle at gmail.com
Tue Feb 16 17:04:33 UTC 2016


On 16.02.2016 11:39, Marek Olšák wrote:
> On Tue, Feb 16, 2016 at 5:01 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_pipe.c   |  1 +
>>>    src/gallium/drivers/radeonsi/si_pipe.h   |  3 ++
>>>    src/gallium/drivers/radeonsi/si_shader.c | 53
>>> ++++++++++++++++++++++++--------
>>>    src/gallium/drivers/radeonsi/si_shader.h |  2 +-
>>>    4 files changed, 45 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c
>>> b/src/gallium/drivers/radeonsi/si_pipe.c
>>> index fa60732..448fe88 100644
>>> --- a/src/gallium/drivers/radeonsi/si_pipe.c
>>> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
>>> @@ -600,6 +600,7 @@ struct pipe_screen *radeonsi_screen_create(struct
>>> radeon_winsys *ws)
>>>
>>>          sscreen->b.has_cp_dma = true;
>>>          sscreen->b.has_streamout = true;
>>> +       sscreen->use_monolithic_shaders = true;
>>>
>>>          if (debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE))
>>>                  sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS |
>>> DBG_PS | DBG_CS;
>>> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h
>>> b/src/gallium/drivers/radeonsi/si_pipe.h
>>> index b5790d6..2a2455c 100644
>>> --- a/src/gallium/drivers/radeonsi/si_pipe.h
>>> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
>>> @@ -84,6 +84,9 @@ struct si_compute;
>>>    struct si_screen {
>>>          struct r600_common_screen       b;
>>>          unsigned                        gs_table_depth;
>>> +
>>> +       /* Whether shaders are monolithic (1-part) or separate (3-part).
>>> */
>>> +       bool                            use_monolithic_shaders;
>>>    };
>>>
>>>    struct si_blend_color {
>>> diff --git a/src/gallium/drivers/radeonsi/si_shader.c
>>> b/src/gallium/drivers/radeonsi/si_shader.c
>>> index b058019..b74ed1e 100644
>>> --- a/src/gallium/drivers/radeonsi/si_shader.c
>>> +++ b/src/gallium/drivers/radeonsi/si_shader.c
>>> @@ -70,6 +70,12 @@ struct si_shader_context
>>>
>>>          unsigned type; /* TGSI_PROCESSOR_* specifies the type of shader.
>>> */
>>>          bool is_gs_copy_shader;
>>> +
>>> +       /* Whether to generate the optimized shader variant compiled as a
>>> whole
>>> +        * (without a prolog and epilog)
>>> +        */
>>> +       bool is_monolithic;
>>> +
>>>          int param_streamout_config;
>>>          int param_streamout_write_index;
>>>          int param_streamout_offset[4];
>>> @@ -3657,8 +3663,10 @@ static void create_function(struct
>>> si_shader_context *ctx)
>>>          struct lp_build_tgsi_context *bld_base =
>>> &ctx->radeon_bld.soa.bld_base;
>>>          struct gallivm_state *gallivm = bld_base->base.gallivm;
>>>          struct si_shader *shader = ctx->shader;
>>> -       LLVMTypeRef params[SI_NUM_PARAMS], v2i32, v3i32;
>>> +       LLVMTypeRef params[SI_NUM_PARAMS + SI_NUM_VERTEX_BUFFERS], v2i32,
>>> v3i32;
>>> +       LLVMTypeRef returns[16+32*4];
>>
>>
>> This is a bit of a magic number, I guess something like max parameters plus
>> attributes. Can you replace it by the appropriate defines?
>
> There is not a single definition that would express this clearly.
>
> The prolog has to return up to 16 input SGPRs and 4-20 input VGPRs.
> Additionally, the prolog returns other data in VGPRs. That's up to
> 4+16 VGPRs (16 vertex load addresses) for the VS and 20+8 VGPRs (2
> vec4 colors) for the PS. The PS epilog returns one SGPR (but in s10 or
> so, so we need to allocate 11) and 9*4 VGPRs at most. This all can
> change in the future, who knows.
>
> 16+32*4 is much more than we'll ever need, but it shouldn't overflow
> at least. Assertions also check if we don't overflow.

Hmm, I see. I guess I can live with it, as well as with the casts in 
patch 14.

Nicolai

> Marek
>


More information about the mesa-dev mailing list