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
]);
134 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribfvARB(pname)");
141 _mesa_GetVertexAttribivARB(GLuint index
, GLenum pname
, GLint
*params
)
144 GET_CURRENT_CONTEXT(ctx
);
145 ASSERT_OUTSIDE_BEGIN_END(ctx
);
147 _mesa_GetVertexAttribfvARB(index
, pname
, fparams
);
148 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
149 if (pname
== GL_CURRENT_VERTEX_ATTRIB_ARB
) {
150 COPY_4V_CAST(params
, fparams
, GLint
); /* float to int */
153 params
[0] = (GLint
) fparams
[0];
160 _mesa_GetVertexAttribPointervARB(GLuint index
, GLenum pname
, GLvoid
**pointer
)
162 GET_CURRENT_CONTEXT(ctx
);
163 ASSERT_OUTSIDE_BEGIN_END(ctx
);
165 if (index
>= ctx
->Const
.MaxVertexProgramAttribs
) {
166 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribPointerARB(index)");
170 if (pname
!= GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB
) {
171 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribPointerARB(pname)");
175 *pointer
= ctx
->Array
.VertexAttrib
[index
].Ptr
;;
180 _mesa_ProgramStringARB(GLenum target
, GLenum format
, GLsizei len
,
181 const GLvoid
*string
)
183 GET_CURRENT_CONTEXT(ctx
);
184 ASSERT_OUTSIDE_BEGIN_END(ctx
);
186 if (target
== GL_VERTEX_PROGRAM_ARB
187 && ctx
->Extensions
.ARB_vertex_program
) {
188 struct vertex_program
*prog
= ctx
->VertexProgram
.Current
;
189 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
190 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
193 _mesa_parse_arb_vertex_program(ctx
, target
, string
, len
, prog
);
195 else if (target
== GL_FRAGMENT_PROGRAM_ARB
196 && ctx
->Extensions
.ARB_fragment_program
) {
197 struct fragment_program
*prog
= ctx
->FragmentProgram
.Current
;
198 if (format
!= GL_PROGRAM_FORMAT_ASCII_ARB
) {
199 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(format)");
202 _mesa_parse_arb_fragment_program(ctx
, target
, string
, len
, prog
);
205 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramStringARB(target)");
211 _mesa_ProgramEnvParameter4dARB(GLenum target
, GLuint index
,
212 GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
214 _mesa_ProgramEnvParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
215 (GLfloat
) z
, (GLfloat
) w
);
220 _mesa_ProgramEnvParameter4dvARB(GLenum target
, GLuint index
,
221 const GLdouble
*params
)
223 _mesa_ProgramEnvParameter4fARB(target
, index
, (GLfloat
) params
[0],
224 (GLfloat
) params
[1], (GLfloat
) params
[2],
225 (GLfloat
) params
[3]);
230 _mesa_ProgramEnvParameter4fARB(GLenum target
, GLuint index
,
231 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
233 GET_CURRENT_CONTEXT(ctx
);
234 ASSERT_OUTSIDE_BEGIN_END(ctx
);
236 if (target
== GL_FRAGMENT_PROGRAM_ARB
237 && ctx
->Extensions
.ARB_fragment_program
) {
238 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
239 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
242 ASSIGN_4V(ctx
->FragmentProgram
.Parameters
[index
], x
, y
, z
, w
);
244 if (target
== GL_VERTEX_PROGRAM_ARB
245 && ctx
->Extensions
.ARB_vertex_program
) {
246 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
247 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramEnvParameter(index)");
250 ASSIGN_4V(ctx
->VertexProgram
.Parameters
[index
], x
, y
, z
, w
);
253 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramEnvParameter(target)");
260 _mesa_ProgramEnvParameter4fvARB(GLenum target
, GLuint index
,
261 const GLfloat
*params
)
263 _mesa_ProgramEnvParameter4fARB(target
, index
, params
[0], params
[1],
264 params
[2], params
[3]);
269 _mesa_GetProgramEnvParameterdvARB(GLenum target
, GLuint index
,
272 GET_CURRENT_CONTEXT(ctx
);
275 _mesa_GetProgramEnvParameterfvARB(target
, index
, fparams
);
276 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
277 params
[0] = fparams
[0];
278 params
[1] = fparams
[1];
279 params
[2] = fparams
[2];
280 params
[3] = fparams
[3];
286 _mesa_GetProgramEnvParameterfvARB(GLenum target
, GLuint index
,
289 GET_CURRENT_CONTEXT(ctx
);
291 if (!ctx
->_CurrentProgram
)
292 ASSERT_OUTSIDE_BEGIN_END(ctx
);
294 if (target
== GL_FRAGMENT_PROGRAM_ARB
295 && ctx
->Extensions
.ARB_fragment_program
) {
296 if (index
>= ctx
->Const
.MaxFragmentProgramEnvParams
) {
297 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
300 COPY_4V(params
, ctx
->FragmentProgram
.Parameters
[index
]);
302 if (target
== GL_VERTEX_PROGRAM_ARB
303 && ctx
->Extensions
.ARB_vertex_program
) {
304 if (index
>= ctx
->Const
.MaxVertexProgramEnvParams
) {
305 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramEnvParameter(index)");
308 COPY_4V(params
, ctx
->VertexProgram
.Parameters
[index
]);
311 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramEnvParameter(target)");
318 * Note, this function is also used by the GL_NV_fragment_program extension.
321 _mesa_ProgramLocalParameter4fARB(GLenum target
, GLuint index
,
322 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
324 GET_CURRENT_CONTEXT(ctx
);
325 struct program
*prog
;
326 ASSERT_OUTSIDE_BEGIN_END(ctx
);
328 if ((target
== GL_FRAGMENT_PROGRAM_NV
329 && ctx
->Extensions
.NV_fragment_program
) ||
330 (target
== GL_FRAGMENT_PROGRAM_ARB
331 && ctx
->Extensions
.ARB_fragment_program
)) {
332 if (index
>= ctx
->Const
.MaxFragmentProgramLocalParams
) {
333 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
336 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
338 else if (target
== GL_VERTEX_PROGRAM_ARB
339 && ctx
->Extensions
.ARB_vertex_program
) {
340 if (index
>= ctx
->Const
.MaxVertexProgramLocalParams
) {
341 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramLocalParameterARB");
344 prog
= &(ctx
->VertexProgram
.Current
->Base
);
347 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramLocalParameterARB");
351 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
352 prog
->LocalParams
[index
][0] = x
;
353 prog
->LocalParams
[index
][1] = y
;
354 prog
->LocalParams
[index
][2] = z
;
355 prog
->LocalParams
[index
][3] = w
;
360 * Note, this function is also used by the GL_NV_fragment_program extension.
363 _mesa_ProgramLocalParameter4fvARB(GLenum target
, GLuint index
,
364 const GLfloat
*params
)
366 _mesa_ProgramLocalParameter4fARB(target
, index
, params
[0], params
[1],
367 params
[2], params
[3]);
372 * Note, this function is also used by the GL_NV_fragment_program extension.
375 _mesa_ProgramLocalParameter4dARB(GLenum target
, GLuint index
,
376 GLdouble x
, GLdouble y
,
377 GLdouble z
, GLdouble w
)
379 _mesa_ProgramLocalParameter4fARB(target
, index
, (GLfloat
) x
, (GLfloat
) y
,
380 (GLfloat
) z
, (GLfloat
) w
);
385 * Note, this function is also used by the GL_NV_fragment_program extension.
388 _mesa_ProgramLocalParameter4dvARB(GLenum target
, GLuint index
,
389 const GLdouble
*params
)
391 _mesa_ProgramLocalParameter4fARB(target
, index
,
392 (GLfloat
) params
[0], (GLfloat
) params
[1],
393 (GLfloat
) params
[2], (GLfloat
) params
[3]);
398 * Note, this function is also used by the GL_NV_fragment_program extension.
401 _mesa_GetProgramLocalParameterfvARB(GLenum target
, GLuint index
,
404 const struct program
*prog
;
406 GET_CURRENT_CONTEXT(ctx
);
407 ASSERT_OUTSIDE_BEGIN_END(ctx
);
409 if (target
== GL_VERTEX_PROGRAM_ARB
410 && ctx
->Extensions
.ARB_vertex_program
) {
411 prog
= &(ctx
->VertexProgram
.Current
->Base
);
412 maxParams
= ctx
->Const
.MaxVertexProgramLocalParams
;
414 else if (target
== GL_FRAGMENT_PROGRAM_ARB
415 && ctx
->Extensions
.ARB_fragment_program
) {
416 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
417 maxParams
= ctx
->Const
.MaxFragmentProgramLocalParams
;
419 else if (target
== GL_FRAGMENT_PROGRAM_NV
420 && ctx
->Extensions
.NV_fragment_program
) {
421 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
422 maxParams
= MAX_NV_FRAGMENT_PROGRAM_PARAMS
;
425 _mesa_error(ctx
, GL_INVALID_ENUM
,
426 "glGetProgramLocalParameterARB(target)");
430 if (index
>= maxParams
) {
431 _mesa_error(ctx
, GL_INVALID_VALUE
,
432 "glGetProgramLocalParameterARB(index)");
437 ASSERT(index
< MAX_PROGRAM_LOCAL_PARAMS
);
438 COPY_4V(params
, prog
->LocalParams
[index
]);
443 * Note, this function is also used by the GL_NV_fragment_program extension.
446 _mesa_GetProgramLocalParameterdvARB(GLenum target
, GLuint index
,
449 GET_CURRENT_CONTEXT(ctx
);
450 GLfloat floatParams
[4];
451 _mesa_GetProgramLocalParameterfvARB(target
, index
, floatParams
);
452 if (ctx
->ErrorValue
== GL_NO_ERROR
) {
453 COPY_4V(params
, floatParams
);
459 _mesa_GetProgramivARB(GLenum target
, GLenum pname
, GLint
*params
)
461 struct program
*prog
;
462 GET_CURRENT_CONTEXT(ctx
);
464 if (!ctx
->_CurrentProgram
)
465 ASSERT_OUTSIDE_BEGIN_END(ctx
);
467 if (target
== GL_VERTEX_PROGRAM_ARB
468 && ctx
->Extensions
.ARB_vertex_program
) {
469 prog
= &(ctx
->VertexProgram
.Current
->Base
);
471 else if (target
== GL_FRAGMENT_PROGRAM_ARB
472 && ctx
->Extensions
.ARB_fragment_program
) {
473 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
476 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
483 case GL_PROGRAM_LENGTH_ARB
:
484 *params
= prog
->String
? _mesa_strlen((char *) prog
->String
) : 0;
486 case GL_PROGRAM_FORMAT_ARB
:
487 *params
= prog
->Format
;
489 case GL_PROGRAM_BINDING_ARB
:
492 case GL_PROGRAM_INSTRUCTIONS_ARB
:
493 *params
= prog
->NumInstructions
;
495 case GL_MAX_PROGRAM_INSTRUCTIONS_ARB
:
496 if (target
== GL_VERTEX_PROGRAM_ARB
)
497 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
499 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
501 case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
502 *params
= prog
->NumInstructions
;
504 case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
:
505 if (target
== GL_VERTEX_PROGRAM_ARB
)
506 *params
= ctx
->Const
.MaxVertexProgramInstructions
;
508 *params
= ctx
->Const
.MaxFragmentProgramInstructions
;
510 case GL_PROGRAM_TEMPORARIES_ARB
:
511 *params
= prog
->NumTemporaries
;
513 case GL_MAX_PROGRAM_TEMPORARIES_ARB
:
514 if (target
== GL_VERTEX_PROGRAM_ARB
)
515 *params
= ctx
->Const
.MaxVertexProgramTemps
;
517 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
519 case GL_PROGRAM_NATIVE_TEMPORARIES_ARB
:
520 /* XXX same as GL_PROGRAM_TEMPORARIES_ARB? */
521 *params
= prog
->NumTemporaries
;
523 case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
:
524 /* XXX same as GL_MAX_PROGRAM_TEMPORARIES_ARB? */
525 if (target
== GL_VERTEX_PROGRAM_ARB
)
526 *params
= ctx
->Const
.MaxVertexProgramTemps
;
528 *params
= ctx
->Const
.MaxFragmentProgramTemps
;
530 case GL_PROGRAM_PARAMETERS_ARB
:
531 *params
= prog
->NumParameters
;
533 case GL_MAX_PROGRAM_PARAMETERS_ARB
:
534 if (target
== GL_VERTEX_PROGRAM_ARB
)
535 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
537 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
539 case GL_PROGRAM_NATIVE_PARAMETERS_ARB
:
540 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
541 *params
= prog
->NumParameters
;
543 case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
:
544 /* XXX same as GL_MAX_PROGRAM_PARAMETERS_ARB? */
545 if (target
== GL_VERTEX_PROGRAM_ARB
)
546 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
548 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
550 case GL_PROGRAM_ATTRIBS_ARB
:
551 *params
= prog
->NumAttributes
;
553 case GL_MAX_PROGRAM_ATTRIBS_ARB
:
554 if (target
== GL_VERTEX_PROGRAM_ARB
)
555 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
557 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
559 case GL_PROGRAM_NATIVE_ATTRIBS_ARB
:
560 /* XXX same as GL_PROGRAM_ATTRIBS_ARB? */
561 *params
= prog
->NumAttributes
;
563 case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB
:
564 /* XXX same as GL_MAX_PROGRAM_ATTRIBS_ARB? */
565 if (target
== GL_VERTEX_PROGRAM_ARB
)
566 *params
= ctx
->Const
.MaxVertexProgramAttribs
;
568 *params
= ctx
->Const
.MaxFragmentProgramAttribs
;
570 case GL_PROGRAM_ADDRESS_REGISTERS_ARB
:
571 *params
= prog
->NumAddressRegs
;
573 case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
:
574 if (target
== GL_VERTEX_PROGRAM_ARB
)
575 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
577 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
579 case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
580 /* XXX same as GL_PROGRAM_ADDRESS_REGISTERS_ARB? */
581 *params
= prog
->NumAddressRegs
;
583 case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
:
584 /* XXX same as GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB? */
585 if (target
== GL_VERTEX_PROGRAM_ARB
)
586 *params
= ctx
->Const
.MaxVertexProgramAddressRegs
;
588 *params
= ctx
->Const
.MaxFragmentProgramAddressRegs
;
590 case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
:
591 if (target
== GL_VERTEX_PROGRAM_ARB
)
592 *params
= ctx
->Const
.MaxVertexProgramLocalParams
;
594 *params
= ctx
->Const
.MaxFragmentProgramLocalParams
;
596 case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
:
597 if (target
== GL_VERTEX_PROGRAM_ARB
)
598 *params
= ctx
->Const
.MaxVertexProgramEnvParams
;
600 *params
= ctx
->Const
.MaxFragmentProgramEnvParams
;
602 case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB
:
608 * The following apply to fragment programs only.
610 case GL_PROGRAM_ALU_INSTRUCTIONS_ARB
:
611 case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
612 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
613 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
616 *params
= ctx
->FragmentProgram
.Current
->NumAluInstructions
;
618 case GL_PROGRAM_TEX_INSTRUCTIONS_ARB
:
619 case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
620 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
621 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
624 *params
= ctx
->FragmentProgram
.Current
->NumTexInstructions
;
626 case GL_PROGRAM_TEX_INDIRECTIONS_ARB
:
627 case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
628 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
629 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
632 *params
= ctx
->FragmentProgram
.Current
->NumTexIndirections
;
634 case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB
:
635 case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
:
636 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
637 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
640 *params
= ctx
->Const
.MaxFragmentProgramAluInstructions
;
642 case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB
:
643 case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB
:
644 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
645 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
648 *params
= ctx
->Const
.MaxFragmentProgramTexInstructions
;
650 case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB
:
651 case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB
:
652 if (target
!= GL_FRAGMENT_PROGRAM_ARB
) {
653 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(target)");
656 *params
= ctx
->Const
.MaxFragmentProgramTexIndirections
;
659 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivARB(pname)");
666 _mesa_GetProgramStringARB(GLenum target
, GLenum pname
, GLvoid
*string
)
668 struct program
*prog
;
669 GET_CURRENT_CONTEXT(ctx
);
671 if (!ctx
->_CurrentProgram
)
672 ASSERT_OUTSIDE_BEGIN_END(ctx
);
674 if (target
== GL_VERTEX_PROGRAM_ARB
) {
675 prog
= &(ctx
->VertexProgram
.Current
->Base
);
677 else if (target
== GL_FRAGMENT_PROGRAM_ARB
) {
678 prog
= &(ctx
->FragmentProgram
.Current
->Base
);
681 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(target)");
687 if (pname
!= GL_PROGRAM_STRING_ARB
) {
688 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringARB(pname)");
692 MEMCPY(string
, prog
->String
, _mesa_strlen((char *) prog
->String
));
699 glProgramCallbackMESA(GLenum target
, GLprogramcallbackMESA callback
,
702 _mesa_ProgramCallbackMESA(target
, callback
, data
);
707 _mesa_ProgramCallbackMESA(GLenum target
, GLprogramcallbackMESA callback
,
710 GET_CURRENT_CONTEXT(ctx
);
713 case GL_FRAGMENT_PROGRAM_ARB
:
714 if (!ctx
->Extensions
.ARB_fragment_program
) {
715 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramCallbackMESA(target)");
718 ctx
->FragmentProgram
.Callback
= callback
;
719 ctx
->FragmentProgram
.CallbackData
= data
;
721 case GL_FRAGMENT_PROGRAM_NV
:
722 if (!ctx
->Extensions
.NV_fragment_program
) {
723 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramCallbackMESA(target)");
726 ctx
->FragmentProgram
.Callback
= callback
;
727 ctx
->FragmentProgram
.CallbackData
= data
;
729 case GL_VERTEX_PROGRAM_ARB
: /* == GL_VERTEX_PROGRAM_NV */
730 if (!ctx
->Extensions
.ARB_vertex_program
&&
731 !ctx
->Extensions
.NV_vertex_program
) {
732 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramCallbackMESA(target)");
735 ctx
->VertexProgram
.Callback
= callback
;
736 ctx
->VertexProgram
.CallbackData
= data
;
739 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramCallbackMESA(target)");
747 glGetProgramRegisterfvMESA(GLenum target
,
748 GLsizei len
, const GLubyte
*registerName
,
751 _mesa_GetProgramRegisterfvMESA(target
, len
, registerName
, v
);
756 _mesa_GetProgramRegisterfvMESA(GLenum target
,
757 GLsizei len
, const GLubyte
*registerName
,
761 GET_CURRENT_CONTEXT(ctx
);
763 /* We _should_ be inside glBegin/glEnd */
765 if (ctx
->Driver
.CurrentExecPrimitive
== PRIM_OUTSIDE_BEGIN_END
) {
766 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetProgramRegisterfvMESA");
771 /* make null-terminated copy of registerName */
772 _mesa_memcpy(reg
, registerName
, len
);
776 case GL_VERTEX_PROGRAM_NV
:
777 if (!ctx
->Extensions
.ARB_vertex_program
&&
778 !ctx
->Extensions
.NV_vertex_program
) {
779 _mesa_error(ctx
, GL_INVALID_ENUM
,
780 "glGetProgramRegisterfvMESA(target)");
783 if (!ctx
->VertexProgram
.Enabled
) {
784 _mesa_error(ctx
, GL_INVALID_OPERATION
,
785 "glGetProgramRegisterfvMESA");
788 /* GL_NV_vertex_program */
791 GLint i
= _mesa_atoi(reg
+ 1);
792 if (i
>= (GLint
)ctx
->Const
.MaxVertexProgramTemps
) {
793 _mesa_error(ctx
, GL_INVALID_VALUE
,
794 "glGetProgramRegisterfvMESA(registerName)");
797 COPY_4V(v
, ctx
->VertexProgram
.Temporaries
[i
]);
799 else if (reg
[0] == 'v' && reg
[1] == '[') {
800 /* Vertex Input attribute */
802 for (i
= 0; i
< ctx
->Const
.MaxVertexProgramAttribs
; i
++) {
803 const char *name
= _mesa_nv_vertex_input_register_name(i
);
805 sprintf(number
, "%d", i
);
806 if (_mesa_strncmp(reg
+ 2, name
, 4) == 0 ||
807 _mesa_strncmp(reg
+ 2, number
, _mesa_strlen(number
)) == 0) {
808 COPY_4V(v
, ctx
->VertexProgram
.Inputs
[i
]);
812 _mesa_error(ctx
, GL_INVALID_VALUE
,
813 "glGetProgramRegisterfvMESA(registerName)");
816 else if (reg
[0] == 'o' && reg
[1] == '[') {
817 /* Vertex output attribute */
819 /* GL_ARB_vertex_program */
820 else if (_mesa_strncmp(reg
, "vertex.", 7) == 0) {
824 _mesa_error(ctx
, GL_INVALID_VALUE
,
825 "glGetProgramRegisterfvMESA(registerName)");
829 case GL_FRAGMENT_PROGRAM_ARB
:
830 if (!ctx
->Extensions
.ARB_fragment_program
) {
831 _mesa_error(ctx
, GL_INVALID_ENUM
,
832 "glGetProgramRegisterfvMESA(target)");
835 if (!ctx
->FragmentProgram
.Enabled
) {
836 _mesa_error(ctx
, GL_INVALID_OPERATION
,
837 "glGetProgramRegisterfvMESA");
842 case GL_FRAGMENT_PROGRAM_NV
:
843 if (!ctx
->Extensions
.NV_fragment_program
) {
844 _mesa_error(ctx
, GL_INVALID_ENUM
,
845 "glGetProgramRegisterfvMESA(target)");
848 if (!ctx
->FragmentProgram
.Enabled
) {
849 _mesa_error(ctx
, GL_INVALID_OPERATION
,
850 "glGetProgramRegisterfvMESA");
855 GLint i
= _mesa_atoi(reg
+ 1);
856 if (i
>= (GLint
)ctx
->Const
.MaxFragmentProgramTemps
) {
857 _mesa_error(ctx
, GL_INVALID_VALUE
,
858 "glGetProgramRegisterfvMESA(registerName)");
861 COPY_4V(v
, ctx
->FragmentProgram
.Machine
.Temporaries
[i
]);
863 else if (reg
[0] == 'f' && reg
[1] == '[') {
864 /* Fragment input attribute */
866 for (i
= 0; i
< ctx
->Const
.MaxFragmentProgramAttribs
; i
++) {
867 const char *name
= _mesa_nv_fragment_input_register_name(i
);
868 if (_mesa_strncmp(reg
+ 2, name
, 4) == 0) {
869 COPY_4V(v
, ctx
->FragmentProgram
.Machine
.Inputs
[i
]);
873 _mesa_error(ctx
, GL_INVALID_VALUE
,
874 "glGetProgramRegisterfvMESA(registerName)");
877 else if (_mesa_strcmp(reg
, "o[COLR]") == 0) {
878 /* Fragment output color */
879 COPY_4V(v
, ctx
->FragmentProgram
.Machine
.Outputs
[FRAG_OUTPUT_COLR
]);
881 else if (_mesa_strcmp(reg
, "o[COLH]") == 0) {
882 /* Fragment output color */
883 COPY_4V(v
, ctx
->FragmentProgram
.Machine
.Outputs
[FRAG_OUTPUT_COLH
]);
885 else if (_mesa_strcmp(reg
, "o[DEPR]") == 0) {
886 /* Fragment output depth */
887 COPY_4V(v
, ctx
->FragmentProgram
.Machine
.Outputs
[FRAG_OUTPUT_DEPR
]);
890 _mesa_error(ctx
, GL_INVALID_VALUE
,
891 "glGetProgramRegisterfvMESA(registerName)");
896 _mesa_error(ctx
, GL_INVALID_ENUM
,
897 "glGetProgramRegisterfvMESA(target)");