[Mesa-dev] [PATCH v2] glsl: add packed varyings to program resource list
Tapani Pälli
tapani.palli at intel.com
Fri Sep 11 00:09:15 PDT 2015
On 09/11/2015 09:32 AM, Ilia Mirkin wrote:
> On Fri, Sep 11, 2015 at 2:18 AM, Tapani Pälli <tapani.palli at intel.com> wrote:
>> On 09/11/2015 09:15 AM, Ilia Mirkin wrote:
>>>
>>> On Fri, Sep 11, 2015 at 2:12 AM, Tapani Pälli <tapani.palli at intel.com>
>>> wrote:
>>>>
>>>> This makes sure that user is still able to query properties about
>>>> variables that have gotten packed by lower_packed_varyings pass.
>>>>
>>>> Fixes following OpenGL ES 3.1 test:
>>>> ES31-CTS.program_interface_query.separate-programs-vertex
>>>>
>>>> v2: fix 'name included in packed list' check (Ilia Mirkin)
>>>>
>>>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>>>> ---
>>>> src/glsl/linker.cpp | 74
>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++---
>>>> 1 file changed, 70 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>>>> index 94f847e..d8afb26 100644
>>>> --- a/src/glsl/linker.cpp
>>>> +++ b/src/glsl/linker.cpp
>>>> @@ -3114,6 +3114,29 @@ add_program_resource(struct gl_shader_program
>>>> *prog, GLenum type,
>>>> return true;
>>>> }
>>>>
>>>> +/* Function checks if a variable var is a packed varying and
>>>> + * if given name is part of packed varying's list.
>>>> + *
>>>> + * If a variable is a packed varying, it has a name like
>>>> + * 'packed:a,b,c' where a, b and c are separate variables.
>>>> + */
>>>> +static bool
>>>> +included_in_packed_varying(ir_variable *var, const char *name)
>>>> +{
>>>> + if (strncmp(var->name, "packed:", 7) != 0)
>>>> + return false;
>>>> +
>>>> + const char *name_in_list = strstr(var->name, name);
>>>> + const char *head = name_in_list - 1;
>>>> + const char *tail = name_in_list + strlen(name);
>>>> +
>>>> + if (name_in_list &&
>>>> + (*head == ':' || *head == ',') &&
>>>> + (*tail == '\0' || *tail == ','))
>>>
>>>
>>> So... in the case "ab,b" and you search for 'b', it'll find 'ab' and
>>> reject it.
>>
>>
>> Huh, this seems more complex that I thought .. almost a case for proper
>> parser rather than a helper function.
>
> FWIW there's strtok_r(). BTW, make sure to skip the "packed:" bit of
> var->name. And be thankful that variable names can't contain commas in
> them :)
I could iterate over instances also using strstr but strtok_r seems
cleaner, only minus is that it requires strdup but this will happen only
with packed varyings so overall it is quite a corner case. Will send
strtok_r version.
// Tapani
More information about the mesa-dev
mailing list