blob: 7a6fc6e7dbb9630c398986f43a336bea94d88737 [file] [log] [blame]
Brian Paul9a0d97a2003-07-18 16:43:45 +00001/*
2 * Mesa 3-D graphics library
3 * Version: 5.1
4 *
5 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
6 *
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:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
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.
23 */
24
Karl Rasche1c27a1e2003-11-19 13:15:13 +000025#define DEBUG_VP 0
26
Brian Paul2c50b922003-08-06 19:23:20 +000027/**
28 * \file arbvertparse.c
29 * ARB_vertex_program parser.
30 * \author Karl Rasche
31 */
32
Brian Paul9a0d97a2003-07-18 16:43:45 +000033#include "glheader.h"
34#include "context.h"
Brian Paulba254c02003-11-21 16:38:56 +000035#include "arbvertparse.h"
Brian Paul9a0d97a2003-07-18 16:43:45 +000036#include "hash.h"
37#include "imports.h"
38#include "macros.h"
39#include "mtypes.h"
40#include "nvprogram.h"
41#include "nvvertparse.h"
42#include "nvvertprog.h"
43
Karl Rasche1c27a1e2003-11-19 13:15:13 +000044#include "arbparse.h"
Brian Paul9a0d97a2003-07-18 16:43:45 +000045
Brian Paul9a0d97a2003-07-18 16:43:45 +000046
Karl Rasche1c27a1e2003-11-19 13:15:13 +000047static GLvoid
48debug_vp_inst(GLint num, struct vp_instruction *vp)
Brian Paul9a0d97a2003-07-18 16:43:45 +000049{
50 GLint a;
51
Karl Rasche1c27a1e2003-11-19 13:15:13 +000052 for (a=0; a<num; a++) {
53 switch (vp[a].Opcode) {
54 case VP_OPCODE_MOV:
55 fprintf(stderr, "VP_OPCODE_MOV"); break;
56
57 case VP_OPCODE_LIT:
58 fprintf(stderr, "VP_OPCODE_LIT"); break;
59
60 case VP_OPCODE_RCP:
61 fprintf(stderr, "VP_OPCODE_RCP"); break;
62
63 case VP_OPCODE_RSQ:
64 fprintf(stderr, "VP_OPCODE_RSQ"); break;
65
66 case VP_OPCODE_EXP:
67 fprintf(stderr, "VP_OPCODE_EXP"); break;
68
69 case VP_OPCODE_LOG:
70 fprintf(stderr, "VP_OPCODE_LOG"); break;
71
72 case VP_OPCODE_MUL:
73 fprintf(stderr, "VP_OPCODE_MUL"); break;
74
75 case VP_OPCODE_ADD:
76 fprintf(stderr, "VP_OPCODE_ADD"); break;
77
78 case VP_OPCODE_DP3:
79 fprintf(stderr, "VP_OPCODE_DP3"); break;
80
81 case VP_OPCODE_DP4:
82 fprintf(stderr, "VP_OPCODE_DP4"); break;
83
84 case VP_OPCODE_DST:
85 fprintf(stderr, "VP_OPCODE_DST"); break;
86
87 case VP_OPCODE_MIN:
88 fprintf(stderr, "VP_OPCODE_MIN"); break;
89
90 case VP_OPCODE_MAX:
91 fprintf(stderr, "VP_OPCODE_MAX"); break;
92
93 case VP_OPCODE_SLT:
94 fprintf(stderr, "VP_OPCODE_SLT"); break;
95
96 case VP_OPCODE_SGE:
97 fprintf(stderr, "VP_OPCODE_SGE"); break;
98
99 case VP_OPCODE_MAD:
100 fprintf(stderr, "VP_OPCODE_MAD"); break;
101
102 case VP_OPCODE_ARL:
103 fprintf(stderr, "VP_OPCODE_ARL"); break;
104
105 case VP_OPCODE_DPH:
106 fprintf(stderr, "VP_OPCODE_DPH"); break;
107
108 case VP_OPCODE_RCC:
109 fprintf(stderr, "VP_OPCODE_RCC"); break;
110
111 case VP_OPCODE_SUB:
112 fprintf(stderr, "VP_OPCODE_SUB"); break;
113
114 case VP_OPCODE_ABS:
115 fprintf(stderr, "VP_OPCODE_ABS"); break;
116
117 case VP_OPCODE_FLR:
118 fprintf(stderr, "VP_OPCODE_FLR"); break;
119
120 case VP_OPCODE_FRC:
121 fprintf(stderr, "VP_OPCODE_FRC"); break;
122
123 case VP_OPCODE_EX2:
124 fprintf(stderr, "VP_OPCODE_EX2"); break;
125
126 case VP_OPCODE_LG2:
127 fprintf(stderr, "VP_OPCODE_LG2"); break;
128
129 case VP_OPCODE_POW:
130 fprintf(stderr, "VP_OPCODE_POW"); break;
131
132 case VP_OPCODE_XPD:
133 fprintf(stderr, "VP_OPCODE_XPD"); break;
134
135 case VP_OPCODE_SWZ:
136 fprintf(stderr, "VP_OPCODE_SWZ"); break;
137
138 case VP_OPCODE_END:
139 fprintf(stderr, "VP_OPCODE_END"); break;
Brian Paul9a0d97a2003-07-18 16:43:45 +0000140 }
141
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000142 fprintf(stderr, " D(0x%x:%d:%d%d%d%d) ", vp[a].DstReg.File, vp[a].DstReg.Index,
143 vp[a].DstReg.WriteMask[0],
144 vp[a].DstReg.WriteMask[1],
145 vp[a].DstReg.WriteMask[2],
146 vp[a].DstReg.WriteMask[3]);
147
148 fprintf(stderr, "S1(0x%x:%d:%d%d%d%d) ", vp[a].SrcReg[0].File, vp[a].SrcReg[0].Index,
149 vp[a].SrcReg[0].Swizzle[0],
150 vp[a].SrcReg[0].Swizzle[1],
151 vp[a].SrcReg[0].Swizzle[2],
152 vp[a].SrcReg[0].Swizzle[3]);
Brian Paul9a0d97a2003-07-18 16:43:45 +0000153
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000154 fprintf(stderr, "S2(0x%x:%d:%d%d%d%d) ", vp[a].SrcReg[1].File, vp[a].SrcReg[1].Index,
155 vp[a].SrcReg[1].Swizzle[0],
156 vp[a].SrcReg[1].Swizzle[1],
157 vp[a].SrcReg[1].Swizzle[2],
158 vp[a].SrcReg[1].Swizzle[3]);
Brian Paul9a0d97a2003-07-18 16:43:45 +0000159
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000160 fprintf(stderr, "S3(0x%x:%d:%d%d%d%d)", vp[a].SrcReg[2].File, vp[a].SrcReg[2].Index,
161 vp[a].SrcReg[2].Swizzle[0],
162 vp[a].SrcReg[2].Swizzle[1],
163 vp[a].SrcReg[2].Swizzle[2],
164 vp[a].SrcReg[2].Swizzle[3]);
Brian Paul9a0d97a2003-07-18 16:43:45 +0000165
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000166 fprintf(stderr, "\n");
Brian Paul9a0d97a2003-07-18 16:43:45 +0000167 }
168}
169
170
Brian Paul9a0d97a2003-07-18 16:43:45 +0000171void
172_mesa_parse_arb_vertex_program(GLcontext * ctx, GLenum target,
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000173 const GLubyte * str, GLsizei len,
Brian Paul9a0d97a2003-07-18 16:43:45 +0000174 struct vertex_program *program)
175{
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000176 GLuint retval;
177 struct arb_program ap;
178
Brian Paulba254c02003-11-21 16:38:56 +0000179 retval = _mesa_parse_arb_program(ctx, str, len, &ap);
Brian Paul9a0d97a2003-07-18 16:43:45 +0000180
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000181 /* XXX: Parse error. Cleanup things and return */
182 if (retval)
183 {
Brian Paul9a0d97a2003-07-18 16:43:45 +0000184 return;
Brian Paul2c50b922003-08-06 19:23:20 +0000185 }
Brian Paul9a0d97a2003-07-18 16:43:45 +0000186
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000187 /* XXX: Eh.. we parsed something that wasn't a vertex program. doh! */
188 if (ap.type != GL_VERTEX_PROGRAM_ARB)
189 {
190 return;
Brian Paul9a0d97a2003-07-18 16:43:45 +0000191 }
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000192
193#if DEBUG_VP
194 debug_vp_inst(ap.Base.NumInstructions, ap.VPInstructions);
Brian Paulba254c02003-11-21 16:38:56 +0000195#else
196 (void) debug_vp_inst;
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000197#endif
Brian Paul9a0d97a2003-07-18 16:43:45 +0000198
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000199 /* copy the relvant contents of the arb_program struct into the
200 * fragment_program struct
Brian Paul9a0d97a2003-07-18 16:43:45 +0000201 */
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000202 program->Base.NumInstructions = ap.Base.NumInstructions;
203 program->Base.NumTemporaries = ap.Base.NumTemporaries;
204 program->Base.NumParameters = ap.Base.NumParameters;
205 program->Base.NumAttributes = ap.Base.NumAttributes;
206 program->Base.NumAddressRegs = ap.Base.NumAddressRegs;
Brian Paul9a0d97a2003-07-18 16:43:45 +0000207
Karl Rasche1c27a1e2003-11-19 13:15:13 +0000208 program->Instructions = ap.VPInstructions;
209 program->IsPositionInvariant = ap.HintPositionInvariant;
210 program->InputsRead = ap.InputsRead;
211 program->OutputsWritten = ap.OutputsWritten;
212 program->Parameters = ap.Parameters;
Brian Paul9a0d97a2003-07-18 16:43:45 +0000213}