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 * ARB_vertex/fragment_program state management functions.
33 #include "arbprogram.h"
34 #include "arbfragparse.h"
35 #include "arbvertparse.h"
40 #include "nvprogram.h"
41 #include "nvfragparse.h"
42 #include "nvfragprog.h"
43 #include "nvvertparse.h"
44 #include "nvvertprog.h"
48 _mesa_EnableVertexAttribArrayARB(GLuint index
)
50 GET_CURRENT_CONTEXT(ctx
);
51 ASSERT_OUTSIDE_BEGIN_END(ctx
);
53 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
54 _mesa_error(ctx
, GL_INVALID_VALUE
,
55 "glEnableVertexAttribArrayARB(index)");
59 ctx
->Array
.VertexAttrib
[index
].Enabled
= GL_TRUE
;
60 ctx
->Array
._Enabled
|= _NEW_ARRAY_ATTRIB(index
);
61 ctx
->Array
.NewState
|= _NEW_ARRAY_ATTRIB(index
);
66 _mesa_DisableVertexAttribArrayARB(GLuint index
)
68 GET_CURRENT_CONTEXT(ctx
);
69 ASSERT_OUTSIDE_BEGIN_END(ctx
);
71 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
72 _mesa_error(ctx
, GL_INVALID_VALUE
,
73 "glEnableVertexAttribArrayARB(index)");
77 ctx
->Array
.VertexAttrib
[index
].Enabled
= GL_FALSE
;
78 ctx
->Array
._Enabled
&= ~_NEW_ARRAY_ATTRIB(index
);
79 ctx
->Array
.NewState
|= _NEW_ARRAY_ATTRIB(index
);
84 _mesa_GetVertexAttribdvARB(GLuint index
, GLenum pname
, GLdouble
*params
)
87 GET_CURRENT_CONTEXT(ctx
);
88 ASSERT_OUTSIDE_BEGIN_END(ctx
);
90 _mesa_GetVertexAttribfvARB(index
, pname
, fparams
);
91 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
92 if (pname
== GL_CURRENT_VERTEX_ATTRIB_ARB
) {
93 COPY_4V(params
, fparams
);
96 params
[0] = fparams
[0];
103 _mesa_GetVertexAttribfvARB(GLuint index
, GLenum pname
, GLfloat
*params
)
105 GET_CURRENT_CONTEXT(ctx
);
106 ASSERT_OUTSIDE_BEGIN_END(ctx
);
108 if (index
== 0 || index
>= VERT_ATTRIB_MAX
) {
109 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribfvARB(index)");
114 case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB
:
115 params
[0] = (GLfloat
) ctx
->Array
.VertexAttrib
[index
].Enabled
;
117 case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB
:
118 params
[0] = (GLfloat
) ctx
->Array
.VertexAttrib
[index
].Size
;
120 case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB
:
121 params
[0] = (GLfloat
) ctx
->Array
.VertexAttrib
[index
].Stride
;
123 case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB
:
124 params
[0] = (GLfloat
) ctx
->Array
.VertexAttrib
[index
].Type
;
126 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB
:
127 params
[0] = ctx
->Array
.VertexAttrib
[index
].Normalized
;
129 case GL_CURRENT_VERTEX_ATTRIB_ARB
:
130 FLUSH_CURRENT(ctx
, 0);
131 COPY_4V(params
, ctx
->Current
.Attrib
[index
]);
133 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB
:
134 if (!ctx
->Extensions
.ARB_vertex_buffer_object
) {
135 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribfvARB(pname)");
138 params
[0] = (GLfloat
) ctx
->Array
.VertexAttrib
[index
].BufferObj
->Name
;
140 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribfvARB(pname)");
147 _mesa_GetVertexAttribivARB(GLuint index
, GLenum pname
, GLint
*params
)
150 GET_CURRENT_CONTEXT(ctx
);
151 ASSERT_OUTSIDE_BEGIN_END(ctx
);
153 _mesa_GetVertexAttribfvARB(index
, pname
, fparams
);
154 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
155 if (pname
== GL_CURRENT_VERTEX_ATTRIB_ARB
) {
156 COPY_4V_CAST(params
, fparams
, GLint
); /* float to int */
159 params
[0] = (GLint
) fparams
[0];
166 _mesa_GetVertexAttribPointervARB(GLuint index
, GLenum pname
, GLvoid
**pointer
)
168 GET_CURRENT_CONTEXT(ctx
);
169 ASSERT_OUTSIDE_BEGIN_END(ctx
);
171 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
172 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribPointerARB(index)");
176 if (pname
!= GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB
) {
177 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribPointerARB(pname)");
181 *pointer
= ctx
->Array
.VertexAttrib
[index
].Ptr
;;
186 _mesa_ProgramStringARB(GLenum target
, GLenum format
, GLsizei len
,
187 const GLvoid
*string
)
189 GET_CURRENT_CONTEXT(ctx
);
190 ASSERT_OUTSIDE_BEGIN_END(ctx
);
192 if (target
== GL_VERTEX_PROGRAM_ARB
193 && ctx
->Extensions
.ARB_vertex_program
) {
194 struct vertex_program
*prog
= ctx
->VertexProgram
.Current
;
195 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
196 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
199 _mesa_parse_arb_vertex_program(ctx
, target
, string
, len
, prog
);
201 else if (target
== GL_FRAGMENT_PROGRAM_ARB
202 && ctx
->Extensions
.ARB_fragment_program
) {
203 struct fragment_program
*prog
= ctx
->FragmentProgram
.Current
;
204 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
205 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
208 _mesa_parse_arb_fragment_program(ctx
, target
, string
, len
, prog
);
211 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(target)");
217 _mesa_ProgramEnvParameter4dARB(GLenum target
, GLuint index
,
218 GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
220 _mesa_ProgramEnvParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
221 (GLfloat
) z
, (GLfloat
) w
);
226 _mesa_ProgramEnvParameter4dvARB(GLenum target
, GLuint index
,
227 const GLdouble
*params
)
229 _mesa_ProgramEnvParameter4fARB(target
, index
, (GLfloat
) params
[0],
230 (GLfloat
) params
[1], (GLfloat
) params
[2],
231 (GLfloat
) params
[3]);
236 _mesa_ProgramEnvParameter4fARB(GLenum target
, GLuint index
,
237 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
239 GET_CURRENT_CONTEXT(ctx
);
240 ASSERT_OUTSIDE_BEGIN_END(ctx
);
242 if (target
== GL_FRAGMENT_PROGRAM_ARB
243 && ctx
->Extensions
.ARB_fragment_program
) {
244 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
245 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
248 ASSIGN_4V(ctx
->FragmentProgram
.Parameters
[index
], x
, y
, z
, w
);
250 if (target
== GL_VERTEX_PROGRAM_ARB
251 && ctx
->Extensions
.ARB_vertex_program
) {
252 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
253 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
256 ASSIGN_4V(ctx
->VertexProgram
.Parameters
[index
], x
, y
, z
, w
);
259 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramEnvParameter(target)");
266 _mesa_ProgramEnvParameter4fvARB(GLenum target
, GLuint index
,
267 const GLfloat
*params
)
269 _mesa_ProgramEnvParameter4fARB(target
, index
, params
[0], params
[1],
270 params
[2], params
[3]);
275 _mesa_GetProgramEnvParameterdvARB(GLenum target
, GLuint index
,
278 GET_CURRENT_CONTEXT(ctx
);
281 _mesa_GetProgramEnvParameterfvARB(target
, index
, fparams
);
282 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
283 params
[0] = fparams
[0];
284 params
[1] = fparams
[1];
285 params
[2] = fparams
[2];
286 params
[3] = fparams
[3];
292 _mesa_GetProgramEnvParameterfvARB(GLenum target
, GLuint index
,
295 GET_CURRENT_CONTEXT(ctx
);
297 if (!ctx
->_CurrentProgram
)
298 ASSERT_OUTSIDE_BEGIN_END(ctx
);
300 if (target
== GL_FRAGMENT_PROGRAM_ARB
301 && ctx
->Extensions
.ARB_fragment_program
) {
302 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
303 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
306 COPY_4V(params
, ctx
->FragmentProgram
.Parameters
[index
]);
308 if (target
== GL_VERTEX_PROGRAM_ARB
309 && ctx
->Extensions
.ARB_vertex_program
) {
310 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
311 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
314 COPY_4V(params
, ctx
->VertexProgram
.Parameters
[index
]);
317 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramEnvParameter(target)");
324 * Note, this function is also used by the GL_NV_fragment_program extension.
327 _mesa_ProgramLocalParameter4fARB(GLenum target
, GLuint index
,
328 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
330 GET_CURRENT_CONTEXT(ctx
);
331 struct program
*prog
;
332 ASSERT_OUTSIDE_BEGIN_END(ctx
);
334 if ((target
== GL_FRAGMENT_PROGRAM_NV
335 && ctx
->Extensions
.NV_fragment_program
) ||
336 (target
== GL_FRAGMENT_PROGRAM_ARB
337 && ctx
->Extensions
.ARB_fragment_program
)) {
338 if (index
>= ctx
->Const
.MaxFragmentProgramLocalParams
) {
339 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
342 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
344 else if (target
== GL_VERTEX_PROGRAM_ARB
345 && ctx
->Extensions
.ARB_vertex_program
) {
346 if (index
>= ctx
->Const
.MaxVertexProgramLocalParams
) {
347 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
350 prog
= &(ctx
->VertexProgram
.Current
->Base
);
353 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramLocalParameterARB");
357 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
358 prog
->LocalParams
[index
][0] = x
;
359 prog
->LocalParams
[index
][1] = y
;
360 prog
->LocalParams
[index
][2] = z
;
361 prog
->LocalParams
[index
][3] = w
;
366 * Note, this function is also used by the GL_NV_fragment_program extension.
369 _mesa_ProgramLocalParameter4fvARB(GLenum target
, GLuint index
,
370 const GLfloat
*params
)
372 _mesa_ProgramLocalParameter4fARB(target
, index
, params
[0], params
[1],
373 params
[2], params
[3]);
378 * Note, this function is also used by the GL_NV_fragment_program extension.
381 _mesa_ProgramLocalParameter4dARB(GLenum target
, GLuint index
,
382 GLdouble x
, GLdouble y
,
383 GLdouble z
, GLdouble w
)
385 _mesa_ProgramLocalParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
386 (GLfloat
) z
, (GLfloat
) w
);
391 * Note, this function is also used by the GL_NV_fragment_program extension.
394 _mesa_ProgramLocalParameter4dvARB(GLenum target
, GLuint index
,
395 const GLdouble
*params
)
397 _mesa_ProgramLocalParameter4fARB(target
, index
,
398 (GLfloat
) params
[0], (GLfloat
) params
[1],
399 (GLfloat
) params
[2], (GLfloat
) params
[3]);
404 * Note, this function is also used by the GL_NV_fragment_program extension.
407 _mesa_GetProgramLocalParameterfvARB(GLenum target
, GLuint index
,
410 const struct program
*prog
;
412 GET_CURRENT_CONTEXT(ctx
);
413 ASSERT_OUTSIDE_BEGIN_END(ctx
);
415 if (target
== GL_VERTEX_PROGRAM_ARB
416 && ctx
->Extensions
.ARB_vertex_program
) {
417 prog
= &(ctx
->VertexProgram
.Current
->Base
);
418 maxParams
= ctx
->Const
.MaxVertexProgramLocalParams
;
420 else if (target
== GL_FRAGMENT_PROGRAM_ARB
421 && ctx
->Extensions
.ARB_fragment_program
) {
422 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
423 maxParams
= ctx
->Const
.MaxFragmentProgramLocalParams
;
425 else if (target
== GL_FRAGMENT_PROGRAM_NV
426 && ctx
->Extensions
.NV_fragment_program
) {
427 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
428 maxParams
= MAX_NV_FRAGMENT_PROGRAM_PARAMS
;
431 _mesa_error(ctx
, GL_INVALID_ENUM
,
432 "glGetProgramLocalParameterARB(target)");
436 if (index
>= maxParams
) {
437 _mesa_error(ctx
, GL_INVALID_VALUE
,
438 "glGetProgramLocalParameterARB(index)");
443 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
444 COPY_4V(params
, prog
->LocalParams
[index
]);
449 * Note, this function is also used by the GL_NV_fragment_program extension.
452 _mesa_GetProgramLocalParameterdvARB(GLenum target
, GLuint index
,
455 GET_CURRENT_CONTEXT(ctx
);
456 GLfloat floatParams
[4];
457 _mesa_GetProgramLocalParameterfvARB(target
, index
, floatParams
);
458 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
459 COPY_4V(params
, floatParams
);
465 _mesa_GetProgramivARB(GLenum target
, GLenum pname
, GLint
*params
)
467 struct program
*prog
;
468 GET_CURRENT_CONTEXT(ctx
);
470 if (!ctx
->_CurrentProgram
)
471 ASSERT_OUTSIDE_BEGIN_END(ctx
);
473 if (target
== GL_VERTEX_PROGRAM_ARB
474 && ctx
->Extensions
.ARB_vertex_program
) {
475 prog
= &(ctx
->VertexProgram
.Current
->Base
);
477 else if (target
== GL_FRAGMENT_PROGRAM_ARB
478 && ctx
->Extensions
.ARB_fragment_program
) {
479 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
482 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
489 case GL_PROGRAM_LENGTH_ARB
:
490 *params
= prog
->String
? _mesa_strlen((char *) prog
->String
) : 0;
492 case GL_PROGRAM_FORMAT_ARB
:
493 *params
= prog
->Format
;
495 case GL_PROGRAM_BINDING_ARB
:
498 case GL_PROGRAM_INSTRUCTIONS_ARB
:
499 *params
= prog
->NumInstructions
;
501 case GL_MAX_PROGRAM_INSTRUCTIONS_ARB
:
502 if (target
== GL_VERTEX_PROGRAM_ARB
)
503 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
505 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
507 case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
508 *params
= prog
->NumInstructions
;
510 case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
511 if (target
== GL_VERTEX_PROGRAM_ARB
)
512 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
514 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
516 case GL_PROGRAM_TEMPORARIES_ARB
:
517 *params
= prog
->NumTemporaries
;
519 case GL_MAX_PROGRAM_TEMPORARIES_ARB
:
520 if (target
== GL_VERTEX_PROGRAM_ARB
)
521 *params
= ctx
->Const
.MaxVertexProgramTemps
;
523 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
525 case GL_PROGRAM_NATIVE_TEMPORARIES_ARB
:
526 /* XXX same as GL_PROGRAM_TEMPORARIES_ARB? */
527 *params
= prog
->NumTemporaries
;
529 case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
:
530 /* XXX same as GL_MAX_PROGRAM_TEMPORARIES_ARB? */
531 if (target
== GL_VERTEX_PROGRAM_ARB
)
532 *params
= ctx
->Const
.MaxVertexProgramTemps
;
534 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
536 case GL_PROGRAM_PARAMETERS_ARB
:
537 *params
= prog
->NumParameters
;
539 case GL_MAX_PROGRAM_PARAMETERS_ARB
:
540 if (target
== GL_VERTEX_PROGRAM_ARB
)
541 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
543 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
545 case GL_PROGRAM_NATIVE_PARAMETERS_ARB
:
546 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
547 *params
= prog
->NumParameters
;
549 case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
:
550 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
551 if (target
== GL_VERTEX_PROGRAM_ARB
)
552 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
554 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
556 case GL_PROGRAM_ATTRIBS_ARB
:
557 *params
= prog
->NumAttributes
;
559 case GL_MAX_PROGRAM_ATTRIBS_ARB
:
560 if (target
== GL_VERTEX_PROGRAM_ARB
)
561 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
563 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
565 case GL_PROGRAM_NATIVE_ATTRIBS_ARB
:
566 /* XXX same as GL_PROGRAM_ATTRIBS_ARB? */
567 *params
= prog
->NumAttributes
;
569 case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB
:
570 /* XXX same as GL_MAX_PROGRAM_ATTRIBS_ARB? */
571 if (target
== GL_VERTEX_PROGRAM_ARB
)
572 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
574 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
576 case GL_PROGRAM_ADDRESS_REGISTERS_ARB
:
577 *params
= prog
->NumAddressRegs
;
579 case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
:
580 if (target
== GL_VERTEX_PROGRAM_ARB
)
581 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
583 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
585 case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
586 /* XXX same as GL_PROGRAM_ADDRESS_REGISTERS_ARB? */
587 *params
= prog
->NumAddressRegs
;
589 case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
590 /* XXX same as GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB? */
591 if (target
== GL_VERTEX_PROGRAM_ARB
)
592 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
594 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
596 case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
:
597 if (target
== GL_VERTEX_PROGRAM_ARB
)
598 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
600 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
602 case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
:
603 if (target
== GL_VERTEX_PROGRAM_ARB
)
604 *params
= ctx
->Const
.MaxVertexProgramEnvParams
;
606 *params
= ctx
->Const
.MaxFragmentProgramEnvParams
;
608 case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB
:
614 * The following apply to fragment programs only.
616 case GL_PROGRAM_ALU_INSTRUCTIONS_ARB
:
617 case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
618 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
619 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
622 *params
= ctx
->FragmentProgram
.Current
->NumAluInstructions
;
624 case GL_PROGRAM_TEX_INSTRUCTIONS_ARB
:
625 case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
626 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
627 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
630 *params
= ctx
->FragmentProgram
.Current
->NumTexInstructions
;
632 case GL_PROGRAM_TEX_INDIRECTIONS_ARB
:
633 case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
634 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
635 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
638 *params
= ctx
->FragmentProgram
.Current
->NumTexIndirections
;
640 case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB
:
641 case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
642 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
643 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
646 *params
= ctx
->Const
.MaxFragmentProgramAluInstructions
;
648 case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB
:
649 case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
650 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
651 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
654 *params
= ctx
->Const
.MaxFragmentProgramTexInstructions
;
656 case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB
:
657 case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
658 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
659 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
662 *params
= ctx
->Const
.MaxFragmentProgramTexIndirections
;
665 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(pname)");
672 _mesa_GetProgramStringARB(GLenum target
, GLenum pname
, GLvoid
*string
)
674 struct program
*prog
;
675 GET_CURRENT_CONTEXT(ctx
);
677 if (!ctx
->_CurrentProgram
)
678 ASSERT_OUTSIDE_BEGIN_END(ctx
);
680 if (target
== GL_VERTEX_PROGRAM_ARB
) {
681 prog
= &(ctx
->VertexProgram
.Current
->Base
);
683 else if (target
== GL_FRAGMENT_PROGRAM_ARB
) {
684 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
687 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(target)");
693 if (pname
!= GL_PROGRAM_STRING_ARB
) {
694 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(pname)");
698 MEMCPY(string
, prog
->String
, _mesa_strlen((char *) prog
->String
));