mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:57:35 +00:00
LibGL: Implement texture unit texturing states
This commit is contained in:
parent
c7b90fa7d3
commit
5788a139d8
5 changed files with 67 additions and 4 deletions
|
@ -188,7 +188,10 @@ extern "C" {
|
||||||
#define GL_REPLACE 0x1E01
|
#define GL_REPLACE 0x1E01
|
||||||
|
|
||||||
// Texture targets
|
// Texture targets
|
||||||
|
#define GL_TEXTURE_1D 0x0DE0
|
||||||
#define GL_TEXTURE_2D 0x0DE1
|
#define GL_TEXTURE_2D 0x0DE1
|
||||||
|
#define GL_TEXTURE_3D 0x806F
|
||||||
|
#define GL_TEXTURE_CUBE_MAP 0x8513
|
||||||
|
|
||||||
// Texture Unit indices
|
// Texture Unit indices
|
||||||
#define GL_TEXTURE0 0x84C0
|
#define GL_TEXTURE0 0x84C0
|
||||||
|
|
|
@ -553,6 +553,18 @@ void SoftwareGLContext::gl_enable(GLenum capability)
|
||||||
rasterizer_options.scissor_enabled = true;
|
rasterizer_options.scissor_enabled = true;
|
||||||
update_rasterizer_options = true;
|
update_rasterizer_options = true;
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_1D:
|
||||||
|
m_active_texture_unit->set_texture_1d_enabled(true);
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_2D:
|
||||||
|
m_active_texture_unit->set_texture_2d_enabled(true);
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_3D:
|
||||||
|
m_active_texture_unit->set_texture_3d_enabled(true);
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_CUBE_MAP:
|
||||||
|
m_active_texture_unit->set_texture_cube_map_enabled(true);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
|
RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
|
||||||
}
|
}
|
||||||
|
@ -597,6 +609,18 @@ void SoftwareGLContext::gl_disable(GLenum capability)
|
||||||
rasterizer_options.scissor_enabled = false;
|
rasterizer_options.scissor_enabled = false;
|
||||||
update_rasterizer_options = true;
|
update_rasterizer_options = true;
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_1D:
|
||||||
|
m_active_texture_unit->set_texture_1d_enabled(false);
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_2D:
|
||||||
|
m_active_texture_unit->set_texture_2d_enabled(false);
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_3D:
|
||||||
|
m_active_texture_unit->set_texture_3d_enabled(false);
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_CUBE_MAP:
|
||||||
|
m_active_texture_unit->set_texture_cube_map_enabled(false);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
|
RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
|
||||||
}
|
}
|
||||||
|
@ -1458,6 +1482,18 @@ void SoftwareGLContext::gl_get_booleanv(GLenum pname, GLboolean* data)
|
||||||
case GL_CULL_FACE:
|
case GL_CULL_FACE:
|
||||||
*data = m_cull_faces ? GL_TRUE : GL_FALSE;
|
*data = m_cull_faces ? GL_TRUE : GL_FALSE;
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_1D:
|
||||||
|
*data = m_active_texture_unit->texture_1d_enabled() ? GL_TRUE : GL_FALSE;
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_2D:
|
||||||
|
*data = m_active_texture_unit->texture_2d_enabled() ? GL_TRUE : GL_FALSE;
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_3D:
|
||||||
|
*data = m_active_texture_unit->texture_3d_enabled() ? GL_TRUE : GL_FALSE;
|
||||||
|
break;
|
||||||
|
case GL_TEXTURE_CUBE_MAP:
|
||||||
|
*data = m_active_texture_unit->texture_cube_map_enabled() ? GL_TRUE : GL_FALSE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// According to the Khronos docs, we always return GL_INVALID_ENUM if we encounter a non-accepted value
|
// According to the Khronos docs, we always return GL_INVALID_ENUM if we encounter a non-accepted value
|
||||||
// for `pname`
|
// for `pname`
|
||||||
|
|
|
@ -498,8 +498,17 @@ void SoftwareRasterizer::submit_triangle(const GLTriangle& triangle, const Array
|
||||||
if (!texture_unit.is_bound())
|
if (!texture_unit.is_bound())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// FIXME: Don't assume Texture2D
|
// FIXME: implement GL_TEXTURE_1D, GL_TEXTURE_3D and GL_TEXTURE_CUBE_MAP
|
||||||
auto texel = texture_unit.bound_texture_2d()->sampler().sample(uv);
|
FloatVector4 texel;
|
||||||
|
switch (texture_unit.currently_bound_target()) {
|
||||||
|
case GL_TEXTURE_2D:
|
||||||
|
if (!texture_unit.texture_2d_enabled() || texture_unit.texture_3d_enabled() || texture_unit.texture_cube_map_enabled())
|
||||||
|
continue;
|
||||||
|
texel = texture_unit.bound_texture_2d()->sampler().sample(uv);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: Implement more blend modes
|
// FIXME: Implement more blend modes
|
||||||
switch (texture_unit.env_mode()) {
|
switch (texture_unit.env_mode()) {
|
||||||
|
|
|
@ -14,8 +14,8 @@ void TextureUnit::bind_texture_to_target(GLenum texture_target, const RefPtr<Tex
|
||||||
switch (texture_target) {
|
switch (texture_target) {
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
m_texture_target_2d = static_ptr_cast<Texture2D>(texture);
|
m_texture_target_2d = static_ptr_cast<Texture2D>(texture);
|
||||||
m_currently_bound_texture = texture;
|
|
||||||
m_currently_bound_target = GL_TEXTURE_2D;
|
m_currently_bound_target = GL_TEXTURE_2D;
|
||||||
|
m_currently_bound_texture = texture;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
|
@ -27,7 +27,7 @@ void TextureUnit::unbind_texture(GLenum texture_target)
|
||||||
switch (texture_target) {
|
switch (texture_target) {
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
m_texture_target_2d = nullptr;
|
m_texture_target_2d = nullptr;
|
||||||
m_currently_bound_target = 0;
|
m_currently_bound_target = GL_NONE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
|
|
|
@ -27,11 +27,26 @@ public:
|
||||||
void set_env_mode(GLenum mode) { m_env_mode = mode; }
|
void set_env_mode(GLenum mode) { m_env_mode = mode; }
|
||||||
GLenum env_mode() const { return m_env_mode; }
|
GLenum env_mode() const { return m_env_mode; }
|
||||||
|
|
||||||
|
bool texture_1d_enabled() const { return m_texture_1d_enabled; };
|
||||||
|
void set_texture_1d_enabled(bool texture_1d_enabled) { m_texture_1d_enabled = texture_1d_enabled; }
|
||||||
|
bool texture_2d_enabled() const { return m_texture_2d_enabled; };
|
||||||
|
void set_texture_2d_enabled(bool texture_2d_enabled) { m_texture_2d_enabled = texture_2d_enabled; }
|
||||||
|
bool texture_3d_enabled() const { return m_texture_3d_enabled; };
|
||||||
|
void set_texture_3d_enabled(bool texture_3d_enabled) { m_texture_3d_enabled = texture_3d_enabled; }
|
||||||
|
bool texture_cube_map_enabled() const { return m_texture_cube_map_enabled; };
|
||||||
|
void set_texture_cube_map_enabled(bool texture_cube_map_enabled) { m_texture_cube_map_enabled = texture_cube_map_enabled; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable RefPtr<Texture2D> m_texture_target_2d { nullptr };
|
mutable RefPtr<Texture2D> m_texture_target_2d { nullptr };
|
||||||
mutable RefPtr<Texture> m_currently_bound_texture { nullptr };
|
mutable RefPtr<Texture> m_currently_bound_texture { nullptr };
|
||||||
GLenum m_currently_bound_target;
|
GLenum m_currently_bound_target;
|
||||||
GLenum m_env_mode { GL_MODULATE };
|
GLenum m_env_mode { GL_MODULATE };
|
||||||
|
|
||||||
|
// Texturing state per unit, in increasing priority:
|
||||||
|
bool m_texture_1d_enabled { false };
|
||||||
|
bool m_texture_2d_enabled { false };
|
||||||
|
bool m_texture_3d_enabled { false };
|
||||||
|
bool m_texture_cube_map_enabled { false };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue