[Mesa-dev] [PATCH 2/7] mesa: add compressed_tex_sub_image() helper

Nicolai Hähnle nhaehnle at gmail.com
Tue May 16 13:39:54 UTC 2017


On 16.05.2017 04:19, Timothy Arceri wrote:
>
>
> On 16/05/17 00:12, Nicolai Hähnle wrote:
>> On 12.05.2017 06:12, Timothy Arceri wrote:
>>> This reduces duplication between the dsa and non-dsa function
>>> and will also be used in the following commit to add
>>> KHR_no_error support.
>>> ---
>>>  src/mesa/main/teximage.c | 82
>>> ++++++++++++++++++++++--------------------------
>>>  1 file changed, 38 insertions(+), 44 deletions(-)
>>>
>>> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
>>> index 2486704..c95e9e2 100644
>>> --- a/src/mesa/main/teximage.c
>>> +++ b/src/mesa/main/teximage.c
>>> @@ -4522,89 +4522,83 @@ compressed_texture_sub_image(struct
>>> gl_context *ctx, GLuint dims,
>>>
>>>           /* NOTE: Don't signal _NEW_TEXTURE_OBJECT since we've only
>>> changed
>>>            * the texel data, not the texture format, size, etc.
>>>            */
>>>        }
>>>     }
>>>     _mesa_unlock_texture(ctx, texObj);
>>>  }
>>>
>>>
>>> -void GLAPIENTRY
>>> -_mesa_CompressedTexSubImage1D(GLenum target, GLint level, GLint
>>> xoffset,
>>> -                              GLsizei width, GLenum format,
>>> -                              GLsizei imageSize, const GLvoid *data)
>>> +static ALWAYS_INLINE void
>>> +compressed_tex_sub_image(unsigned dim, GLenum target, GLuint texture,
>>> +                         GLint level, GLint xoffset, GLsizei width,
>>> +                         GLenum format, GLsizei imageSize, const
>>> GLvoid *data,
>>> +                         bool dsa, const char *caller)
>>>  {
>>>     struct gl_texture_object *texObj;
>>>     struct gl_texture_image *texImage;
>>>
>>>     GET_CURRENT_CONTEXT(ctx);
>>>
>>> -   if (compressed_subtexture_target_check(ctx, target, 1, format,
>>> false,
>>> -
>>> "glCompressedTexSubImage1D")) {
>>> -      return;
>>> +   if (dsa) {
>>> +      texObj = _mesa_lookup_texture_err(ctx, texture, caller);
>>> +      if (!texObj)
>>> +         return;
>>> +
>>> +      target = texObj->Target;
>>>     }
>>>
>>> -   texObj = _mesa_get_current_tex_object(ctx, target);
>>> -   if (!texObj)
>>> +   if (compressed_subtexture_target_check(ctx, target, dim, format,
>>> dsa,
>>> +                                          caller)) {
>>>        return;
>>> +   }
>>>
>>> -   if (compressed_subtexture_error_check(ctx, 1, texObj, target,
>>> -                                         level, xoffset, 0, 0,
>>> -                                         width, 1, 1,
>>> -                                         format, imageSize, data,
>>> -
>>> "glCompressedTexSubImage1D")) {
>>> +   if (!dsa) {
>>> +      texObj = _mesa_get_current_tex_object(ctx, target);
>>> +         if (!texObj)
>>> +            return;
>>> +   }
>>
>> I think you can clean the code up a bit here by having
>>
>>     if (dsa) {
>>        texObj = ...;
>>        target = ...;
>>     } else {
>>        texObj = ...;
>>     }
>>
>>     if (compressed_subtexture_target_check(...))
>>        return;
>>
>> When multiple error conditions are present, the OpenGL spec leaves it
>> up to the implementation which one it flags.
>
> Actually no. Switching the order would mean we always report the target
> as no being found. This is no very helpful to the dev and would mean we
> never report that the target is invalid as specified by the spec.
>
> It would also result in a CTS failure [1].

Okay, that's fair enough. You can add my R-b to this patch as well.

Cheers,
Nicolai


>
> [1] https://bugs.freedesktop.org/show_bug.cgi?id=89311
>
>>
>> Cheers,
>> Nicolai
>>
>>
>>
>>> +
>>> +   if (compressed_subtexture_error_check(ctx, dim, texObj, target,
>>> level,
>>> +                                         xoffset, 0, 0, width, 1, 1,
>>> format,
>>> +                                         imageSize, data, caller)) {
>>>        return;
>>>     }
>>>
>>>     texImage = _mesa_select_tex_image(texObj, target, level);
>>>     assert(texImage);
>>>
>>> -   compressed_texture_sub_image(ctx, 1, texObj, texImage, target,
>>> level,
>>> +   compressed_texture_sub_image(ctx, dim, texObj, texImage, target,
>>> level,
>>>                                  xoffset, 0, 0, width, 1, 1, format,
>>> imageSize,
>>>                                  data);
>>>  }
>>>
>>> +
>>> +void GLAPIENTRY
>>> +_mesa_CompressedTexSubImage1D(GLenum target, GLint level, GLint
>>> xoffset,
>>> +                              GLsizei width, GLenum format,
>>> +                              GLsizei imageSize, const GLvoid *data)
>>> +{
>>> +   compressed_tex_sub_image(1, target, 0, level, xoffset, width,
>>> format,
>>> +                            imageSize, data, false,
>>> +                            "glCompressedTexSubImage1D");
>>> +}
>>> +
>>>  void GLAPIENTRY
>>>  _mesa_CompressedTextureSubImage1D(GLuint texture, GLint level, GLint
>>> xoffset,
>>>                                    GLsizei width, GLenum format,
>>>                                    GLsizei imageSize, const GLvoid
>>> *data)
>>>  {
>>> -   struct gl_texture_object *texObj;
>>> -   struct gl_texture_image *texImage;
>>> -
>>> -   GET_CURRENT_CONTEXT(ctx);
>>> -
>>> -   texObj = _mesa_lookup_texture_err(ctx, texture,
>>> -                                     "glCompressedTextureSubImage1D");
>>> -   if (!texObj)
>>> -      return;
>>> -
>>> -   if (compressed_subtexture_target_check(ctx, texObj->Target, 1,
>>> format, true,
>>> -
>>> "glCompressedTextureSubImage1D")) {
>>> -      return;
>>> -   }
>>> -
>>> -   if (compressed_subtexture_error_check(ctx, 1, texObj,
>>> texObj->Target,
>>> -                                         level, xoffset, 0, 0,
>>> -                                         width, 1, 1,
>>> -                                         format, imageSize, data,
>>> -
>>> "glCompressedTextureSubImage1D")) {
>>> -      return;
>>> -   }
>>> -
>>> -   texImage = _mesa_select_tex_image(texObj, texObj->Target, level);
>>> -   assert(texImage);
>>> -
>>> -   compressed_texture_sub_image(ctx, 1, texObj, texImage,
>>> texObj->Target,
>>> -                                level, xoffset, 0, 0, width, 1, 1,
>>> format,
>>> -                                imageSize, data);
>>> +   compressed_tex_sub_image(1, 0, texture, level, xoffset, width,
>>> +                            format, imageSize, data, true,
>>> +                            "glCompressedTextureSubImage1D");
>>>  }
>>>
>>>
>>>  void GLAPIENTRY
>>>  _mesa_CompressedTexSubImage2D(GLenum target, GLint level, GLint
>>> xoffset,
>>>                                GLint yoffset, GLsizei width, GLsizei
>>> height,
>>>                                GLenum format, GLsizei imageSize,
>>>                                const GLvoid *data)
>>>  {
>>>     struct gl_texture_object *texObj;
>>>
>>
>>


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list