From aabbeac3d9e2ac0f293ab43fec71e56091c823e8 Mon Sep 17 00:00:00 2001 From: hachem Date: Tue, 18 Aug 2026 15:00:34 +0200 Subject: fix: macOS compatibility --- src/platform/opengl/opengl_texture.cpp | 104 ++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 46 deletions(-) (limited to 'src/platform/opengl/opengl_texture.cpp') diff --git a/src/platform/opengl/opengl_texture.cpp b/src/platform/opengl/opengl_texture.cpp index 34a5117..8471ee8 100644 --- a/src/platform/opengl/opengl_texture.cpp +++ b/src/platform/opengl/opengl_texture.cpp @@ -16,14 +16,14 @@ namespace Donut m_internal_format = GL_RGBA8; m_data_format = GL_RGBA; - glCreateTextures(GL_TEXTURE_2D, 1, &m_renderer_id); - glTextureStorage2D(m_renderer_id, 1, m_internal_format, m_width, m_height); + glGenTextures(1, &m_renderer_id); + glBindTexture(GL_TEXTURE_2D, m_renderer_id); + glTexImage2D(GL_TEXTURE_2D, 0, m_internal_format, m_width, m_height, 0, m_data_format, GL_UNSIGNED_BYTE, nullptr); - glTextureParameteri(m_renderer_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTextureParameteri(m_renderer_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_T, GL_REPEAT); + 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) @@ -34,17 +34,17 @@ namespace Donut m_internal_format = GL_RGBA8; m_data_format = GL_RGBA; - glCreateTextures(GL_TEXTURE_2D, 1, &m_renderer_id); - glTextureStorage2D(m_renderer_id, 1, m_internal_format, m_width, m_height); - - glTextureParameteri(m_renderer_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTextureParameteri(m_renderer_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glGenTextures(1, &m_renderer_id); + glBindTexture(GL_TEXTURE_2D, m_renderer_id); + glTexImage2D(GL_TEXTURE_2D, 0, m_internal_format, m_width, m_height, 0, m_data_format, GL_UNSIGNED_BYTE, nullptr); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_T, GL_REPEAT); + 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 white_pixel = 0xFFFFFFFF; - glTextureSubImage2D(m_renderer_id, 0, 0, 0, m_width, m_height, m_data_format, GL_UNSIGNED_BYTE, &white_pixel); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_width, m_height, m_data_format, GL_UNSIGNED_BYTE, &white_pixel); DONUT_INFO("Created default texture (stb_image not available for loading: ", path, ")"); } @@ -62,17 +62,21 @@ namespace Donut DONUT_ERROR("Data must be entire texture!"); return; } - - glTextureSubImage2D(m_renderer_id, 0, 0, 0, m_width, m_height, m_data_format, GL_UNSIGNED_BYTE, data); + + glBindTexture(GL_TEXTURE_2D, m_renderer_id); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_width, m_height, m_data_format, GL_UNSIGNED_BYTE, data); } void OpenGLTexture2D::bind(uint32_t slot) const { - glBindTextureUnit(slot, m_renderer_id); + glActiveTexture(GL_TEXTURE0 + slot); + glBindTexture(GL_TEXTURE_2D, m_renderer_id); } void OpenGLTexture2D::bind_as_image(uint32_t slot, bool read_only) const { + if (glBindImageTexture == nullptr) + return; GLenum access = read_only ? GL_READ_ONLY : GL_WRITE_ONLY; glBindImageTexture(slot, m_renderer_id, 0, GL_FALSE, 0, access, m_internal_format); } @@ -80,17 +84,19 @@ namespace Donut OpenGLCubemapTexture::OpenGLCubemapTexture(uint32_t width, uint32_t height) : m_width(width), m_height(height) { - m_internal_format = GL_RGB16F; - m_data_format = GL_RGB; + m_internal_format = GL_RGBA16F; + m_data_format = GL_RGBA; - glCreateTextures(GL_TEXTURE_CUBE_MAP, 1, &m_renderer_id); - glTextureStorage2D(m_renderer_id, 1, m_internal_format, m_width, m_height); + glGenTextures(1, &m_renderer_id); + glBindTexture(GL_TEXTURE_CUBE_MAP, m_renderer_id); + for (uint32_t i = 0; i < 6; ++i) + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_internal_format, m_width, m_height, 0, m_data_format, GL_FLOAT, nullptr); - glTextureParameteri(m_renderer_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTextureParameteri(m_renderer_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + 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) @@ -98,17 +104,19 @@ namespace Donut { m_width = 1024; m_height = 1024; - m_internal_format = GL_RGB16F; - m_data_format = GL_RGB; + m_internal_format = GL_RGBA16F; + m_data_format = GL_RGBA; - glCreateTextures(GL_TEXTURE_CUBE_MAP, 1, &m_renderer_id); - glTextureStorage2D(m_renderer_id, 1, m_internal_format, m_width, m_height); + glGenTextures(1, &m_renderer_id); + glBindTexture(GL_TEXTURE_CUBE_MAP, m_renderer_id); + for (uint32_t i = 0; i < 6; ++i) + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_internal_format, m_width, m_height, 0, m_data_format, GL_FLOAT, nullptr); - glTextureParameteri(m_renderer_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTextureParameteri(m_renderer_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTextureParameteri(m_renderer_id, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + 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); load_hdri(path); } @@ -123,11 +131,11 @@ namespace Donut stbi_set_flip_vertically_on_load(true); int width, height, channels; float* hdr_data = stbi_loadf(path.c_str(), &width, &height, &channels, 3); - + if (!hdr_data) { DONUT_ERROR("Failed to load HDRI: {}", path); - float default_sky[6 * 4] = + float default_sky[6 * 4] = { 0.5f, 0.7f, 1.0f, 1.0f, 0.5f, 0.7f, 1.0f, 1.0f, @@ -136,15 +144,16 @@ namespace Donut 0.5f, 0.7f, 1.0f, 1.0f, 0.5f, 0.7f, 1.0f, 1.0f }; - + + glBindTexture(GL_TEXTURE_CUBE_MAP, m_renderer_id); for (int i = 0; i < 6; ++i) - glTextureSubImage3D(m_renderer_id, 0, 0, 0, i, 1, 1, 1, GL_RGBA, GL_FLOAT, &default_sky[i * 4]); + glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, 1, 1, GL_RGBA, GL_FLOAT, &default_sky[i * 4]); return; } convert_equirectangular_to_cubemap(hdr_data, width, height); stbi_image_free(hdr_data); - + DONUT_INFO("Successfully loaded HDRI: {} ({}x{})", path, width, height); } @@ -174,10 +183,10 @@ namespace Donut DONUT_ERROR("Failed to create equirectangular to cubemap shader"); return; } - + uint32_t shader_program = equirect_shader->get_renderer_id(); - float vertices[] = + 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, @@ -197,7 +206,7 @@ namespace Donut glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glm::mat4 capture_projection = glm::perspective(glm::radians(90.0f), 1.0f, 0.1f, 10.0f); - glm::mat4 capture_views[] = + glm::mat4 capture_views[] = { 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)), @@ -224,10 +233,10 @@ namespace Donut glDrawArrays(GL_TRIANGLES, 0, 36); } glBindVertexArray(0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); glDeleteVertexArrays(1, &cube_vao); glDeleteBuffers(1, &cube_vbo); - glDeleteProgram(shader_program); glDeleteTextures(1, &hdr_texture); glDeleteFramebuffers(1, &capture_fbo); glDeleteRenderbuffers(1, &capture_rbo); @@ -240,11 +249,14 @@ namespace Donut void OpenGLCubemapTexture::bind(uint32_t slot) const { - glBindTextureUnit(slot, m_renderer_id); + glActiveTexture(GL_TEXTURE0 + slot); + glBindTexture(GL_TEXTURE_CUBE_MAP, m_renderer_id); } void OpenGLCubemapTexture::bind_as_image(uint32_t slot, bool read_only) const { + if (glBindImageTexture == nullptr) + return; GLenum access = read_only ? GL_READ_ONLY : GL_WRITE_ONLY; glBindImageTexture(slot, m_renderer_id, 0, GL_TRUE, 0, access, m_internal_format); } -- cgit v1.3