mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 03:37:43 +00:00
LibGL: Use LibGLSL to compile shaders
This commit is contained in:
parent
67b2f8d68d
commit
4ad41e6680
4 changed files with 62 additions and 3 deletions
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <LibGL/GL/gl.h>
|
#include <LibGL/GL/gl.h>
|
||||||
#include <LibGL/Shaders/Program.h>
|
#include <LibGL/Shaders/Program.h>
|
||||||
|
#include <LibGLSL/Linker.h>
|
||||||
|
|
||||||
namespace GL {
|
namespace GL {
|
||||||
|
|
||||||
|
@ -49,7 +50,42 @@ ErrorOr<void> Program::attach_shader(Shader& shader)
|
||||||
|
|
||||||
ErrorOr<void> Program::link()
|
ErrorOr<void> Program::link()
|
||||||
{
|
{
|
||||||
// FIXME: Implement actual program linker
|
m_info_log = TRY(String::from_utf8(""sv));
|
||||||
|
|
||||||
|
GLSL::Linker linker;
|
||||||
|
|
||||||
|
// Link vertex shader objects
|
||||||
|
|
||||||
|
Vector<GLSL::ObjectFile const*> vertex_shader_object_files;
|
||||||
|
for (auto vertex_shader : m_vertex_shaders)
|
||||||
|
vertex_shader_object_files.append(vertex_shader->object_file());
|
||||||
|
|
||||||
|
auto linked_vertex_shader_or_error = linker.link(vertex_shader_object_files);
|
||||||
|
|
||||||
|
if (linked_vertex_shader_or_error.is_error()) {
|
||||||
|
m_link_status = false;
|
||||||
|
m_info_log = linker.messages();
|
||||||
|
return linked_vertex_shader_or_error.error();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_linked_vertex_shader = linked_vertex_shader_or_error.release_value();
|
||||||
|
|
||||||
|
// Link fragment shader objects
|
||||||
|
|
||||||
|
Vector<GLSL::ObjectFile const*> fragment_shader_object_files;
|
||||||
|
for (auto fragment_shader : m_fragment_shaders)
|
||||||
|
fragment_shader_object_files.append(fragment_shader->object_file());
|
||||||
|
|
||||||
|
auto linked_fragment_shader_or_error = linker.link(fragment_shader_object_files);
|
||||||
|
|
||||||
|
if (linked_fragment_shader_or_error.is_error()) {
|
||||||
|
m_link_status = false;
|
||||||
|
m_info_log = linker.messages();
|
||||||
|
return linked_fragment_shader_or_error.error();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_linked_fragment_shader = linked_fragment_shader_or_error.release_value();
|
||||||
|
|
||||||
m_link_status = true;
|
m_link_status = true;
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,12 @@
|
||||||
#include <AK/Error.h>
|
#include <AK/Error.h>
|
||||||
#include <AK/NonnullRefPtr.h>
|
#include <AK/NonnullRefPtr.h>
|
||||||
#include <AK/Optional.h>
|
#include <AK/Optional.h>
|
||||||
|
#include <AK/OwnPtr.h>
|
||||||
#include <AK/RefCounted.h>
|
#include <AK/RefCounted.h>
|
||||||
#include <AK/String.h>
|
#include <AK/String.h>
|
||||||
#include <AK/Vector.h>
|
#include <AK/Vector.h>
|
||||||
#include <LibGL/Shaders/Shader.h>
|
#include <LibGL/Shaders/Shader.h>
|
||||||
|
#include <LibGLSL/LinkedShader.h>
|
||||||
|
|
||||||
namespace GL {
|
namespace GL {
|
||||||
|
|
||||||
|
@ -31,6 +33,8 @@ private:
|
||||||
Vector<NonnullRefPtr<Shader>> m_vertex_shaders;
|
Vector<NonnullRefPtr<Shader>> m_vertex_shaders;
|
||||||
Vector<NonnullRefPtr<Shader>> m_fragment_shaders;
|
Vector<NonnullRefPtr<Shader>> m_fragment_shaders;
|
||||||
Optional<String> m_info_log;
|
Optional<String> m_info_log;
|
||||||
|
OwnPtr<GLSL::LinkedShader> m_linked_vertex_shader;
|
||||||
|
OwnPtr<GLSL::LinkedShader> m_linked_fragment_shader;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <AK/String.h>
|
#include <AK/String.h>
|
||||||
#include <LibGL/Shaders/Shader.h>
|
#include <LibGL/Shaders/Shader.h>
|
||||||
|
#include <LibGLSL/Compiler.h>
|
||||||
|
|
||||||
namespace GL {
|
namespace GL {
|
||||||
|
|
||||||
|
@ -23,8 +24,22 @@ ErrorOr<void> Shader::add_source(StringView source_code)
|
||||||
|
|
||||||
ErrorOr<void> Shader::compile()
|
ErrorOr<void> Shader::compile()
|
||||||
{
|
{
|
||||||
// FIXME: Implement actual shader compilation
|
m_info_log = TRY(String::from_utf8(""sv));
|
||||||
|
|
||||||
|
GLSL::Compiler compiler;
|
||||||
|
|
||||||
|
auto object_file_or_error = compiler.compile(m_sources);
|
||||||
|
|
||||||
|
if (object_file_or_error.is_error()) {
|
||||||
|
m_compile_status = false;
|
||||||
|
m_info_log = compiler.messages();
|
||||||
|
return object_file_or_error.error();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_object_file = object_file_or_error.release_value();
|
||||||
|
|
||||||
m_compile_status = true;
|
m_compile_status = true;
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,14 @@
|
||||||
#include <AK/Error.h>
|
#include <AK/Error.h>
|
||||||
#include <AK/NonnullRefPtr.h>
|
#include <AK/NonnullRefPtr.h>
|
||||||
#include <AK/Optional.h>
|
#include <AK/Optional.h>
|
||||||
|
#include <AK/OwnPtr.h>
|
||||||
#include <AK/RefCounted.h>
|
#include <AK/RefCounted.h>
|
||||||
#include <AK/RefPtr.h>
|
#include <AK/RefPtr.h>
|
||||||
#include <AK/String.h>
|
#include <AK/String.h>
|
||||||
#include <AK/StringView.h>
|
#include <AK/StringView.h>
|
||||||
#include <AK/Vector.h>
|
#include <AK/Vector.h>
|
||||||
#include <LibGL/GL/glplatform.h>
|
#include <LibGL/GL/gl.h>
|
||||||
|
#include <LibGLSL/ObjectFile.h>
|
||||||
|
|
||||||
namespace GL {
|
namespace GL {
|
||||||
|
|
||||||
|
@ -27,6 +29,7 @@ public:
|
||||||
ErrorOr<void> compile();
|
ErrorOr<void> compile();
|
||||||
GLenum type() const { return m_type; }
|
GLenum type() const { return m_type; }
|
||||||
bool compile_status() const { return m_compile_status; }
|
bool compile_status() const { return m_compile_status; }
|
||||||
|
GLSL::ObjectFile const* object_file() const { return m_object_file.ptr(); }
|
||||||
|
|
||||||
size_t info_log_length() const;
|
size_t info_log_length() const;
|
||||||
size_t combined_source_length() const;
|
size_t combined_source_length() const;
|
||||||
|
@ -41,6 +44,7 @@ private:
|
||||||
GLenum m_type;
|
GLenum m_type;
|
||||||
bool m_compile_status { false };
|
bool m_compile_status { false };
|
||||||
Optional<String> m_info_log;
|
Optional<String> m_info_log;
|
||||||
|
OwnPtr<GLSL::ObjectFile> m_object_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue