OSDN Git Service

Added utility function for OpenGL extension strings
authorAlexis Hetu <sugoi@google.com>
Thu, 2 Apr 2015 20:45:59 +0000 (16:45 -0400)
committerAlexis Hétu <sugoi@google.com>
Tue, 14 Apr 2015 15:39:07 +0000 (15:39 +0000)
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 <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/libGLESv2.cpp
src/OpenGL/libGLESv2/libGLESv3.cpp

index c610e59..923ee91 100644 (file)
@@ -1867,8 +1867,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
                *params = 0;\r
                break;\r
        case GL_NUM_EXTENSIONS: // integer\r
-               UNIMPLEMENTED();\r
-               *params = 0;\r
+               GLuint numExtensions;\r
+               getExtensions(0, &numExtensions);\r
+               *params = numExtensions;\r
                break;\r
        case GL_NUM_PROGRAM_BINARY_FORMATS: // integer, at least 0\r
                UNIMPLEMENTED();\r
@@ -3890,6 +3891,85 @@ Device *Context::getDevice()
        return device;\r
 }\r
 \r
+const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt)\r
+{\r
+       // Keep list sorted in following order:\r
+       // OES extensions\r
+       // EXT extensions\r
+       // Vendor extensions\r
+       static const GLubyte* extensions[] = {\r
+               (const GLubyte*)"GL_OES_compressed_ETC1_RGB8_texture",\r
+               (const GLubyte*)"GL_OES_depth_texture",\r
+               (const GLubyte*)"GL_OES_depth_texture_cube_map",\r
+               (const GLubyte*)"GL_OES_EGL_image",\r
+               (const GLubyte*)"GL_OES_EGL_image_external",\r
+               (const GLubyte*)"GL_OES_element_index_uint",\r
+               (const GLubyte*)"GL_OES_packed_depth_stencil",\r
+               (const GLubyte*)"GL_OES_rgb8_rgba8",\r
+               (const GLubyte*)"GL_OES_standard_derivatives",\r
+               (const GLubyte*)"GL_OES_texture_float",\r
+               (const GLubyte*)"GL_OES_texture_float_linear",\r
+               (const GLubyte*)"GL_OES_texture_half_float",\r
+               (const GLubyte*)"GL_OES_texture_half_float_linear",\r
+               (const GLubyte*)"GL_OES_texture_npot",\r
+               (const GLubyte*)"GL_OES_texture_3D",\r
+               (const GLubyte*)"GL_EXT_blend_minmax",\r
+               (const GLubyte*)"GL_EXT_occlusion_query_boolean",\r
+               (const GLubyte*)"GL_EXT_read_format_bgra",\r
+#if (S3TC_SUPPORT)\r
+               (const GLubyte*)"GL_EXT_texture_compression_dxt1",\r
+#endif\r
+               (const GLubyte*)"GL_EXT_texture_filter_anisotropic",\r
+               (const GLubyte*)"GL_EXT_texture_format_BGRA8888",\r
+               (const GLubyte*)"GL_ANGLE_framebuffer_blit",\r
+               (const GLubyte*)"GL_NV_framebuffer_blit",\r
+               (const GLubyte*)"GL_ANGLE_framebuffer_multisample",\r
+#if (S3TC_SUPPORT)\r
+               (const GLubyte*)"GL_ANGLE_texture_compression_dxt3",\r
+               (const GLubyte*)"GL_ANGLE_texture_compression_dxt5",\r
+#endif\r
+               (const GLubyte*)"GL_NV_fence"\r
+       };\r
+       static const GLuint numExtensions = sizeof(extensions) / sizeof(*extensions);\r
+\r
+       if(numExt)\r
+       {\r
+               *numExt = numExtensions;\r
+               return nullptr;\r
+       }\r
+\r
+       if(index == GL_INVALID_INDEX)\r
+       {\r
+               static GLubyte* extensionsCat = nullptr;\r
+               if((extensionsCat == nullptr) && (numExtensions > 0))\r
+               {\r
+                       int totalLength = numExtensions; // 1 space between each extension name + terminating null\r
+                       for(int i = 0; i < numExtensions; ++i)\r
+                       {\r
+                               totalLength += strlen(reinterpret_cast<const char*>(extensions[i]));\r
+                       }\r
+                       extensionsCat = new GLubyte[totalLength];\r
+                       extensionsCat[0] = '\0';\r
+                       for(int i = 0; i < numExtensions; ++i)\r
+                       {\r
+                               if(i != 0)\r
+                               {\r
+                                       strcat(reinterpret_cast<char*>(extensionsCat), " ");\r
+                               }\r
+                               strcat(reinterpret_cast<char*>(extensionsCat), reinterpret_cast<const char*>(extensions[i]));\r
+                       }\r
+               }\r
+               return extensionsCat;\r
+       }\r
+\r
+       if(index >= numExtensions)\r
+       {\r
+               return nullptr;\r
+       }\r
+\r
+       return extensions[index];\r
+}\r
+\r
 }\r
 \r
 // Exported functions for use by EGL\r
index aa7fccc..56031f6 100644 (file)
@@ -560,6 +560,8 @@ public:
 \r
        Device *getDevice();\r
 \r
+       const GLubyte* getExtensions(GLuint index, GLuint* numExt = nullptr);\r
+\r
 private:\r
        virtual ~Context();\r
 \r
index 21c1232..4b025ef 100644 (file)
@@ -3104,7 +3104,7 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
        switch(name)\r
        {\r
        case GL_VENDOR:\r
-               return (GLubyte*)"TransGaming Inc.";\r
+               return (GLubyte*)"Google Inc.";\r
        case GL_RENDERER:\r
                return (GLubyte*)"SwiftShader";\r
        case GL_VERSION:\r
@@ -3112,42 +3112,10 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
        case GL_SHADING_LANGUAGE_VERSION:\r
                return (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING;\r
        case GL_EXTENSIONS:\r
-               // Keep list sorted in following order:\r
-               // OES extensions\r
-               // EXT extensions\r
-               // Vendor extensions\r
-               return (GLubyte*)\r
-                       "GL_OES_compressed_ETC1_RGB8_texture "\r
-                       "GL_OES_depth_texture "\r
-                       "GL_OES_depth_texture_cube_map "\r
-                       "GL_OES_EGL_image "\r
-                       "GL_OES_EGL_image_external "\r
-                       "GL_OES_element_index_uint "\r
-                       "GL_OES_packed_depth_stencil "\r
-                       "GL_OES_rgb8_rgba8 "\r
-                       "GL_OES_standard_derivatives "\r
-                       "GL_OES_texture_float "\r
-                       "GL_OES_texture_float_linear "\r
-                       "GL_OES_texture_half_float "\r
-                       "GL_OES_texture_half_float_linear "\r
-                       "GL_OES_texture_npot "\r
-                       "GL_OES_texture_3D "\r
-                       "GL_EXT_blend_minmax "\r
-                       "GL_EXT_occlusion_query_boolean "\r
-                       "GL_EXT_read_format_bgra "\r
-                       #if (S3TC_SUPPORT)\r
-                       "GL_EXT_texture_compression_dxt1 "\r
-                       #endif\r
-                       "GL_EXT_texture_filter_anisotropic "\r
-                       "GL_EXT_texture_format_BGRA8888 "\r
-                       "GL_ANGLE_framebuffer_blit "\r
-                       "GL_NV_framebuffer_blit "\r
-                       "GL_ANGLE_framebuffer_multisample "\r
-                       #if (S3TC_SUPPORT)\r
-                       "GL_ANGLE_texture_compression_dxt3 "\r
-                       "GL_ANGLE_texture_compression_dxt5 "\r
-                       #endif\r
-                       "GL_NV_fence";\r
+       {\r
+               es2::Context *context = es2::getContext();\r
+               return context ? context->getExtensions(GL_INVALID_INDEX) : (GLubyte*)NULL;\r
+       }\r
        default:\r
                return error(GL_INVALID_ENUM, (GLubyte*)NULL);\r
        }\r
index e58a3ce..c71834e 100644 (file)
@@ -2257,8 +2257,27 @@ const GLubyte *GL_APIENTRY glGetStringi(GLenum name, GLuint index)
 {\r
        TRACE("(GLenum name = 0x%X, GLuint index = %d)", name, index);\r
 \r
-       UNIMPLEMENTED();\r
-       return nullptr;\r
+       es2::Context *context = es2::getContext();\r
+       if(context)\r
+       {\r
+               GLuint numExtensions;\r
+               context->getExtensions(0, &numExtensions);\r
+\r
+               if(index >= numExtensions)\r
+               {\r
+                       return error(GL_INVALID_VALUE, (GLubyte*)NULL);\r
+               }\r
+\r
+               switch(name)\r
+               {\r
+               case GL_EXTENSIONS:\r
+                       return context->getExtensions(index);\r
+               default:\r
+                       return error(GL_INVALID_ENUM, (GLubyte*)NULL);\r
+               }\r
+       }\r
+\r
+       return (GLubyte*)NULL;\r
 }\r
 \r
 void GL_APIENTRY glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)\r