1770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* 2770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copyright © 2009 Intel Corporation 3770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 4770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 5770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * copy of this software and associated documentation files (the "Software"), 6770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to deal in the Software without restriction, including without limitation 7770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the 9770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software is furnished to do so, subject to the following conditions: 10770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 11770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The above copyright notice and this permission notice (including the next 12770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * paragraph) shall be included in all copies or substantial portions of the 13770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software. 14770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 15770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * DEALINGS IN THE SOFTWARE. 22770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 23770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 24770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <string.h> 25770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "main/mtypes.h" 26770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "prog_instruction.h" 27770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "program_parser.h" 28770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 29770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 30770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/** 31770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Extra assembly-level parser routines 32770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 33770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \author Ian Romanick <ian.d.romanick@intel.com> 34770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 36770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 37d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick_mesa_parse_instruction_suffix(const struct asm_parser_state *state, 38d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick const char *suffix, 39d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick struct prog_instruction *inst) 40d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick{ 41d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->CondUpdate = 0; 42d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->CondDst = 0; 43d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->SaturateMode = SATURATE_OFF; 44d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Precision = FLOAT32; 45d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 46d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 47d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick /* The first possible suffix element is the precision specifier from 48d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * NV_fragment_program_option. 49d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick */ 50d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (state->option.NV_fragment) { 51d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick switch (suffix[0]) { 52d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick case 'H': 53d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Precision = FLOAT16; 54d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick suffix++; 55d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick break; 56d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick case 'R': 57d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Precision = FLOAT32; 58d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick suffix++; 59d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick break; 60d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick case 'X': 61d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->Precision = FIXED12; 62d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick suffix++; 63d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick break; 64d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick default: 65d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick break; 66d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 67d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 68d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 69d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick /* The next possible suffix element is the condition code modifier selection 70d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * from NV_fragment_program_option. 71d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick */ 72d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (state->option.NV_fragment) { 73d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (suffix[0] == 'C') { 74d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->CondUpdate = 1; 75d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick suffix++; 76d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 77d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 78d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 79d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 80d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick /* The final possible suffix element is the saturation selector from 81d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick * ARB_fragment_program. 82d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick */ 83d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (state->mode == ARB_fragment) { 84d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick if (strcmp(suffix, "_SAT") == 0) { 85d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick inst->SaturateMode = SATURATE_ZERO_ONE; 86d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick suffix += 4; 87d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 88d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick } 89d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 90d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 91d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick /* It is an error for all of the suffix string not to be consumed. 92d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick */ 93d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick return suffix[0] == '\0'; 94d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick} 95d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 96d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick 97d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanickint 9881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick_mesa_parse_cc(const char *s) 9981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick{ 10081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick int cond = 0; 10181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 10281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick switch (s[0]) { 10381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick case 'E': 10481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (s[1] == 'Q') { 10581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_EQ; 10681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 10781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick break; 10881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 10981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick case 'F': 11081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (s[1] == 'L') { 11181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_FL; 11281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 11381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick break; 11481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 11581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick case 'G': 11681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (s[1] == 'E') { 11781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_GE; 11881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } else if (s[1] == 'T') { 11981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_GT; 12081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 12181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick break; 12281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 12381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick case 'L': 12481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (s[1] == 'E') { 12581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_LE; 12681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } else if (s[1] == 'T') { 12781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_LT; 12881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 12981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick break; 13081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 13181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick case 'N': 13281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (s[1] == 'E') { 13381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_NE; 13481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 13581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick break; 13681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 13781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick case 'T': 13881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick if (s[1] == 'R') { 13981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick cond = COND_TR; 14081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 14181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick break; 14281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 14381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick default: 14481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick break; 14581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick } 14681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 14781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick return ((cond == 0) || (s[2] != '\0')) ? 0 : cond; 14881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick} 14981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 15081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick 15181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanickint 152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_ARBvp_parse_option(struct asm_parser_state *state, const char *option) 153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strcmp(option, "ARB_position_invariant") == 0) { 155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->option.PositionInvariant = 1; 156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint 164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_ARBfp_parse_option(struct asm_parser_state *state, const char *option) 165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{ 166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* All of the options currently supported start with "ARB_". The code is 167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * currently structured with nested if-statements because eventually options 168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * that start with "NV_" will be supported. This structure will result in 169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * less churn when those options are added. 170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strncmp(option, "ARB_", 4) == 0) { 172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Advance the pointer past the "ARB_" prefix. 173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick option += 4; 175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strncmp(option, "fog_", 4) == 0) { 178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick option += 4; 179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->option.Fog == OPTION_NONE) { 181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strcmp(option, "exp") == 0) { 182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->option.Fog = OPTION_FOG_EXP; 183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (strcmp(option, "exp2") == 0) { 185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->option.Fog = OPTION_FOG_EXP2; 186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (strcmp(option, "linear") == 0) { 188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->option.Fog = OPTION_FOG_LINEAR; 189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (strncmp(option, "precision_hint_", 15) == 0) { 195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick option += 15; 196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (state->option.PrecisionHint == OPTION_NONE) { 198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (strcmp(option, "nicest") == 0) { 199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->option.PrecisionHint = OPTION_NICEST; 200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (strcmp(option, "fastest") == 0) { 202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->option.PrecisionHint = OPTION_FASTEST; 203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (strcmp(option, "draw_buffers") == 0) { 209054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick /* Don't need to check extension availability because all Mesa-based 210054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick * drivers support GL_ARB_draw_buffers. 211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */ 212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state->option.DrawBuffers = 1; 213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 1; 214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } else if (strcmp(option, "fragment_program_shadow") == 0) { 215054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick if (state->ctx->Extensions.ARB_fragment_program_shadow) { 216054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick state->option.Shadow = 1; 217054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick return 1; 218054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick } 219e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri } else if (strncmp(option, "fragment_coord_", 15) == 0) { 220e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri option += 15; 221e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri if (state->ctx->Extensions.ARB_fragment_coord_conventions) { 222e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri if (strcmp(option, "origin_upper_left") == 0) { 223e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri state->option.OriginUpperLeft = 1; 224e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri return 1; 225e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri } 226e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri else if (strcmp(option, "pixel_center_integer") == 0) { 227e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri state->option.PixelCenterInteger = 1; 228e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri return 1; 229e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri } 230e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri } 231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 232fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt } else if (strncmp(option, "ATI_", 4) == 0) { 233fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt option += 4; 234fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt 235fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt if (strcmp(option, "draw_buffers") == 0) { 236fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt /* Don't need to check extension availability because all Mesa-based 237fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt * drivers support GL_ATI_draw_buffers. 238fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt */ 239fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt state->option.DrawBuffers = 1; 240fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt return 1; 241fb6e39737a24f9652b6cdc10067736b8915c61f9Eric Anholt } 242dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick } else if (strncmp(option, "NV_fragment_program", 19) == 0) { 243dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick option += 19; 244dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick 245dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick /* Other NV_fragment_program strings may be supported later. 246dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick */ 247dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick if (option[0] == '\0') { 248dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick if (state->ctx->Extensions.NV_fragment_program_option) { 249dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick state->option.NV_fragment = 1; 250dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick return 1; 251dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick } 252dc8ec05ace3d2a0284dbe47ec2d88168b1efb517Ian Romanick } 253aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick } else if (strncmp(option, "MESA_", 5) == 0) { 254aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick option += 5; 255aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick 256aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick if (strcmp(option, "texture_array") == 0) { 257aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick if (state->ctx->Extensions.MESA_texture_array) { 258aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick state->option.TexArray = 1; 259aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick return 1; 260aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick } 261aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick } 262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick return 0; 265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick} 266