mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
utils: slight improvements to gl_bind_texture().
This commit is contained in:
parent
30ef6802d6
commit
9b9c049a67
1 changed files with 55 additions and 32 deletions
|
@ -166,6 +166,39 @@ gl_get_texture_param(GLenum target, GLenum param, guint *pval)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gl_get_texture_binding:
|
||||||
|
* @target: a texture target
|
||||||
|
*
|
||||||
|
* Determines the texture binding type for the specified target.
|
||||||
|
*
|
||||||
|
* Return value: texture binding type for @target
|
||||||
|
*/
|
||||||
|
static GLenum
|
||||||
|
gl_get_texture_binding(GLenum target)
|
||||||
|
{
|
||||||
|
GLenum binding;
|
||||||
|
|
||||||
|
switch (target) {
|
||||||
|
case GL_TEXTURE_1D:
|
||||||
|
binding = GL_TEXTURE_BINDING_1D;
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_2D:
|
||||||
|
binding = GL_TEXTURE_BINDING_2D;
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_3D:
|
||||||
|
binding = GL_TEXTURE_BINDING_3D;
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_RECTANGLE_ARB:
|
||||||
|
binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
binding = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return binding;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gl_set_bgcolor:
|
* gl_set_bgcolor:
|
||||||
* @color: the requested RGB color
|
* @color: the requested RGB color
|
||||||
|
@ -455,42 +488,32 @@ gl_swap_buffers(GLContextState *cs)
|
||||||
gboolean
|
gboolean
|
||||||
gl_bind_texture(GLTextureState *ts, GLenum target, GLuint texture)
|
gl_bind_texture(GLTextureState *ts, GLenum target, GLuint texture)
|
||||||
{
|
{
|
||||||
ts->target = target;
|
GLenum binding;
|
||||||
ts->old_texture = 0;
|
|
||||||
ts->was_bound = 0;
|
|
||||||
ts->was_enabled = glIsEnabled(target);
|
|
||||||
if (!ts->was_enabled)
|
|
||||||
glEnable(target);
|
|
||||||
|
|
||||||
GLenum texture_binding;
|
ts->target = target;
|
||||||
switch (target) {
|
|
||||||
case GL_TEXTURE_1D:
|
|
||||||
texture_binding = GL_TEXTURE_BINDING_1D;
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_2D:
|
|
||||||
texture_binding = GL_TEXTURE_BINDING_2D;
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_3D:
|
|
||||||
texture_binding = GL_TEXTURE_BINDING_3D;
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_RECTANGLE_ARB:
|
|
||||||
texture_binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert(!texture);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gl_get_param(texture_binding, &ts->old_texture))
|
if (glIsEnabled(target)) {
|
||||||
return FALSE;
|
binding = gl_get_texture_binding(target);
|
||||||
|
if (!binding)
|
||||||
ts->was_bound = texture == ts->old_texture;
|
|
||||||
if (!ts->was_bound) {
|
|
||||||
gl_purge_errors();
|
|
||||||
glBindTexture(target, texture);
|
|
||||||
if (gl_check_error())
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
if (!gl_get_param(binding, &ts->old_texture))
|
||||||
|
return FALSE;
|
||||||
|
ts->was_enabled = TRUE;
|
||||||
|
ts->was_bound = texture == ts->old_texture;
|
||||||
|
if (ts->was_bound)
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
glEnable(target);
|
||||||
|
ts->old_texture = 0;
|
||||||
|
ts->was_enabled = FALSE;
|
||||||
|
ts->was_bound = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_purge_errors();
|
||||||
|
glBindTexture(target, texture);
|
||||||
|
if (gl_check_error())
|
||||||
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue