[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