mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 18:27:40 +00:00
LibGL: Add Texture Name Allocation
Texture names can now be allocated via `glGenTextures` and deallocated via `glDeleteTextures`.
This commit is contained in:
parent
8a69e6714e
commit
21dff6d40b
8 changed files with 118 additions and 0 deletions
|
@ -1,4 +1,5 @@
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
|
Tex/NameAllocator.cpp
|
||||||
Clipper.cpp
|
Clipper.cpp
|
||||||
GLBlend.cpp
|
GLBlend.cpp
|
||||||
GLColor.cpp
|
GLColor.cpp
|
||||||
|
@ -6,6 +7,7 @@ set(SOURCES
|
||||||
GLLights.cpp
|
GLLights.cpp
|
||||||
GLLists.cpp
|
GLLists.cpp
|
||||||
GLMat.cpp
|
GLMat.cpp
|
||||||
|
GLTexture.cpp
|
||||||
GLUtils.cpp
|
GLUtils.cpp
|
||||||
GLVert.cpp
|
GLVert.cpp
|
||||||
SoftwareGLContext.cpp
|
SoftwareGLContext.cpp
|
||||||
|
|
|
@ -180,8 +180,10 @@ GLAPI void glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a);
|
||||||
GLAPI void glColor4fv(const GLfloat* v);
|
GLAPI void glColor4fv(const GLfloat* v);
|
||||||
GLAPI void glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a);
|
GLAPI void glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a);
|
||||||
GLAPI void glColor4ubv(const GLubyte* v);
|
GLAPI void glColor4ubv(const GLubyte* v);
|
||||||
|
GLAPI void glDeleteTextures(GLsizei n, const GLuint* textures);
|
||||||
GLAPI void glEnd();
|
GLAPI void glEnd();
|
||||||
GLAPI void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal);
|
GLAPI void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal);
|
||||||
|
GLAPI void glGenTextures(GLsizei n, GLuint* textures);
|
||||||
GLAPI GLenum glGetError();
|
GLAPI GLenum glGetError();
|
||||||
GLAPI GLubyte* glGetString(GLenum name);
|
GLAPI GLubyte* glGetString(GLenum name);
|
||||||
GLAPI void glLoadIdentity();
|
GLAPI void glLoadIdentity();
|
||||||
|
|
|
@ -23,8 +23,10 @@ public:
|
||||||
virtual void gl_clear_color(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = 0;
|
virtual void gl_clear_color(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = 0;
|
||||||
virtual void gl_clear_depth(GLdouble depth) = 0;
|
virtual void gl_clear_depth(GLdouble depth) = 0;
|
||||||
virtual void gl_color(GLdouble r, GLdouble g, GLdouble b, GLdouble a) = 0;
|
virtual void gl_color(GLdouble r, GLdouble g, GLdouble b, GLdouble a) = 0;
|
||||||
|
virtual void gl_delete_textures(GLsizei n, const GLuint* textures) = 0;
|
||||||
virtual void gl_end() = 0;
|
virtual void gl_end() = 0;
|
||||||
virtual void gl_frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val) = 0;
|
virtual void gl_frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val) = 0;
|
||||||
|
virtual void gl_gen_textures(GLsizei n, GLuint* textures) = 0;
|
||||||
virtual GLenum gl_get_error() = 0;
|
virtual GLenum gl_get_error() = 0;
|
||||||
virtual GLubyte* gl_get_string(GLenum name) = 0;
|
virtual GLubyte* gl_get_string(GLenum name) = 0;
|
||||||
virtual void gl_load_identity() = 0;
|
virtual void gl_load_identity() = 0;
|
||||||
|
|
20
Userland/Libraries/LibGL/GLTexture.cpp
Normal file
20
Userland/Libraries/LibGL/GLTexture.cpp
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "GLContext.h"
|
||||||
|
#include <LibGL/GL/gl.h>
|
||||||
|
|
||||||
|
extern GL::GLContext* g_gl_context;
|
||||||
|
|
||||||
|
void glGenTextures(GLsizei n, GLuint* textures)
|
||||||
|
{
|
||||||
|
g_gl_context->gl_gen_textures(n, textures);
|
||||||
|
}
|
||||||
|
|
||||||
|
void glDeleteTextures(GLsizei n, const GLuint* textures)
|
||||||
|
{
|
||||||
|
g_gl_context->gl_delete_textures(n, textures);
|
||||||
|
}
|
|
@ -742,6 +742,36 @@ void SoftwareGLContext::gl_disable(GLenum capability)
|
||||||
m_rasterizer.set_options(rasterizer_options);
|
m_rasterizer.set_options(rasterizer_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoftwareGLContext::gl_gen_textures(GLsizei n, GLuint* textures)
|
||||||
|
{
|
||||||
|
if (n < 0) {
|
||||||
|
m_error = GL_INVALID_VALUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_in_draw_state) {
|
||||||
|
m_error = GL_INVALID_OPERATION;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_name_allocator.allocate(n, textures);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareGLContext::gl_delete_textures(GLsizei n, const GLuint* textures)
|
||||||
|
{
|
||||||
|
if (n < 0) {
|
||||||
|
m_error = GL_INVALID_VALUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_in_draw_state) {
|
||||||
|
m_error = GL_INVALID_OPERATION;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_name_allocator.free(n, textures);
|
||||||
|
}
|
||||||
|
|
||||||
void SoftwareGLContext::gl_front_face(GLenum face)
|
void SoftwareGLContext::gl_front_face(GLenum face)
|
||||||
{
|
{
|
||||||
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_front_face, face);
|
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_front_face, face);
|
||||||
|
|
|
@ -29,8 +29,10 @@ public:
|
||||||
virtual void gl_clear_color(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) override;
|
virtual void gl_clear_color(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) override;
|
||||||
virtual void gl_clear_depth(GLdouble depth) override;
|
virtual void gl_clear_depth(GLdouble depth) override;
|
||||||
virtual void gl_color(GLdouble r, GLdouble g, GLdouble b, GLdouble a) override;
|
virtual void gl_color(GLdouble r, GLdouble g, GLdouble b, GLdouble a) override;
|
||||||
|
virtual void gl_delete_textures(GLsizei n, const GLuint* textures) override;
|
||||||
virtual void gl_end() override;
|
virtual void gl_end() override;
|
||||||
virtual void gl_frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val) override;
|
virtual void gl_frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val) override;
|
||||||
|
virtual void gl_gen_textures(GLsizei n, GLuint* textures) override;
|
||||||
virtual GLenum gl_get_error() override;
|
virtual GLenum gl_get_error() override;
|
||||||
virtual GLubyte* gl_get_string(GLenum name) override;
|
virtual GLubyte* gl_get_string(GLenum name) override;
|
||||||
virtual void gl_load_identity() override;
|
virtual void gl_load_identity() override;
|
||||||
|
@ -124,6 +126,7 @@ private:
|
||||||
NonnullRefPtr<Gfx::Bitmap> m_frontbuffer;
|
NonnullRefPtr<Gfx::Bitmap> m_frontbuffer;
|
||||||
|
|
||||||
Clipper m_clipper;
|
Clipper m_clipper;
|
||||||
|
TextureNameAllocator m_name_allocator;
|
||||||
|
|
||||||
SoftwareRasterizer m_rasterizer;
|
SoftwareRasterizer m_rasterizer;
|
||||||
|
|
||||||
|
|
33
Userland/Libraries/LibGL/Tex/NameAllocator.cpp
Normal file
33
Userland/Libraries/LibGL/Tex/NameAllocator.cpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LibGL/Tex/NameAllocator.h>
|
||||||
|
|
||||||
|
namespace GL {
|
||||||
|
|
||||||
|
void TextureNameAllocator::allocate(GLsizei count, GLuint* textures)
|
||||||
|
{
|
||||||
|
for (auto i = 0; i < count; ++i) {
|
||||||
|
if (!m_free_texture_names.is_empty()) {
|
||||||
|
textures[i] = m_free_texture_names.top();
|
||||||
|
m_free_texture_names.pop();
|
||||||
|
} else {
|
||||||
|
// We're out of free previously allocated names. Let's allocate a new contiguous amount from the
|
||||||
|
// last known texture name
|
||||||
|
textures[i] = m_last_texture_id++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextureNameAllocator::free(GLsizei count, const GLuint* textures)
|
||||||
|
{
|
||||||
|
size_t tex_array_index = 0;
|
||||||
|
|
||||||
|
while (count-- > 0)
|
||||||
|
m_free_texture_names.push(textures[tex_array_index++]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
26
Userland/Libraries/LibGL/Tex/NameAllocator.h
Normal file
26
Userland/Libraries/LibGL/Tex/NameAllocator.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/Stack.h>
|
||||||
|
#include <LibGL/GL/gl.h>
|
||||||
|
|
||||||
|
namespace GL {
|
||||||
|
|
||||||
|
class TextureNameAllocator {
|
||||||
|
public:
|
||||||
|
TextureNameAllocator() = default;
|
||||||
|
|
||||||
|
void allocate(GLsizei count, GLuint* textures);
|
||||||
|
void free(GLsizei count, const GLuint* textures);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Stack<GLuint, 512> m_free_texture_names;
|
||||||
|
GLuint m_last_texture_id { 1 };
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue