소스 검색

LibGL: Implement glTexParameter{i,f}

This currently only implements a subset of this function.
Namely setting wrap, mag and min modes for the GL_TETXURE_2D target.
Stephan Unverwerth 4 년 전
부모
커밋
b9523e15df

+ 10 - 1
Userland/Libraries/LibGL/GL/gl.h

@@ -198,7 +198,14 @@ extern "C" {
 // Texture Environment and Parameters
 #define GL_NEAREST 0x2600
 #define GL_LINEAR 0x2601
-#define GL_NEAREST_MIPMAP_LINEAR 0x2602
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
 #define GL_CLAMP 0x2900
 #define GL_REPEAT 0x2901
 #define GL_MIRRORED_REPEAT 0x8370
@@ -299,6 +306,8 @@ GLAPI void glReadBuffer(GLenum mode);
 GLAPI void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
 GLAPI void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data);
 GLAPI void glTexCoord2f(GLfloat s, GLfloat t);
+GLAPI void glTexParameteri(GLenum target, GLenum pname, GLint param);
+GLAPI void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
 GLAPI void glBindTexture(GLenum target, GLuint texture);
 GLAPI void glActiveTexture(GLenum texture);
 GLAPI void glGetFloatv(GLenum pname, GLfloat* params);

+ 1 - 0
Userland/Libraries/LibGL/GLContext.h

@@ -58,6 +58,7 @@ public:
     virtual void gl_read_buffer(GLenum mode) = 0;
     virtual void gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) = 0;
     virtual void gl_tex_image_2d(GLenum target, GLint level, GLint internal_format, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) = 0;
+    virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) = 0;
     virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) = 0;
     virtual void gl_bind_texture(GLenum target, GLuint texture) = 0;
     virtual void gl_active_texture(GLenum texture) = 0;

+ 10 - 0
Userland/Libraries/LibGL/GLTexture.cpp

@@ -36,3 +36,13 @@ void glActiveTexture(GLenum texture)
 {
     g_gl_context->gl_active_texture(texture);
 }
+
+void glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+    g_gl_context->gl_tex_parameter(target, pname, param);
+}
+
+void glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+    g_gl_context->gl_tex_parameter(target, pname, param);
+}

+ 70 - 0
Userland/Libraries/LibGL/SoftwareGLContext.cpp

@@ -714,6 +714,76 @@ void SoftwareGLContext::gl_tex_image_2d(GLenum target, GLint level, GLint intern
     m_active_texture_unit->bound_texture_2d()->upload_texture_data(target, level, internal_format, width, height, border, format, type, data);
 }
 
+void SoftwareGLContext::gl_tex_parameter(GLenum target, GLenum pname, GLfloat param)
+{
+    APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_tex_parameter, target, pname, param);
+
+    RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
+
+    // FIXME: We currently only support GL_TETXURE_2D targets. 1D, 3D and CUBE should also be supported (https://docs.gl/gl2/glTexParameter)
+    RETURN_WITH_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
+
+    // FIXME: implement the remaining parameters. (https://docs.gl/gl2/glTexParameter)
+    RETURN_WITH_ERROR_IF(!(pname == GL_TEXTURE_MIN_FILTER
+                             || pname == GL_TEXTURE_MAG_FILTER
+                             || pname == GL_TEXTURE_WRAP_S
+                             || pname == GL_TEXTURE_WRAP_T),
+        GL_INVALID_ENUM);
+
+    if (target == GL_TEXTURE_2D) {
+        auto texture2d = m_active_texture_unit->bound_texture_2d();
+        if (texture2d.is_null())
+            return;
+
+        switch (pname) {
+        case GL_TEXTURE_MIN_FILTER:
+            RETURN_WITH_ERROR_IF(!(param == GL_NEAREST
+                                     || param == GL_LINEAR
+                                     || param == GL_NEAREST_MIPMAP_NEAREST
+                                     || param == GL_LINEAR_MIPMAP_NEAREST
+                                     || param == GL_NEAREST_MIPMAP_LINEAR
+                                     || param == GL_LINEAR_MIPMAP_LINEAR),
+                GL_INVALID_ENUM);
+
+            texture2d->sampler().set_min_filter(param);
+            break;
+
+        case GL_TEXTURE_MAG_FILTER:
+            RETURN_WITH_ERROR_IF(!(param == GL_NEAREST
+                                     || param == GL_LINEAR),
+                GL_INVALID_ENUM);
+
+            texture2d->sampler().set_mag_filter(param);
+            break;
+
+        case GL_TEXTURE_WRAP_S:
+            RETURN_WITH_ERROR_IF(!(param == GL_CLAMP
+                                     || param == GL_CLAMP_TO_BORDER
+                                     || param == GL_CLAMP_TO_EDGE
+                                     || param == GL_MIRRORED_REPEAT
+                                     || param == GL_REPEAT),
+                GL_INVALID_ENUM);
+
+            texture2d->sampler().set_wrap_s_mode(param);
+            break;
+
+        case GL_TEXTURE_WRAP_T:
+            RETURN_WITH_ERROR_IF(!(param == GL_CLAMP
+                                     || param == GL_CLAMP_TO_BORDER
+                                     || param == GL_CLAMP_TO_EDGE
+                                     || param == GL_MIRRORED_REPEAT
+                                     || param == GL_REPEAT),
+                GL_INVALID_ENUM);
+
+            texture2d->sampler().set_wrap_t_mode(param);
+            break;
+
+        default:
+            VERIFY_NOT_REACHED();
+        }
+    }
+}
+
 void SoftwareGLContext::gl_front_face(GLenum face)
 {
     APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_front_face, face);

+ 3 - 1
Userland/Libraries/LibGL/SoftwareGLContext.h

@@ -68,6 +68,7 @@ public:
     virtual void gl_read_buffer(GLenum mode) override;
     virtual void gl_read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) override;
     virtual void gl_tex_image_2d(GLenum target, GLint level, GLint internal_format, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* data) override;
+    virtual void gl_tex_parameter(GLenum target, GLenum pname, GLfloat param) override;
     virtual void gl_tex_coord(GLfloat s, GLfloat t, GLfloat r, GLfloat q) override;
     virtual void gl_bind_texture(GLenum target, GLuint texture) override;
     virtual void gl_active_texture(GLenum texture) override;
@@ -194,7 +195,8 @@ private:
             decltype(&SoftwareGLContext::gl_shade_model),
             decltype(&SoftwareGLContext::gl_alpha_func),
             decltype(&SoftwareGLContext::gl_hint),
-            decltype(&SoftwareGLContext::gl_read_buffer)>;
+            decltype(&SoftwareGLContext::gl_read_buffer),
+            decltype(&SoftwareGLContext::gl_tex_parameter)>;
 
         using ExtraSavedArguments = Variant<
             FloatMatrix4x4>;

+ 1 - 0
Userland/Libraries/LibGL/Tex/Texture2D.h

@@ -42,6 +42,7 @@ public:
 
     GLenum internal_format() const { return m_internal_format; }
     Sampler2D const& sampler() const { return m_sampler; }
+    Sampler2D& sampler() { return m_sampler; }
 
 private:
     template<typename TCallback>