--- src/mapi/glapi/gen/ARB_direct_state_access.xml | 19 ++++ src/mesa/main/teximage.c | 124 +++++++++++++++++++------ src/mesa/main/teximage.h | 20 ++++ 3 files changed, 135 insertions(+), 28 deletions(-)
diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml index afc16ad..c48fb26 100644 --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml @@ -39,6 +39,25 @@ <param name="depth" type="GLsizei" /> </function> + <function name="TextureStorage2DMultisample" offset="assign"> + <param name="texture" type="GLuint" /> + <param name="samples" type="GLsizei" /> + <param name="internalformat" type="GLenum" /> + <param name="width" type="GLsizei" /> + <param name="height" type="GLsizei" /> + <param name="fixedsamplelocations" type="GLboolean" /> + </function> + + <function name="TextureStorage3DMultisample" offset="assign"> + <param name="texture" type="GLuint" /> + <param name="samples" type="GLsizei" /> + <param name="internalformat" type="GLenum" /> + <param name="width" type="GLsizei" /> + <param name="height" type="GLsizei" /> + <param name="depth" type="GLsizei" /> + <param name="fixedsamplelocations" type="GLboolean" /> + </function> + <function name="TextureSubImage1D" offset="assign"> <param name="texture" type="GLuint" /> <param name="level" type="GLint" /> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 444b8f9..fa1596d 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -5067,16 +5067,18 @@ is_renderable_texture_format(struct gl_context *ctx, GLenum internalformat) /** GL_ARB_texture_multisample */ static GLboolean -check_multisample_target(GLuint dims, GLenum target) +check_multisample_target(GLuint dims, GLenum target, bool dsa) { switch(target) { case GL_TEXTURE_2D_MULTISAMPLE: - case GL_PROXY_TEXTURE_2D_MULTISAMPLE: return dims == 2; + case GL_PROXY_TEXTURE_2D_MULTISAMPLE: + return dims == 2 && !dsa; case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: - case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY: return dims == 3; + case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY: + return dims == 3 && !dsa; default: return GL_FALSE; @@ -5084,19 +5086,20 @@ check_multisample_target(GLuint dims, GLenum target) } -static void -teximagemultisample(GLuint dims, GLenum target, GLsizei samples, - GLint internalformat, GLsizei width, GLsizei height, - GLsizei depth, GLboolean fixedsamplelocations, - GLboolean immutable, const char *func) +void +_mesa_texture_image_multisample(struct gl_context *ctx, GLuint dims, + struct gl_texture_object *texObj, + GLenum target, GLsizei samples, + GLint internalformat, GLsizei width, + GLsizei height, GLsizei depth, + GLboolean fixedsamplelocations, + GLboolean immutable, const char *func) { - struct gl_texture_object *texObj; struct gl_texture_image *texImage; GLboolean sizeOK, dimensionsOK, samplesOK; mesa_format texFormat; GLenum sample_count_error; - - GET_CURRENT_CONTEXT(ctx); + bool dsa = strstr(func, "ture") ? true : false; if (!(ctx->Extensions.ARB_texture_multisample && _mesa_is_desktop_gl(ctx))) { @@ -5104,9 +5107,15 @@ teximagemultisample(GLuint dims, GLenum target, GLsizei samples, return; } - if (!check_multisample_target(dims, target)) { - _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func); - return; + if (!check_multisample_target(dims, target, dsa)) { + if (dsa) { + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(target)", func); + return; + } + else { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func); + return; + } } /* check that the specified internalformat is color/depth/stencil-renderable; @@ -5144,8 +5153,6 @@ teximagemultisample(GLuint dims, GLenum target, GLsizei samples, return; } - texObj = _mesa_get_current_tex_object(ctx, target); - if (immutable && (!texObj || (texObj->Name == 0))) { _mesa_error(ctx, GL_INVALID_OPERATION, "%s(texture object 0)", @@ -5234,9 +5241,14 @@ _mesa_TexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { - teximagemultisample(2, target, samples, internalformat, - width, height, 1, fixedsamplelocations, GL_FALSE, - "glTexImage2DMultisample"); + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + texObj = _mesa_get_current_tex_object(ctx, target); + + _mesa_texture_image_multisample(ctx, 2, texObj, target, samples, + internalformat, width, height, 1, + fixedsamplelocations, GL_FALSE, + "glTexImage2DMultisample"); } @@ -5246,9 +5258,14 @@ _mesa_TexImage3DMultisample(GLenum target, GLsizei samples, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { - teximagemultisample(3, target, samples, internalformat, - width, height, depth, fixedsamplelocations, GL_FALSE, - "glTexImage3DMultisample"); + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + texObj = _mesa_get_current_tex_object(ctx, target); + + _mesa_texture_image_multisample(ctx, 3, texObj, target, samples, + internalformat, width, height, depth, + fixedsamplelocations, GL_FALSE, + "glTexImage3DMultisample"); } @@ -5257,9 +5274,14 @@ _mesa_TexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { - teximagemultisample(2, target, samples, internalformat, - width, height, 1, fixedsamplelocations, GL_TRUE, - "glTexStorage2DMultisample"); + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + texObj = _mesa_get_current_tex_object(ctx, target); + + _mesa_texture_image_multisample(ctx, 2, texObj, target, samples, + internalformat, width, height, 1, + fixedsamplelocations, GL_TRUE, + "glTexStorage2DMultisample"); } void GLAPIENTRY @@ -5268,7 +5290,53 @@ _mesa_TexStorage3DMultisample(GLenum target, GLsizei samples, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { - teximagemultisample(3, target, samples, internalformat, - width, height, depth, fixedsamplelocations, GL_TRUE, - "glTexStorage3DMultisample"); + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + texObj = _mesa_get_current_tex_object(ctx, target); + + _mesa_texture_image_multisample(ctx, 3, texObj, target, samples, + internalformat, width, height, depth, + fixedsamplelocations, GL_TRUE, + "glTexStorage3DMultisample"); +} + +void GLAPIENTRY +_mesa_TextureStorage2DMultisample(GLuint texture, GLsizei samples, + GLenum internalformat, GLsizei width, + GLsizei height, + GLboolean fixedsamplelocations) +{ + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + + texObj = _mesa_lookup_texture_err(ctx, texture, + "glTextureStorage2DMultisample"); + if (!texObj) + return; + + _mesa_texture_image_multisample(ctx, 2, texObj, texObj->Target, samples, + internalformat, width, height, 1, + fixedsamplelocations, GL_TRUE, + "glTextureStorage2DMultisample"); +} + +void GLAPIENTRY +_mesa_TextureStorage3DMultisample(GLuint texture, GLsizei samples, + GLenum internalformat, GLsizei width, + GLsizei height, GLsizei depth, + GLboolean fixedsamplelocations) +{ + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + + /* Get the texture object by Name. */ + texObj = _mesa_lookup_texture_err(ctx, texture, + "glTextureStorage3DMultisample"); + if (!texObj) + return; + + _mesa_texture_image_multisample(ctx, 3, texObj, texObj->Target, samples, + internalformat, width, height, depth, + fixedsamplelocations, GL_TRUE, + "glTextureStorage3DMultisample"); } diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index 01f37ad..0ab8af6 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -184,6 +184,15 @@ _mesa_copy_texture_sub_image( struct gl_context *ctx, GLuint dims, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, bool dsa ); + +extern void +_mesa_texture_image_multisample(struct gl_context *ctx, GLuint dims, + struct gl_texture_object *texObj, + GLenum target, GLsizei samples, + GLint internalformat, GLsizei width, + GLsizei height, GLsizei depth, + GLboolean fixedsamplelocations, + GLboolean immutable, const char *func); /*@}*/ @@ -399,6 +408,17 @@ _mesa_TexStorage3DMultisample(GLenum target, GLsizei samples, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +void GLAPIENTRY +_mesa_TextureStorage2DMultisample(GLuint texture, GLsizei samples, + GLenum internalformat, GLsizei width, + GLsizei height, + GLboolean fixedsamplelocations); + +void GLAPIENTRY +_mesa_TextureStorage3DMultisample(GLuint texture, GLsizei samples, + GLenum internalformat, GLsizei width, + GLsizei height, GLsizei depth, + GLboolean fixedsamplelocations); /*@}*/ #ifdef __cplusplus -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev