Serenity Operating System
1/*
2 * Copyright (c) 2022, Stephan Unverwerth <s.unverwerth@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Error.h>
10#include <AK/NonnullRefPtr.h>
11#include <AK/Optional.h>
12#include <AK/OwnPtr.h>
13#include <AK/RefCounted.h>
14#include <AK/String.h>
15#include <AK/Vector.h>
16#include <LibGL/Shaders/Shader.h>
17#include <LibGLSL/LinkedShader.h>
18#include <LibGPU/Device.h>
19#include <LibGPU/Shader.h>
20
21namespace GL {
22
23class Program final : public RefCounted<Program> {
24public:
25 static NonnullRefPtr<Program> create();
26
27 bool is_shader_attached(Shader const&) const;
28 ErrorOr<void> attach_shader(Shader&);
29 ErrorOr<void> link(GPU::Device&);
30 bool link_status() const { return m_link_status; }
31 size_t info_log_length() const;
32
33private:
34 bool m_link_status { false };
35 Vector<NonnullRefPtr<Shader const>> m_vertex_shaders;
36 Vector<NonnullRefPtr<Shader const>> m_fragment_shaders;
37 Optional<String> m_info_log;
38 OwnPtr<GLSL::LinkedShader> m_linked_vertex_shader;
39 OwnPtr<GLSL::LinkedShader> m_linked_fragment_shader;
40 RefPtr<GPU::Shader const> m_gpu_vertex_shader;
41 RefPtr<GPU::Shader const> m_gpu_fragment_shader;
42};
43
44}