浏览代码

LibGL: Implement glUseProgram

Stephan Unverwerth 2 年之前
父节点
当前提交
69171e7a05

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

@@ -825,6 +825,7 @@ GLAPI GLuint glCreateProgram();
 GLAPI void glDeleteProgram(GLuint program);
 GLAPI void glAttachShader(GLuint program, GLuint shader);
 GLAPI void glLinkProgram(GLuint program);
+GLAPI void glUseProgram(GLuint program);
 
 #ifdef __cplusplus
 }

+ 5 - 0
Userland/Libraries/LibGL/GLAPI.cpp

@@ -1043,6 +1043,11 @@ void glTranslatef(GLfloat x, GLfloat y, GLfloat z)
     g_gl_context->gl_translate(x, y, z);
 }
 
+void glUseProgram(GLuint program)
+{
+    g_gl_context->gl_use_program(program);
+}
+
 void glVertex2d(GLdouble x, GLdouble y)
 {
     g_gl_context->gl_vertex(x, y, 0.0, 1.0);

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

@@ -239,6 +239,7 @@ public:
     void gl_delete_program(GLuint program);
     void gl_attach_shader(GLuint program, GLuint shader);
     void gl_link_program(GLuint program);
+    void gl_use_program(GLuint program);
 
 private:
     void sync_device_config();
@@ -414,6 +415,7 @@ private:
     NameAllocator m_program_name_allocator;
     HashMap<GLuint, RefPtr<Shader>> m_allocated_shaders;
     HashMap<GLuint, RefPtr<Program>> m_allocated_programs;
+    RefPtr<Program> m_current_program;
 
     struct Listing {
 

+ 17 - 0
Userland/Libraries/LibGL/Shader.cpp

@@ -118,4 +118,21 @@ void GLContext::gl_link_program(GLuint program)
     (void)program_it->value->link();
 }
 
+void GLContext::gl_use_program(GLuint program)
+{
+    if (program == 0) {
+        m_current_program = nullptr;
+        return;
+    }
+
+    auto it = m_allocated_programs.find(program);
+
+    // FIXME: implement check "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL."
+    RETURN_WITH_ERROR_IF(it == m_allocated_programs.end(), GL_INVALID_OPERATION);
+    // FIXME: implement check "GL_INVALID_OPERATION is generated if transform feedback mode is active."
+    RETURN_WITH_ERROR_IF(it->value->link_status() != true, GL_INVALID_OPERATION);
+
+    m_current_program = it->value;
+}
+
 }