diff options
author | Stephan Unverwerth <s.unverwerth@serenityos.org> | 2022-08-28 11:12:31 +0200 |
---|---|---|
committer | Andrew Kaster <andrewdkaster@gmail.com> | 2022-12-17 22:39:09 -0700 |
commit | d5277ecdfe605442d12a6c6c7ff57f9d559cc77c (patch) | |
tree | 6774cbadd8fcfbc2e8b9c02dc1bffbad7ffe2ffb | |
parent | 962d088e4e3f03f137e527b75e27cb64d83d5040 (diff) | |
download | serenity-d5277ecdfe605442d12a6c6c7ff57f9d559cc77c.zip |
LibGL: Implement glShaderSource
-rw-r--r-- | Userland/Libraries/LibGL/Shader.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/Userland/Libraries/LibGL/Shader.cpp b/Userland/Libraries/LibGL/Shader.cpp index e3b1418040..52c6a57edc 100644 --- a/Userland/Libraries/LibGL/Shader.cpp +++ b/Userland/Libraries/LibGL/Shader.cpp @@ -5,6 +5,7 @@ */ #include <AK/Debug.h> +#include <AK/StringBuilder.h> #include <LibGL/GLContext.h> namespace GL { @@ -40,8 +41,23 @@ void GLContext::gl_delete_shader(GLuint shader) void GLContext::gl_shader_source(GLuint shader, GLsizei count, GLchar const** string, GLint const* length) { - dbgln("gl_shader_source({}, {}, {#x}, {#x}) unimplemented ", shader, count, string, length); - TODO(); + auto it = m_allocated_shaders.find(shader); + // FIXME: implement check "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL." + RETURN_WITH_ERROR_IF(it == m_allocated_shaders.end(), GL_INVALID_OPERATION); + RETURN_WITH_ERROR_IF(count < 0, GL_INVALID_VALUE); + + it->value->clear_sources(); + for (int i = 0; i < count; i++) { + if (length == nullptr || length[i] < 0) { + auto result = it->value->add_source(StringView(string[i], strlen(string[i]))); + RETURN_WITH_ERROR_IF(result.is_error() && result.error().is_errno() && result.error().code() == ENOMEM, GL_OUT_OF_MEMORY); + RETURN_WITH_ERROR_IF(result.is_error(), GL_INVALID_OPERATION); + } else { + auto result = it->value->add_source(StringView(string[i], length[i])); + RETURN_WITH_ERROR_IF(result.is_error() && result.error().is_errno() && result.error().code() == ENOMEM, GL_OUT_OF_MEMORY); + RETURN_WITH_ERROR_IF(result.is_error(), GL_INVALID_OPERATION); + } + } } void GLContext::gl_compile_shader(GLuint shader) |