diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibGL/SoftwareGLContext.cpp | 24 | ||||
-rw-r--r-- | Userland/Libraries/LibGL/SoftwareGLContext.h | 5 |
2 files changed, 26 insertions, 3 deletions
diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index 1186d4faf4..f7e777235b 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -9,6 +9,7 @@ #include <AK/Debug.h> #include <AK/Format.h> #include <AK/QuickSort.h> +#include <AK/StringBuilder.h> #include <AK/TemporaryChange.h> #include <AK/Variant.h> #include <AK/Vector.h> @@ -75,6 +76,8 @@ SoftwareGLContext::SoftwareGLContext(Gfx::Bitmap& frontbuffer) light0.diffuse_intensity = { 1.0f, 1.0f, 1.0f, 1.0f }; light0.specular_intensity = { 1.0f, 1.0f, 1.0f, 1.0f }; m_light_state_is_dirty = true; + + build_extension_string(); } Optional<ContextParameter> SoftwareGLContext::get_context_parameter(GLenum name) @@ -431,7 +434,7 @@ GLubyte* SoftwareGLContext::gl_get_string(GLenum name) case GL_VERSION: return reinterpret_cast<GLubyte*>(const_cast<char*>("1.5")); case GL_EXTENSIONS: - return reinterpret_cast<GLubyte*>(const_cast<char*>("")); + return reinterpret_cast<GLubyte*>(const_cast<char*>(m_extensions.characters())); case GL_SHADING_LANGUAGE_VERSION: return reinterpret_cast<GLubyte*>(const_cast<char*>("0.0")); default: @@ -924,8 +927,10 @@ void SoftwareGLContext::gl_tex_image_2d(GLenum target, GLint level, GLint intern RETURN_WITH_ERROR_IF(level < 0 || level > Texture2D::LOG2_MAX_TEXTURE_SIZE, GL_INVALID_VALUE); RETURN_WITH_ERROR_IF(width < 0 || height < 0 || width > (2 + Texture2D::MAX_TEXTURE_SIZE) || height > (2 + Texture2D::MAX_TEXTURE_SIZE), GL_INVALID_VALUE); // Check if width and height are a power of 2 - RETURN_WITH_ERROR_IF((width & (width - 1)) != 0, GL_INVALID_VALUE); - RETURN_WITH_ERROR_IF((height & (height - 1)) != 0, GL_INVALID_VALUE); + if (!m_device_info.supports_npot_textures) { + RETURN_WITH_ERROR_IF((width & (width - 1)) != 0, GL_INVALID_VALUE); + RETURN_WITH_ERROR_IF((height & (height - 1)) != 0, GL_INVALID_VALUE); + } RETURN_WITH_ERROR_IF(border != 0, GL_INVALID_VALUE); if (level == 0) { @@ -3249,6 +3254,19 @@ void SoftwareGLContext::sync_stencil_configuration() set_device_stencil(SoftGPU::Face::Back, m_stencil_function[Face::Back], m_stencil_operation[Face::Back]); } +void SoftwareGLContext::build_extension_string() +{ + Vector<StringView> extensions; + + // FIXME: npot texture support became a required core feature starting with OpenGL 2.0 (https://www.khronos.org/opengl/wiki/NPOT_Texture) + // Ideally we would verify if the selected device adheres to the requested OpenGL context version before context creation + // and refuse to create a context if it doesn't. + if (m_device_info.supports_npot_textures) + extensions.append("GL_ARB_texture_non_power_of_two"); + + m_extensions = String::join(" ", extensions); +} + void SoftwareGLContext::gl_lightf(GLenum light, GLenum pname, GLfloat param) { APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_lightf, light, pname, param); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index ff5ea056be..8448098990 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -157,6 +157,8 @@ private: void sync_light_state(); void sync_stencil_configuration(); + void build_extension_string(); + template<typename T> T* store_in_listing(T value) { @@ -432,6 +434,9 @@ private: bool m_color_material_enabled { false }; GLenum m_color_material_face { GL_FRONT_AND_BACK }; GLenum m_color_material_mode { GL_AMBIENT_AND_DIFFUSE }; + + // GL Extension string + String m_extensions; }; } |