aboutsummaryrefslogtreecommitdiff
path: root/src/Platform/OpenGL
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-20 02:27:02 +0200
committerhachem <im@hachem.wtf>2026-08-20 02:40:07 +0200
commit5b361d81dbd2af0d0e99b9eb1adebea76ff05db0 (patch)
tree34db1df17e8c7248aeeb92156d635d31c2484e3f /src/Platform/OpenGL
parente3abaaf59777258ba06705135a0cafcb5918ad12 (diff)
[chore]: MASSIVE refactor + more vulkan bs
Diffstat (limited to 'src/Platform/OpenGL')
-rw-r--r--src/Platform/OpenGL/OpenGLFramebuffer.cpp246
-rw-r--r--src/Platform/OpenGL/OpenGLFramebuffer.h35
-rw-r--r--src/Platform/OpenGL/OpenGLIndexBuffer.cpp28
-rw-r--r--src/Platform/OpenGL/OpenGLIndexBuffer.h22
-rw-r--r--src/Platform/OpenGL/OpenGLRendererAPI.cpp118
-rw-r--r--src/Platform/OpenGL/OpenGLRendererAPI.h44
-rw-r--r--src/Platform/OpenGL/OpenGLShader.cpp302
-rw-r--r--src/Platform/OpenGL/OpenGLShader.h58
-rw-r--r--src/Platform/OpenGL/OpenGLTexture.cpp272
-rw-r--r--src/Platform/OpenGL/OpenGLTexture.h68
-rw-r--r--src/Platform/OpenGL/OpenGLUniformBuffer.cpp29
-rw-r--r--src/Platform/OpenGL/OpenGLUniformBuffer.h21
-rw-r--r--src/Platform/OpenGL/OpenGLVertexArray.cpp58
-rw-r--r--src/Platform/OpenGL/OpenGLVertexArray.h41
-rw-r--r--src/Platform/OpenGL/OpenGLVertexBuffer.cpp35
-rw-r--r--src/Platform/OpenGL/OpenGLVertexBuffer.h25
16 files changed, 0 insertions, 1402 deletions
diff --git a/src/Platform/OpenGL/OpenGLFramebuffer.cpp b/src/Platform/OpenGL/OpenGLFramebuffer.cpp
deleted file mode 100644
index c46e0e6..0000000
--- a/src/Platform/OpenGL/OpenGLFramebuffer.cpp
+++ /dev/null
@@ -1,246 +0,0 @@
-#include "OpenGLFramebuffer.h"
-#include "Core/Log.h"
-
-#include <glad/glad.h>
-
-namespace Donut
-{
- namespace Utils
- {
- static GLenum TextureTarget(bool multisampled)
- {
- return multisampled ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D;
- }
-
- static void BindTexture(bool multisampled, uint32_t id)
- {
- glBindTexture(TextureTarget(multisampled), id);
- }
-
- static void CreateTextures(bool multisampled, uint32_t* outID, uint32_t count)
- {
- // glCreateTextures is 4.5 DSA; macOS caps at 4.1. Callers bind each
- // texture (with the correct target) before use.
- glGenTextures(count, outID);
- }
-
- static void AttachColorTexture(uint32_t id, int samples, GLenum internalFormat, GLenum format, uint32_t width, uint32_t height, int index)
- {
- bool multisampled = samples > 1;
- if (multisampled)
- {
- glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, internalFormat, width, height, GL_FALSE);
- }
- else
- {
- // Integer color formats require an integer pixel type even when
- // data is null, or macOS's strict core profile rejects the call.
- GLenum type = (format == GL_RED_INTEGER) ? GL_INT : GL_UNSIGNED_BYTE;
- glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, nullptr);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- }
-
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, TextureTarget(multisampled), id, 0);
- }
-
- static void AttachDepthTexture(uint32_t id, int samples, GLenum format, GLenum attachmentType, uint32_t width, uint32_t height)
- {
- bool multisampled = samples > 1;
- if (multisampled)
- {
- glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, format, width, height, GL_FALSE);
- }
- else
- {
- // glTexStorage2D is 4.2; use mutable storage for macOS (4.1).
- GLenum depthFormat = (format == GL_DEPTH24_STENCIL8) ? GL_DEPTH_STENCIL : GL_DEPTH_COMPONENT;
- GLenum depthType = (format == GL_DEPTH24_STENCIL8) ? GL_UNSIGNED_INT_24_8 : GL_FLOAT;
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, depthFormat, depthType, nullptr);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- }
-
- glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentType, TextureTarget(multisampled), id, 0);
- }
-
- static bool IsDepthFormat(FramebufferTextureFormat format)
- {
- switch (format)
- {
- case FramebufferTextureFormat::DEPTH24STENCIL8: return true;
- }
- return false;
- }
-
- static GLenum DonutFBTextureFormatToGL(FramebufferTextureFormat format)
- {
- switch (format)
- {
- case FramebufferTextureFormat::RGBA8: return GL_RGBA8;
- case FramebufferTextureFormat::RED_INTEGER: return GL_RED_INTEGER;
- }
-
- return 0;
- }
- }
-
- OpenGLFramebuffer::OpenGLFramebuffer(const FramebufferSpecification& spec)
- : m_Specification(spec)
- {
- for (auto spec : m_Specification.Attachments.Attachments)
- {
- if (!Utils::IsDepthFormat(spec.TextureFormat))
- m_ColorAttachmentSpecifications.emplace_back(spec);
- else
- m_DepthAttachmentSpecification = spec;
- }
-
- Invalidate();
- }
-
- OpenGLFramebuffer::~OpenGLFramebuffer()
- {
- glDeleteFramebuffers(1, &m_RendererID);
- glDeleteTextures(static_cast<GLsizei>(m_ColorAttachments.size()), m_ColorAttachments.data());
- glDeleteTextures(1, &m_DepthAttachment);
- }
-
- void OpenGLFramebuffer::Invalidate()
- {
- if (m_RendererID)
- {
- glDeleteFramebuffers(1, &m_RendererID);
- glDeleteTextures(static_cast<GLsizei>(m_ColorAttachments.size()), m_ColorAttachments.data());
- glDeleteTextures(1, &m_DepthAttachment);
-
- m_ColorAttachments.clear();
- m_DepthAttachment = 0;
- }
-
- glGenFramebuffers(1, &m_RendererID); // glCreateFramebuffers is 4.5 DSA; unavailable on macOS 4.1
- glBindFramebuffer(GL_FRAMEBUFFER, m_RendererID);
-
- bool multisample = m_Specification.Samples > 1;
-
- if (m_ColorAttachmentSpecifications.size())
- {
- m_ColorAttachments.resize(m_ColorAttachmentSpecifications.size());
- Utils::CreateTextures(multisample, m_ColorAttachments.data(), static_cast<uint32_t>(m_ColorAttachments.size()));
-
- for (size_t i = 0; i < m_ColorAttachments.size(); i++)
- {
- Utils::BindTexture(multisample, m_ColorAttachments[i]);
- switch (m_ColorAttachmentSpecifications[i].TextureFormat)
- {
- case FramebufferTextureFormat::RGBA8:
- Utils::AttachColorTexture(m_ColorAttachments[i], m_Specification.Samples, GL_RGBA8, GL_RGBA, m_Specification.Width, m_Specification.Height, static_cast<int>(i));
- break;
- case FramebufferTextureFormat::RED_INTEGER:
- Utils::AttachColorTexture(m_ColorAttachments[i], m_Specification.Samples, GL_R32I, GL_RED_INTEGER, m_Specification.Width, m_Specification.Height, static_cast<int>(i));
- break;
- }
- }
- }
-
- if (m_DepthAttachmentSpecification.TextureFormat != FramebufferTextureFormat::None)
- {
- Utils::CreateTextures(multisample, &m_DepthAttachment, 1);
- Utils::BindTexture(multisample, m_DepthAttachment);
- switch (m_DepthAttachmentSpecification.TextureFormat)
- {
- case FramebufferTextureFormat::DEPTH24STENCIL8:
- Utils::AttachDepthTexture(m_DepthAttachment, m_Specification.Samples, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL_ATTACHMENT, m_Specification.Width, m_Specification.Height);
- break;
- }
- }
-
- if (m_ColorAttachments.size() > 1)
- {
- GLenum buffers[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
- glDrawBuffers(static_cast<GLsizei>(m_ColorAttachments.size()), buffers);
- }
- else if (m_ColorAttachments.empty())
- glDrawBuffer(GL_NONE);
-
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
- {
- GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- switch (status)
- {
- case GL_FRAMEBUFFER_UNDEFINED:
- DONUT_ERROR("Framebuffer is undefined");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
- DONUT_ERROR("Framebuffer has incomplete attachment");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
- DONUT_ERROR("Framebuffer is missing attachment");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
- DONUT_ERROR("Framebuffer has incomplete draw buffer");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
- DONUT_ERROR("Framebuffer has incomplete read buffer");
- break;
- case GL_FRAMEBUFFER_UNSUPPORTED:
- DONUT_ERROR("Framebuffer format is unsupported");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
- DONUT_ERROR("Framebuffer has incomplete multisample");
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
- DONUT_ERROR("Framebuffer has incomplete layer targets");
- break;
- default:
- DONUT_ERROR("Framebuffer is incomplete (unknown error: {})", status);
- break;
- }
- }
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- }
-
- void OpenGLFramebuffer::Bind()
- {
- glBindFramebuffer(GL_FRAMEBUFFER, m_RendererID);
- glViewport(0, 0, m_Specification.Width, m_Specification.Height);
- }
-
- void OpenGLFramebuffer::Unbind()
- {
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
- }
-
- void OpenGLFramebuffer::Resize(uint32_t width, uint32_t height)
- {
- m_Specification.Width = width;
- m_Specification.Height = height;
-
- Invalidate();
- }
-
- int OpenGLFramebuffer::ReadPixel(uint32_t attachmentIndex, int x, int y)
- {
- glReadBuffer(GL_COLOR_ATTACHMENT0 + attachmentIndex);
- int pixelData;
- glReadPixels(x, y, 1, 1, GL_RED_INTEGER, GL_INT, &pixelData);
- return pixelData;
- }
-
- void OpenGLFramebuffer::ClearAttachment(uint32_t attachmentIndex, int value)
- {
- // glClearTexImage is 4.4 and unavailable on macOS. Clear the integer
- // attachment by binding this framebuffer and clearing its draw buffer.
- glBindFramebuffer(GL_FRAMEBUFFER, m_RendererID);
- glClearBufferiv(GL_COLOR, static_cast<GLint>(attachmentIndex), &value);
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLFramebuffer.h b/src/Platform/OpenGL/OpenGLFramebuffer.h
deleted file mode 100644
index 8cd376c..0000000
--- a/src/Platform/OpenGL/OpenGLFramebuffer.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#pragma once
-
-#include "Rendering/Framebuffer.h"
-
-namespace Donut
-{
- class OpenGLFramebuffer : public Framebuffer
- {
- public:
- OpenGLFramebuffer(const FramebufferSpecification& spec);
- virtual ~OpenGLFramebuffer();
-
- void Invalidate();
-
- virtual void Bind() override;
- virtual void Unbind() override;
-
- virtual void Resize(uint32_t width, uint32_t height) override;
- virtual int ReadPixel(uint32_t attachmentIndex, int x, int y) override;
-
- virtual void ClearAttachment(uint32_t attachmentIndex, int value) override;
- virtual uint32_t GetColorAttachmentRendererID(uint32_t index = 0) const override { return m_ColorAttachments[index]; }
-
- virtual const FramebufferSpecification& GetSpecification() const override { return m_Specification; }
- private:
- uint32_t m_RendererID = 0;
- FramebufferSpecification m_Specification;
-
- std::vector<FramebufferTextureSpecification> m_ColorAttachmentSpecifications;
- FramebufferTextureSpecification m_DepthAttachmentSpecification = FramebufferTextureFormat::None;
-
- std::vector<uint32_t> m_ColorAttachments;
- uint32_t m_DepthAttachment = 0;
- };
-};
diff --git a/src/Platform/OpenGL/OpenGLIndexBuffer.cpp b/src/Platform/OpenGL/OpenGLIndexBuffer.cpp
deleted file mode 100644
index 668a898..0000000
--- a/src/Platform/OpenGL/OpenGLIndexBuffer.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "OpenGLIndexBuffer.h"
-#include <glad/glad.h>
-
-namespace Donut
-{
- OpenGLIndexBuffer::OpenGLIndexBuffer(const uint32_t* indices, uint32_t count)
- : m_Count(count)
- {
- glGenBuffers(1, &m_RendererID); // glCreateBuffers is 4.5 DSA; unavailable on macOS 4.1
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(uint32_t), indices, GL_STATIC_DRAW);
- }
-
- OpenGLIndexBuffer::~OpenGLIndexBuffer()
- {
- glDeleteBuffers(1, &m_RendererID);
- }
-
- void OpenGLIndexBuffer::Bind() const
- {
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID);
- }
-
- void OpenGLIndexBuffer::Unbind() const
- {
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLIndexBuffer.h b/src/Platform/OpenGL/OpenGLIndexBuffer.h
deleted file mode 100644
index b3048a3..0000000
--- a/src/Platform/OpenGL/OpenGLIndexBuffer.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#pragma once
-
-#include "Rendering/IndexBuffer.h"
-
-namespace Donut
-{
- class OpenGLIndexBuffer
- : public IndexBuffer
- {
- public:
- OpenGLIndexBuffer(const uint32_t* indices, uint32_t count);
- virtual ~OpenGLIndexBuffer();
-
- virtual void Bind() const override;
- virtual void Unbind() const override;
- virtual uint32_t GetCount() const override { return m_Count; }
-
- private:
- uint32_t m_RendererID;
- uint32_t m_Count;
- };
-};
diff --git a/src/Platform/OpenGL/OpenGLRendererAPI.cpp b/src/Platform/OpenGL/OpenGLRendererAPI.cpp
deleted file mode 100644
index fd3c491..0000000
--- a/src/Platform/OpenGL/OpenGLRendererAPI.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-#include "OpenGLRendererAPI.h"
-
-#include <glad/glad.h>
-#include <GLFW/glfw3.h>
-
-namespace Donut
-{
- void OpenGLRendererAPI::Init()
- {
- if (!glfwGetCurrentContext())
- {
- DONUT_ERROR("No OpenGL context is current! Cannot initialize GLAD.");
- return;
- }
-
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
- {
- DONUT_ERROR("Failed to initialize GLAD!");
- return;
- }
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
-
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glFrontFace(GL_CCW);
- }
-
- void OpenGLRendererAPI::SetViewport(uint32_t x, uint32_t y, uint32_t width, uint32_t height)
- {
- glViewport(x, y, width, height);
- }
-
- void OpenGLRendererAPI::SetClearColor(const glm::vec4& color)
- {
- glClearColor(color.r, color.g, color.b, color.a);
- }
-
- void OpenGLRendererAPI::Clear()
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- }
-
- void OpenGLRendererAPI::EnableDepthTest()
- {
- glEnable(GL_DEPTH_TEST);
- }
-
- void OpenGLRendererAPI::DisableDepthTest()
- {
- glDisable(GL_DEPTH_TEST);
- }
-
- void OpenGLRendererAPI::SetFaceCulling(bool enabled)
- {
- if (enabled)
- {
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glFrontFace(GL_CCW);
- }
- else
- glDisable(GL_CULL_FACE);
- }
-
- void OpenGLRendererAPI::EnableBlending()
- {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- void OpenGLRendererAPI::DisableBlending()
- {
- glDisable(GL_BLEND);
- }
-
- void OpenGLRendererAPI::DrawIndexed(const Ref<VertexArray>& vertexArray, uint32_t indexCount)
- {
- uint32_t count = indexCount ? indexCount : vertexArray->GetIndexBuffer()->GetCount();
- glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, nullptr);
- glBindTexture(GL_TEXTURE_2D, 0);
- }
-
- void OpenGLRendererAPI::DrawArrays(uint32_t vertexCount, uint32_t first)
- {
- glDrawArrays(GL_TRIANGLES, first, vertexCount);
- }
-
- void OpenGLRendererAPI::DrawLines(const Ref<VertexArray>& vertexArray, uint32_t indexCount)
- {
- uint32_t count = indexCount ? indexCount : vertexArray->GetIndexBuffer()->GetCount();
- glDrawElements(GL_LINES, count, GL_UNSIGNED_INT, nullptr);
- }
-
- void OpenGLRendererAPI::BindTexture(uint32_t textureID, uint32_t slot)
- {
- glActiveTexture(GL_TEXTURE0 + slot);
- glBindTexture(GL_TEXTURE_2D, textureID);
- }
-
- void OpenGLRendererAPI::BindImageTexture(uint32_t textureID, uint32_t slot, bool readOnly)
- {
- // Image load/store is OpenGL 4.2; the pointer is null on macOS (4.1).
- if (glBindImageTexture == nullptr)
- return;
- glBindImageTexture(slot, textureID, 0, GL_FALSE, 0,
- readOnly ? GL_READ_ONLY : GL_WRITE_ONLY, GL_RGBA8);
- }
-
- void OpenGLRendererAPI::ReadPixels(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
- uint32_t format, uint32_t type, void* pixels)
- {
- glReadPixels(x, y, width, height, format, type, pixels);
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLRendererAPI.h b/src/Platform/OpenGL/OpenGLRendererAPI.h
deleted file mode 100644
index 5a68622..0000000
--- a/src/Platform/OpenGL/OpenGLRendererAPI.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#pragma once
-
-#include "Core/Memory.h"
-#include "Core/Log.h"
-
-#include "Rendering/Renderer.h"
-
-#include <glad/glad.h>
-
-namespace Donut
-{
- class OpenGLRendererAPI
- : public RendererAPI
- {
- public:
- virtual void Init() override;
- virtual void SetViewport(uint32_t x, uint32_t y,
- uint32_t width, uint32_t height) override;
- virtual void SetClearColor(const glm::vec4& color) override;
- virtual void Clear() override;
- virtual void EnableDepthTest() override;
- virtual void DisableDepthTest() override;
- virtual void SetFaceCulling(bool enabled) override;
- virtual void EnableBlending() override;
- virtual void DisableBlending() override;
-
- virtual void DrawIndexed(const Ref<VertexArray>& vertexArray,
- uint32_t indexCount = 0) override;
-
- virtual void DrawArrays(uint32_t vertexCount,
- uint32_t first = 0) override;
- virtual void DrawLines(const Ref<VertexArray>& vertexArray,
- uint32_t indexCount = 0) override;
- virtual void BindTexture(uint32_t textureID,
- uint32_t slot = 0) override;
- virtual void BindImageTexture(uint32_t textureID,
- uint32_t slot = 0,
- bool readOnly = false) override;
- virtual void ReadPixels(uint32_t x, uint32_t y,
- uint32_t width, uint32_t height,
- uint32_t format, uint32_t type,
- void* pixels) override;
- };
-};
diff --git a/src/Platform/OpenGL/OpenGLShader.cpp b/src/Platform/OpenGL/OpenGLShader.cpp
deleted file mode 100644
index 5d6dd66..0000000
--- a/src/Platform/OpenGL/OpenGLShader.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-#include "OpenGLShader.h"
-
-#include <glad/glad.h>
-#include <glm/gtc/type_ptr.hpp>
-
-#include <fstream>
-#include <iostream>
-
-namespace Donut
-{
- static uint32_t ShaderTypeFromString(const std::string& type)
- {
- if (type == "vertex")
- return GL_VERTEX_SHADER;
- if (type == "fragment" || type == "pixel")
- return GL_FRAGMENT_SHADER;
- if (type == "compute")
- return GL_COMPUTE_SHADER;
- return 0;
- }
-
- // Shaders are authored in Slang and compiled to Assets/Shaders/generated/
- // <name>.glsl by Tools/compile-shaders.sh. Given a legacy ".../<name>.glsl"
- // path, prefer that generated file when present; otherwise fall back to the
- // hand-written GLSL (e.g. shaders not yet ported to Slang).
- static std::string ResolveShaderPath(const std::string& filepath)
- {
- size_t slash = filepath.find_last_of("/\\");
- std::string dir = (slash == std::string::npos) ? std::string() : filepath.substr(0, slash + 1);
- std::string file = (slash == std::string::npos) ? filepath : filepath.substr(slash + 1);
- size_t dot = file.rfind('.');
- std::string base = (dot == std::string::npos) ? file : file.substr(0, dot);
-
- std::string generated = dir + "generated/" + base + ".glsl";
- std::ifstream test(generated);
- if (test.good())
- return generated;
- return filepath;
- }
-
- OpenGLShader::OpenGLShader(const std::string& filepath)
- {
- std::string resolved = ResolveShaderPath(filepath);
- m_IsSlang = (resolved != filepath);
- std::string source = ReadFile(resolved);
- auto shaderSources = PreProcess(source);
- Compile(shaderSources);
-
- auto lastSlash = filepath.find_last_of("/\\");
- lastSlash = lastSlash == std::string::npos ? 0 : lastSlash + 1;
- auto lastDot = filepath.rfind('.');
- auto count = lastDot == std::string::npos ? filepath.size() - lastSlash : lastDot - lastSlash;
- m_Name = filepath.substr(lastSlash, count);
- }
-
- OpenGLShader::OpenGLShader(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc)
- : m_Name(name)
- {
- std::unordered_map<uint32_t, std::string> sources;
- sources[GL_VERTEX_SHADER] = vertexSrc;
- sources[GL_FRAGMENT_SHADER] = fragmentSrc;
- Compile(sources);
- }
-
- OpenGLShader::OpenGLShader(const std::string& name, const std::string& computeSrc)
- : m_Name(name)
- {
- std::unordered_map<uint32_t, std::string> sources;
- sources[GL_COMPUTE_SHADER] = computeSrc;
- Compile(sources);
- }
-
- OpenGLShader::~OpenGLShader()
- {
- glDeleteProgram(m_RendererID);
- }
-
- std::string OpenGLShader::ReadFile(const std::string& filepath)
- {
- std::string result;
- std::ifstream in(filepath, std::ios::in |
- std::ios::binary);
-
- if (in)
- {
- in.seekg(0, std::ios::end);
- size_t size = in.tellg();
- if (size != -1)
- {
- result.resize(size);
- in.seekg(0, std::ios::beg);
- in.read(&result[0], size);
- }
- }
- return result;
- }
-
- std::unordered_map<uint32_t, std::string> OpenGLShader::PreProcess(const std::string& source)
- {
- std::unordered_map<uint32_t, std::string> shaderSources;
-
- const char* typeToken = "#type";
- size_t typeTokenLength = strlen(typeToken);
- size_t pos = source.find(typeToken, 0);
-
- while (pos != std::string::npos)
- {
- size_t eol = source.find_first_of("\r\n", pos);
- size_t begin = pos + typeTokenLength + 1;
- std::string type = source.substr(begin, eol - begin);
-
- size_t nextLinePos = source.find_first_not_of("\r\n", eol);
- pos = source.find(typeToken, nextLinePos);
- shaderSources[ShaderTypeFromString(type)] = (pos == std::string::npos) ? source.substr(nextLinePos) :
- source.substr(nextLinePos, pos - nextLinePos);
- }
-
- return shaderSources;
- }
-
- void OpenGLShader::Compile(const std::unordered_map<uint32_t, std::string>& shaderSources)
- {
- uint32_t program = glCreateProgram();
- std::vector<uint32_t> glShaderIDs(shaderSources.size());
- for (auto& kv : shaderSources)
- {
- uint32_t type = kv.first;
- const std::string& source = kv.second;
-
- uint32_t shader = glCreateShader(type);
- const char* sourceCStr = source.c_str();
- glShaderSource(shader, 1, &sourceCStr, 0);
- glCompileShader(shader);
-
- int isCompiled = 0;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
- if (isCompiled == GL_FALSE)
- {
- int maxLength = 0;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
- std::vector<char> infoLog(maxLength);
- glGetShaderInfoLog(shader, maxLength, &maxLength, &infoLog[0]);
- glDeleteShader(shader);
- for (auto id : glShaderIDs)
- glDeleteShader(id);
- glDeleteProgram(program);
- m_RendererID = 0;
- // infoLog.data() is null when the driver returns an empty log
- // (e.g. macOS rejecting a compute shader); streaming a null
- // char* into std::cout calls strlen(NULL) and crashes.
- const char* log = infoLog.empty() ? "" : infoLog.data();
- std::cout << "Shader compilation failure!" << std::endl << log << std::endl;
- return;
- }
- glAttachShader(program, shader);
- glShaderIDs.push_back(shader);
- }
-
- m_RendererID = program;
- glLinkProgram(m_RendererID);
-
- int isLinked = 0;
- glGetProgramiv(m_RendererID, GL_LINK_STATUS, (int*)&isLinked);
- if (isLinked == GL_FALSE)
- {
- int maxLength = 0;
- glGetProgramiv(m_RendererID, GL_INFO_LOG_LENGTH, &maxLength);
- std::vector<char> infoLog(maxLength);
- glGetProgramInfoLog(m_RendererID, maxLength, &maxLength, &infoLog[0]);
- glDeleteProgram(m_RendererID);
- for (auto id : glShaderIDs)
- glDeleteShader(id);
- m_RendererID = 0;
- const char* log = infoLog.empty() ? "" : infoLog.data();
- std::cout << "Shader link failure!" << std::endl << log << std::endl;
- return;
- }
-
- for (auto id : glShaderIDs)
- {
- glDetachShader(m_RendererID, id);
- glDeleteShader(id);
- }
- }
-
- void OpenGLShader::Bind() const
- {
- glUseProgram(m_RendererID);
- }
-
- void OpenGLShader::Unbind() const
- {
- glUseProgram(0);
- }
-
- void OpenGLShader::SetInt(const std::string& name, int value)
- {
- UploadUniformInt(name, value);
- }
-
- void OpenGLShader::SetIntArray(const std::string& name, int* values, uint32_t count)
- {
- UploadUniformIntArray(name, values, count);
- }
-
- void OpenGLShader::SetFloat(const std::string& name, float value)
- {
- UploadUniformFloat(name, value);
- }
-
- void OpenGLShader::SetFloat2(const std::string& name, const glm::vec2& value)
- {
- UploadUniformFloat2(name, value);
- }
-
- void OpenGLShader::SetFloat3(const std::string& name, const glm::vec3& value)
- {
- UploadUniformFloat3(name, value);
- }
-
- void OpenGLShader::SetFloat4(const std::string& name, const glm::vec4& value)
- {
- UploadUniformFloat4(name, value);
- }
-
- void OpenGLShader::SetMat4(const std::string& name, const glm::mat4& value)
- {
- UploadUniformMat4(name, value);
- }
-
- void OpenGLShader::UploadUniformInt(const std::string& name, int value)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniform1i(location, value);
- }
-
- void OpenGLShader::UploadUniformIntArray(const std::string& name, int* values, uint32_t count)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniform1iv(location, count, values);
- }
-
- void OpenGLShader::UploadUniformFloat(const std::string& name, float value)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniform1f(location, value);
- }
-
- void OpenGLShader::UploadUniformFloat2(const std::string& name, const glm::vec2& value)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniform2f(location, value.x, value.y);
- }
-
- void OpenGLShader::UploadUniformFloat3(const std::string& name, const glm::vec3& value)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniform3f(location, value.x, value.y, value.z);
- }
-
- void OpenGLShader::UploadUniformFloat4(const std::string& name, const glm::vec4& value)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniform4f(location, value.x, value.y, value.z, value.w);
- }
-
- void OpenGLShader::UploadUniformMat3(const std::string& name, const glm::mat3& matrix)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniformMatrix3fv(location, 1, m_IsSlang ? GL_TRUE : GL_FALSE, glm::value_ptr(matrix));
- }
-
- void OpenGLShader::UploadUniformMat4(const std::string& name, const glm::mat4& matrix)
- {
- int location = glGetUniformLocation(m_RendererID, name.c_str());
- glUniformMatrix4fv(location, 1, m_IsSlang ? GL_TRUE : GL_FALSE, glm::value_ptr(matrix));
- }
-
- void OpenGLShader::Dispatch(uint32_t x, uint32_t y, uint32_t z)
- {
- // Compute shaders require OpenGL 4.3+. On drivers that cap out earlier
- // (e.g. macOS, which is frozen at 4.1) glDispatchCompute is never
- // loaded and the pointer is null. Guard so we no-op instead of crash.
- if (m_RendererID == 0 || glDispatchCompute == nullptr)
- return;
- glDispatchCompute(x, y, z);
- }
-
- void OpenGLShader::DispatchIndirect(uint32_t offset)
- {
- if (m_RendererID == 0 || glDispatchComputeIndirect == nullptr)
- return;
- glDispatchComputeIndirect(offset);
- }
-
- void OpenGLShader::MemoryBarrier(uint32_t barriers)
- {
- if (glMemoryBarrier == nullptr)
- return;
- glMemoryBarrier(barriers);
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLShader.h b/src/Platform/OpenGL/OpenGLShader.h
deleted file mode 100644
index 4b63597..0000000
--- a/src/Platform/OpenGL/OpenGLShader.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-#include "Rendering/Shader.h"
-
-#include <unordered_map>
-#include <glm/glm.hpp>
-
-namespace Donut
-{
- class OpenGLShader
- : public Shader
- {
- public:
- OpenGLShader(const std::string& filepath);
- OpenGLShader(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc);
- OpenGLShader(const std::string& name, const std::string& computeSrc);
- virtual ~OpenGLShader();
-
- virtual void Bind() const override;
- virtual void Unbind() const override;
-
- virtual void SetInt( const std::string& name, int value) override;
- virtual void SetIntArray(const std::string& name, int* values, uint32_t count) override;
- virtual void SetFloat( const std::string& name, float value) override;
- virtual void SetFloat2( const std::string& name, const glm::vec2& value) override;
- virtual void SetFloat3( const std::string& name, const glm::vec3& value) override;
- virtual void SetFloat4( const std::string& name, const glm::vec4& value) override;
- virtual void SetMat4( const std::string& name, const glm::mat4& value) override;
-
- virtual void Dispatch(uint32_t x, uint32_t y = 1, uint32_t z = 1) override;
- virtual void DispatchIndirect(uint32_t offset = 0) override;
- virtual void MemoryBarrier(uint32_t barriers) override;
-
- virtual const std::string& GetName() const override { return m_Name; }
- virtual uint32_t GetRendererID() const override { return m_RendererID; }
-
- void UploadUniformInt( const std::string& name, int value);
- void UploadUniformIntArray(const std::string& name, int* values, uint32_t count);
- void UploadUniformFloat( const std::string& name, float value);
- void UploadUniformFloat2( const std::string& name, const glm::vec2& value);
- void UploadUniformFloat3( const std::string& name, const glm::vec3& value);
- void UploadUniformFloat4( const std::string& name, const glm::vec4& value);
- void UploadUniformMat3( const std::string& name, const glm::mat3& matrix);
- void UploadUniformMat4( const std::string& name, const glm::mat4& matrix);
-
- private:
- std::string ReadFile(const std::string& filepath);
- std::unordered_map<uint32_t, std::string> PreProcess(const std::string& source);
- void Compile(const std::unordered_map<uint32_t, std::string>& shaderSources);
- private:
- uint32_t m_RendererID = 0;
- std::string m_Name;
- // True when loaded from a Slang-compiled GLSL. Slang expects row-major
- // matrix data, so matrix uniforms are transposed on upload (glm is
- // column-major) to keep all matrix math correct.
- bool m_IsSlang = false;
- };
-};
diff --git a/src/Platform/OpenGL/OpenGLTexture.cpp b/src/Platform/OpenGL/OpenGLTexture.cpp
deleted file mode 100644
index 16892c6..0000000
--- a/src/Platform/OpenGL/OpenGLTexture.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-#include "OpenGLTexture.h"
-
-#include "Rendering/Shader.h"
-
-#define STB_IMAGE_IMPLEMENTATION
-#include "stb_image.h"
-#include <glm/glm.hpp>
-#include <glm/gtc/matrix_transform.hpp>
-#include <glm/gtc/type_ptr.hpp>
-
-// NOTE: This file targets OpenGL 4.1 (the maximum macOS exposes). It uses the
-// classic bind-based texture API rather than 4.5 Direct State Access
-// (glCreateTextures / glTextureStorage2D / glTextureParameteri / glBindTextureUnit),
-// none of which exist on macOS.
-
-namespace Donut
-{
- OpenGLTexture2D::OpenGLTexture2D(uint32_t width, uint32_t height)
- : m_Width(width), m_Height(height)
- {
- m_InternalFormat = GL_RGBA8;
- m_DataFormat = GL_RGBA;
-
- glGenTextures(1, &m_RendererID);
- glBindTexture(GL_TEXTURE_2D, m_RendererID);
- glTexImage2D(GL_TEXTURE_2D, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_UNSIGNED_BYTE, nullptr);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- }
-
- OpenGLTexture2D::OpenGLTexture2D(const std::string& path)
- : m_Path(path)
- {
- m_Width = 1;
- m_Height = 1;
- m_InternalFormat = GL_RGBA8;
- m_DataFormat = GL_RGBA;
-
- glGenTextures(1, &m_RendererID);
- glBindTexture(GL_TEXTURE_2D, m_RendererID);
- glTexImage2D(GL_TEXTURE_2D, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_UNSIGNED_BYTE, nullptr);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- uint32_t whitePixel = 0xFFFFFFFF;
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_Height, m_DataFormat, GL_UNSIGNED_BYTE, &whitePixel);
-
- DONUT_INFO("Created default texture (stb_image not available for loading: ", path, ")");
- }
-
- OpenGLTexture2D::~OpenGLTexture2D()
- {
- glDeleteTextures(1, &m_RendererID);
- }
-
- void OpenGLTexture2D::SetData(void* data, uint32_t size)
- {
- uint32_t bpp = m_DataFormat == GL_RGBA ? 4 : 3;
- if (size != m_Width * m_Height * bpp)
- {
- DONUT_ERROR("Data must be entire texture!");
- return;
- }
-
- glBindTexture(GL_TEXTURE_2D, m_RendererID);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_Width, m_Height, m_DataFormat, GL_UNSIGNED_BYTE, data);
- }
-
- void OpenGLTexture2D::Bind(uint32_t slot) const
- {
- glActiveTexture(GL_TEXTURE0 + slot);
- glBindTexture(GL_TEXTURE_2D, m_RendererID);
- }
-
- void OpenGLTexture2D::BindAsImage(uint32_t slot, bool readOnly) const
- {
- // Image load/store is OpenGL 4.2 and unavailable on macOS. Guard the
- // function pointer so this degrades to a no-op instead of crashing.
- if (glBindImageTexture == nullptr)
- return;
- GLenum access = readOnly ? GL_READ_ONLY : GL_WRITE_ONLY;
- glBindImageTexture(slot, m_RendererID, 0, GL_FALSE, 0, access, m_InternalFormat);
- }
-
- OpenGLCubemapTexture::OpenGLCubemapTexture(uint32_t width, uint32_t height)
- : m_Width(width), m_Height(height)
- {
- m_InternalFormat = GL_RGBA16F;
- m_DataFormat = GL_RGBA;
-
- glGenTextures(1, &m_RendererID);
- glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID);
- for (uint32_t i = 0; i < 6; ++i)
- glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_FLOAT, nullptr);
-
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- }
-
- OpenGLCubemapTexture::OpenGLCubemapTexture(const std::string& path)
- : m_Path(path)
- {
- m_Width = 1024;
- m_Height = 1024;
- m_InternalFormat = GL_RGBA16F;
- m_DataFormat = GL_RGBA;
-
- glGenTextures(1, &m_RendererID);
- glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID);
- for (uint32_t i = 0; i < 6; ++i)
- glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_InternalFormat, m_Width, m_Height, 0, m_DataFormat, GL_FLOAT, nullptr);
-
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
-
- LoadHDRI(path);
- }
-
- OpenGLCubemapTexture::~OpenGLCubemapTexture()
- {
- glDeleteTextures(1, &m_RendererID);
- }
-
- void OpenGLCubemapTexture::LoadHDRI(const std::string& path)
- {
- stbi_set_flip_vertically_on_load(true);
- int width, height, channels;
- float* hdrData = stbi_loadf(path.c_str(), &width, &height, &channels, 3);
-
- if (!hdrData)
- {
- DONUT_ERROR("Failed to load HDRI: {}", path);
- float defaultSky[6 * 4] =
- {
- 0.5f, 0.7f, 1.0f, 1.0f, // Right
- 0.5f, 0.7f, 1.0f, 1.0f, // Left
- 0.5f, 0.7f, 1.0f, 1.0f, // Top
- 0.5f, 0.7f, 1.0f, 1.0f, // Bottom
- 0.5f, 0.7f, 1.0f, 1.0f, // Front
- 0.5f, 0.7f, 1.0f, 1.0f // Back
- };
-
- glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID);
- for (int i = 0; i < 6; ++i)
- glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, 1, 1, GL_RGBA, GL_FLOAT, &defaultSky[i * 4]);
- return;
- }
-
- ConvertEquirectangularToCubemap(hdrData, width, height);
- stbi_image_free(hdrData);
-
- DONUT_INFO("Successfully loaded HDRI: {} ({}x{})", path, width, height);
- }
-
- void OpenGLCubemapTexture::ConvertEquirectangularToCubemap(float* hdrData, int width, int height)
- {
- uint32_t captureFBO, captureRBO;
- glGenFramebuffers(1, &captureFBO);
- glGenRenderbuffers(1, &captureRBO);
-
- glBindFramebuffer(GL_FRAMEBUFFER, captureFBO);
- glBindRenderbuffer(GL_RENDERBUFFER, captureRBO);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, m_Width, m_Height);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, captureRBO);
-
- uint32_t hdrTexture;
- glGenTextures(1, &hdrTexture);
- glBindTexture(GL_TEXTURE_2D, hdrTexture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, hdrData);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- auto equirectShader = Shader::Create("Assets/Shaders/EquirectToCubemap.glsl");
- if (!equirectShader)
- {
- DONUT_ERROR("Failed to create equirectangular to cubemap shader");
- return;
- }
-
- uint32_t shaderProgram = equirectShader->GetRendererID();
-
- float vertices[] =
- {
- -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f,
- -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f,
- 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
- -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f,
- -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f,
- -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f
- };
-
- uint32_t cubeVAO, cubeVBO;
- glGenVertexArrays(1, &cubeVAO);
- glGenBuffers(1, &cubeVBO);
- glBindVertexArray(cubeVAO);
- glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
-
- glm::mat4 captureProjection = glm::perspective(glm::radians(90.0f), 1.0f, 0.1f, 10.0f);
- glm::mat4 captureViews[] =
- {
- glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)),
- glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)),
- glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)),
- glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f)),
- glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f)),
- glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f))
- };
-
- glUseProgram(shaderProgram);
- glUniform1i(glGetUniformLocation(shaderProgram, "u_EquirectangularMap"), 0);
- // EquirectToCubemap is authored in Slang (row-major); transpose glm's
- // column-major matrices on upload (GL_TRUE) to match.
- glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "u_Projection"), 1, GL_TRUE, &captureProjection[0][0]);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, hdrTexture);
-
- glViewport(0, 0, m_Width, m_Height);
- glBindFramebuffer(GL_FRAMEBUFFER, captureFBO);
- for (unsigned int i = 0; i < 6; ++i)
- {
- glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "u_View"), 1, GL_TRUE, &captureViews[i][0][0]);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, m_RendererID, 0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glBindVertexArray(cubeVAO);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
- glBindVertexArray(0);
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- glDeleteVertexArrays(1, &cubeVAO);
- glDeleteBuffers(1, &cubeVBO);
- glDeleteTextures(1, &hdrTexture);
- glDeleteFramebuffers(1, &captureFBO);
- glDeleteRenderbuffers(1, &captureRBO);
- }
-
- void OpenGLCubemapTexture::SetData(void* data, uint32_t size)
- {
- DONUT_WARN("SetData not implemented for cubemaps");
- }
-
- void OpenGLCubemapTexture::Bind(uint32_t slot) const
- {
- glActiveTexture(GL_TEXTURE0 + slot);
- glBindTexture(GL_TEXTURE_CUBE_MAP, m_RendererID);
- }
-
- void OpenGLCubemapTexture::BindAsImage(uint32_t slot, bool readOnly) const
- {
- if (glBindImageTexture == nullptr)
- return;
- GLenum access = readOnly ? GL_READ_ONLY : GL_WRITE_ONLY;
- glBindImageTexture(slot, m_RendererID, 0, GL_TRUE, 0, access, m_InternalFormat);
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLTexture.h b/src/Platform/OpenGL/OpenGLTexture.h
deleted file mode 100644
index 220df09..0000000
--- a/src/Platform/OpenGL/OpenGLTexture.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#pragma once
-
-#include "Rendering/Texture.h"
-#include "Core/Log.h"
-
-#include <glad/glad.h>
-
-namespace Donut
-{
- class OpenGLTexture2D
- : public Texture2D
- {
- public:
- OpenGLTexture2D(uint32_t width, uint32_t height);
- OpenGLTexture2D(const std::string& path);
- virtual ~OpenGLTexture2D();
-
- virtual uint32_t GetWidth() const override { return m_Width; }
- virtual uint32_t GetHeight() const override { return m_Height; }
- virtual uint32_t GetRendererID() const override { return m_RendererID; }
-
- virtual void SetData(void* data, uint32_t size) override;
- virtual void Bind(uint32_t slot = 0) const override;
- virtual void BindAsImage(uint32_t slot = 0, bool readOnly = false) const override;
-
- virtual bool operator==(const Texture& other) const override
- {
- return m_RendererID == other.GetRendererID();
- }
-
- private:
- std::string m_Path;
- uint32_t m_Width, m_Height;
- uint32_t m_RendererID;
- GLenum m_InternalFormat, m_DataFormat;
- };
-
- class OpenGLCubemapTexture
- : public CubemapTexture
- {
- public:
- OpenGLCubemapTexture(uint32_t width, uint32_t height);
- OpenGLCubemapTexture(const std::string& path);
- virtual ~OpenGLCubemapTexture();
-
- virtual uint32_t GetWidth() const override { return m_Width; }
- virtual uint32_t GetHeight() const override { return m_Height; }
- virtual uint32_t GetRendererID() const override { return m_RendererID; }
-
- virtual void SetData(void* data, uint32_t size) override;
- virtual void Bind(uint32_t slot = 0) const override;
- virtual void BindAsImage(uint32_t slot = 0, bool readOnly = false) const override;
-
- virtual bool operator==(const Texture& other) const override
- {
- return m_RendererID == other.GetRendererID();
- }
-
- private:
- void LoadHDRI(const std::string& path);
- void ConvertEquirectangularToCubemap(float* hdrData, int width, int height);
-
- std::string m_Path;
- uint32_t m_Width, m_Height;
- uint32_t m_RendererID;
- GLenum m_InternalFormat, m_DataFormat;
- };
-}
diff --git a/src/Platform/OpenGL/OpenGLUniformBuffer.cpp b/src/Platform/OpenGL/OpenGLUniformBuffer.cpp
deleted file mode 100644
index 631b863..0000000
--- a/src/Platform/OpenGL/OpenGLUniformBuffer.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "OpenGLUniformBuffer.h"
-
-namespace Donut
-{
- OpenGLUniformBuffer::OpenGLUniformBuffer(uint32_t size, uint32_t binding)
- : m_Size(size), m_Binding(binding)
- {
- glGenBuffers(1, &m_RendererID);
- glBindBuffer(GL_UNIFORM_BUFFER, m_RendererID);
- glBufferData(GL_UNIFORM_BUFFER, size, nullptr, GL_DYNAMIC_DRAW);
- glBindBufferBase(GL_UNIFORM_BUFFER, binding, m_RendererID);
- }
-
- OpenGLUniformBuffer::~OpenGLUniformBuffer()
- {
- glDeleteBuffers(1, &m_RendererID);
- }
-
- void OpenGLUniformBuffer::SetData(const void* data, uint32_t size, uint32_t offset)
- {
- glBindBuffer(GL_UNIFORM_BUFFER, m_RendererID);
- glBufferSubData(GL_UNIFORM_BUFFER, offset, size, data);
- }
-
- void OpenGLUniformBuffer::Bind(uint32_t binding)
- {
- glBindBufferBase(GL_UNIFORM_BUFFER, binding, m_RendererID);
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLUniformBuffer.h b/src/Platform/OpenGL/OpenGLUniformBuffer.h
deleted file mode 100644
index fd96f37..0000000
--- a/src/Platform/OpenGL/OpenGLUniformBuffer.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#pragma once
-
-#include "Rendering/UniformBuffer.h"
-#include <glad/glad.h>
-
-namespace Donut
-{
- class OpenGLUniformBuffer : public UniformBuffer
- {
- public:
- OpenGLUniformBuffer(uint32_t size, uint32_t binding);
- virtual ~OpenGLUniformBuffer();
-
- virtual void SetData(const void* data, uint32_t size, uint32_t offset = 0) override;
- virtual void Bind(uint32_t binding) override;
- private:
- uint32_t m_RendererID = 0;
- uint32_t m_Size = 0;
- uint32_t m_Binding = 0;
- };
-};
diff --git a/src/Platform/OpenGL/OpenGLVertexArray.cpp b/src/Platform/OpenGL/OpenGLVertexArray.cpp
deleted file mode 100644
index afe5fe2..0000000
--- a/src/Platform/OpenGL/OpenGLVertexArray.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <glad/glad.h>
-
-#include "OpenGLVertexArray.h"
-#include "Rendering/VertexBuffer.h"
-#include "Rendering/IndexBuffer.h"
-
-namespace Donut
-{
- OpenGLVertexArray::OpenGLVertexArray()
- {
- // glCreateVertexArrays is 4.5 DSA; macOS caps at 4.1. glGenVertexArrays
- // reserves the name and the VAO is created on first bind (done below).
- glGenVertexArrays(1, &m_RendererID);
- }
-
- OpenGLVertexArray::~OpenGLVertexArray()
- {
- glDeleteVertexArrays(1, &m_RendererID);
- }
-
- void OpenGLVertexArray::Bind() const
- {
- glBindVertexArray(m_RendererID);
- }
-
- void OpenGLVertexArray::Unbind() const
- {
- glBindVertexArray(0);
- }
-
- void OpenGLVertexArray::AddVertexBuffer(const Ref<VertexBuffer>& vertexBuffer)
- {
- glBindVertexArray(m_RendererID);
- vertexBuffer->Bind();
-
- const auto& layout = vertexBuffer->GetLayout();
- for (const auto& element : layout.GetElements())
- {
- glEnableVertexAttribArray(m_VertexBufferIndex);
- glVertexAttribPointer(m_VertexBufferIndex,
- element.count,
- element.type,
- element.normalized ? GL_TRUE : GL_FALSE,
- layout.GetStride(),
- reinterpret_cast<const void*>(static_cast<uintptr_t>(element.offset)));
- m_VertexBufferIndex++;
- }
-
- m_VertexBuffers.push_back(vertexBuffer);
- }
-
- void OpenGLVertexArray::SetIndexBuffer(const Ref<IndexBuffer>& indexBuffer)
- {
- glBindVertexArray(m_RendererID);
- indexBuffer->Bind();
- m_IndexBuffer = indexBuffer;
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLVertexArray.h b/src/Platform/OpenGL/OpenGLVertexArray.h
deleted file mode 100644
index b6ae82f..0000000
--- a/src/Platform/OpenGL/OpenGLVertexArray.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#pragma once
-
-#include "Core/Memory.h"
-
-#include "Rendering/VertexArray.h"
-#include "Rendering/VertexBuffer.h"
-#include "Rendering/IndexBuffer.h"
-
-#include <vector>
-
-namespace Donut
-{
- class OpenGLVertexArray
- : public VertexArray
- {
- public:
- OpenGLVertexArray();
- virtual ~OpenGLVertexArray();
-
- virtual void Bind() const override;
- virtual void Unbind() const override;
-
- virtual void AddVertexBuffer(const Ref<VertexBuffer>& vertexBuffer) override;
- virtual void SetIndexBuffer(const Ref<IndexBuffer>& indexBuffer) override;
-
- virtual const std::vector<Ref<VertexBuffer>>& GetVertexBuffers() const override
- {
- return m_VertexBuffers;
- }
-
- virtual const Ref<IndexBuffer>& GetIndexBuffer() const override
- {
- return m_IndexBuffer;
- }
- private:
- uint32_t m_RendererID;
- uint32_t m_VertexBufferIndex = 0;
- std::vector<Ref<VertexBuffer>> m_VertexBuffers;
- Ref<IndexBuffer> m_IndexBuffer;
- };
-};
diff --git a/src/Platform/OpenGL/OpenGLVertexBuffer.cpp b/src/Platform/OpenGL/OpenGLVertexBuffer.cpp
deleted file mode 100644
index 4f5e48f..0000000
--- a/src/Platform/OpenGL/OpenGLVertexBuffer.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "OpenGLVertexBuffer.h"
-#include "Rendering/VertexBuffer.h"
-
-#include <glad/glad.h>
-
-namespace Donut
-{
- OpenGLVertexBuffer::OpenGLVertexBuffer(const void* data, uint32_t size)
- {
- glGenBuffers(1, &m_RendererID); // glCreateBuffers is 4.5 DSA; unavailable on macOS 4.1
- glBindBuffer(GL_ARRAY_BUFFER, m_RendererID);
- glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
- }
-
- OpenGLVertexBuffer::~OpenGLVertexBuffer()
- {
- glDeleteBuffers(1, &m_RendererID);
- }
-
- void OpenGLVertexBuffer::Bind() const
- {
- glBindBuffer(GL_ARRAY_BUFFER, m_RendererID);
- }
-
- void OpenGLVertexBuffer::Unbind() const
- {
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- }
-
- void OpenGLVertexBuffer::SetData(const void* data, uint32_t size)
- {
- glBindBuffer(GL_ARRAY_BUFFER, m_RendererID);
- glBufferSubData(GL_ARRAY_BUFFER, 0, size, data);
- }
-};
diff --git a/src/Platform/OpenGL/OpenGLVertexBuffer.h b/src/Platform/OpenGL/OpenGLVertexBuffer.h
deleted file mode 100644
index 6244f7d..0000000
--- a/src/Platform/OpenGL/OpenGLVertexBuffer.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#pragma once
-
-#include "Rendering/VertexBuffer.h"
-
-namespace Donut
-{
- class OpenGLVertexBuffer
- : public VertexBuffer
- {
- public:
- OpenGLVertexBuffer(const void* data, uint32_t size);
- virtual ~OpenGLVertexBuffer();
-
- virtual void Bind() const override;
- virtual void Unbind() const override;
- virtual void SetData(const void* data, uint32_t size) override;
-
- virtual const VertexBufferLayout& GetLayout() const override { return m_Layout; }
- virtual void SetLayout(const VertexBufferLayout& layout) override { m_Layout = layout; }
-
- private:
- uint32_t m_RendererID;
- VertexBufferLayout m_Layout;
- };
-};