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