[Mesa-dev] [PATCH 2/2] glsl: error out on ES 3.1 if VS or FS present but not both

Tapani Pälli tapani.palli at intel.com
Thu Sep 3 23:20:34 PDT 2015



On 09/03/2015 09:54 PM, Ilia Mirkin wrote:
> On Thu, Sep 3, 2015 at 7:58 AM, Tapani Pälli <tapani.palli at intel.com> wrote:
>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>> ---
>>   src/glsl/linker.cpp | 31 +++++++++++++++++++++++++++----
>>   1 file changed, 27 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index bc76af6..2be5660 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -3890,10 +3890,33 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
>>       * behavior specified in GLSL specification.
>>       */
>>      if (!prog->SeparateShader && ctx->API == API_OPENGLES2) {
>> -      if (prog->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
>> -        linker_error(prog, "program lacks a vertex shader\n");
>> -      } else if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) {
>> -        linker_error(prog, "program lacks a fragment shader\n");
>> +      /* With ES < 3.1 one needs to have always vertex + fragment shader. */
>> +      if (ctx->Version < 31) {
>> +         if (prog->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
>> +           linker_error(prog, "program lacks a vertex shader\n");
>> +         } else if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) {
>> +           linker_error(prog, "program lacks a fragment shader\n");
>> +         }
>> +      } else {
>> +         /* From OpenGL ES 3.1 specification (7.3 Program Objects):
>> +          *     "Linking can fail for a variety of reasons as specified in the
>> +          *     OpenGL ES Shading Language Specification, as well as any of the
>> +          *     following reasons:
>> +          *
>> +          *     ...
>> +          *
>> +          *     * program contains objects to form either a vertex shader or
>> +          *       fragment shader, and program is not separable, and does not
>> +          *       contain objects to form both a vertex shader and fragment
>> +          *       shader."
>> +          */
>> +         if ((prog->_LinkedShaders[MESA_SHADER_VERTEX] ||
>> +             prog->_LinkedShaders[MESA_SHADER_FRAGMENT]) &&
>
> indentation appears to be off-by-1 here and below (prog's should line
> up). Otherwise this is
>
> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
>
> Another quick way to do this is, btw,
>
> !!vertex ^ !!fragment
>
> Which will be 1 iff only one of them is set.

True, will make it more compact. I'll change it, thanks for the review!

>> +             (!prog->_LinkedShaders[MESA_SHADER_VERTEX] ||
>> +             !prog->_LinkedShaders[MESA_SHADER_FRAGMENT])) {
>> +            linker_error(prog, "Program needs to contain both vertex and fragment "
>> +                         "shaders.\n");
>> +         }
>>         }
>>      }
>>
>> --
>> 2.4.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list