summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibGL/Shader.cpp20
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)