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 <bri...@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, >> >> >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev