Search
lxdream.org :: lxdream/src/pvr2/glutil.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/pvr2/glutil.c
changeset 1140:7dc1c71ece76
prev1134:f502f3d32f90
next1150: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
}
.