filename | src/pvr2/glutil.c |
changeset | 1140:7dc1c71ece76 |
prev | 1134:f502f3d32f90 |
next | 1150:1038800cecd8 |
author | nkeynes |
date | Tue Oct 26 08:39:02 2010 +1000 (10 years ago) |
permissions | -rw-r--r-- |
last change | Implement fragment shader to support palette textures 'directly', and therefore avoid having to reload all palette textures whenever the palette changes. |
file | annotate | diff | log | raw |
nkeynes@635 | 1 | /** |
nkeynes@636 | 2 | * $Id$ |
nkeynes@635 | 3 | * |
nkeynes@635 | 4 | * GL-based support functions |
nkeynes@635 | 5 | * |
nkeynes@635 | 6 | * Copyright (c) 2005 Nathan Keynes. |
nkeynes@635 | 7 | * |
nkeynes@635 | 8 | * This program is free software; you can redistribute it and/or modify |
nkeynes@635 | 9 | * it under the terms of the GNU General Public License as published by |
nkeynes@635 | 10 | * the Free Software Foundation; either version 2 of the License, or |
nkeynes@635 | 11 | * (at your option) any later version. |
nkeynes@635 | 12 | * |
nkeynes@635 | 13 | * This program is distributed in the hope that it will be useful, |
nkeynes@635 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
nkeynes@635 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nkeynes@635 | 16 | * GNU General Public License for more details. |
nkeynes@635 | 17 | */ |
nkeynes@736 | 18 | |
nkeynes@645 | 19 | #include <string.h> |
nkeynes@1129 | 20 | #include <stdlib.h> |
nkeynes@687 | 21 | #include <glib/gstrfuncs.h> |
nkeynes@635 | 22 | #include "pvr2/glutil.h" |
nkeynes@635 | 23 | |
nkeynes@667 | 24 | gboolean isGLSecondaryColorSupported() |
nkeynes@667 | 25 | { |
nkeynes@736 | 26 | return isGLExtensionSupported("GL_EXT_secondary_color"); |
nkeynes@667 | 27 | } |
nkeynes@667 | 28 | |
nkeynes@667 | 29 | gboolean isGLVertexBufferSupported() |
nkeynes@667 | 30 | { |
nkeynes@736 | 31 | return isGLExtensionSupported("GL_ARB_vertex_buffer_object"); |
nkeynes@667 | 32 | } |
nkeynes@667 | 33 | |
nkeynes@667 | 34 | gboolean isGLPixelBufferSupported() |
nkeynes@667 | 35 | { |
nkeynes@736 | 36 | return isGLExtensionSupported("GL_ARB_pixel_buffer_object"); |
nkeynes@667 | 37 | } |
nkeynes@667 | 38 | |
nkeynes@667 | 39 | gboolean isGLMirroredTextureSupported() |
nkeynes@667 | 40 | { |
nkeynes@736 | 41 | return isGLExtensionSupported("GL_ARB_texture_mirrored_repeat"); |
nkeynes@667 | 42 | } |
nkeynes@667 | 43 | |
nkeynes@1140 | 44 | /** |
nkeynes@1140 | 45 | * Check if there's at least 2 texture units |
nkeynes@1140 | 46 | */ |
nkeynes@1140 | 47 | gboolean isGLMultitextureSupported() |
nkeynes@1140 | 48 | { |
nkeynes@1140 | 49 | if( !isGLExtensionSupported("GL_ARB_multitexture") ) |
nkeynes@1140 | 50 | return FALSE; |
nkeynes@1140 | 51 | int units = 0; |
nkeynes@1140 | 52 | glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &units); |
nkeynes@1140 | 53 | return units >= 2; |
nkeynes@1140 | 54 | } |
nkeynes@1140 | 55 | |
nkeynes@1134 | 56 | gboolean isGLVertexRangeSupported() |
nkeynes@1134 | 57 | { |
nkeynes@1134 | 58 | return isGLExtensionSupported("GL_APPLE_vertex_array_range") || |
nkeynes@1134 | 59 | isGLExtensionSupported("GL_NV_vertex_array_range"); |
nkeynes@1134 | 60 | } |
nkeynes@1134 | 61 | |
nkeynes@635 | 62 | /** |
nkeynes@635 | 63 | * Test if a specific extension is supported. From opengl.org |
nkeynes@635 | 64 | * @param extension extension name to check for |
nkeynes@635 | 65 | * @return TRUE if supported, otherwise FALSE. |
nkeynes@635 | 66 | */ |
nkeynes@635 | 67 | gboolean isGLExtensionSupported( const char *extension ) |
nkeynes@635 | 68 | { |
nkeynes@635 | 69 | const GLubyte *extensions = NULL; |
nkeynes@635 | 70 | const GLubyte *start; |
nkeynes@635 | 71 | GLubyte *where, *terminator; |
nkeynes@635 | 72 | |
nkeynes@635 | 73 | /* Extension names should not have spaces. */ |
nkeynes@635 | 74 | where = (GLubyte *) strchr(extension, ' '); |
nkeynes@635 | 75 | if (where || *extension == '\0') |
nkeynes@736 | 76 | return 0; |
nkeynes@635 | 77 | extensions = glGetString(GL_EXTENSIONS); |
nkeynes@645 | 78 | if( extensions == NULL ) { |
nkeynes@736 | 79 | /* No GL available, so we're pretty sure the extension isn't |
nkeynes@736 | 80 | * available either. */ |
nkeynes@736 | 81 | return FALSE; |
nkeynes@645 | 82 | } |
nkeynes@635 | 83 | /* It takes a bit of care to be fool-proof about parsing the |
nkeynes@635 | 84 | OpenGL extensions string. Don't be fooled by sub-strings, |
nkeynes@635 | 85 | etc. */ |
nkeynes@635 | 86 | start = extensions; |
nkeynes@635 | 87 | for (;;) { |
nkeynes@736 | 88 | where = (GLubyte *) strstr((const char *) start, extension); |
nkeynes@736 | 89 | if (!where) |
nkeynes@736 | 90 | break; |
nkeynes@736 | 91 | terminator = where + strlen(extension); |
nkeynes@736 | 92 | if (where == start || *(where - 1) == ' ') |
nkeynes@736 | 93 | if (*terminator == ' ' || *terminator == '\0') |
nkeynes@736 | 94 | return TRUE; |
nkeynes@736 | 95 | start = terminator; |
nkeynes@635 | 96 | } |
nkeynes@635 | 97 | return FALSE; |
nkeynes@635 | 98 | } |
nkeynes@687 | 99 | |
nkeynes@1129 | 100 | int compare_charp( const void *a, const void *b ) |
nkeynes@1129 | 101 | { |
nkeynes@1129 | 102 | const char **ca = (const char **)a; |
nkeynes@1129 | 103 | const char **cb = (const char **)b; |
nkeynes@1129 | 104 | return strcmp(*ca, *cb); |
nkeynes@1129 | 105 | } |
nkeynes@1129 | 106 | |
nkeynes@1134 | 107 | #define DEFAULT_TERMINAL_COLUMNS 80 |
nkeynes@1134 | 108 | #define DEFAULT_COLUMN_WIDTH 34 |
nkeynes@1134 | 109 | |
nkeynes@1134 | 110 | /** |
nkeynes@1134 | 111 | * Format a GL extension list (or other space-separated string) nicely, and |
nkeynes@1134 | 112 | * print to the given output stream. |
nkeynes@1134 | 113 | */ |
nkeynes@1134 | 114 | |
nkeynes@1134 | 115 | void fprint_extensions( FILE *out, const char *extensions ) |
nkeynes@687 | 116 | { |
nkeynes@1134 | 117 | unsigned int i, j, count, maxlen = DEFAULT_COLUMN_WIDTH, columns, per_column, terminal_columns; |
nkeynes@1134 | 118 | const char *terminal_columns_str = getenv("COLUMNS"); |
nkeynes@1134 | 119 | if( terminal_columns_str == NULL || (terminal_columns = strtol(terminal_columns_str,0,10)) == 0 ) |
nkeynes@1134 | 120 | terminal_columns = DEFAULT_TERMINAL_COLUMNS; |
nkeynes@1129 | 121 | |
nkeynes@1134 | 122 | if( extensions == NULL || extensions[0] == '\0' ) |
nkeynes@1134 | 123 | return; |
nkeynes@1134 | 124 | |
nkeynes@1134 | 125 | gchar *ext_dup = g_strdup(extensions); |
nkeynes@1134 | 126 | gchar **ext_split = g_strsplit(g_strstrip(extensions), " ", 0); |
nkeynes@1134 | 127 | for( count = 0; ext_split[count] != NULL; count++ ) { |
nkeynes@1134 | 128 | unsigned len = strlen(ext_split[count]); |
nkeynes@1134 | 129 | if( len > maxlen ) |
nkeynes@1134 | 130 | maxlen = len; |
nkeynes@1134 | 131 | } |
nkeynes@1134 | 132 | |
nkeynes@1134 | 133 | columns = terminal_columns / (maxlen+2); |
nkeynes@1134 | 134 | if( columns == 0 ) |
nkeynes@1134 | 135 | columns = 1; |
nkeynes@1134 | 136 | per_column = (count+columns-1) / columns; |
nkeynes@1129 | 137 | |
nkeynes@1129 | 138 | qsort(ext_split, count, sizeof(gchar *), compare_charp); |
nkeynes@736 | 139 | |
nkeynes@1134 | 140 | for( i=0; i<per_column; i++ ) { |
nkeynes@1134 | 141 | for( j=0; j<columns; j++ ) { |
nkeynes@1134 | 142 | unsigned idx = i + (j*per_column); |
nkeynes@1134 | 143 | if( idx < count ) |
nkeynes@1134 | 144 | fprintf( out, " %-*s", maxlen, ext_split[idx] ); |
nkeynes@1134 | 145 | } |
nkeynes@1134 | 146 | fprintf( out, "\n" ); |
nkeynes@1134 | 147 | } |
nkeynes@1134 | 148 | g_strfreev(ext_split); |
nkeynes@1134 | 149 | g_free(ext_dup); |
nkeynes@1134 | 150 | } |
nkeynes@1134 | 151 | |
nkeynes@1134 | 152 | void glPrintInfo( FILE *out ) |
nkeynes@1134 | 153 | { |
nkeynes@687 | 154 | fprintf( out, "GL Vendor: %s\n", glGetString(GL_VENDOR) ); |
nkeynes@687 | 155 | fprintf( out, "GL Renderer: %s\n", glGetString(GL_RENDERER) ); |
nkeynes@687 | 156 | fprintf( out, "GL Version: %s\n", glGetString(GL_VERSION) ); |
nkeynes@1134 | 157 | if( glsl_is_supported() ) { |
nkeynes@1134 | 158 | const char * version = glsl_get_version(); |
nkeynes@1134 | 159 | fprintf( out, "SL Version: %s\n", version ); |
nkeynes@1134 | 160 | } |
nkeynes@736 | 161 | |
nkeynes@1134 | 162 | fprintf( out, "GL Extensions:\n" ); |
nkeynes@1134 | 163 | |
nkeynes@1134 | 164 | fprint_extensions( out, (const gchar *)glGetString(GL_EXTENSIONS) ); |
nkeynes@1134 | 165 | if( display_driver && display_driver->print_info ) { |
nkeynes@1134 | 166 | fprintf( out, "\n"); |
nkeynes@1134 | 167 | display_driver->print_info(out); |
nkeynes@687 | 168 | } |
nkeynes@687 | 169 | } |
.