2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2006 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 * NVIDIA vertex/fragment program state management functions.
32 * Regarding GL_NV_fragment/vertex_program, GL_NV_vertex_program1_1, etc:
34 * Portions of this software may use or implement intellectual
35 * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims
36 * any and all warranties with respect to such intellectual property,
37 * including any use thereof or modifications thereto.
46 #include "nvfragparse.h"
47 #include "program_instruction.h"
48 #include "nvvertexec.h"
49 #include "nvvertparse.h"
50 #include "nvprogram.h"
56 * Execute a vertex state program.
57 * \note Called from the GL API dispatcher.
60 _mesa_ExecuteProgramNV(GLenum target
, GLuint id
, const GLfloat
*params
)
62 struct gl_vertex_program
*vprog
;
63 GET_CURRENT_CONTEXT(ctx
);
64 ASSERT_OUTSIDE_BEGIN_END(ctx
);
66 if (target
!= GL_VERTEX_STATE_PROGRAM_NV
) {
67 _mesa_error(ctx
, GL_INVALID_ENUM
, "glExecuteProgramNV");
71 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
73 vprog
= (struct gl_vertex_program
*) _mesa_lookup_program(ctx
, id
);
75 if (!vprog
|| vprog
->Base
.Target
!= GL_VERTEX_STATE_PROGRAM_NV
) {
76 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glExecuteProgramNV");
80 _mesa_init_vp_per_vertex_registers(ctx
);
81 _mesa_init_vp_per_primitive_registers(ctx
);
82 COPY_4V(ctx
->VertexProgram
.Inputs
[VERT_ATTRIB_POS
], params
);
83 _mesa_exec_vertex_program(ctx
, vprog
);
88 * Determine if a set of programs is resident in hardware.
89 * \note Not compiled into display lists.
90 * \note Called from the GL API dispatcher.
92 GLboolean GLAPIENTRY
_mesa_AreProgramsResidentNV(GLsizei n
, const GLuint
*ids
,
93 GLboolean
*residences
)
96 GLboolean allResident
= GL_TRUE
;
97 GET_CURRENT_CONTEXT(ctx
);
98 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx
, GL_FALSE
);
101 _mesa_error(ctx
, GL_INVALID_VALUE
, "glAreProgramsResidentNV(n)");
105 for (i
= 0; i
< n
; i
++) {
106 const struct gl_program
*prog
;
108 _mesa_error(ctx
, GL_INVALID_VALUE
, "glAreProgramsResidentNV");
111 prog
= _mesa_lookup_program(ctx
, ids
[i
]);
113 _mesa_error(ctx
, GL_INVALID_VALUE
, "glAreProgramsResidentNV");
116 if (prog
->Resident
) {
118 residences
[i
] = GL_TRUE
;
122 allResident
= GL_FALSE
;
123 for (j
= 0; j
< i
; j
++)
124 residences
[j
] = GL_TRUE
;
126 residences
[i
] = GL_FALSE
;
135 * Request that a set of programs be resident in hardware.
136 * \note Called from the GL API dispatcher.
139 _mesa_RequestResidentProgramsNV(GLsizei n
, const GLuint
*ids
)
142 GET_CURRENT_CONTEXT(ctx
);
143 ASSERT_OUTSIDE_BEGIN_END(ctx
);
146 _mesa_error(ctx
, GL_INVALID_VALUE
, "glRequestResidentProgramsNV(n)");
150 /* just error checking for now */
151 for (i
= 0; i
< n
; i
++) {
152 struct gl_program
*prog
;
155 _mesa_error(ctx
, GL_INVALID_VALUE
, "glRequestResidentProgramsNV(id)");
159 prog
= _mesa_lookup_program(ctx
, ids
[i
]);
161 _mesa_error(ctx
, GL_INVALID_VALUE
, "glRequestResidentProgramsNV(id)");
165 /* XXX this is really a hardware thing we should hook out */
166 prog
->Resident
= GL_TRUE
;
172 * Get a program parameter register.
173 * \note Not compiled into display lists.
174 * \note Called from the GL API dispatcher.
177 _mesa_GetProgramParameterfvNV(GLenum target
, GLuint index
,
178 GLenum pname
, GLfloat
*params
)
180 GET_CURRENT_CONTEXT(ctx
);
181 ASSERT_OUTSIDE_BEGIN_END(ctx
);
183 if (target
== GL_VERTEX_PROGRAM_NV
) {
184 if (pname
== GL_PROGRAM_PARAMETER_NV
) {
185 if (index
< MAX_NV_VERTEX_PROGRAM_PARAMS
) {
186 COPY_4V(params
, ctx
->VertexProgram
.Parameters
[index
]);
189 _mesa_error(ctx
, GL_INVALID_VALUE
,
190 "glGetProgramParameterfvNV(index)");
195 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramParameterfvNV(pname)");
200 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramParameterfvNV(target)");
207 * Get a program parameter register.
208 * \note Not compiled into display lists.
209 * \note Called from the GL API dispatcher.
212 _mesa_GetProgramParameterdvNV(GLenum target
, GLuint index
,
213 GLenum pname
, GLdouble
*params
)
215 GET_CURRENT_CONTEXT(ctx
);
216 ASSERT_OUTSIDE_BEGIN_END(ctx
);
218 if (target
== GL_VERTEX_PROGRAM_NV
) {
219 if (pname
== GL_PROGRAM_PARAMETER_NV
) {
220 if (index
< MAX_NV_VERTEX_PROGRAM_PARAMS
) {
221 COPY_4V(params
, ctx
->VertexProgram
.Parameters
[index
]);
224 _mesa_error(ctx
, GL_INVALID_VALUE
,
225 "glGetProgramParameterdvNV(index)");
230 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramParameterdvNV(pname)");
235 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramParameterdvNV(target)");
242 * Get a program attribute.
243 * \note Not compiled into display lists.
244 * \note Called from the GL API dispatcher.
247 _mesa_GetProgramivNV(GLuint id
, GLenum pname
, GLint
*params
)
249 struct gl_program
*prog
;
250 GET_CURRENT_CONTEXT(ctx
);
252 if (!ctx
->_CurrentProgram
)
253 ASSERT_OUTSIDE_BEGIN_END(ctx
);
255 prog
= _mesa_lookup_program(ctx
, id
);
257 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetProgramivNV");
262 case GL_PROGRAM_TARGET_NV
:
263 *params
= prog
->Target
;
265 case GL_PROGRAM_LENGTH_NV
:
266 *params
= prog
->String
?(GLint
)_mesa_strlen((char *) prog
->String
) : 0;
268 case GL_PROGRAM_RESIDENT_NV
:
269 *params
= prog
->Resident
;
272 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramivNV(pname)");
279 * Get the program source code.
280 * \note Not compiled into display lists.
281 * \note Called from the GL API dispatcher.
284 _mesa_GetProgramStringNV(GLuint id
, GLenum pname
, GLubyte
*program
)
286 struct gl_program
*prog
;
287 GET_CURRENT_CONTEXT(ctx
);
289 if (!ctx
->_CurrentProgram
)
290 ASSERT_OUTSIDE_BEGIN_END(ctx
);
292 if (pname
!= GL_PROGRAM_STRING_NV
) {
293 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetProgramStringNV(pname)");
297 prog
= _mesa_lookup_program(ctx
, id
);
299 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetProgramStringNV");
304 MEMCPY(program
, prog
->String
, _mesa_strlen((char *) prog
->String
));
313 * Get matrix tracking information.
314 * \note Not compiled into display lists.
315 * \note Called from the GL API dispatcher.
318 _mesa_GetTrackMatrixivNV(GLenum target
, GLuint address
,
319 GLenum pname
, GLint
*params
)
321 GET_CURRENT_CONTEXT(ctx
);
322 ASSERT_OUTSIDE_BEGIN_END(ctx
);
324 if (target
== GL_VERTEX_PROGRAM_NV
325 && ctx
->Extensions
.NV_vertex_program
) {
328 if ((address
& 0x3) || address
>= MAX_NV_VERTEX_PROGRAM_PARAMS
) {
329 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetTrackMatrixivNV(address)");
336 case GL_TRACK_MATRIX_NV
:
337 params
[0] = (GLint
) ctx
->VertexProgram
.TrackMatrix
[i
];
339 case GL_TRACK_MATRIX_TRANSFORM_NV
:
340 params
[0] = (GLint
) ctx
->VertexProgram
.TrackMatrixTransform
[i
];
343 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTrackMatrixivNV");
348 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTrackMatrixivNV");
355 * Get a vertex (or vertex array) attribute.
356 * \note Not compiled into display lists.
357 * \note Called from the GL API dispatcher.
360 _mesa_GetVertexAttribdvNV(GLuint index
, GLenum pname
, GLdouble
*params
)
362 GET_CURRENT_CONTEXT(ctx
);
363 ASSERT_OUTSIDE_BEGIN_END(ctx
);
365 if (index
== 0 || index
>= MAX_NV_VERTEX_PROGRAM_INPUTS
) {
366 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribdvNV(index)");
371 case GL_ATTRIB_ARRAY_SIZE_NV
:
372 params
[0] = ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Size
;
374 case GL_ATTRIB_ARRAY_STRIDE_NV
:
375 params
[0] = ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Stride
;
377 case GL_ATTRIB_ARRAY_TYPE_NV
:
378 params
[0] = ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Type
;
380 case GL_CURRENT_ATTRIB_NV
:
381 FLUSH_CURRENT(ctx
, 0);
382 COPY_4V(params
, ctx
->Current
.Attrib
[index
]);
385 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribdvNV");
391 * Get a vertex (or vertex array) attribute.
392 * \note Not compiled into display lists.
393 * \note Called from the GL API dispatcher.
396 _mesa_GetVertexAttribfvNV(GLuint index
, GLenum pname
, GLfloat
*params
)
398 GET_CURRENT_CONTEXT(ctx
);
399 ASSERT_OUTSIDE_BEGIN_END(ctx
);
401 if (index
== 0 || index
>= MAX_NV_VERTEX_PROGRAM_INPUTS
) {
402 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribdvNV(index)");
407 case GL_ATTRIB_ARRAY_SIZE_NV
:
408 params
[0] = (GLfloat
) ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Size
;
410 case GL_ATTRIB_ARRAY_STRIDE_NV
:
411 params
[0] = (GLfloat
) ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Stride
;
413 case GL_ATTRIB_ARRAY_TYPE_NV
:
414 params
[0] = (GLfloat
) ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Type
;
416 case GL_CURRENT_ATTRIB_NV
:
417 FLUSH_CURRENT(ctx
, 0);
418 COPY_4V(params
, ctx
->Current
.Attrib
[index
]);
421 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribdvNV");
427 * Get a vertex (or vertex array) attribute.
428 * \note Not compiled into display lists.
429 * \note Called from the GL API dispatcher.
432 _mesa_GetVertexAttribivNV(GLuint index
, GLenum pname
, GLint
*params
)
434 GET_CURRENT_CONTEXT(ctx
);
435 ASSERT_OUTSIDE_BEGIN_END(ctx
);
437 if (index
== 0 || index
>= MAX_NV_VERTEX_PROGRAM_INPUTS
) {
438 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribdvNV(index)");
443 case GL_ATTRIB_ARRAY_SIZE_NV
:
444 params
[0] = ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Size
;
446 case GL_ATTRIB_ARRAY_STRIDE_NV
:
447 params
[0] = ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Stride
;
449 case GL_ATTRIB_ARRAY_TYPE_NV
:
450 params
[0] = ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Type
;
452 case GL_CURRENT_ATTRIB_NV
:
453 FLUSH_CURRENT(ctx
, 0);
454 params
[0] = (GLint
) ctx
->Current
.Attrib
[index
][0];
455 params
[1] = (GLint
) ctx
->Current
.Attrib
[index
][1];
456 params
[2] = (GLint
) ctx
->Current
.Attrib
[index
][2];
457 params
[3] = (GLint
) ctx
->Current
.Attrib
[index
][3];
459 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB
:
460 if (!ctx
->Extensions
.ARB_vertex_buffer_object
) {
461 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribdvNV");
464 params
[0] = ctx
->Array
.ArrayObj
->VertexAttrib
[index
].BufferObj
->Name
;
467 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribdvNV");
474 * Get a vertex array attribute pointer.
475 * \note Not compiled into display lists.
476 * \note Called from the GL API dispatcher.
479 _mesa_GetVertexAttribPointervNV(GLuint index
, GLenum pname
, GLvoid
**pointer
)
481 GET_CURRENT_CONTEXT(ctx
);
482 ASSERT_OUTSIDE_BEGIN_END(ctx
);
484 if (index
>= MAX_NV_VERTEX_PROGRAM_INPUTS
) {
485 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetVertexAttribPointerNV(index)");
489 if (pname
!= GL_ATTRIB_ARRAY_POINTER_NV
) {
490 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetVertexAttribPointerNV(pname)");
494 *pointer
= (GLvoid
*) ctx
->Array
.ArrayObj
->VertexAttrib
[index
].Ptr
;
500 * Load/parse/compile a program.
501 * \note Called from the GL API dispatcher.
504 _mesa_LoadProgramNV(GLenum target
, GLuint id
, GLsizei len
,
505 const GLubyte
*program
)
507 struct gl_program
*prog
;
508 GET_CURRENT_CONTEXT(ctx
);
509 ASSERT_OUTSIDE_BEGIN_END(ctx
);
512 _mesa_error(ctx
, GL_INVALID_VALUE
, "glLoadProgramNV(id)");
517 _mesa_error(ctx
, GL_INVALID_VALUE
, "glLoadProgramNV(len)");
521 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
523 prog
= _mesa_lookup_program(ctx
, id
);
525 if (prog
&& prog
->Target
!= 0 && prog
->Target
!= target
) {
526 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glLoadProgramNV(target)");
530 if ((target
== GL_VERTEX_PROGRAM_NV
||
531 target
== GL_VERTEX_STATE_PROGRAM_NV
)
532 && ctx
->Extensions
.NV_vertex_program
) {
533 struct gl_vertex_program
*vprog
= (struct gl_vertex_program
*) prog
;
534 if (!vprog
|| prog
== &_mesa_DummyProgram
) {
535 vprog
= (struct gl_vertex_program
*)
536 ctx
->Driver
.NewProgram(ctx
, target
, id
);
538 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glLoadProgramNV");
541 _mesa_HashInsert(ctx
->Shared
->Programs
, id
, vprog
);
543 _mesa_parse_nv_vertex_program(ctx
, target
, program
, len
, vprog
);
545 else if (target
== GL_FRAGMENT_PROGRAM_NV
546 && ctx
->Extensions
.NV_fragment_program
) {
547 struct gl_fragment_program
*fprog
= (struct gl_fragment_program
*) prog
;
548 if (!fprog
|| prog
== &_mesa_DummyProgram
) {
549 fprog
= (struct gl_fragment_program
*)
550 ctx
->Driver
.NewProgram(ctx
, target
, id
);
552 _mesa_error(ctx
, GL_OUT_OF_MEMORY
, "glLoadProgramNV");
555 _mesa_HashInsert(ctx
->Shared
->Programs
, id
, fprog
);
557 _mesa_parse_nv_fragment_program(ctx
, target
, program
, len
, fprog
);
560 _mesa_error(ctx
, GL_INVALID_ENUM
, "glLoadProgramNV(target)");
567 * Set a program parameter register.
568 * \note Called from the GL API dispatcher.
571 _mesa_ProgramParameter4dNV(GLenum target
, GLuint index
,
572 GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
574 _mesa_ProgramParameter4fNV(target
, index
,
575 (GLfloat
)x
, (GLfloat
)y
, (GLfloat
)z
, (GLfloat
)w
);
580 * Set a program parameter register.
581 * \note Called from the GL API dispatcher.
584 _mesa_ProgramParameter4dvNV(GLenum target
, GLuint index
,
585 const GLdouble
*params
)
587 _mesa_ProgramParameter4fNV(target
, index
,
588 (GLfloat
)params
[0], (GLfloat
)params
[1],
589 (GLfloat
)params
[2], (GLfloat
)params
[3]);
594 * Set a program parameter register.
595 * \note Called from the GL API dispatcher.
598 _mesa_ProgramParameter4fNV(GLenum target
, GLuint index
,
599 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
601 GET_CURRENT_CONTEXT(ctx
);
602 ASSERT_OUTSIDE_BEGIN_END(ctx
);
604 if (target
== GL_VERTEX_PROGRAM_NV
&& ctx
->Extensions
.NV_vertex_program
) {
605 if (index
< MAX_NV_VERTEX_PROGRAM_PARAMS
) {
606 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
607 ASSIGN_4V(ctx
->VertexProgram
.Parameters
[index
], x
, y
, z
, w
);
610 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramParameterNV(index)");
615 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameterNV");
622 * Set a program parameter register.
623 * \note Called from the GL API dispatcher.
626 _mesa_ProgramParameter4fvNV(GLenum target
, GLuint index
,
627 const GLfloat
*params
)
629 _mesa_ProgramParameter4fNV(target
, index
,
630 params
[0], params
[1], params
[2], params
[3]);
636 * Set a sequence of program parameter registers.
637 * \note Called from the GL API dispatcher.
640 _mesa_ProgramParameters4dvNV(GLenum target
, GLuint index
,
641 GLuint num
, const GLdouble
*params
)
643 GET_CURRENT_CONTEXT(ctx
);
644 ASSERT_OUTSIDE_BEGIN_END(ctx
);
646 if (target
== GL_VERTEX_PROGRAM_NV
&& ctx
->Extensions
.NV_vertex_program
) {
648 if (index
+ num
> MAX_NV_VERTEX_PROGRAM_PARAMS
) {
649 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramParameters4dvNV");
652 for (i
= 0; i
< num
; i
++) {
653 ctx
->VertexProgram
.Parameters
[index
+ i
][0] = (GLfloat
) params
[0];
654 ctx
->VertexProgram
.Parameters
[index
+ i
][1] = (GLfloat
) params
[1];
655 ctx
->VertexProgram
.Parameters
[index
+ i
][2] = (GLfloat
) params
[2];
656 ctx
->VertexProgram
.Parameters
[index
+ i
][3] = (GLfloat
) params
[3];
661 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameters4dvNV");
668 * Set a sequence of program parameter registers.
669 * \note Called from the GL API dispatcher.
672 _mesa_ProgramParameters4fvNV(GLenum target
, GLuint index
,
673 GLuint num
, const GLfloat
*params
)
675 GET_CURRENT_CONTEXT(ctx
);
676 ASSERT_OUTSIDE_BEGIN_END(ctx
);
678 if (target
== GL_VERTEX_PROGRAM_NV
&& ctx
->Extensions
.NV_vertex_program
) {
680 if (index
+ num
> MAX_NV_VERTEX_PROGRAM_PARAMS
) {
681 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramParameters4fvNV");
684 for (i
= 0; i
< num
; i
++) {
685 COPY_4V(ctx
->VertexProgram
.Parameters
[index
+ i
], params
);
690 _mesa_error(ctx
, GL_INVALID_ENUM
, "glProgramParameters4fvNV");
698 * Setup tracking of matrices into program parameter registers.
699 * \note Called from the GL API dispatcher.
702 _mesa_TrackMatrixNV(GLenum target
, GLuint address
,
703 GLenum matrix
, GLenum transform
)
705 GET_CURRENT_CONTEXT(ctx
);
706 ASSERT_OUTSIDE_BEGIN_END(ctx
);
708 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
710 if (target
== GL_VERTEX_PROGRAM_NV
&& ctx
->Extensions
.NV_vertex_program
) {
712 /* addr must be multiple of four */
713 _mesa_error(ctx
, GL_INVALID_VALUE
, "glTrackMatrixNV(address)");
723 case GL_MODELVIEW_PROJECTION_NV
:
732 /* OK, fallthrough */
735 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTrackMatrixNV(matrix)");
742 case GL_TRANSPOSE_NV
:
743 case GL_INVERSE_TRANSPOSE_NV
:
744 /* OK, fallthrough */
747 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTrackMatrixNV(transform)");
751 ctx
->VertexProgram
.TrackMatrix
[address
/ 4] = matrix
;
752 ctx
->VertexProgram
.TrackMatrixTransform
[address
/ 4] = transform
;
755 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTrackMatrixNV(target)");
762 _mesa_ProgramNamedParameter4fNV(GLuint id
, GLsizei len
, const GLubyte
*name
,
763 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
765 struct gl_program
*prog
;
766 struct gl_fragment_program
*fragProg
;
769 GET_CURRENT_CONTEXT(ctx
);
770 ASSERT_OUTSIDE_BEGIN_END(ctx
);
772 FLUSH_VERTICES(ctx
, _NEW_PROGRAM
);
774 prog
= _mesa_lookup_program(ctx
, id
);
775 if (!prog
|| prog
->Target
!= GL_FRAGMENT_PROGRAM_NV
) {
776 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glProgramNamedParameterNV");
781 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramNamedParameterNV(len)");
785 fragProg
= (struct gl_fragment_program
*) prog
;
786 v
= _mesa_lookup_parameter_value(fragProg
->Base
.Parameters
, len
,
796 _mesa_error(ctx
, GL_INVALID_VALUE
, "glProgramNamedParameterNV(name)");
801 _mesa_ProgramNamedParameter4fvNV(GLuint id
, GLsizei len
, const GLubyte
*name
,
804 _mesa_ProgramNamedParameter4fNV(id
, len
, name
, v
[0], v
[1], v
[2], v
[3]);
809 _mesa_ProgramNamedParameter4dNV(GLuint id
, GLsizei len
, const GLubyte
*name
,
810 GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
812 _mesa_ProgramNamedParameter4fNV(id
, len
, name
, (GLfloat
)x
, (GLfloat
)y
,
813 (GLfloat
)z
, (GLfloat
)w
);
818 _mesa_ProgramNamedParameter4dvNV(GLuint id
, GLsizei len
, const GLubyte
*name
,
821 _mesa_ProgramNamedParameter4fNV(id
, len
, name
,
822 (GLfloat
)v
[0], (GLfloat
)v
[1],
823 (GLfloat
)v
[2], (GLfloat
)v
[3]);
828 _mesa_GetProgramNamedParameterfvNV(GLuint id
, GLsizei len
, const GLubyte
*name
,
831 struct gl_program
*prog
;
832 struct gl_fragment_program
*fragProg
;
835 GET_CURRENT_CONTEXT(ctx
);
837 if (!ctx
->_CurrentProgram
)
838 ASSERT_OUTSIDE_BEGIN_END(ctx
);
840 prog
= _mesa_lookup_program(ctx
, id
);
841 if (!prog
|| prog
->Target
!= GL_FRAGMENT_PROGRAM_NV
) {
842 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetProgramNamedParameterNV");
847 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramNamedParameterNV");
851 fragProg
= (struct gl_fragment_program
*) prog
;
852 v
= _mesa_lookup_parameter_value(fragProg
->Base
.Parameters
,
862 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetProgramNamedParameterNV");
867 _mesa_GetProgramNamedParameterdvNV(GLuint id
, GLsizei len
, const GLubyte
*name
,
870 GLfloat floatParams
[4];
871 _mesa_GetProgramNamedParameterfvNV(id
, len
, name
, floatParams
);
872 COPY_4V(params
, floatParams
);