2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * \brief ARB_vertex/fragment_program state management functions.
33 #include "arbprogram.h"
39 #include "nvprogram.h"
40 #include "nvfragprog.h"
41 #include "nvvertprog.h"
46 _mesa_parse_arb_vertex_program(GLcontext
*ctx
, GLenum target
,
47 const GLubyte
*string
, GLsizei len
,
48 struct vertex_program
*prog
)
54 _mesa_parse_arb_fragment_program(GLcontext
*ctx
, GLenum target
,
55 const GLubyte
*string
, GLsizei len
,
56 struct fragment_program
*prog
)
63 _mesa_EnableVertexAttribArrayARB(GLuint index
)
65 GET_CURRENT_CONTEXT(ctx
);
66 ASSERT_OUTSIDE_BEGIN_END(ctx
);
68 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
69 _mesa_error(ctx
, GL_INVALID_VALUE
,
70 "glEnableVertexAttribArrayARB(index)");
74 ctx
->Array
.VertexAttrib
[index
].Enabled
= GL_TRUE
;
75 ctx
->Array
._Enabled
|= _NEW_ARRAY_ATTRIB(index
);
76 ctx
->Array
.NewState
|= _NEW_ARRAY_ATTRIB(index
);
81 _mesa_DisableVertexAttribArrayARB(GLuint index
)
83 GET_CURRENT_CONTEXT(ctx
);
84 ASSERT_OUTSIDE_BEGIN_END(ctx
);
86 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
87 _mesa_error(ctx
, GL_INVALID_VALUE
,
88 "glEnableVertexAttribArrayARB(index)");
92 ctx
->Array
.VertexAttrib
[index
].Enabled
= GL_FALSE
;
93 ctx
->Array
._Enabled
&= ~_NEW_ARRAY_ATTRIB(index
);
94 ctx
->Array
.NewState
|= _NEW_ARRAY_ATTRIB(index
);
99 _mesa_GetVertexAttribdvARB(GLuint index
, GLenum pname
, GLdouble
*params
)
102 GET_CURRENT_CONTEXT(ctx
);
103 ASSERT_OUTSIDE_BEGIN_END(ctx
);
105 _mesa_GetVertexAttribfvARB(index
, pname
, fparams
);
106 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
107 if (pname
== GL_CURRENT_VERTEX_ATTRIB_ARB
) {
108 COPY_4V(params
, fparams
);
111 params
[0] = fparams
[0];
118 _mesa_GetVertexAttribfvARB(GLuint index
, GLenum pname
, GLfloat
*params
)
120 GET_CURRENT_CONTEXT(ctx
);
121 ASSERT_OUTSIDE_BEGIN_END(ctx
);
123 if (index
== 0 || index
>= VERT_ATTRIB_MAX
) {
124 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribfvARB(index)");
129 case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB
:
130 params
[0] = ctx
->Array
.VertexAttrib
[index
].Enabled
;
132 case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB
:
133 params
[0] = ctx
->Array
.VertexAttrib
[index
].Size
;
135 case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB
:
136 params
[0] = ctx
->Array
.VertexAttrib
[index
].Stride
;
138 case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB
:
139 params
[0] = ctx
->Array
.VertexAttrib
[index
].Type
;
141 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB
:
142 params
[0] = ctx
->Array
.VertexAttrib
[index
].Normalized
;
144 case GL_CURRENT_VERTEX_ATTRIB_ARB
:
145 FLUSH_CURRENT(ctx
, 0);
146 COPY_4V(params
, ctx
->Current
.Attrib
[index
]);
149 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribfvARB(pname)");
156 _mesa_GetVertexAttribivARB(GLuint index
, GLenum pname
, GLint
*params
)
159 GET_CURRENT_CONTEXT(ctx
);
160 ASSERT_OUTSIDE_BEGIN_END(ctx
);
162 _mesa_GetVertexAttribfvARB(index
, pname
, fparams
);
163 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
164 if (pname
== GL_CURRENT_VERTEX_ATTRIB_ARB
) {
165 COPY_4V(params
, fparams
); /* float to int */
168 params
[0] = fparams
[0];
175 _mesa_GetVertexAttribPointervARB(GLuint index
, GLenum pname
, GLvoid
**pointer
)
177 GET_CURRENT_CONTEXT(ctx
);
178 ASSERT_OUTSIDE_BEGIN_END(ctx
);
180 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
181 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribPointerARB(index)");
185 if (pname
!= GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB
) {
186 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribPointerARB(pname)");
190 *pointer
= ctx
->Array
.VertexAttrib
[index
].Ptr
;;
195 _mesa_ProgramStringARB(GLenum target
, GLenum format
, GLsizei len
,
196 const GLvoid
*string
)
198 GET_CURRENT_CONTEXT(ctx
);
199 ASSERT_OUTSIDE_BEGIN_END(ctx
);
201 if (target
== GL_VERTEX_PROGRAM_ARB
202 && ctx
->Extensions
.ARB_vertex_program
) {
203 struct vertex_program
*prog
= ctx
->VertexProgram
.Current
;
204 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
205 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
208 _mesa_parse_arb_vertex_program(ctx
, target
, string
, len
, prog
);
210 else if (target
== GL_FRAGMENT_PROGRAM_ARB
211 && ctx
->Extensions
.ARB_fragment_program
) {
212 struct fragment_program
*prog
= ctx
->FragmentProgram
.Current
;
213 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
214 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
217 _mesa_parse_arb_fragment_program(ctx
, target
, string
, len
, prog
);
220 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(target)");
226 _mesa_ProgramEnvParameter4dARB(GLenum target
, GLuint index
,
227 GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
229 _mesa_ProgramEnvParameter4fARB(target
, index
, x
, y
, z
, w
);
234 _mesa_ProgramEnvParameter4dvARB(GLenum target
, GLuint index
,
235 const GLdouble
*params
)
237 _mesa_ProgramEnvParameter4fARB(target
, index
, params
[0], params
[1],
238 params
[2], params
[3]);
243 _mesa_ProgramEnvParameter4fARB(GLenum target
, GLuint index
,
244 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
246 GET_CURRENT_CONTEXT(ctx
);
247 ASSERT_OUTSIDE_BEGIN_END(ctx
);
249 if (target
== GL_FRAGMENT_PROGRAM_ARB
250 && ctx
->Extensions
.ARB_fragment_program
) {
251 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
252 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
255 index
+= FP_PROG_REG_START
;
256 ASSIGN_4V(ctx
->FragmentProgram
.Machine
.Registers
[index
], x
, y
, z
, w
);
258 if (target
== GL_VERTEX_PROGRAM_ARB
259 && ctx
->Extensions
.ARB_vertex_program
) {
260 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
261 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
264 index
+= VP_PROG_REG_START
;
265 ASSIGN_4V(ctx
->VertexProgram
.Machine
.Registers
[index
], x
, y
, z
, w
);
268 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramEnvParameter(target)");
275 _mesa_ProgramEnvParameter4fvARB(GLenum target
, GLuint index
,
276 const GLfloat
*params
)
278 _mesa_ProgramEnvParameter4fARB(target
, index
, params
[0], params
[1],
279 params
[2], params
[3]);
284 _mesa_GetProgramEnvParameterdvARB(GLenum target
, GLuint index
,
287 GET_CURRENT_CONTEXT(ctx
);
290 _mesa_GetProgramEnvParameterfvARB(target
, index
, fparams
);
291 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
292 params
[0] = fparams
[0];
293 params
[1] = fparams
[1];
294 params
[2] = fparams
[2];
295 params
[3] = fparams
[3];
301 _mesa_GetProgramEnvParameterfvARB(GLenum target
, GLuint index
,
304 GET_CURRENT_CONTEXT(ctx
);
305 ASSERT_OUTSIDE_BEGIN_END(ctx
);
307 if (target
== GL_FRAGMENT_PROGRAM_ARB
308 && ctx
->Extensions
.ARB_fragment_program
) {
309 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
310 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
313 index
+= FP_PROG_REG_START
;
314 COPY_4V(params
, ctx
->FragmentProgram
.Machine
.Registers
[index
]);
316 if (target
== GL_VERTEX_PROGRAM_ARB
317 && ctx
->Extensions
.ARB_vertex_program
) {
318 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
319 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
322 index
+= VP_PROG_REG_START
;
323 COPY_4V(params
, ctx
->VertexProgram
.Machine
.Registers
[index
]);
326 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramEnvParameter(target)");
333 * Note, this function is also used by the GL_NV_fragment_program extension.
336 _mesa_ProgramLocalParameter4fARB(GLenum target
, GLuint index
,
337 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
339 GET_CURRENT_CONTEXT(ctx
);
340 struct program
*prog
;
341 ASSERT_OUTSIDE_BEGIN_END(ctx
);
343 if ((target
== GL_FRAGMENT_PROGRAM_NV
344 && ctx
->Extensions
.NV_fragment_program
) ||
345 (target
== GL_FRAGMENT_PROGRAM_ARB
346 && ctx
->Extensions
.ARB_fragment_program
)) {
347 if (index
>= ctx
->Const
.MaxFragmentProgramLocalParams
) {
348 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
351 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
353 else if (target
== GL_VERTEX_PROGRAM_ARB
354 && ctx
->Extensions
.ARB_vertex_program
) {
355 if (index
>= ctx
->Const
.MaxVertexProgramLocalParams
) {
356 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
359 prog
= &(ctx
->VertexProgram
.Current
->Base
);
362 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramLocalParameterARB");
366 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
367 prog
->LocalParams
[index
][0] = x
;
368 prog
->LocalParams
[index
][1] = y
;
369 prog
->LocalParams
[index
][2] = z
;
370 prog
->LocalParams
[index
][3] = w
;
375 * Note, this function is also used by the GL_NV_fragment_program extension.
378 _mesa_ProgramLocalParameter4fvARB(GLenum target
, GLuint index
,
379 const GLfloat
*params
)
381 _mesa_ProgramLocalParameter4fARB(target
, index
, params
[0], params
[1],
382 params
[2], params
[3]);
387 * Note, this function is also used by the GL_NV_fragment_program extension.
390 _mesa_ProgramLocalParameter4dARB(GLenum target
, GLuint index
,
391 GLdouble x
, GLdouble y
,
392 GLdouble z
, GLdouble w
)
394 _mesa_ProgramLocalParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
395 (GLfloat
) z
, (GLfloat
) w
);
400 * Note, this function is also used by the GL_NV_fragment_program extension.
403 _mesa_ProgramLocalParameter4dvARB(GLenum target
, GLuint index
,
404 const GLdouble
*params
)
406 _mesa_ProgramLocalParameter4fARB(target
, index
,
407 (GLfloat
) params
[0], (GLfloat
) params
[1],
408 (GLfloat
) params
[2], (GLfloat
) params
[3]);
413 * Note, this function is also used by the GL_NV_fragment_program extension.
416 _mesa_GetProgramLocalParameterfvARB(GLenum target
, GLuint index
,
419 const struct program
*prog
;
421 GET_CURRENT_CONTEXT(ctx
);
422 ASSERT_OUTSIDE_BEGIN_END(ctx
);
424 if (target
== GL_VERTEX_PROGRAM_ARB
425 && ctx
->Extensions
.ARB_vertex_program
) {
426 prog
= &(ctx
->VertexProgram
.Current
->Base
);
427 maxParams
= ctx
->Const
.MaxVertexProgramLocalParams
;
429 else if (target
== GL_FRAGMENT_PROGRAM_ARB
430 && ctx
->Extensions
.ARB_fragment_program
) {
431 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
432 maxParams
= ctx
->Const
.MaxFragmentProgramLocalParams
;
434 else if (target
== GL_FRAGMENT_PROGRAM_NV
435 && ctx
->Extensions
.NV_fragment_program
) {
436 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
437 maxParams
= MAX_NV_FRAGMENT_PROGRAM_PARAMS
;
440 _mesa_error(ctx
, GL_INVALID_ENUM
,
441 "glGetProgramLocalParameterARB(target)");
445 if (index
>= maxParams
) {
446 _mesa_error(ctx
, GL_INVALID_VALUE
,
447 "glGetProgramLocalParameterARB(index)");
452 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
453 COPY_4V(params
, prog
->LocalParams
[index
]);
458 * Note, this function is also used by the GL_NV_fragment_program extension.
461 _mesa_GetProgramLocalParameterdvARB(GLenum target
, GLuint index
,
464 GET_CURRENT_CONTEXT(ctx
);
465 GLfloat floatParams
[4];
466 _mesa_GetProgramLocalParameterfvARB(target
, index
, floatParams
);
467 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
468 COPY_4V(params
, floatParams
);
474 _mesa_GetProgramivARB(GLenum target
, GLenum pname
, GLint
*params
)
476 struct program
*prog
;
477 GET_CURRENT_CONTEXT(ctx
);
478 ASSERT_OUTSIDE_BEGIN_END(ctx
);
480 if (target
== GL_VERTEX_PROGRAM_ARB
481 && ctx
->Extensions
.ARB_vertex_program
) {
482 prog
= &(ctx
->VertexProgram
.Current
->Base
);
484 else if (target
== GL_FRAGMENT_PROGRAM_ARB
485 && ctx
->Extensions
.ARB_vertex_program
) {
486 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
489 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
496 case GL_PROGRAM_LENGTH_ARB
:
497 *params
= prog
->String
? _mesa_strlen((char *) prog
->String
) : 0;
499 case GL_PROGRAM_FORMAT_ARB
:
500 *params
= prog
->Format
;
502 case GL_PROGRAM_BINDING_ARB
:
505 case GL_PROGRAM_INSTRUCTIONS_ARB
:
506 *params
= prog
->NumInstructions
;
508 case GL_MAX_PROGRAM_INSTRUCTIONS_ARB
:
509 if (target
== GL_VERTEX_PROGRAM_ARB
)
510 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
512 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
514 case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
515 *params
= prog
->NumInstructions
;
517 case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
518 if (target
== GL_VERTEX_PROGRAM_ARB
)
519 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
521 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
523 case GL_PROGRAM_TEMPORARIES_ARB
:
524 *params
= prog
->NumTemporaries
;
526 case GL_MAX_PROGRAM_TEMPORARIES_ARB
:
527 if (target
== GL_VERTEX_PROGRAM_ARB
)
528 *params
= ctx
->Const
.MaxVertexProgramTemps
;
530 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
532 case GL_PROGRAM_NATIVE_TEMPORARIES_ARB
:
533 /* XXX same as GL_PROGRAM_TEMPORARIES_ARB? */
534 *params
= prog
->NumTemporaries
;
536 case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
:
537 /* XXX same as GL_MAX_PROGRAM_TEMPORARIES_ARB? */
538 if (target
== GL_VERTEX_PROGRAM_ARB
)
539 *params
= ctx
->Const
.MaxVertexProgramTemps
;
541 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
543 case GL_PROGRAM_PARAMETERS_ARB
:
544 *params
= prog
->NumParameters
;
546 case GL_MAX_PROGRAM_PARAMETERS_ARB
:
547 if (target
== GL_VERTEX_PROGRAM_ARB
)
548 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
550 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
552 case GL_PROGRAM_NATIVE_PARAMETERS_ARB
:
553 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
554 *params
= prog
->NumParameters
;
556 case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
:
557 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
558 if (target
== GL_VERTEX_PROGRAM_ARB
)
559 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
561 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
563 case GL_PROGRAM_ATTRIBS_ARB
:
564 *params
= prog
->NumAttributes
;
566 case GL_MAX_PROGRAM_ATTRIBS_ARB
:
567 if (target
== GL_VERTEX_PROGRAM_ARB
)
568 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
570 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
572 case GL_PROGRAM_NATIVE_ATTRIBS_ARB
:
573 /* XXX same as GL_PROGRAM_ATTRIBS_ARB? */
574 *params
= prog
->NumAttributes
;
576 case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB
:
577 /* XXX same as GL_MAX_PROGRAM_ATTRIBS_ARB? */
578 if (target
== GL_VERTEX_PROGRAM_ARB
)
579 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
581 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
583 case GL_PROGRAM_ADDRESS_REGISTERS_ARB
:
584 *params
= prog
->NumAddressRegs
;
586 case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
:
587 if (target
== GL_VERTEX_PROGRAM_ARB
)
588 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
590 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
592 case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
593 /* XXX same as GL_PROGRAM_ADDRESS_REGISTERS_ARB? */
594 *params
= prog
->NumAddressRegs
;
596 case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
597 /* XXX same as GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB? */
598 if (target
== GL_VERTEX_PROGRAM_ARB
)
599 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
601 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
603 case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
:
604 if (target
== GL_VERTEX_PROGRAM_ARB
)
605 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
607 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
609 case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
:
610 if (target
== GL_VERTEX_PROGRAM_ARB
)
611 *params
= ctx
->Const
.MaxVertexProgramEnvParams
;
613 *params
= ctx
->Const
.MaxFragmentProgramEnvParams
;
615 case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB
:
621 * The following apply to fragment programs only.
623 case GL_PROGRAM_ALU_INSTRUCTIONS_ARB
:
624 case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
625 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
626 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
629 *params
= ctx
->FragmentProgram
.Current
->NumAluInstructions
;
631 case GL_PROGRAM_TEX_INSTRUCTIONS_ARB
:
632 case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
633 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
634 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
637 *params
= ctx
->FragmentProgram
.Current
->NumTexInstructions
;
639 case GL_PROGRAM_TEX_INDIRECTIONS_ARB
:
640 case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
641 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
642 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
645 *params
= ctx
->FragmentProgram
.Current
->NumTexIndirections
;
647 case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB
:
648 case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
649 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
650 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
653 *params
= ctx
->Const
.MaxFragmentProgramAluInstructions
;
655 case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB
:
656 case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
657 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
658 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
661 *params
= ctx
->Const
.MaxFragmentProgramTexInstructions
;
663 case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB
:
664 case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
665 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
666 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
669 *params
= ctx
->Const
.MaxFragmentProgramTexIndirections
;
672 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(pname)");
679 _mesa_GetProgramStringARB(GLenum target
, GLenum pname
, GLvoid
*string
)
681 struct program
*prog
;
682 GET_CURRENT_CONTEXT(ctx
);
683 ASSERT_OUTSIDE_BEGIN_END(ctx
);
685 if (target
== GL_VERTEX_PROGRAM_ARB
) {
686 prog
= &(ctx
->VertexProgram
.Current
->Base
);
688 else if (target
== GL_FRAGMENT_PROGRAM_ARB
) {
689 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
692 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(target)");
698 if (pname
!= GL_PROGRAM_STRING_ARB
) {
699 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(pname)");
703 MEMCPY(string
, prog
->String
, _mesa_strlen((char *) prog
->String
));