[Mesa-dev] [PATCH 07/24] mesa: hook up memory object multisamples tex(ture)storage api
Samuel Pitoiset
samuel.pitoiset at gmail.com
Wed Jul 26 15:12:55 UTC 2017
On 07/26/2017 01:46 PM, Timothy Arceri wrote:
> From: Andres Rodriguez <andresx7 at gmail.com>
>
> Signed-off-by: Andres Rodriguez <andresx7 at gmail.com>
> Reviewed-by: Timothy Arceri <tarceri at 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 879c2bb..1c6ba18 100644
> --- a/src/mesa/main/externalobjects.c
> +++ b/src/mesa/main/externalobjects.c
> @@ -280,9 +280,27 @@ 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);
See my comment on the previous patch (this applies everywhere this
function is called anyway).
> + 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);
> }
>
> /**
> @@ -319,9 +337,27 @@ 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
> @@ -348,7 +384,8 @@ _mesa_TexStorageMem2DMultisampleEXT(GLenum target,
> GLuint64 offset)
> {
> texstorage_memory_ms(2, target, samples, internalFormat, width, height, 1,
> - fixedSampleLocations, memory, offset);
> + fixedSampleLocations, memory, offset,
> + "glTexStorageMem2DMultisampleEXT");
> }
>
> void GLAPIENTRY
> @@ -377,7 +414,8 @@ _mesa_TexStorageMem3DMultisampleEXT(GLenum target,
> GLuint64 offset)
> {
> texstorage_memory_ms(3, target, samples, internalFormat, width, height,
> - depth, fixedSampleLocations, memory, offset);
> + depth, fixedSampleLocations, memory, offset,
> + "glTexStorageMem3DMultisampleEXT");
> }
>
> void GLAPIENTRY
> @@ -404,7 +442,8 @@ _mesa_TextureStorageMem2DMultisampleEXT(GLuint texture,
> GLuint64 offset)
> {
> texturestorage_memory_ms(2, texture, samples, internalFormat, width, height,
> - 1, fixedSampleLocations, memory, offset);
> + 1, fixedSampleLocations, memory, offset,
> + "glTextureStorageMem2DMultisampleEXT");
> }
>
> void GLAPIENTRY
> @@ -433,7 +472,8 @@ _mesa_TextureStorageMem3DMultisampleEXT(GLuint texture,
> GLuint64 offset)
> {
> texturestorage_memory_ms(3, texture, samples, internalFormat, width, height,
> - depth, fixedSampleLocations, memory, offset);
> + depth, fixedSampleLocations, memory, offset,
> + "glTextureStorageMem3DMultisampleEXT");
> }
>
> void GLAPIENTRY
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 1de40b0..868abcc 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -5651,11 +5651,13 @@ check_multisample_target(GLuint dims, GLenum target, bool dsa)
> 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;
> @@ -5792,14 +5794,25 @@ texture_image_multisample(struct gl_context *ctx, GLuint dims,
> 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);
> + }
> }
> }
>
> @@ -5826,9 +5839,9 @@ _mesa_TexImage2DMultisample(GLenum target, GLsizei samples,
> 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");
> }
>
> @@ -5846,9 +5859,9 @@ _mesa_TexImage3DMultisample(GLenum target, GLsizei samples,
> 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");
> }
>
> @@ -5882,9 +5895,9 @@ _mesa_TexStorage2DMultisample(GLenum target, GLsizei samples,
> 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");
> }
>
> @@ -5904,9 +5917,9 @@ _mesa_TexStorage3DMultisample(GLenum target, GLsizei samples,
> 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");
> }
>
> @@ -5927,9 +5940,9 @@ _mesa_TextureStorage2DMultisample(GLuint texture, GLsizei samples,
> 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");
> }
>
> @@ -5951,8 +5964,26 @@ _mesa_TextureStorage3DMultisample(GLuint texture, GLsizei samples,
> 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 04ddbb9..8db476d 100644
> --- a/src/mesa/main/teximage.h
> +++ b/src/mesa/main/teximage.h
> @@ -226,6 +226,16 @@ _mesa_texture_sub_image(struct gl_context *ctx, GLuint dims,
> 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);
>
>
More information about the mesa-dev
mailing list