From: Andres Rodriguez <andre...@gmail.com> Signed-off-by: Andres Rodriguez <andre...@gmail.com> Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com> --- src/mesa/main/externalobjects.c | 52 ++++++++++++++++++++++++---- src/mesa/main/teximage.c | 75 +++++++++++++++++++++++++++++------------ src/mesa/main/teximage.h | 10 ++++++ 3 files changed, 109 insertions(+), 28 deletions(-)
diff --git a/src/mesa/main/externalobjects.c b/src/mesa/main/externalobjects.c index 25ed176aaa..82946121b3 100644 --- a/src/mesa/main/externalobjects.c +++ b/src/mesa/main/externalobjects.c @@ -275,23 +275,41 @@ texstorage_memory(GLuint dims, GLenum target, GLsizei levels, _mesa_texture_storage_memory(ctx, dims, texObj, memObj, target, levels, internalFormat, width, height, depth, offset, false); } static void texstorage_memory_ms(GLuint dims, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, - GLuint memory, GLuint64 offset) + GLuint memory, GLuint64 offset, const char* func) { + struct gl_texture_object *texObj; + struct gl_memory_object *memObj; + + GET_CURRENT_CONTEXT(ctx); + + texObj = _mesa_get_current_tex_object(ctx, target); + if (!texObj) + return; + + memObj = _mesa_lookup_memory_object(ctx, memory); + if (!memObj) + return; + + if (texstorage_validate(ctx, memObj, func)) + return; + _mesa_texture_storage_ms_memory(ctx, dims, texObj, memObj, target, samples, + internalFormat, width, height, depth, + fixedSampleLocations, offset, func); } /** * Helper used by _mesa_TextureStorageMem1/2/3DEXT(). */ static void texturestorage_memory(GLuint dims, GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, const char *func) @@ -314,23 +332,41 @@ texturestorage_memory(GLuint dims, GLuint texture, GLsizei levels, _mesa_texture_storage_memory(ctx, dims, texObj, memObj, texObj->Target, levels, internalFormat, width, height, depth, offset, true); } static void texturestorage_memory_ms(GLuint dims, GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, - GLuint memory, GLuint64 offset) + GLuint memory, GLuint64 offset, const char* func) { + struct gl_texture_object *texObj; + struct gl_memory_object *memObj; + + GET_CURRENT_CONTEXT(ctx); + + texObj = _mesa_lookup_texture(ctx, texture); + if (!texObj) + return; + + memObj = _mesa_lookup_memory_object(ctx, memory); + if (!memObj) + return; + + if (texstorage_validate(ctx, memObj, func)) + return; + _mesa_texture_storage_ms_memory(ctx, dims, texObj, memObj, texObj->Target, + samples, internalFormat, width, height, + depth, fixedSampleLocations, offset, func); } void GLAPIENTRY _mesa_TexStorageMem2DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset) @@ -343,21 +379,22 @@ void GLAPIENTRY _mesa_TexStorageMem2DMultisampleEXT(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset) { texstorage_memory_ms(2, target, samples, internalFormat, width, height, 1, - fixedSampleLocations, memory, offset); + fixedSampleLocations, memory, offset, + "glTexStorageMem2DMultisampleEXT"); } void GLAPIENTRY _mesa_TexStorageMem3DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, @@ -372,21 +409,22 @@ _mesa_TexStorageMem3DMultisampleEXT(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset) { texstorage_memory_ms(3, target, samples, internalFormat, width, height, - depth, fixedSampleLocations, memory, offset); + depth, fixedSampleLocations, memory, offset, + "glTexStorageMem3DMultisampleEXT"); } void GLAPIENTRY _mesa_TextureStorageMem2DEXT(GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset) @@ -399,21 +437,22 @@ void GLAPIENTRY _mesa_TextureStorageMem2DMultisampleEXT(GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset) { texturestorage_memory_ms(2, texture, samples, internalFormat, width, height, - 1, fixedSampleLocations, memory, offset); + 1, fixedSampleLocations, memory, offset, + "glTextureStorageMem2DMultisampleEXT"); } void GLAPIENTRY _mesa_TextureStorageMem3DEXT(GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, @@ -428,21 +467,22 @@ _mesa_TextureStorageMem3DMultisampleEXT(GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset) { texturestorage_memory_ms(3, texture, samples, internalFormat, width, height, - depth, fixedSampleLocations, memory, offset); + depth, fixedSampleLocations, memory, offset, + "glTextureStorageMem3DMultisampleEXT"); } void GLAPIENTRY _mesa_TexStorageMem1DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset) { diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 1de40b04bf..868abcc8d8 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -5644,25 +5644,27 @@ check_multisample_target(GLuint dims, GLenum target, bool dsa) return dims == 3 && !dsa; default: return GL_FALSE; } } static void texture_image_multisample(struct gl_context *ctx, GLuint dims, struct gl_texture_object *texObj, + struct gl_memory_object *memObj, GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations, - GLboolean immutable, const char *func) + GLboolean immutable, GLuint64 offset, + const char *func) { struct gl_texture_image *texImage; GLboolean sizeOK, dimensionsOK, samplesOK; mesa_format texFormat; GLenum sample_count_error; bool dsa = strstr(func, "ture") ? true : false; if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) { _mesa_debug(ctx, "%s(target=%s, samples=%d)\n", func, _mesa_enum_to_string(target), samples); @@ -5785,28 +5787,39 @@ texture_image_multisample(struct gl_context *ctx, GLuint dims, return; } ctx->Driver.FreeTextureImageBuffer(ctx, texImage); init_teximage_fields_ms(ctx, texImage, width, height, depth, 0, internalformat, texFormat, samples, fixedsamplelocations); if (width > 0 && height > 0 && depth > 0) { - if (!ctx->Driver.AllocTextureStorage(ctx, texObj, 1, - width, height, depth)) { - /* tidy up the texture image state. strictly speaking, - * we're allowed to just leave this in whatever state we - * like, but being tidy is good. - */ - _mesa_init_teximage_fields(ctx, texImage, - 0, 0, 0, 0, internalformat, texFormat); + if (memObj) { + if (!ctx->Driver.SetTextureStorageForMemoryObject(ctx, texObj, + memObj, 1, width, + height, depth, + offset)) { + + _mesa_init_teximage_fields(ctx, texImage, 0, 0, 0, 0, + internalformat, texFormat); + } + } else { + if (!ctx->Driver.AllocTextureStorage(ctx, texObj, 1, + width, height, depth)) { + /* tidy up the texture image state. strictly speaking, + * we're allowed to just leave this in whatever state we + * like, but being tidy is good. + */ + _mesa_init_teximage_fields(ctx, texImage, 0, 0, 0, 0, + internalformat, texFormat); + } } } texObj->Immutable |= immutable; if (immutable) { _mesa_set_texture_view_state(ctx, texObj, target, 1); } _mesa_update_fbo_texture(ctx, texObj, 0, 0); @@ -5819,43 +5832,43 @@ _mesa_TexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { struct gl_texture_object *texObj; GET_CURRENT_CONTEXT(ctx); texObj = _mesa_get_current_tex_object(ctx, target); if (!texObj) return; - texture_image_multisample(ctx, 2, texObj, target, samples, + texture_image_multisample(ctx, 2, texObj, NULL, target, samples, internalformat, width, height, 1, - fixedsamplelocations, GL_FALSE, + fixedsamplelocations, GL_FALSE, 0, "glTexImage2DMultisample"); } void GLAPIENTRY _mesa_TexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { struct gl_texture_object *texObj; GET_CURRENT_CONTEXT(ctx); texObj = _mesa_get_current_tex_object(ctx, target); if (!texObj) return; - texture_image_multisample(ctx, 3, texObj, target, samples, + texture_image_multisample(ctx, 3, texObj, NULL, target, samples, internalformat, width, height, depth, - fixedsamplelocations, GL_FALSE, + fixedsamplelocations, GL_FALSE, 0, "glTexImage3DMultisample"); } static bool valid_texstorage_ms_parameters(GLsizei width, GLsizei height, GLsizei depth, GLsizei samples, unsigned dims) { GET_CURRENT_CONTEXT(ctx); if (!_mesa_valid_tex_storage_dim(width, height, depth)) { @@ -5875,68 +5888,68 @@ _mesa_TexStorage2DMultisample(GLenum target, GLsizei samples, struct gl_texture_object *texObj; GET_CURRENT_CONTEXT(ctx); texObj = _mesa_get_current_tex_object(ctx, target); if (!texObj) return; if (!valid_texstorage_ms_parameters(width, height, 1, samples, 2)) return; - texture_image_multisample(ctx, 2, texObj, target, samples, + texture_image_multisample(ctx, 2, texObj, NULL, target, samples, internalformat, width, height, 1, - fixedsamplelocations, GL_TRUE, + fixedsamplelocations, GL_TRUE, 0, "glTexStorage2DMultisample"); } void GLAPIENTRY _mesa_TexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { struct gl_texture_object *texObj; GET_CURRENT_CONTEXT(ctx); texObj = _mesa_get_current_tex_object(ctx, target); if (!texObj) return; if (!valid_texstorage_ms_parameters(width, height, depth, samples, 3)) return; - texture_image_multisample(ctx, 3, texObj, target, samples, + texture_image_multisample(ctx, 3, texObj, NULL, target, samples, internalformat, width, height, depth, - fixedsamplelocations, GL_TRUE, + fixedsamplelocations, GL_TRUE, 0, "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; if (!valid_texstorage_ms_parameters(width, height, 1, samples, 2)) return; - texture_image_multisample(ctx, 2, texObj, texObj->Target, samples, - internalformat, width, height, 1, - fixedsamplelocations, GL_TRUE, + texture_image_multisample(ctx, 2, texObj, NULL, texObj->Target, + samples, internalformat, width, height, 1, + fixedsamplelocations, GL_TRUE, 0, "glTextureStorage2DMultisample"); } void GLAPIENTRY _mesa_TextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { struct gl_texture_object *texObj; @@ -5944,15 +5957,33 @@ _mesa_TextureStorage3DMultisample(GLuint texture, GLsizei samples, /* Get the texture object by Name. */ texObj = _mesa_lookup_texture_err(ctx, texture, "glTextureStorage3DMultisample"); if (!texObj) return; if (!valid_texstorage_ms_parameters(width, height, depth, samples, 3)) return; - texture_image_multisample(ctx, 3, texObj, texObj->Target, samples, + texture_image_multisample(ctx, 3, texObj, NULL, texObj->Target, samples, internalformat, width, height, depth, - fixedsamplelocations, GL_TRUE, + fixedsamplelocations, GL_TRUE, 0, "glTextureStorage3DMultisample"); } + +void +_mesa_texture_storage_ms_memory(struct gl_context *ctx, GLuint dims, + struct gl_texture_object *texObj, + struct gl_memory_object *memObj, + GLenum target, GLsizei samples, + GLenum internalFormat, GLsizei width, + GLsizei height, GLsizei depth, + GLboolean fixedSampleLocations, + GLuint64 offset, const char* func) +{ + assert(memObj); + + texture_image_multisample(ctx, dims, texObj, memObj, target, samples, + internalFormat, width, height, depth, + fixedSampleLocations, GL_TRUE, offset, + func); +} diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index 04ddbb90e5..8db476d813 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -219,20 +219,30 @@ _mesa_is_renderable_texture_format(struct gl_context *ctx, GLenum internalformat extern void _mesa_texture_sub_image(struct gl_context *ctx, GLuint dims, struct gl_texture_object *texObj, struct gl_texture_image *texImage, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels, bool dsa); +extern void +_mesa_texture_storage_ms_memory(struct gl_context *ctx, GLuint dims, + struct gl_texture_object *texObj, + struct gl_memory_object *memObj, + GLenum target, GLsizei samples, + GLenum internalFormat, GLsizei width, + GLsizei height, GLsizei depth, + GLboolean fixedSampleLocations, + GLuint64 offset, const char* func); + bool _mesa_is_cube_map_texture(GLenum target); /*@}*/ /** \name API entry point functions */ /*@{*/ extern void GLAPIENTRY -- 2.13.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev