[Mesa-dev] [PATCH 03/24] mesa: add support for memory object parameters
Samuel Pitoiset
samuel.pitoiset at gmail.com
Fri Jul 28 09:38:33 UTC 2017
On 07/27/2017 03:08 PM, Timothy Arceri wrote:
> From: Andres Rodriguez <andresx7 at gmail.com>
>
> V2 (Timothy Arceri):
> - fix copy and paste error with error message
>
> V3 (Timothy Arceri):
> - drop the Protected field for now as its unused
>
> Signed-off-by: Andres Rodriguez <andresx7 at gmail.com>
> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
> ---
> src/mesa/main/externalobjects.c | 51 ++++++++++++++++++++++++++++++++++++++++-
> src/mesa/main/mtypes.h | 4 +++-
> 2 files changed, 53 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/main/externalobjects.c b/src/mesa/main/externalobjects.c
> index 4cbada3f4e..c3ee0d8115 100644
> --- a/src/mesa/main/externalobjects.c
> +++ b/src/mesa/main/externalobjects.c
> @@ -66,20 +66,21 @@ _mesa_init_memory_object_functions(struct dd_function_table *driver)
> /**
> * Initialize a buffer object to default values.
> */
> void
> _mesa_initialize_memory_object(struct gl_context *ctx,
> struct gl_memory_object *obj,
> GLuint name)
> {
> memset(obj, 0, sizeof(struct gl_memory_object));
> obj->Name = name;
> + obj->Dedicated = GL_FALSE;
> }
>
> void GLAPIENTRY
> _mesa_DeleteMemoryObjectsEXT(GLsizei n, const GLuint *memoryObjects)
> {
> GET_CURRENT_CONTEXT(ctx);
>
> if (MESA_VERBOSE & (VERBOSE_API))
> _mesa_debug(ctx, "glDeleteMemoryObjectsEXT(%d, %p)\n", n, memoryObjects);
>
> @@ -135,21 +136,20 @@ _mesa_CreateMemoryObjectsEXT(GLsizei n, GLuint *memoryObjects)
> }
>
> if (!memoryObjects)
> return;
>
> _mesa_HashLockMutex(ctx->Shared->MemoryObjects);
> GLuint first = _mesa_HashFindFreeKeyBlock(ctx->Shared->MemoryObjects, n);
> if (first) {
> for (GLsizei i = 0; i < n; i++) {
> struct gl_memory_object *memObj;
> -
mmh?
> memoryObjects[i] = first + i;
>
> /* allocate memory object */
> memObj = ctx->Driver.NewMemoryObject(ctx, memoryObjects[i]);
> if (!memObj) {
> _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s()", func);
> goto out_unlock;
> }
>
> /* insert into hash table */
> @@ -161,29 +161,77 @@ _mesa_CreateMemoryObjectsEXT(GLsizei n, GLuint *memoryObjects)
>
> out_unlock:
> _mesa_HashUnlockMutex(ctx->Shared->MemoryObjects);
> }
>
> void GLAPIENTRY
> _mesa_MemoryObjectParameterivEXT(GLuint memoryObject,
> GLenum pname,
> const GLint *params)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_memory_object *memObj;
> +
> + memObj = _mesa_lookup_memory_object(ctx, memoryObject);
Like I said previously, if memoryObject is 0 this will crash (or
assert). Does the spec allow memoryObject to be 0? Though, usually when
an object is not found, we have to return GL_INVALID_OPERATION, but the
spec doesn't seem to mention anything about that.
> + if (!memObj)
> + return;
> +
> + if (memObj->Immutable) {
> + _mesa_error(ctx, GL_INVALID_OPERATION,
> + "glMemoryObjectParameterivEXT(memoryObject is immutable");
> + return;
> + }
>
> + switch (pname) {
> + case GL_DEDICATED_MEMORY_OBJECT_EXT:
> + memObj->Dedicated = (GLboolean) params[0];
> + break;
> + case GL_PROTECTED_MEMORY_OBJECT_EXT:
> + /* EXT_protected_textures not supported */
> + goto invalid_pname;
> + default:
> + goto invalid_pname;
> + }
> + return;
> +
> +invalid_pname:
> + _mesa_error(ctx, GL_INVALID_ENUM,
> + "glMemoryObjectParameterivEXT(pname=0x%x)", pname);
> }
>
> void GLAPIENTRY
> _mesa_GetMemoryObjectParameterivEXT(GLuint memoryObject,
> GLenum pname,
> GLint *params)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_memory_object *memObj;
> +
> + memObj = _mesa_lookup_memory_object(ctx, memoryObject);
> + if (!memObj)
> + return;
> +
> + switch (pname) {
> + case GL_DEDICATED_MEMORY_OBJECT_EXT:
> + *params = (GLint) memObj->Dedicated;
> + break;
> + case GL_PROTECTED_MEMORY_OBJECT_EXT:
> + /* EXT_protected_textures not supported */
> + goto invalid_pname;
> + default:
> + goto invalid_pname;
> + }
> + return;
>
> +invalid_pname:
> + _mesa_error(ctx, GL_INVALID_ENUM,
> + "glGetMemoryObjectParameterivEXT(pname=0x%x)", pname);
> }
>
> void GLAPIENTRY
> _mesa_TexStorageMem2DEXT(GLenum target,
> GLsizei levels,
> GLenum internalFormat,
> GLsizei width,
> GLsizei height,
> GLuint memory,
> GLuint64 offset)
> @@ -375,19 +423,20 @@ _mesa_ImportMemoryFdEXT(GLuint memory,
> }
>
> if (memory == 0)
> return;
>
> struct gl_memory_object *memObj = _mesa_lookup_memory_object(ctx, memory);
> if (!memObj)
> return;
>
> ctx->Driver.ImportMemoryObjectFd(ctx, memObj, size, fd);
> + memObj->Immutable = GL_TRUE;
> }
>
> void GLAPIENTRY
> _mesa_ImportSemaphoreFdEXT(GLuint semaphore,
> GLenum handleType,
> GLint fd)
> {
>
> }
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 642cd72d29..8cb9ae3d17 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -4640,21 +4640,23 @@ struct gl_texture_handle_object
> };
>
> struct gl_image_handle_object
> {
> struct gl_image_unit imgObj;
> GLuint64 handle;
> };
>
> struct gl_memory_object
> {
> - GLuint Name; /**< hash table ID/name */
> + GLuint Name; /**< hash table ID/name */
> + GLboolean Immutable; /**< denotes mutability state of parameters */
> + GLboolean Dedicated; /**< import memory from a dedicated allocation */
> };
>
> /**
> * Mesa rendering context.
> *
> * This is the central context data structure for Mesa. Almost all
> * OpenGL state is contained in this structure.
> * Think of this as a base class from which device drivers will derive
> * sub classes.
> */
>
More information about the mesa-dev
mailing list