On Sun, Mar 18, 2018 at 11:10 PM, Timothy Arceri <tarc...@itsqueeze.com>
wrote:

>
>
> On 28/02/18 03:45, Marek Olšák wrote:
>
>> On Mon, Feb 26, 2018 at 10:43 AM, Timothy Arceri <tarc...@itsqueeze.com>
>> wrote:
>>
>>> ---
>>>   src/compiler/shader_info.h                |  5 +++++
>>>   src/mesa/state_tracker/st_glsl_to_nir.cpp | 13 +++++++++++++
>>>   2 files changed, 18 insertions(+)
>>>
>>> diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
>>> index e7fd7dbe62..11a59ff6ac 100644
>>> --- a/src/compiler/shader_info.h
>>> +++ b/src/compiler/shader_info.h
>>> @@ -54,6 +54,11 @@ typedef struct shader_info {
>>>      /** The shader stage, such as MESA_SHADER_VERTEX. */
>>>      gl_shader_stage stage;
>>>
>>> +   /** The shader stage in a non SSO linked program that follows this
>>> stage,
>>> +     * such as MESA_SHADER_FRAGMENT.
>>> +     */
>>> +   gl_shader_stage next_stage;
>>> +
>>>      /* Number of textures used by this shader */
>>>      unsigned num_textures;
>>>      /* Number of uniform buffers used by this shader */
>>> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp
>>> b/src/mesa/state_tracker/st_glsl_to_nir.cpp
>>> index 765c827d93..914fd2e898 100644
>>> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
>>> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
>>> @@ -317,6 +317,19 @@ st_glsl_to_nir(struct st_context *st, struct
>>> gl_program *prog,
>>>
>>>      nir_shader *nir = glsl_to_nir(shader_program, stage, options);
>>>
>>> +   /* Set the next shader stage hint for VS and TES. */
>>> +   if (!nir->info.separate_shader &&
>>> +       (nir->info.stage == MESA_SHADER_VERTEX ||
>>> +        nir->info.stage == MESA_SHADER_TESS_EVAL)) {
>>> +
>>> +      unsigned prev_stages = (1 << (prog->info.stage + 1)) - 1;
>>> +      unsigned stages_mask =
>>> +         ~prev_stages & shader_program->data->linked_stages;
>>> +
>>> +      nir->info.next_stage = stages_mask ?
>>> +         (gl_shader_stage) u_bit_scan(&stages_mask) :
>>> MESA_SHADER_FRAGMENT;
>>>
>>
>> ffs would be better.
>>
>> Also, ureg sets ..._SHADER_FRAGMENT if st/mesa doesn't set anything
>> (e.g. it's a separate shader).
>>
>
> Yes the ureg function does that, which is what the "stages_mask ?" above
> does too. However separate shaders don't get set because
> ureg_set_next_shader_processor() won't get called for them.
>
>    /* Set the next shader stage hint for VS and TES. */
>    switch (procType) {
>    case PIPE_SHADER_VERTEX:
>    case PIPE_SHADER_TESS_EVAL:
>       if (program->shader_program->SeparateShader)
>          break;
>
>       for (i = program->shader->Stage+1; i <= MESA_SHADER_FRAGMENT; i++) {
>          if (program->shader_program->_LinkedShaders[i]) {
>             ureg_set_next_shader_processor(
>                   ureg, pipe_shader_type_from_mesa((gl_shader_stage)i));
>             break;
>          }
>       }
>       break;
>    }
>

Not here. See tgsi_ureg.c. It defaults to FRAGMENT.

Marek
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to