diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index d4251f26a2..04e850b2d4 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -552,6 +552,7 @@ GLAPI void glTexParameterf(GLenum target, GLenum pname, GLfloat param); GLAPI void glTexEnvf(GLenum target, GLenum pname, GLfloat param); GLAPI void glTexEnvi(GLenum target, GLenum pname, GLint param); GLAPI void glBindTexture(GLenum target, GLuint texture); +GLAPI GLboolean glIsTexture(GLuint texture); GLAPI void glActiveTexture(GLenum texture); GLAPI void glGetBooleanv(GLenum pname, GLboolean* data); GLAPI void glGetDoublev(GLenum pname, GLdouble* params); diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index 42b93fe998..e33eeb6b5d 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -71,6 +71,7 @@ public: virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) = 0; virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) = 0; virtual void gl_bind_texture(GLenum target, GLuint texture) = 0; + virtual GLboolean gl_is_texture(GLuint texture) = 0; virtual void gl_active_texture(GLenum texture) = 0; virtual void gl_depth_mask(GLboolean flag) = 0; virtual void gl_enable_client_state(GLenum cap) = 0; diff --git a/Userland/Libraries/LibGL/GLTexture.cpp b/Userland/Libraries/LibGL/GLTexture.cpp index 181a6c140a..7b4e40f9eb 100644 --- a/Userland/Libraries/LibGL/GLTexture.cpp +++ b/Userland/Libraries/LibGL/GLTexture.cpp @@ -47,6 +47,11 @@ void glBindTexture(GLenum target, GLuint texture) g_gl_context->gl_bind_texture(target, texture); } +GLboolean glIsTexture(GLuint texture) +{ + return g_gl_context->gl_is_texture(texture); +} + // Note: This is an _extremely_ misleading API name. This sets the active // texture unit, NOT the active texture itself... void glActiveTexture(GLenum texture) diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index 9aa756796e..34ab226d7d 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1801,6 +1801,20 @@ void SoftwareGLContext::gl_bind_texture(GLenum target, GLuint texture) m_sampler_config_is_dirty = true; } +GLboolean SoftwareGLContext::gl_is_texture(GLuint texture) +{ + RETURN_VALUE_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION, GL_FALSE); + + if (texture == 0) + return GL_FALSE; + + auto it = m_allocated_textures.find(texture); + if (it == m_allocated_textures.end()) + return GL_FALSE; + + return it->value.is_null() ? GL_FALSE : GL_TRUE; +} + void SoftwareGLContext::gl_active_texture(GLenum texture) { RETURN_WITH_ERROR_IF(texture < GL_TEXTURE0 || texture > GL_TEXTURE31, GL_INVALID_ENUM); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index b8d9900a4e..06de61a85a 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -102,6 +102,7 @@ public: virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) override; virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) override; virtual void gl_bind_texture(GLenum target, GLuint texture) override; + virtual GLboolean gl_is_texture(GLuint texture) override; virtual void gl_active_texture(GLenum texture) override; virtual void gl_depth_mask(GLboolean flag) override; virtual void gl_enable_client_state(GLenum cap) override;