From 8141d7c5285f42605920c66f1282f923ea41949b Mon Sep 17 00:00:00 2001 From: Alexis Hetu Date: Thu, 2 Apr 2015 16:45:59 -0400 Subject: [PATCH] Added utility function for OpenGL extension strings MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The new glGetStringi() function needed to be unified with glGetString(), so I made a utility function to make future modifications easy. Change-Id: I6619d9f99b10d9fc43bd8783a1d50274e2b37a7b Reviewed-on: https://swiftshader-review.googlesource.com/2797 Tested-by: Alexis Hétu Reviewed-by: Nicolas Capens --- src/OpenGL/libGLESv2/Context.cpp | 84 +++++++++++++++++++++++++++++++++++++- src/OpenGL/libGLESv2/Context.h | 2 + src/OpenGL/libGLESv2/libGLESv2.cpp | 42 +++---------------- src/OpenGL/libGLESv2/libGLESv3.cpp | 23 ++++++++++- 4 files changed, 110 insertions(+), 41 deletions(-) diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index c610e59f8..923ee9142 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp @@ -1867,8 +1867,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params) *params = 0; break; case GL_NUM_EXTENSIONS: // integer - UNIMPLEMENTED(); - *params = 0; + GLuint numExtensions; + getExtensions(0, &numExtensions); + *params = numExtensions; break; case GL_NUM_PROGRAM_BINARY_FORMATS: // integer, at least 0 UNIMPLEMENTED(); @@ -3890,6 +3891,85 @@ Device *Context::getDevice() return device; } +const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt) +{ + // Keep list sorted in following order: + // OES extensions + // EXT extensions + // Vendor extensions + static const GLubyte* extensions[] = { + (const GLubyte*)"GL_OES_compressed_ETC1_RGB8_texture", + (const GLubyte*)"GL_OES_depth_texture", + (const GLubyte*)"GL_OES_depth_texture_cube_map", + (const GLubyte*)"GL_OES_EGL_image", + (const GLubyte*)"GL_OES_EGL_image_external", + (const GLubyte*)"GL_OES_element_index_uint", + (const GLubyte*)"GL_OES_packed_depth_stencil", + (const GLubyte*)"GL_OES_rgb8_rgba8", + (const GLubyte*)"GL_OES_standard_derivatives", + (const GLubyte*)"GL_OES_texture_float", + (const GLubyte*)"GL_OES_texture_float_linear", + (const GLubyte*)"GL_OES_texture_half_float", + (const GLubyte*)"GL_OES_texture_half_float_linear", + (const GLubyte*)"GL_OES_texture_npot", + (const GLubyte*)"GL_OES_texture_3D", + (const GLubyte*)"GL_EXT_blend_minmax", + (const GLubyte*)"GL_EXT_occlusion_query_boolean", + (const GLubyte*)"GL_EXT_read_format_bgra", +#if (S3TC_SUPPORT) + (const GLubyte*)"GL_EXT_texture_compression_dxt1", +#endif + (const GLubyte*)"GL_EXT_texture_filter_anisotropic", + (const GLubyte*)"GL_EXT_texture_format_BGRA8888", + (const GLubyte*)"GL_ANGLE_framebuffer_blit", + (const GLubyte*)"GL_NV_framebuffer_blit", + (const GLubyte*)"GL_ANGLE_framebuffer_multisample", +#if (S3TC_SUPPORT) + (const GLubyte*)"GL_ANGLE_texture_compression_dxt3", + (const GLubyte*)"GL_ANGLE_texture_compression_dxt5", +#endif + (const GLubyte*)"GL_NV_fence" + }; + static const GLuint numExtensions = sizeof(extensions) / sizeof(*extensions); + + if(numExt) + { + *numExt = numExtensions; + return nullptr; + } + + if(index == GL_INVALID_INDEX) + { + static GLubyte* extensionsCat = nullptr; + if((extensionsCat == nullptr) && (numExtensions > 0)) + { + int totalLength = numExtensions; // 1 space between each extension name + terminating null + for(int i = 0; i < numExtensions; ++i) + { + totalLength += strlen(reinterpret_cast(extensions[i])); + } + extensionsCat = new GLubyte[totalLength]; + extensionsCat[0] = '\0'; + for(int i = 0; i < numExtensions; ++i) + { + if(i != 0) + { + strcat(reinterpret_cast(extensionsCat), " "); + } + strcat(reinterpret_cast(extensionsCat), reinterpret_cast(extensions[i])); + } + } + return extensionsCat; + } + + if(index >= numExtensions) + { + return nullptr; + } + + return extensions[index]; +} + } // Exported functions for use by EGL diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h index aa7fccc1c..56031f6bb 100644 --- a/src/OpenGL/libGLESv2/Context.h +++ b/src/OpenGL/libGLESv2/Context.h @@ -560,6 +560,8 @@ public: Device *getDevice(); + const GLubyte* getExtensions(GLuint index, GLuint* numExt = nullptr); + private: virtual ~Context(); diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp index 21c1232c3..4b025ef63 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.cpp +++ b/src/OpenGL/libGLESv2/libGLESv2.cpp @@ -3104,7 +3104,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name) switch(name) { case GL_VENDOR: - return (GLubyte*)"TransGaming Inc."; + return (GLubyte*)"Google Inc."; case GL_RENDERER: return (GLubyte*)"SwiftShader"; case GL_VERSION: @@ -3112,42 +3112,10 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name) case GL_SHADING_LANGUAGE_VERSION: return (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING; case GL_EXTENSIONS: - // Keep list sorted in following order: - // OES extensions - // EXT extensions - // Vendor extensions - return (GLubyte*) - "GL_OES_compressed_ETC1_RGB8_texture " - "GL_OES_depth_texture " - "GL_OES_depth_texture_cube_map " - "GL_OES_EGL_image " - "GL_OES_EGL_image_external " - "GL_OES_element_index_uint " - "GL_OES_packed_depth_stencil " - "GL_OES_rgb8_rgba8 " - "GL_OES_standard_derivatives " - "GL_OES_texture_float " - "GL_OES_texture_float_linear " - "GL_OES_texture_half_float " - "GL_OES_texture_half_float_linear " - "GL_OES_texture_npot " - "GL_OES_texture_3D " - "GL_EXT_blend_minmax " - "GL_EXT_occlusion_query_boolean " - "GL_EXT_read_format_bgra " - #if (S3TC_SUPPORT) - "GL_EXT_texture_compression_dxt1 " - #endif - "GL_EXT_texture_filter_anisotropic " - "GL_EXT_texture_format_BGRA8888 " - "GL_ANGLE_framebuffer_blit " - "GL_NV_framebuffer_blit " - "GL_ANGLE_framebuffer_multisample " - #if (S3TC_SUPPORT) - "GL_ANGLE_texture_compression_dxt3 " - "GL_ANGLE_texture_compression_dxt5 " - #endif - "GL_NV_fence"; + { + es2::Context *context = es2::getContext(); + return context ? context->getExtensions(GL_INVALID_INDEX) : (GLubyte*)NULL; + } default: return error(GL_INVALID_ENUM, (GLubyte*)NULL); } diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp index e58a3ce29..c71834e29 100644 --- a/src/OpenGL/libGLESv2/libGLESv3.cpp +++ b/src/OpenGL/libGLESv2/libGLESv3.cpp @@ -2257,8 +2257,27 @@ const GLubyte *GL_APIENTRY glGetStringi(GLenum name, GLuint index) { TRACE("(GLenum name = 0x%X, GLuint index = %d)", name, index); - UNIMPLEMENTED(); - return nullptr; + es2::Context *context = es2::getContext(); + if(context) + { + GLuint numExtensions; + context->getExtensions(0, &numExtensions); + + if(index >= numExtensions) + { + return error(GL_INVALID_VALUE, (GLubyte*)NULL); + } + + switch(name) + { + case GL_EXTENSIONS: + return context->getExtensions(index); + default: + return error(GL_INVALID_ENUM, (GLubyte*)NULL); + } + } + + return (GLubyte*)NULL; } void GL_APIENTRY glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) -- 2.11.0