diff options
Diffstat (limited to 'src/mesa/es/main/specials_es1.c')
-rw-r--r-- | src/mesa/es/main/specials_es1.c | 166 |
1 files changed, 117 insertions, 49 deletions
diff --git a/src/mesa/es/main/specials_es1.c b/src/mesa/es/main/specials_es1.c index 8c1edab38c..1bba8b1770 100644 --- a/src/mesa/es/main/specials_es1.c +++ b/src/mesa/es/main/specials_es1.c @@ -32,62 +32,130 @@ extern const GLubyte * GLAPIENTRY _es_GetString(GLenum name); -static const char * +static const GLubyte * compute_es_version(void) { + GET_CURRENT_CONTEXT(ctx); static const char es_1_0[] = "OpenGL ES-CM 1.0"; static const char es_1_1[] = "OpenGL ES-CM 1.1"; + /* OpenGL ES 1.0 is derived from OpenGL 1.3 */ + const GLboolean ver_1_0 = (ctx->Extensions.ARB_multisample && + ctx->Extensions.ARB_multitexture && + ctx->Extensions.ARB_texture_compression && + ctx->Extensions.EXT_texture_env_add && + ctx->Extensions.ARB_texture_env_combine && + ctx->Extensions.ARB_texture_env_dot3); + /* OpenGL ES 1.1 is derived from OpenGL 1.5 */ + const GLboolean ver_1_1 = (ver_1_0 && + ctx->Extensions.EXT_point_parameters && + ctx->Extensions.SGIS_generate_mipmap && + ctx->Extensions.ARB_vertex_buffer_object); + if (ver_1_1) + return (const GLubyte *) es_1_1; + + if (!ver_1_0) + _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support."); + return (const GLubyte *) es_1_0; +} + + +static size_t +append_extension(char **str, const char *ext) +{ + char *s = *str; + size_t len = strlen(ext); + + if (s) { + memcpy(s, ext, len); + s[len++] = ' '; + s[len] = '\0'; - (void) es_1_0; - return es_1_1; + *str += len; + } + else { + len++; + } + + return len; } -/** - * Note: a more dynamic solution would be query the underlying GL - * and translate extension names... - */ -static const char * -extension_string(void) +static size_t +make_extension_string(const GLcontext *ctx, char *str) { - return - /* Core additions */ - "GL_OES_byte_coordinates " - "GL_OES_fixed_point " - "GL_OES_single_precision " - "GL_OES_matrix_get " - - /* 1.1 required extensions */ - "GL_OES_read_format " - "GL_OES_compressed_paletted_texture " - "GL_OES_point_size_array " - "GL_OES_point_sprite " - - /* 1.1 optional extensions */ - "GL_OES_draw_texture " - - /* 1.1 deprecated extensions */ - "GL_OES_query_matrix " - - /* Newer extensions */ - "GL_OES_blend_equation_separate " - "GL_OES_blend_func_separate " - "GL_OES_blend_subtract " - "GL_OES_depth24 " - "GL_OES_depth32 " - "GL_OES_element_index_uint " - "GL_OES_fbo_render_mipmap " - "GL_OES_framebuffer_object " - "GL_OES_mapbuffer " - "GL_OES_rgb8_rgba8 " - "GL_OES_stencil1 " - "GL_OES_stencil4 " - "GL_OES_stencil8 " - "GL_OES_texture_cube_map " - "GL_OES_texture_env_crossbar " - "GL_OES_texture_mirrored_repeat " - "GL_EXT_texture_filter_anisotropic " - ; + size_t len = 0; + + /* Core additions */ + len += append_extension(&str, "GL_OES_byte_coordinates"); + len += append_extension(&str, "GL_OES_fixed_point"); + len += append_extension(&str, "GL_OES_single_precision"); + len += append_extension(&str, "GL_OES_matrix_get"); + + /* 1.1 required extensions */ + len += append_extension(&str, "GL_OES_read_format"); + len += append_extension(&str, "GL_OES_compressed_paletted_texture"); + len += append_extension(&str, "GL_OES_point_size_array"); + len += append_extension(&str, "GL_OES_point_sprite"); + + /* 1.1 optional extensions */ + len += append_extension(&str, "GL_OES_draw_texture"); + /* 1.1 deprecated extensions */ + len += append_extension(&str, "GL_OES_query_matrix"); + + if (ctx->Extensions.EXT_blend_equation_separate) + len += append_extension(&str, "GL_OES_blend_equation_separate"); + if (ctx->Extensions.EXT_blend_func_separate) + len += append_extension(&str, "GL_OES_blend_func_separate"); + if (ctx->Extensions.EXT_blend_subtract) + len += append_extension(&str, "GL_OES_blend_subtract"); + + if (ctx->Extensions.ARB_texture_cube_map) + len += append_extension(&str, "GL_OES_texture_cube_map"); + if (ctx->Extensions.ARB_texture_env_crossbar) + len += append_extension(&str, "GL_OES_texture_env_crossbar"); + if (ctx->Extensions.ARB_texture_mirrored_repeat) + len += append_extension(&str, "GL_OES_texture_mirrored_repeat"); + + if (ctx->Extensions.ARB_framebuffer_object) { + len += append_extension(&str, "GL_OES_framebuffer_object"); + len += append_extension(&str, "GL_OES_depth24"); + len += append_extension(&str, "GL_OES_depth32"); + len += append_extension(&str, "GL_OES_fbo_render_mipmap"); + len += append_extension(&str, "GL_OES_rgb8_rgba8"); + len += append_extension(&str, "GL_OES_stencil1"); + len += append_extension(&str, "GL_OES_stencil4"); + len += append_extension(&str, "GL_OES_stencil8"); + } + + if (ctx->Extensions.EXT_vertex_array) + len += append_extension(&str, "GL_OES_element_index_uint"); + if (ctx->Extensions.ARB_vertex_buffer_object) + len += append_extension(&str, "GL_OES_mapbuffer"); + if (ctx->Extensions.EXT_texture_filter_anisotropic) + len += append_extension(&str, "GL_EXT_texture_filter_anisotropic"); + + return len; +} + + +static const GLubyte * +compute_es_extensions(void) +{ + GET_CURRENT_CONTEXT(ctx); + + if (!ctx->Extensions.String) { + char *s; + unsigned int len; + + len = make_extension_string(ctx, NULL); + s = (char *) _mesa_malloc(len + 1); + if (!s) + return NULL; + make_extension_string(ctx, s); + ctx->Extensions.String = (const GLubyte *) s; + } + + return ctx->Extensions.String; } @@ -96,9 +164,9 @@ _es_GetString(GLenum name) { switch (name) { case GL_VERSION: - return (const GLubyte *) compute_es_version(); + return compute_es_version(); case GL_EXTENSIONS: - return (const GLubyte *) extension_string(); + return compute_es_extensions(); default: return _mesa_GetString(name); } |