[Mesa-dev] [PATCH 27/41] main: Added entry points for CopyTextureSubImage*D.

Laura Ekstrand laura at jlekstrand.net
Tue Jan 6 11:15:35 PST 2015


These comments have been addressed:
http://cgit.freedesktop.org/~ldeks/mesa/commit/?h=adsa-textures&id=8309dd6981a4d3e007437a860e5a45a823bf04cf

Thanks.

Laura

On Tue, Dec 16, 2014 at 7:45 AM, Brian Paul <brianp at vmware.com> wrote:

> On 12/15/2014 06:22 PM, Laura Ekstrand wrote:
>
>> ---
>>   src/mapi/glapi/gen/ARB_direct_state_access.xml |  32 +++++
>>   src/mesa/main/teximage.c                       | 170
>> ++++++++++++++++++-------
>>   src/mesa/main/teximage.h                       |  21 +++
>>   3 files changed, 177 insertions(+), 46 deletions(-)
>>
>> diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml
>> b/src/mapi/glapi/gen/ARB_direct_state_access.xml
>> index fd154de..eef6536 100644
>> --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
>> +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
>> @@ -75,6 +75,38 @@
>>         <param name="pixels" type="const GLvoid *" />
>>      </function>
>>
>> +   <function name="CopyTextureSubImage1D" offset="assign">
>> +      <param name="texture" type="GLuint" />
>> +      <param name="level" type="GLint" />
>> +      <param name="xoffset" type="GLint" />
>> +      <param name="x" type="GLint" />
>> +      <param name="y" type="GLint" />
>> +      <param name="width" type="GLsizei" />
>> +   </function>
>> +
>> +   <function name="CopyTextureSubImage2D" offset="assign">
>> +      <param name="texture" type="GLuint" />
>> +      <param name="level" type="GLint" />
>> +      <param name="xoffset" type="GLint" />
>> +      <param name="yoffset" type="GLint" />
>> +      <param name="x" type="GLint" />
>> +      <param name="y" type="GLint" />
>> +      <param name="width" type="GLsizei" />
>> +      <param name="height" type="GLsizei" />
>> +   </function>
>> +
>> +   <function name="CopyTextureSubImage3D" offset="assign">
>> +      <param name="texture" type="GLuint" />
>> +      <param name="level" type="GLint" />
>> +      <param name="xoffset" type="GLint" />
>> +      <param name="yoffset" type="GLint" />
>> +      <param name="zoffset" type="GLint" />
>> +      <param name="x" type="GLint" />
>> +      <param name="y" type="GLint" />
>> +      <param name="width" type="GLsizei" />
>> +      <param name="height" type="GLsizei" />
>> +   </function>
>> +
>>      <function name="TextureParameterf" offset="assign">
>>         <param name="texture" type="GLuint" />
>>         <param name="pname" type="GLenum" />
>> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
>> index cfb6297..73e7f4b 100644
>> --- a/src/mesa/main/teximage.c
>> +++ b/src/mesa/main/teximage.c
>> @@ -2729,14 +2729,13 @@ copytexture_error_check( struct gl_context *ctx,
>> GLuint dimensions,
>>    */
>>   static GLboolean
>>   copytexsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
>> +                            struct gl_texture_object *texObj,
>>
>
> can texObj be const-qualified?
>
>
> I'm stopping with reviewing here at patch 27 for now.
>
>
>                                GLenum target, GLint level,
>>                               GLint xoffset, GLint yoffset, GLint zoffset,
>> -                            GLint width, GLint height)
>> +                            GLint width, GLint height, bool dsa)
>>   {
>> -   struct gl_texture_object *texObj;
>>      struct gl_texture_image *texImage;
>>
>> -
>>      /* Check that the source buffer is complete */
>>      if (_mesa_is_user_fbo(ctx->ReadBuffer)) {
>>         if (ctx->ReadBuffer->_Status == 0) {
>> @@ -2744,36 +2743,39 @@ copytexsubimage_error_check(struct gl_context
>> *ctx, GLuint dimensions,
>>         }
>>         if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
>>            _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
>> -                     "glCopyTexImage%dD(invalid readbuffer)",
>> dimensions);
>> +                     "glCopyTex%sSubImage%dD(invalid readbuffer)",
>> +                     dsa ? "ture" : "", dimensions);
>>
>
> Again, a local var storing the function name would be cleaner, imho.
>
>
>
>             return GL_TRUE;
>>         }
>>
>>         if (ctx->ReadBuffer->Visual.samples > 0) {
>> -        _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                    "glCopyTexSubImage%dD(multisample FBO)",
>> -                    dimensions);
>> -        return GL_TRUE;
>> +         _mesa_error(ctx, GL_INVALID_OPERATION,
>> +                "glCopyTex%sSubImage%dD(multisample FBO)", dsa ? "ture"
>> : "",
>> +                dimensions);
>> +         return GL_TRUE;
>>         }
>>      }
>>
>>      /* check target (proxies not allowed) */
>> -   if (!legal_texsubimage_target(ctx, dimensions, target, false)) {
>> -      _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexImage%uD(target=%s)",
>> -                  dimensions, _mesa_lookup_enum_by_nr(target));
>> +   if (!legal_texsubimage_target(ctx, dimensions, target, dsa)) {
>> +      _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTex%sSubImage%uD(
>> target=%s)",
>> +                  dsa ? "ture" : "", dimensions,
>> +                  _mesa_lookup_enum_by_nr(target));
>>         return GL_TRUE;
>>      }
>>
>>      /* Check level */
>>      if (level < 0 || level >= _mesa_max_texture_levels(ctx, target)) {
>>         _mesa_error(ctx, GL_INVALID_VALUE,
>> -                  "glCopyTexSubImage%dD(level=%d)", dimensions, level);
>> +                  "glCopyTex%sSubImage%dD(level=%d)", dsa ? "ture" : "",
>> +                  dimensions, level);
>>         return GL_TRUE;
>>      }
>>
>> -   /* Get dest texture object / image pointers */
>> -   texObj = _mesa_get_current_tex_object(ctx, target);
>> +   /* Get dest image pointers */
>>      if (!texObj) {
>> -      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage%dD()",
>> dimensions);
>> +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTex%sSubImage%dD()",
>> +                  dsa ? "ture" : "", dimensions);
>>         return GL_TRUE;
>>      }
>>
>> @@ -2781,34 +2783,38 @@ copytexsubimage_error_check(struct gl_context
>> *ctx, GLuint dimensions,
>>      if (!texImage) {
>>         /* destination image does not exist */
>>         _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                  "glCopyTexSubImage%dD(invalid texture image)",
>> dimensions);
>> +                  "glCopyTex%sSubImage%dD(invalid texture image)",
>> +                  dsa ? "ture" : "", dimensions);
>>         return GL_TRUE;
>>      }
>>
>>      if (error_check_subtexture_dimensions(ctx, dimensions, texImage,
>>                                            xoffset, yoffset, zoffset,
>> -                                         width, height, 1,
>> -                                         "glCopyTexSubImage")) {
>> +                                         width, height, 1, dsa ?
>> +                                         "glCompressedTextureSubImage" :
>> +                                         "glCompressedTexSubImage")) {
>>         return GL_TRUE;
>>      }
>>
>>      if (_mesa_is_format_compressed(texImage->TexFormat)) {
>>         if (compressedteximage_only_format(ctx,
>> texImage->InternalFormat)) {
>>            _mesa_error(ctx, GL_INVALID_OPERATION,
>> -               "glCopyTexSubImage%dD(no compression for format)",
>> dimensions);
>> +               "glCopyTex%sSubImage%dD(no compression for format)",
>> +               dsa ? "ture" : "", dimensions);
>>            return GL_TRUE;
>>         }
>>      }
>>
>>      if (texImage->InternalFormat == GL_YCBCR_MESA) {
>> -      _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexSubImage2D");
>> +      _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTex%sSubImage2D",
>> +                  dsa ? "ture" : "");
>>         return GL_TRUE;
>>      }
>>
>>      if (!_mesa_source_buffer_exists(ctx, texImage->_BaseFormat)) {
>>         _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                  "glCopyTexSubImage%dD(missing readbuffer,
>> format=0x%x)",
>> -                  dimensions, texImage->_BaseFormat);
>> +                  "glCopyTex%sSubImage%dD(missing readbuffer,
>> format=0x%x)",
>> +                  dsa ? "ture" : "", dimensions, texImage->_BaseFormat);
>>         return GL_TRUE;
>>      }
>>
>> @@ -2823,10 +2829,11 @@ copytexsubimage_error_check(struct gl_context
>> *ctx, GLuint dimensions,
>>         struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer;
>>
>>         if (_mesa_is_format_integer_color(rb->Format) !=
>> -         _mesa_is_format_integer_color(texImage->TexFormat)) {
>> -        _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                    "glCopyTexImage%dD(integer vs non-integer)",
>> dimensions);
>> -        return GL_TRUE;
>> +          _mesa_is_format_integer_color(texImage->TexFormat)) {
>> +         _mesa_error(ctx, GL_INVALID_OPERATION,
>> +                     "glCopyTex%sSubImage%dD(integer vs non-integer)",
>> +                     dsa ? "ture" : "", dimensions);
>> +         return GL_TRUE;
>>         }
>>      }
>>
>> @@ -3920,37 +3927,37 @@ _mesa_CopyTexImage2D( GLenum target, GLint level,
>> GLenum internalFormat,
>>                   x, y, width, height, border);
>>   }
>>
>> -
>> -
>>   /**
>> - * Implementation for glCopyTexSubImage1/2/3D() functions.
>> + * Implementation for glCopyTex(ture)SubImage1/2/3D() functions.
>>    */
>> -static void
>> -copytexsubimage(struct gl_context *ctx, GLuint dims, GLenum target,
>> GLint level,
>> -                GLint xoffset, GLint yoffset, GLint zoffset,
>> -                GLint x, GLint y, GLsizei width, GLsizei height)
>> +void
>> +_mesa_copy_texture_sub_image(struct gl_context *ctx, GLuint dims,
>> +                             struct gl_texture_object *texObj,
>> +                             GLenum target, GLint level,
>> +                             GLint xoffset, GLint yoffset, GLint zoffset,
>> +                             GLint x, GLint y,
>> +                             GLsizei width, GLsizei height,
>> +                             bool dsa )
>>   {
>> -   struct gl_texture_object *texObj;
>>      struct gl_texture_image *texImage;
>>
>>      FLUSH_VERTICES(ctx, 0);
>>
>>      if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
>> -      _mesa_debug(ctx, "glCopyTexSubImage%uD %s %d %d %d %d %d %d %d
>> %d\n",
>> -                  dims,
>> +      _mesa_debug(ctx, "glCopyTex%sSubImage%uD %s %d %d %d %d %d %d %d
>> %d\n",
>> +                  dsa ? "ture" : "", dims,
>>                     _mesa_lookup_enum_by_nr(target),
>>                     level, xoffset, yoffset, zoffset, x, y, width,
>> height);
>>
>>      if (ctx->NewState & NEW_COPY_TEX_STATE)
>>         _mesa_update_state(ctx);
>>
>> -   if (copytexsubimage_error_check(ctx, dims, target, level,
>> -                                   xoffset, yoffset, zoffset, width,
>> height)) {
>> +   if (copytexsubimage_error_check(ctx, dims, texObj, target, level,
>> +                                   xoffset, yoffset, zoffset,
>> +                                   width, height, dsa)) {
>>         return;
>>      }
>>
>> -   texObj = _mesa_get_current_tex_object(ctx, target);
>> -
>>      _mesa_lock_texture(ctx, texObj);
>>      {
>>         texImage = _mesa_select_tex_image(ctx, texObj, target, level);
>> @@ -3988,13 +3995,19 @@ copytexsubimage(struct gl_context *ctx, GLuint
>> dims, GLenum target, GLint level,
>>      _mesa_unlock_texture(ctx, texObj);
>>   }
>>
>> -
>>   void GLAPIENTRY
>>   _mesa_CopyTexSubImage1D( GLenum target, GLint level,
>>                            GLint xoffset, GLint x, GLint y, GLsizei width
>> )
>>   {
>> +   struct gl_texture_object* texObj;
>>      GET_CURRENT_CONTEXT(ctx);
>> -   copytexsubimage(ctx, 1, target, level, xoffset, 0, 0, x, y, width, 1);
>> +
>> +   texObj = _mesa_get_current_tex_object(ctx, target);
>> +   if (!texObj)
>> +      return;
>> +
>> +   _mesa_copy_texture_sub_image(ctx, 1, texObj, target, level, xoffset,
>> 0, 0,
>> +                                x, y, width, 1, false);
>>   }
>>
>>
>> @@ -4004,9 +4017,16 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint
>> level,
>>                            GLint xoffset, GLint yoffset,
>>                            GLint x, GLint y, GLsizei width, GLsizei
>> height )
>>   {
>> +   struct gl_texture_object* texObj;
>>      GET_CURRENT_CONTEXT(ctx);
>> -   copytexsubimage(ctx, 2, target, level, xoffset, yoffset, 0, x, y,
>> -                   width, height);
>> +
>> +   texObj = _mesa_get_current_tex_object(ctx, target);
>> +   if (!texObj)
>> +      return;
>> +
>> +   _mesa_copy_texture_sub_image(ctx, 2, texObj, target, level,
>> +                                xoffset, yoffset, 0,
>> +                                x, y, width, height, false);
>>   }
>>
>>
>> @@ -4016,9 +4036,67 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint
>> level,
>>                            GLint xoffset, GLint yoffset, GLint zoffset,
>>                            GLint x, GLint y, GLsizei width, GLsizei
>> height )
>>   {
>> +   struct gl_texture_object* texObj;
>> +   GET_CURRENT_CONTEXT(ctx);
>> +
>> +   texObj = _mesa_get_current_tex_object(ctx, target);
>> +   if (!texObj)
>> +      return;
>> +
>> +   _mesa_copy_texture_sub_image(ctx, 3, texObj, target, level,
>> +                                xoffset, yoffset, zoffset,
>> +                                x, y, width, height, false);
>> +}
>> +
>> +void GLAPIENTRY
>> +_mesa_CopyTextureSubImage1D( GLuint texture, GLint level,
>> +                             GLint xoffset, GLint x, GLint y, GLsizei
>> width )
>> +{
>> +   struct gl_texture_object* texObj;
>> +   GET_CURRENT_CONTEXT(ctx);
>> +
>> +   texObj = _mesa_lookup_texture_err(ctx, texture,
>> "glCopyTextureSubImage1D");
>> +   if (!texObj)
>> +      return;
>> +
>> +   _mesa_copy_texture_sub_image(ctx, 1, texObj, texObj->Target, level,
>> +                                xoffset, 0, 0, x, y, width, 1, true);
>> +}
>> +
>> +void GLAPIENTRY
>> +_mesa_CopyTextureSubImage2D( GLuint texture, GLint level,
>> +                             GLint xoffset, GLint yoffset,
>> +                             GLint x, GLint y, GLsizei width, GLsizei
>> height )
>> +{
>> +   struct gl_texture_object* texObj;
>> +   GET_CURRENT_CONTEXT(ctx);
>> +
>> +   texObj = _mesa_lookup_texture_err(ctx, texture,
>> "glCopyTextureSubImage2D");
>> +   if (!texObj)
>> +      return;
>> +
>> +   _mesa_copy_texture_sub_image(ctx, 2, texObj, texObj->Target, level,
>> +                                xoffset, yoffset, 0,
>> +                                x, y, width, height, true);
>> +}
>> +
>> +
>> +
>> +void GLAPIENTRY
>> +_mesa_CopyTextureSubImage3D( GLuint texture, GLint level,
>> +                             GLint xoffset, GLint yoffset, GLint zoffset,
>> +                             GLint x, GLint y, GLsizei width, GLsizei
>> height )
>> +{
>> +   struct gl_texture_object* texObj;
>>      GET_CURRENT_CONTEXT(ctx);
>> -   copytexsubimage(ctx, 3, target, level, xoffset, yoffset, zoffset,
>> -                   x, y, width, height);
>> +
>> +   texObj = _mesa_lookup_texture_err(ctx, texture,
>> "glCopyTextureSubImage3D");
>> +   if (!texObj)
>> +      return;
>> +
>> +   _mesa_copy_texture_sub_image(ctx, 3, texObj, texObj->Target, level,
>> +                                xoffset, yoffset, zoffset,
>> +                                x, y, width, height, true);
>>   }
>>
>>   static bool
>> diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h
>> index c014bd9..913a677 100644
>> --- a/src/mesa/main/teximage.h
>> +++ b/src/mesa/main/teximage.h
>> @@ -165,6 +165,13 @@ _mesa_texture_sub_image( struct gl_context *ctx,
>> GLuint dims,
>>                            GLsizei width, GLsizei height, GLsizei depth,
>>                            GLenum format, GLenum type, const GLvoid
>> *pixels,
>>                            bool dsa );
>> +extern void
>> +_mesa_copy_texture_sub_image( struct gl_context *ctx, GLuint dims,
>> +                              struct gl_texture_object *texObj,
>> +                              GLenum target, GLint level,
>> +                              GLint xoffset, GLint yoffset, GLint
>> zoffset,
>> +                              GLint x, GLint y,
>> +                              GLsizei width, GLsizei height, bool dsa );
>>   /*@}*/
>>
>>
>> @@ -269,7 +276,21 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,
>>                            GLint xoffset, GLint yoffset, GLint zoffset,
>>                            GLint x, GLint y, GLsizei width, GLsizei
>> height );
>>
>> +extern void GLAPIENTRY
>> +_mesa_CopyTextureSubImage1D( GLuint texture, GLint level,
>> +                             GLint xoffset, GLint x, GLint y, GLsizei
>> width );
>>
>> +extern void GLAPIENTRY
>> +_mesa_CopyTextureSubImage2D( GLuint texture, GLint level,
>> +                             GLint xoffset, GLint yoffset,
>> +                             GLint x, GLint y,
>> +                             GLsizei width, GLsizei height );
>> +
>> +extern void GLAPIENTRY
>> +_mesa_CopyTextureSubImage3D( GLuint texture, GLint level,
>> +                             GLint xoffset, GLint yoffset, GLint zoffset,
>> +                             GLint x, GLint y,
>> +                             GLsizei width, GLsizei height );
>>
>>   extern void GLAPIENTRY
>>   _mesa_ClearTexSubImage( GLuint texture, GLint level,
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150106/f48eace6/attachment-0001.html>


More information about the mesa-dev mailing list