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
= (GLvoid
*) 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
, (const GLubyte
*) string
,
202 else if (target
== GL_FRAGMENT_PROGRAM_ARB
203 && ctx
->Extensions
.ARB_fragment_program
) {
204 struct fragment_program
*prog
= ctx
->FragmentProgram
.Current
;
205 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
206 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
209 _mesa_parse_arb_fragment_program(ctx
, target
, (const GLubyte
*) string
,
213 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(target)");
219 _mesa_ProgramEnvParameter4dARB(GLenum target
, GLuint index
,
220 GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
222 _mesa_ProgramEnvParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
223 (GLfloat
) z
, (GLfloat
) w
);
228 _mesa_ProgramEnvParameter4dvARB(GLenum target
, GLuint index
,
229 const GLdouble
*params
)
231 _mesa_ProgramEnvParameter4fARB(target
, index
, (GLfloat
) params
[0],
232 (GLfloat
) params
[1], (GLfloat
) params
[2],
233 (GLfloat
) params
[3]);
238 _mesa_ProgramEnvParameter4fARB(GLenum target
, GLuint index
,
239 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
241 GET_CURRENT_CONTEXT(ctx
);
242 ASSERT_OUTSIDE_BEGIN_END(ctx
);
244 if (target
== GL_FRAGMENT_PROGRAM_ARB
245 && ctx
->Extensions
.ARB_fragment_program
) {
246 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
247 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
250 ASSIGN_4V(ctx
->FragmentProgram
.Parameters
[index
], x
, y
, z
, w
);
252 if (target
== GL_VERTEX_PROGRAM_ARB
253 && ctx
->Extensions
.ARB_vertex_program
) {
254 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
255 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
258 ASSIGN_4V(ctx
->VertexProgram
.Parameters
[index
], x
, y
, z
, w
);
261 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramEnvParameter(target)");
268 _mesa_ProgramEnvParameter4fvARB(GLenum target
, GLuint index
,
269 const GLfloat
*params
)
271 _mesa_ProgramEnvParameter4fARB(target
, index
, params
[0], params
[1],
272 params
[2], params
[3]);
277 _mesa_GetProgramEnvParameterdvARB(GLenum target
, GLuint index
,
280 GET_CURRENT_CONTEXT(ctx
);
283 _mesa_GetProgramEnvParameterfvARB(target
, index
, fparams
);
284 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
285 params
[0] = fparams
[0];
286 params
[1] = fparams
[1];
287 params
[2] = fparams
[2];
288 params
[3] = fparams
[3];
294 _mesa_GetProgramEnvParameterfvARB(GLenum target
, GLuint index
,
297 GET_CURRENT_CONTEXT(ctx
);
299 if (!ctx
->_CurrentProgram
)
300 ASSERT_OUTSIDE_BEGIN_END(ctx
);
302 if (target
== GL_FRAGMENT_PROGRAM_ARB
303 && ctx
->Extensions
.ARB_fragment_program
) {
304 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
305 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
308 COPY_4V(params
, ctx
->FragmentProgram
.Parameters
[index
]);
310 if (target
== GL_VERTEX_PROGRAM_ARB
311 && ctx
->Extensions
.ARB_vertex_program
) {
312 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
313 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
316 COPY_4V(params
, ctx
->VertexProgram
.Parameters
[index
]);
319 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramEnvParameter(target)");
326 * Note, this function is also used by the GL_NV_fragment_program extension.
329 _mesa_ProgramLocalParameter4fARB(GLenum target
, GLuint index
,
330 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
332 GET_CURRENT_CONTEXT(ctx
);
333 struct program
*prog
;
334 ASSERT_OUTSIDE_BEGIN_END(ctx
);
336 if ((target
== GL_FRAGMENT_PROGRAM_NV
337 && ctx
->Extensions
.NV_fragment_program
) ||
338 (target
== GL_FRAGMENT_PROGRAM_ARB
339 && ctx
->Extensions
.ARB_fragment_program
)) {
340 if (index
>= ctx
->Const
.MaxFragmentProgramLocalParams
) {
341 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
344 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
346 else if (target
== GL_VERTEX_PROGRAM_ARB
347 && ctx
->Extensions
.ARB_vertex_program
) {
348 if (index
>= ctx
->Const
.MaxVertexProgramLocalParams
) {
349 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
352 prog
= &(ctx
->VertexProgram
.Current
->Base
);
355 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramLocalParameterARB");
359 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
360 prog
->LocalParams
[index
][0] = x
;
361 prog
->LocalParams
[index
][1] = y
;
362 prog
->LocalParams
[index
][2] = z
;
363 prog
->LocalParams
[index
][3] = w
;
368 * Note, this function is also used by the GL_NV_fragment_program extension.
371 _mesa_ProgramLocalParameter4fvARB(GLenum target
, GLuint index
,
372 const GLfloat
*params
)
374 _mesa_ProgramLocalParameter4fARB(target
, index
, params
[0], params
[1],
375 params
[2], params
[3]);
380 * Note, this function is also used by the GL_NV_fragment_program extension.
383 _mesa_ProgramLocalParameter4dARB(GLenum target
, GLuint index
,
384 GLdouble x
, GLdouble y
,
385 GLdouble z
, GLdouble w
)
387 _mesa_ProgramLocalParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
388 (GLfloat
) z
, (GLfloat
) w
);
393 * Note, this function is also used by the GL_NV_fragment_program extension.
396 _mesa_ProgramLocalParameter4dvARB(GLenum target
, GLuint index
,
397 const GLdouble
*params
)
399 _mesa_ProgramLocalParameter4fARB(target
, index
,
400 (GLfloat
) params
[0], (GLfloat
) params
[1],
401 (GLfloat
) params
[2], (GLfloat
) params
[3]);
406 * Note, this function is also used by the GL_NV_fragment_program extension.
409 _mesa_GetProgramLocalParameterfvARB(GLenum target
, GLuint index
,
412 const struct program
*prog
;
414 GET_CURRENT_CONTEXT(ctx
);
415 ASSERT_OUTSIDE_BEGIN_END(ctx
);
417 if (target
== GL_VERTEX_PROGRAM_ARB
418 && ctx
->Extensions
.ARB_vertex_program
) {
419 prog
= &(ctx
->VertexProgram
.Current
->Base
);
420 maxParams
= ctx
->Const
.MaxVertexProgramLocalParams
;
422 else if (target
== GL_FRAGMENT_PROGRAM_ARB
423 && ctx
->Extensions
.ARB_fragment_program
) {
424 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
425 maxParams
= ctx
->Const
.MaxFragmentProgramLocalParams
;
427 else if (target
== GL_FRAGMENT_PROGRAM_NV
428 && ctx
->Extensions
.NV_fragment_program
) {
429 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
430 maxParams
= MAX_NV_FRAGMENT_PROGRAM_PARAMS
;
433 _mesa_error(ctx
, GL_INVALID_ENUM
,
434 "glGetProgramLocalParameterARB(target)");
438 if (index
>= maxParams
) {
439 _mesa_error(ctx
, GL_INVALID_VALUE
,
440 "glGetProgramLocalParameterARB(index)");
445 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
446 COPY_4V(params
, prog
->LocalParams
[index
]);
451 * Note, this function is also used by the GL_NV_fragment_program extension.
454 _mesa_GetProgramLocalParameterdvARB(GLenum target
, GLuint index
,
457 GET_CURRENT_CONTEXT(ctx
);
458 GLfloat floatParams
[4];
459 _mesa_GetProgramLocalParameterfvARB(target
, index
, floatParams
);
460 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
461 COPY_4V(params
, floatParams
);
467 _mesa_GetProgramivARB(GLenum target
, GLenum pname
, GLint
*params
)
469 struct program
*prog
;
470 GET_CURRENT_CONTEXT(ctx
);
472 if (!ctx
->_CurrentProgram
)
473 ASSERT_OUTSIDE_BEGIN_END(ctx
);
475 if (target
== GL_VERTEX_PROGRAM_ARB
476 && ctx
->Extensions
.ARB_vertex_program
) {
477 prog
= &(ctx
->VertexProgram
.Current
->Base
);
479 else if (target
== GL_FRAGMENT_PROGRAM_ARB
480 && ctx
->Extensions
.ARB_fragment_program
) {
481 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
484 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
491 case GL_PROGRAM_LENGTH_ARB
:
492 *params
= prog
->String
? _mesa_strlen((char *) prog
->String
) : 0;
494 case GL_PROGRAM_FORMAT_ARB
:
495 *params
= prog
->Format
;
497 case GL_PROGRAM_BINDING_ARB
:
500 case GL_PROGRAM_INSTRUCTIONS_ARB
:
501 *params
= prog
->NumInstructions
;
503 case GL_MAX_PROGRAM_INSTRUCTIONS_ARB
:
504 if (target
== GL_VERTEX_PROGRAM_ARB
)
505 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
507 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
509 case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
510 *params
= prog
->NumInstructions
;
512 case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
513 if (target
== GL_VERTEX_PROGRAM_ARB
)
514 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
516 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
518 case GL_PROGRAM_TEMPORARIES_ARB
:
519 *params
= prog
->NumTemporaries
;
521 case GL_MAX_PROGRAM_TEMPORARIES_ARB
:
522 if (target
== GL_VERTEX_PROGRAM_ARB
)
523 *params
= ctx
->Const
.MaxVertexProgramTemps
;
525 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
527 case GL_PROGRAM_NATIVE_TEMPORARIES_ARB
:
528 /* XXX same as GL_PROGRAM_TEMPORARIES_ARB? */
529 *params
= prog
->NumTemporaries
;
531 case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
:
532 /* XXX same as GL_MAX_PROGRAM_TEMPORARIES_ARB? */
533 if (target
== GL_VERTEX_PROGRAM_ARB
)
534 *params
= ctx
->Const
.MaxVertexProgramTemps
;
536 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
538 case GL_PROGRAM_PARAMETERS_ARB
:
539 *params
= prog
->NumParameters
;
541 case GL_MAX_PROGRAM_PARAMETERS_ARB
:
542 if (target
== GL_VERTEX_PROGRAM_ARB
)
543 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
545 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
547 case GL_PROGRAM_NATIVE_PARAMETERS_ARB
:
548 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
549 *params
= prog
->NumParameters
;
551 case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
:
552 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
553 if (target
== GL_VERTEX_PROGRAM_ARB
)
554 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
556 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
558 case GL_PROGRAM_ATTRIBS_ARB
:
559 *params
= prog
->NumAttributes
;
561 case GL_MAX_PROGRAM_ATTRIBS_ARB
:
562 if (target
== GL_VERTEX_PROGRAM_ARB
)
563 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
565 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
567 case GL_PROGRAM_NATIVE_ATTRIBS_ARB
:
568 /* XXX same as GL_PROGRAM_ATTRIBS_ARB? */
569 *params
= prog
->NumAttributes
;
571 case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB
:
572 /* XXX same as GL_MAX_PROGRAM_ATTRIBS_ARB? */
573 if (target
== GL_VERTEX_PROGRAM_ARB
)
574 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
576 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
578 case GL_PROGRAM_ADDRESS_REGISTERS_ARB
:
579 *params
= prog
->NumAddressRegs
;
581 case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
:
582 if (target
== GL_VERTEX_PROGRAM_ARB
)
583 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
585 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
587 case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
588 /* XXX same as GL_PROGRAM_ADDRESS_REGISTERS_ARB? */
589 *params
= prog
->NumAddressRegs
;
591 case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
592 /* XXX same as GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB? */
593 if (target
== GL_VERTEX_PROGRAM_ARB
)
594 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
596 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
598 case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
:
599 if (target
== GL_VERTEX_PROGRAM_ARB
)
600 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
602 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
604 case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
:
605 if (target
== GL_VERTEX_PROGRAM_ARB
)
606 *params
= ctx
->Const
.MaxVertexProgramEnvParams
;
608 *params
= ctx
->Const
.MaxFragmentProgramEnvParams
;
610 case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB
:
616 * The following apply to fragment programs only.
618 case GL_PROGRAM_ALU_INSTRUCTIONS_ARB
:
619 case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
620 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
621 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
624 *params
= ctx
->FragmentProgram
.Current
->NumAluInstructions
;
626 case GL_PROGRAM_TEX_INSTRUCTIONS_ARB
:
627 case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
628 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
629 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
632 *params
= ctx
->FragmentProgram
.Current
->NumTexInstructions
;
634 case GL_PROGRAM_TEX_INDIRECTIONS_ARB
:
635 case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
636 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
637 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
640 *params
= ctx
->FragmentProgram
.Current
->NumTexIndirections
;
642 case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB
:
643 case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
644 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
645 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
648 *params
= ctx
->Const
.MaxFragmentProgramAluInstructions
;
650 case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB
:
651 case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
652 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
653 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
656 *params
= ctx
->Const
.MaxFragmentProgramTexInstructions
;
658 case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB
:
659 case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
660 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
661 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
664 *params
= ctx
->Const
.MaxFragmentProgramTexIndirections
;
667 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(pname)");
674 _mesa_GetProgramStringARB(GLenum target
, GLenum pname
, GLvoid
*string
)
676 struct program
*prog
;
677 GET_CURRENT_CONTEXT(ctx
);
679 if (!ctx
->_CurrentProgram
)
680 ASSERT_OUTSIDE_BEGIN_END(ctx
);
682 if (target
== GL_VERTEX_PROGRAM_ARB
) {
683 prog
= &(ctx
->VertexProgram
.Current
->Base
);
685 else if (target
== GL_FRAGMENT_PROGRAM_ARB
) {
686 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
689 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(target)");
695 if (pname
!= GL_PROGRAM_STRING_ARB
) {
696 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(pname)");
700 MEMCPY(string
, prog
->String
, _mesa_strlen((char *) prog
->String
));