[Mesa-dev] [PATCH 14/41] main: Added entry point for BindTextureUnit.
Laura Ekstrand
laura at jlekstrand.net
Mon Jan 5 14:43:46 PST 2015
These comments have been addressed.
On Tue, Dec 30, 2014 at 3:46 PM, Anuj Phogat <anuj.phogat at gmail.com> wrote:
> On Tue, Dec 16, 2014 at 7:46 AM, Brian Paul <brianp at vmware.com> wrote:
> > On 12/15/2014 06:22 PM, Laura Ekstrand wrote:
> >>
> >> The following preparations were made in texstate.c and texstate.h to
> >> better facilitate the BindTextureUnit function:
> >>
> >> Dylan Noblesmith:
> >> mesa: add _mesa_get_tex_unit()
> >> mesa: factor out _mesa_max_tex_unit()
> >> This is about to appear in a lot more places, so
> >> reduce boilerplate copy paste.
> >> add _mesa_get_tex_unit_err() checking getter function
> >> Reduce boilerplate across files.
> >>
> >> Laura Ekstrand:
> >> Made note of why BindTextureUnit should throw GL_INVALID_OPERATION if
> the
> >> unit is out of range.
> >> Added assert(unit > 0) to _mesa_get_tex_unit.
> >> ---
> >> src/mapi/glapi/gen/ARB_direct_state_access.xml | 5 ++
> >> src/mesa/main/texobj.c | 108
> >> ++++++++++++++++++++++++-
> >> src/mesa/main/texobj.h | 15 +++-
> >> src/mesa/main/texstate.c | 4 +-
> >> src/mesa/main/texstate.h | 39 ++++++++-
> >> 5 files changed, 160 insertions(+), 11 deletions(-)
> >>
> >> diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml
> >> b/src/mapi/glapi/gen/ARB_direct_state_access.xml
> >> index 4c5005f..f54c3f8 100644
> >> --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
> >> +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
> >> @@ -75,5 +75,10 @@
> >> <param name="pixels" type="const GLvoid *" />
> >> </function>
> >>
> >> + <function name="BindTextureUnit" offset="assign">
> >> + <param name="unit" type="GLuint" />
> >> + <param name="texture" type="GLuint" />
> >> + </function>
> >> +
> >> </category>
> >> </OpenGLAPI>
> >> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
> >> index 26d07ee..eb16f47 100644
> >> --- a/src/mesa/main/texobj.c
> >> +++ b/src/mesa/main/texobj.c
> >> @@ -482,8 +482,8 @@ valid_texture_object(const struct gl_texture_object
> >> *tex)
> >> * when there's a real pointer change.
> >> */
> >> void
> >> -_mesa_reference_texobj_(struct gl_texture_object **ptr,
> >> - struct gl_texture_object *tex)
> >> +_mesa_reference_texobj_( struct gl_texture_object **ptr,
> >> + struct gl_texture_object *tex )
> >
> >
> > I prefer the lack of whitespace as it was.
> This extra space is used at many other places in this patch.
>
> >
> >
> >> {
> >> assert(ptr);
> >>
> >> @@ -503,6 +503,8 @@ _mesa_reference_texobj_(struct gl_texture_object
> >> **ptr,
> >> mtx_unlock(&oldTex->Mutex);
> >>
> >> if (deleteFlag) {
> >> + /* Passing in the context drastically changes the driver code
> >> for
> >> + * framebuffer deletion. */
> >
> >
> > Closing */ on next line.
> >
> >
> >> GET_CURRENT_CONTEXT(ctx);
> >> if (ctx)
> >> ctx->Driver.DeleteTexture(ctx, oldTex);
> >> @@ -1571,6 +1573,108 @@ _mesa_BindTexture( GLenum target, GLuint
> texName )
> >> ctx->Driver.BindTexture(ctx, ctx->Texture.CurrentUnit, target,
> >> newTexObj);
> >> }
> >>
> >> +/** Do the actual binding to a numbered texture unit.
> >
> >
> > /**
> > * Do the ...
> >
> >
> >> + * The refcount on the previously bound
> >> + * texture object will be decremented. It'll be deleted if the
> >> + * count hits zero.
> >> + */
> >> +void
> >> +_mesa_bind_texture_unit( struct gl_context *ctx,
> >> + GLuint unit,
> >> + struct gl_texture_object *texObj )
> >> +{
> >> + struct gl_texture_unit *texUnit;
> >> +
> >> + /* Get the texture unit (this is an array look-up) */
> >> + texUnit = _mesa_get_tex_unit_err(ctx, unit, "glBindTextureUnit");
> >> + if (!texUnit)
> >> + return;
> >> +
> >> + /* Check if this texture is only used by this context and is already
> >> bound.
> >> + * If so, just return.
> >> + */
> >> + {
> >> + GLboolean early_out;
> >
> >
> > bool
> >
> >
> >> + mtx_lock(&ctx->Shared->Mutex);
> >> + early_out = ((ctx->Shared->RefCount == 1)
> >> + && (texObj ==
> >> texUnit->CurrentTex[texObj->TargetIndex]));
> >> + mtx_unlock(&ctx->Shared->Mutex);
> >> + if (early_out) {
> >> + return;
> >> + }
> >> + }
> >> +
> >> + /* flush before changing binding */
> >> + FLUSH_VERTICES(ctx, _NEW_TEXTURE);
> >> +
> >> + _mesa_reference_texobj(&texUnit->CurrentTex[texObj->TargetIndex],
> >> + texObj);
> >> + ASSERT(texUnit->CurrentTex[texObj->TargetIndex]);
> >> + ctx->Texture.NumCurrentTexUsed =
> MAX2(ctx->Texture.NumCurrentTexUsed,
> >> + unit + 1);
> >> + texUnit->_BoundTextures |= (1 << texObj->TargetIndex);
> >> +
> >> +
> >> + /* Pass BindTexture call to device driver */
> >> + if (ctx->Driver.BindTexture)
> >> + {
> >
> >
> > Opening { on the if line.
> >
> >
> >
> >> + ctx->Driver.BindTexture(ctx, unit, texObj->Target, texObj);
> >> + }
> >> +}
> >> +
> >> +/**
> >> + * Bind a named texture to the specified texture unit.
> >> + *
> >> + * \param unit texture unit.
> >> + * \param texture texture name.
> >> + *
> >> + * \sa glBindTexture().
> >> + *
> >> + * If the named texture is 0, this will reset each target for the
> >> specified
> >> + * texture unit to its default texture.
> >> + * If the named texture is not 0 or a recognized texture name, this
> >> throws
> >> + * GL_INVALID_OPERATION.
> >> + */
> >> +void GLAPIENTRY
> >> +_mesa_BindTextureUnit( GLuint unit, GLuint texture )
> >> +{
> >> + GET_CURRENT_CONTEXT(ctx);
> >> + struct gl_texture_object *texObj;
> >> +
> >> + if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
> >> + _mesa_debug(ctx, "glBindTextureUnit %s %d\n",
> >> + _mesa_lookup_enum_by_nr(GL_TEXTURE0+unit), (GLint)
> >> texture);
> >> +
> >> + /* Section 8.1 (Texture Objects) of the OpenGL 4.5 core profile spec
> >> + * (20141030) says:
> >> + * "When texture is zero, each of the targets enumerated at the
> >> + * beginning of this section is reset to its default texture for
> >> the
> >> + * corresponding texture image unit."
> >> + */
> >> + if (texture == 0) {
> >> + unbind_textures_from_unit(ctx, unit);
> >> + return;
> >> + }
> >> +
> >> + /* Get the non-default texture object */
> >> + texObj = _mesa_lookup_texture(ctx, texture);
> >> +
> >> + /* Error checking */
> >> + if (!texObj) {
> >> + _mesa_error(ctx, GL_INVALID_OPERATION,
> >> + "glBindTextureUnit(non-gen name)");
> >> + return;
> >> + }
> >> + if (texObj->Target == 0) {
> >> + _mesa_error(ctx, GL_INVALID_ENUM, "glBindTextureUnit(target)");
> >> + return;
> >> + }
> >> + assert(valid_texture_object(texObj));
> >> +
> >> + _mesa_bind_texture_unit(ctx, unit, texObj);
> >> +}
> >> +
> >> +
> >> void GLAPIENTRY
> >> _mesa_BindTextures(GLuint first, GLsizei count, const GLuint
> *textures)
> >> {
> >> diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h
> >> index b957ac5..34daebb 100644
> >> --- a/src/mesa/main/texobj.h
> >> +++ b/src/mesa/main/texobj.h
> >> @@ -85,12 +85,12 @@ _mesa_clear_texture_object(struct gl_context *ctx,
> >> struct gl_texture_object *obj);
> >>
> >> extern void
> >> -_mesa_reference_texobj_(struct gl_texture_object **ptr,
> >> - struct gl_texture_object *tex);
> >> +_mesa_reference_texobj_( struct gl_texture_object **ptr,
> >> + struct gl_texture_object *tex );
> >>
> >> static inline void
> >> -_mesa_reference_texobj(struct gl_texture_object **ptr,
> >> - struct gl_texture_object *tex)
> >> +_mesa_reference_texobj( struct gl_texture_object **ptr,
> >> + struct gl_texture_object *tex )
> >> {
> >> if (*ptr != tex)
> >> _mesa_reference_texobj_(ptr, tex);
> >> @@ -190,6 +190,11 @@ _mesa_unlock_context_textures( struct gl_context
> *ctx
> >> );
> >> extern void
> >> _mesa_lock_context_textures( struct gl_context *ctx );
> >>
> >> +extern void
> >> +_mesa_bind_texture_unit( struct gl_context *ctx,
> >> + GLuint unit,
> >> + struct gl_texture_object *texObj );
> >> +
> >> /*@}*/
> >>
> >> /**
> >> @@ -210,6 +215,8 @@ _mesa_DeleteTextures( GLsizei n, const GLuint
> >> *textures );
> >> extern void GLAPIENTRY
> >> _mesa_BindTexture( GLenum target, GLuint texture );
> >>
> >> +extern void GLAPIENTRY
> >> +_mesa_BindTextureUnit( GLuint unit, GLuint texture );
> >>
> >> extern void GLAPIENTRY
> >> _mesa_BindTextures( GLuint first, GLsizei count, const GLuint
> *textures
> >> );
> >> diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c
> >> index 36eefa6..66fd718 100644
> >> --- a/src/mesa/main/texstate.c
> >> +++ b/src/mesa/main/texstate.c
> >> @@ -290,9 +290,7 @@ _mesa_ActiveTexture(GLenum texture)
> >> GLuint k;
> >> GET_CURRENT_CONTEXT(ctx);
> >>
> >> - /* See OpenGL spec for glActiveTexture: */
> >> - k = MAX2(ctx->Const.MaxCombinedTextureImageUnits,
> >> - ctx->Const.MaxTextureCoordUnits);
> >> + k = _mesa_max_tex_unit(ctx);
> >>
> >> ASSERT(k <= Elements(ctx->Texture.Unit));
> >>
> >> diff --git a/src/mesa/main/texstate.h b/src/mesa/main/texstate.h
> >> index 5cd1684..2514d10 100644
> >> --- a/src/mesa/main/texstate.h
> >> +++ b/src/mesa/main/texstate.h
> >> @@ -33,9 +33,19 @@
> >>
> >>
> >> #include "compiler.h"
> >> +#include "enums.h"
> >> +#include "macros.h"
> >> #include "mtypes.h"
> >>
> >>
> >> +static inline struct gl_texture_unit *
> >> +_mesa_get_tex_unit(struct gl_context *ctx, GLuint unit)
> >> +{
> >> + ASSERT(unit >= 0);
> >> + ASSERT(unit < Elements(ctx->Texture.Unit));
> >> + return &(ctx->Texture.Unit[unit]);
> >> +}
> >> +
> >> /**
> >> * Return pointer to current texture unit.
> >> * This the texture unit set by glActiveTexture(), not
> >> glClientActiveTexture().
> >> @@ -43,8 +53,33 @@
> >> static inline struct gl_texture_unit *
> >> _mesa_get_current_tex_unit(struct gl_context *ctx)
> >> {
> >> - ASSERT(ctx->Texture.CurrentUnit < Elements(ctx->Texture.Unit));
> >> - return &(ctx->Texture.Unit[ctx->Texture.CurrentUnit]);
> >> + return _mesa_get_tex_unit(ctx, ctx->Texture.CurrentUnit);
> >> +}
> >> +
> >> +static inline GLuint
> >> +_mesa_max_tex_unit(struct gl_context *ctx)
> >> +{
> >> + /* See OpenGL spec for glActiveTexture: */
> >> + return MAX2(ctx->Const.MaxCombinedTextureImageUnits,
> >> + ctx->Const.MaxTextureCoordUnits);
> >> +}
> >> +
> >> +static inline struct gl_texture_unit *
> >> +_mesa_get_tex_unit_err(struct gl_context *ctx, GLuint unit, const char
> >> *func)
> >> +{
> >> + if (unit < _mesa_max_tex_unit(ctx))
> >> + return _mesa_get_tex_unit(ctx, unit);
> >> +
> >> + /* Note: This error is a precedent set by glBindTextures. From the
> GL
> >> 4.5
> >> + * specification (30.10.2014) Section 8.1 ("Texture Objects"):
> >> + *
> >> + * "An INVALID_OPERATION error is generated if first + count is
> >> greater
> >> + * than the number of texture image units supported by the
> >> + * implementation."
> >> + */
> >> + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unit=%s)", func,
> >> + _mesa_lookup_enum_by_nr(GL_TEXTURE0+unit));
> >> + return NULL;
> >> }
> >>
> >>
> >>
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150105/952cf7e3/attachment-0001.html>
More information about the mesa-dev
mailing list