--- src/mapi/glapi/gen/ARB_direct_state_access.xml | 8 ++ src/mesa/main/texobj.c | 109 +++++++++++++++++++------ src/mesa/main/texobj.h | 2 + 3 files changed, 92 insertions(+), 27 deletions(-)
diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml index fcec608..9f2eacb 100644 --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml @@ -7,5 +7,13 @@ <enum name="QUERY_TARGET" value="0x82EA"/> <enum name="TEXTURE_BINDING" value="0x82EB"/> + <!-- Texture object functions --> + + <function name="CreateTextures" offset="assign"> + <param name="target" type="GLenum" /> + <param name="n" type="GLsizei" /> + <param name="textures" type="GLuint *" /> + </function> + </category> </OpenGLAPI> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 6215fe3..26d07ee 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -1100,38 +1100,23 @@ invalidate_tex_image_error_check(struct gl_context *ctx, GLuint texture, return t; } -/*@}*/ - - -/***********************************************************************/ -/** \name API functions */ -/*@{*/ - - -/** - * Generate texture names. - * - * \param n number of texture names to be generated. - * \param textures an array in which will hold the generated texture names. - * - * \sa glGenTextures(). - * - * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture - * IDs which are stored in \p textures. Corresponding empty texture - * objects are also generated. - */ -void GLAPIENTRY -_mesa_GenTextures( GLsizei n, GLuint *textures ) +/* Helper function for glCreateTextures and glGenTextures. Need this because + * glCreateTextures should throw errors if target = 0. This is not exposed to + * the rest of Mesa to encourage Mesa internals to use nameless textures, + * which do not require expensive hash lookups. */ +static void +create_textures( struct gl_context *ctx, GLenum target, + GLsizei n, GLuint *textures, bool dsa ) { - GET_CURRENT_CONTEXT(ctx); GLuint first; GLint i; + const char *func = dsa ? "Create" : "Gen"; if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) - _mesa_debug(ctx, "glGenTextures %d\n", n); + _mesa_debug(ctx, "gl%sTextures %d\n", func, n); if (n < 0) { - _mesa_error( ctx, GL_INVALID_VALUE, "glGenTextures" ); + _mesa_error( ctx, GL_INVALID_VALUE, "gl%sTextures", func ); return; } @@ -1148,15 +1133,28 @@ _mesa_GenTextures( GLsizei n, GLuint *textures ) /* Allocate new, empty texture objects */ for (i = 0; i < n; i++) { struct gl_texture_object *texObj; + GLint targetIndex; GLuint name = first + i; - GLenum target = 0; texObj = ctx->Driver.NewTextureObject(ctx, name, target); if (!texObj) { mtx_unlock(&ctx->Shared->Mutex); - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTextures"); + _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sTextures", func); return; } + /* Initialize the target index if target is non-zero. */ + if (target != 0) + { + targetIndex = _mesa_tex_target_to_index(ctx, texObj->Target); + if (targetIndex < 0) { /* Bad Target */ + mtx_unlock(&ctx->Shared->Mutex); + _mesa_error(ctx, GL_INVALID_ENUM, "gl%sTextures(target)", func); + return; + } + assert(targetIndex < NUM_TEXTURE_TARGETS); + texObj->TargetIndex = targetIndex; + } + /* insert into hash table */ _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj); @@ -1166,6 +1164,63 @@ _mesa_GenTextures( GLsizei n, GLuint *textures ) mtx_unlock(&ctx->Shared->Mutex); } +/*@}*/ + + +/***********************************************************************/ +/** \name API functions */ +/*@{*/ + + +/** + * Generate texture names. + * + * \param n number of texture names to be generated. + * \param textures an array in which will hold the generated texture names. + * + * \sa glGenTextures(), glCreateTextures(). + * + * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture + * IDs which are stored in \p textures. Corresponding empty texture + * objects are also generated. + */ +void GLAPIENTRY +_mesa_GenTextures( GLsizei n, GLuint *textures ) +{ + GET_CURRENT_CONTEXT(ctx); + create_textures(ctx, 0, n, textures, false); +} + +/** + * Create texture objects. + * + * \param target the texture target for each name to be generated. + * \param n number of texture names to be generated. + * \param textures an array in which will hold the generated texture names. + * + * \sa glCreateTextures(), glGenTextures(). + * + * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture + * IDs which are stored in \p textures. Corresponding empty texture + * objects are also generated. + */ +void GLAPIENTRY +_mesa_CreateTextures( GLenum target, GLsizei n, GLuint *textures ) +{ + GLint targetIndex; + GET_CURRENT_CONTEXT(ctx); + + /* The 4.5 core profile spec (20141030) doesn't specify what + * glCreateTextures should do with invalid targets, which was probably an + * oversight. This conforms to the spec for glBindTexture. */ + targetIndex = _mesa_tex_target_to_index(ctx, target); + if (targetIndex < 0) { + _mesa_error(ctx, GL_INVALID_ENUM, "glCreateTextures(target)"); + return; + } + + create_textures(ctx, target, n, textures, true); +} /** * Check if the given texture object is bound to the current draw or diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h index 90cb51a..b957ac5 100644 --- a/src/mesa/main/texobj.h +++ b/src/mesa/main/texobj.h @@ -200,6 +200,8 @@ _mesa_lock_context_textures( struct gl_context *ctx ); extern void GLAPIENTRY _mesa_GenTextures( GLsizei n, GLuint *textures ); +extern void GLAPIENTRY +_mesa_CreateTextures( GLenum target, GLsizei n, GLuint *textures ); extern void GLAPIENTRY _mesa_DeleteTextures( GLsizei n, const GLuint *textures ); -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev