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 COPY_4V(params
, ctx
->Current
.Attrib
[index
]);
148 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribfvARB(pname)");
155 _mesa_GetVertexAttribivARB(GLuint index
, GLenum pname
, GLint
*params
)
158 GET_CURRENT_CONTEXT(ctx
);
159 ASSERT_OUTSIDE_BEGIN_END(ctx
);
161 _mesa_GetVertexAttribfvARB(index
, pname
, fparams
);
162 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
163 if (pname
== GL_CURRENT_VERTEX_ATTRIB_ARB
) {
164 COPY_4V(params
, fparams
); /* float to int */
167 params
[0] = fparams
[0];
174 _mesa_GetVertexAttribPointervARB(GLuint index
, GLenum pname
, GLvoid
**pointer
)
176 GET_CURRENT_CONTEXT(ctx
);
177 ASSERT_OUTSIDE_BEGIN_END(ctx
);
179 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
180 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribPointerARB(index)");
184 if (pname
!= GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB
) {
185 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribPointerARB(pname)");
189 *pointer
= ctx
->Array
.VertexAttrib
[index
].Ptr
;;
194 _mesa_ProgramStringARB(GLenum target
, GLenum format
, GLsizei len
,
195 const GLvoid
*string
)
197 GET_CURRENT_CONTEXT(ctx
);
198 ASSERT_OUTSIDE_BEGIN_END(ctx
);
200 if (target
== GL_VERTEX_PROGRAM_ARB
201 && ctx
->Extensions
.ARB_vertex_program
) {
202 struct vertex_program
*prog
= ctx
->VertexProgram
.Current
;
203 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
204 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
207 _mesa_parse_arb_vertex_program(ctx
, target
, string
, len
, prog
);
209 else if (target
== GL_FRAGMENT_PROGRAM_ARB
210 && ctx
->Extensions
.ARB_fragment_program
) {
211 struct fragment_program
*prog
= ctx
->FragmentProgram
.Current
;
212 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
213 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
216 _mesa_parse_arb_fragment_program(ctx
, target
, string
, len
, prog
);
219 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(target)");
225 _mesa_ProgramEnvParameter4dARB(GLenum target
, GLuint index
,
226 GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
228 _mesa_ProgramEnvParameter4fARB(target
, index
, x
, y
, z
, w
);
233 _mesa_ProgramEnvParameter4dvARB(GLenum target
, GLuint index
,
234 const GLdouble
*params
)
236 _mesa_ProgramEnvParameter4fARB(target
, index
, params
[0], params
[1],
237 params
[2], params
[3]);
242 _mesa_ProgramEnvParameter4fARB(GLenum target
, GLuint index
,
243 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
245 GET_CURRENT_CONTEXT(ctx
);
246 ASSERT_OUTSIDE_BEGIN_END(ctx
);
248 if (target
== GL_FRAGMENT_PROGRAM_ARB
249 && ctx
->Extensions
.ARB_fragment_program
) {
250 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
251 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
254 index
+= FP_PROG_REG_START
;
255 ASSIGN_4V(ctx
->FragmentProgram
.Machine
.Registers
[index
], x
, y
, z
, w
);
257 if (target
== GL_VERTEX_PROGRAM_ARB
258 && ctx
->Extensions
.ARB_vertex_program
) {
259 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
260 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
263 index
+= VP_PROG_REG_START
;
264 ASSIGN_4V(ctx
->VertexProgram
.Machine
.Registers
[index
], x
, y
, z
, w
);
267 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramEnvParameter(target)");
274 _mesa_ProgramEnvParameter4fvARB(GLenum target
, GLuint index
,
275 const GLfloat
*params
)
277 _mesa_ProgramEnvParameter4fARB(target
, index
, params
[0], params
[1],
278 params
[2], params
[3]);
283 _mesa_GetProgramEnvParameterdvARB(GLenum target
, GLuint index
,
286 GET_CURRENT_CONTEXT(ctx
);
289 _mesa_GetProgramEnvParameterfvARB(target
, index
, fparams
);
290 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
291 params
[0] = fparams
[0];
292 params
[1] = fparams
[1];
293 params
[2] = fparams
[2];
294 params
[3] = fparams
[3];
300 _mesa_GetProgramEnvParameterfvARB(GLenum target
, GLuint index
,
303 GET_CURRENT_CONTEXT(ctx
);
304 ASSERT_OUTSIDE_BEGIN_END(ctx
);
306 if (target
== GL_FRAGMENT_PROGRAM_ARB
307 && ctx
->Extensions
.ARB_fragment_program
) {
308 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
309 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
312 index
+= FP_PROG_REG_START
;
313 COPY_4V(params
, ctx
->FragmentProgram
.Machine
.Registers
[index
]);
315 if (target
== GL_VERTEX_PROGRAM_ARB
316 && ctx
->Extensions
.ARB_vertex_program
) {
317 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
318 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
321 index
+= VP_PROG_REG_START
;
322 COPY_4V(params
, ctx
->VertexProgram
.Machine
.Registers
[index
]);
325 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramEnvParameter(target)");
332 * Note, this function is also used by the GL_NV_fragment_program extension.
335 _mesa_ProgramLocalParameter4fARB(GLenum target
, GLuint index
,
336 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
338 GET_CURRENT_CONTEXT(ctx
);
339 struct program
*prog
;
340 ASSERT_OUTSIDE_BEGIN_END(ctx
);
342 if ((target
== GL_FRAGMENT_PROGRAM_NV
343 && ctx
->Extensions
.NV_fragment_program
) ||
344 (target
== GL_FRAGMENT_PROGRAM_ARB
345 && ctx
->Extensions
.ARB_fragment_program
)) {
346 if (index
>= ctx
->Const
.MaxFragmentProgramLocalParams
) {
347 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
350 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
352 else if (target
== GL_VERTEX_PROGRAM_ARB
353 && ctx
->Extensions
.ARB_vertex_program
) {
354 if (index
>= ctx
->Const
.MaxVertexProgramLocalParams
) {
355 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
358 prog
= &(ctx
->VertexProgram
.Current
->Base
);
361 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramLocalParameterARB");
365 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
366 prog
->LocalParams
[index
][0] = x
;
367 prog
->LocalParams
[index
][1] = y
;
368 prog
->LocalParams
[index
][2] = z
;
369 prog
->LocalParams
[index
][3] = w
;
374 * Note, this function is also used by the GL_NV_fragment_program extension.
377 _mesa_ProgramLocalParameter4fvARB(GLenum target
, GLuint index
,
378 const GLfloat
*params
)
380 _mesa_ProgramLocalParameter4fARB(target
, index
, params
[0], params
[1],
381 params
[2], params
[3]);
386 * Note, this function is also used by the GL_NV_fragment_program extension.
389 _mesa_ProgramLocalParameter4dARB(GLenum target
, GLuint index
,
390 GLdouble x
, GLdouble y
,
391 GLdouble z
, GLdouble w
)
393 _mesa_ProgramLocalParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
394 (GLfloat
) z
, (GLfloat
) w
);
399 * Note, this function is also used by the GL_NV_fragment_program extension.
402 _mesa_ProgramLocalParameter4dvARB(GLenum target
, GLuint index
,
403 const GLdouble
*params
)
405 _mesa_ProgramLocalParameter4fARB(target
, index
,
406 (GLfloat
) params
[0], (GLfloat
) params
[1],
407 (GLfloat
) params
[2], (GLfloat
) params
[3]);
412 * Note, this function is also used by the GL_NV_fragment_program extension.
415 _mesa_GetProgramLocalParameterfvARB(GLenum target
, GLuint index
,
418 const struct program
*prog
;
420 GET_CURRENT_CONTEXT(ctx
);
421 ASSERT_OUTSIDE_BEGIN_END(ctx
);
423 if (target
== GL_VERTEX_PROGRAM_ARB
424 && ctx
->Extensions
.ARB_vertex_program
) {
425 prog
= &(ctx
->VertexProgram
.Current
->Base
);
426 maxParams
= ctx
->Const
.MaxVertexProgramLocalParams
;
428 else if (target
== GL_FRAGMENT_PROGRAM_ARB
429 && ctx
->Extensions
.ARB_fragment_program
) {
430 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
431 maxParams
= ctx
->Const
.MaxFragmentProgramLocalParams
;
433 else if (target
== GL_FRAGMENT_PROGRAM_NV
434 && ctx
->Extensions
.NV_fragment_program
) {
435 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
436 maxParams
= MAX_NV_FRAGMENT_PROGRAM_PARAMS
;
439 _mesa_error(ctx
, GL_INVALID_ENUM
,
440 "glGetProgramLocalParameterARB(target)");
444 if (index
>= maxParams
) {
445 _mesa_error(ctx
, GL_INVALID_VALUE
,
446 "glGetProgramLocalParameterARB(index)");
451 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
452 COPY_4V(params
, prog
->LocalParams
[index
]);
457 * Note, this function is also used by the GL_NV_fragment_program extension.
460 _mesa_GetProgramLocalParameterdvARB(GLenum target
, GLuint index
,
463 GET_CURRENT_CONTEXT(ctx
);
464 GLfloat floatParams
[4];
465 _mesa_GetProgramLocalParameterfvARB(target
, index
, floatParams
);
466 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
467 COPY_4V(params
, floatParams
);
473 _mesa_GetProgramivARB(GLenum target
, GLenum pname
, GLint
*params
)
475 struct program
*prog
;
476 GET_CURRENT_CONTEXT(ctx
);
477 ASSERT_OUTSIDE_BEGIN_END(ctx
);
479 if (target
== GL_VERTEX_PROGRAM_ARB
480 && ctx
->Extensions
.ARB_vertex_program
) {
481 prog
= &(ctx
->VertexProgram
.Current
->Base
);
483 else if (target
== GL_FRAGMENT_PROGRAM_ARB
484 && ctx
->Extensions
.ARB_vertex_program
) {
485 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
488 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
495 case GL_PROGRAM_LENGTH_ARB
:
496 *params
= prog
->String
? _mesa_strlen((char *) prog
->String
) : 0;
498 case GL_PROGRAM_FORMAT_ARB
:
499 *params
= prog
->Format
;
501 case GL_PROGRAM_BINDING_ARB
:
504 case GL_PROGRAM_INSTRUCTIONS_ARB
:
505 *params
= prog
->NumInstructions
;
507 case GL_MAX_PROGRAM_INSTRUCTIONS_ARB
:
508 if (target
== GL_VERTEX_PROGRAM_ARB
)
509 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
511 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
513 case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
514 *params
= prog
->NumInstructions
;
516 case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
517 if (target
== GL_VERTEX_PROGRAM_ARB
)
518 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
520 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
522 case GL_PROGRAM_TEMPORARIES_ARB
:
523 *params
= prog
->NumTemporaries
;
525 case GL_MAX_PROGRAM_TEMPORARIES_ARB
:
526 if (target
== GL_VERTEX_PROGRAM_ARB
)
527 *params
= ctx
->Const
.MaxVertexProgramTemps
;
529 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
531 case GL_PROGRAM_NATIVE_TEMPORARIES_ARB
:
532 /* XXX same as GL_PROGRAM_TEMPORARIES_ARB? */
533 *params
= prog
->NumTemporaries
;
535 case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
:
536 /* XXX same as GL_MAX_PROGRAM_TEMPORARIES_ARB? */
537 if (target
== GL_VERTEX_PROGRAM_ARB
)
538 *params
= ctx
->Const
.MaxVertexProgramTemps
;
540 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
542 case GL_PROGRAM_PARAMETERS_ARB
:
543 *params
= prog
->NumParameters
;
545 case GL_MAX_PROGRAM_PARAMETERS_ARB
:
546 if (target
== GL_VERTEX_PROGRAM_ARB
)
547 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
549 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
551 case GL_PROGRAM_NATIVE_PARAMETERS_ARB
:
552 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
553 *params
= prog
->NumParameters
;
555 case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
:
556 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
557 if (target
== GL_VERTEX_PROGRAM_ARB
)
558 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
560 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
562 case GL_PROGRAM_ATTRIBS_ARB
:
563 *params
= prog
->NumAttributes
;
565 case GL_MAX_PROGRAM_ATTRIBS_ARB
:
566 if (target
== GL_VERTEX_PROGRAM_ARB
)
567 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
569 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
571 case GL_PROGRAM_NATIVE_ATTRIBS_ARB
:
572 /* XXX same as GL_PROGRAM_ATTRIBS_ARB? */
573 *params
= prog
->NumAttributes
;
575 case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB
:
576 /* XXX same as GL_MAX_PROGRAM_ATTRIBS_ARB? */
577 if (target
== GL_VERTEX_PROGRAM_ARB
)
578 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
580 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
582 case GL_PROGRAM_ADDRESS_REGISTERS_ARB
:
583 *params
= prog
->NumAddressRegs
;
585 case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
:
586 if (target
== GL_VERTEX_PROGRAM_ARB
)
587 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
589 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
591 case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
592 /* XXX same as GL_PROGRAM_ADDRESS_REGISTERS_ARB? */
593 *params
= prog
->NumAddressRegs
;
595 case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
596 /* XXX same as GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB? */
597 if (target
== GL_VERTEX_PROGRAM_ARB
)
598 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
600 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
602 case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
:
603 if (target
== GL_VERTEX_PROGRAM_ARB
)
604 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
606 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
608 case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
:
609 if (target
== GL_VERTEX_PROGRAM_ARB
)
610 *params
= ctx
->Const
.MaxVertexProgramEnvParams
;
612 *params
= ctx
->Const
.MaxFragmentProgramEnvParams
;
614 case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB
:
620 * The following apply to fragment programs only.
622 case GL_PROGRAM_ALU_INSTRUCTIONS_ARB
:
623 case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
624 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
625 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
628 *params
= ctx
->FragmentProgram
.Current
->NumAluInstructions
;
630 case GL_PROGRAM_TEX_INSTRUCTIONS_ARB
:
631 case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
632 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
633 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
636 *params
= ctx
->FragmentProgram
.Current
->NumTexInstructions
;
638 case GL_PROGRAM_TEX_INDIRECTIONS_ARB
:
639 case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
640 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
641 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
644 *params
= ctx
->FragmentProgram
.Current
->NumTexIndirections
;
646 case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB
:
647 case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
648 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
649 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
652 *params
= ctx
->Const
.MaxFragmentProgramAluInstructions
;
654 case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB
:
655 case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
656 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
657 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
660 *params
= ctx
->Const
.MaxFragmentProgramTexInstructions
;
662 case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB
:
663 case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
664 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
665 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
668 *params
= ctx
->Const
.MaxFragmentProgramTexIndirections
;
671 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(pname)");
678 _mesa_GetProgramStringARB(GLenum target
, GLenum pname
, GLvoid
*string
)
680 struct program
*prog
;
681 GET_CURRENT_CONTEXT(ctx
);
682 ASSERT_OUTSIDE_BEGIN_END(ctx
);
684 if (target
== GL_VERTEX_PROGRAM_ARB
) {
685 prog
= &(ctx
->VertexProgram
.Current
->Base
);
687 else if (target
== GL_FRAGMENT_PROGRAM_ARB
) {
688 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
691 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(target)");
697 if (pname
!= GL_PROGRAM_STRING_ARB
) {
698 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(pname)");
702 MEMCPY(string
, prog
->String
, _mesa_strlen((char *) prog
->String
));