2 * Mesa 3-D graphics library
5 * Copyright (C) 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.
31 #include "shaderobjects.h"
32 #include "shaderobjects_3dlabs.h"
33 #include "t_pipeline.h"
34 #include "slang_utility.h"
35 #include "slang_link.h"
39 GLvector4f outputs
[VERT_RESULT_MAX
];
40 GLvector4f ndc_coords
;
46 #define ARBVS_STAGE_DATA(stage) ((arbvs_stage_data *) stage->privatePtr)
48 static GLboolean
construct_arb_vertex_shader (GLcontext
*ctx
, struct tnl_pipeline_stage
*stage
)
50 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
51 struct vertex_buffer
*vb
= &tnl
->vb
;
52 arbvs_stage_data
*store
;
53 GLuint size
= vb
->Size
;
56 stage
->privatePtr
= _mesa_malloc (sizeof (arbvs_stage_data
));
57 store
= ARBVS_STAGE_DATA(stage
);
61 for (i
= 0; i
< VERT_RESULT_MAX
; i
++)
63 _mesa_vector4f_alloc (&store
->outputs
[i
], 0, size
, 32);
64 store
->outputs
[i
].size
= 4;
66 _mesa_vector4f_alloc (&store
->ndc_coords
, 0, size
, 32);
67 store
->clipmask
= (GLubyte
*) ALIGN_MALLOC (size
, 32);
72 static void destruct_arb_vertex_shader (struct tnl_pipeline_stage
*stage
)
74 arbvs_stage_data
*store
= ARBVS_STAGE_DATA(stage
);
80 for (i
= 0; i
< VERT_RESULT_MAX
; i
++)
81 _mesa_vector4f_free (&store
->outputs
[i
]);
82 _mesa_vector4f_free (&store
->ndc_coords
);
83 ALIGN_FREE (store
->clipmask
);
86 stage
->privatePtr
= NULL
;
90 static void validate_arb_vertex_shader (GLcontext
*ctx
, struct tnl_pipeline_stage
*stage
)
94 static GLvoid
fetch_input_float (struct gl2_program_intf
**pro
, GLuint index
, GLuint attr
, GLuint i
,
95 struct vertex_buffer
*vb
)
97 const GLubyte
*ptr
= (const GLubyte
*) vb
->AttribPtr
[attr
]->data
;
98 const GLuint stride
= vb
->AttribPtr
[attr
]->stride
;
99 const GLfloat
*data
= (const GLfloat
*) (ptr
+ stride
* i
);
103 (**pro
).UpdateFixedAttribute (pro
, index
, vec
, 0, sizeof (GLfloat
), GL_TRUE
);
106 static GLvoid
fetch_input_vec3 (struct gl2_program_intf
**pro
, GLuint index
, GLuint attr
, GLuint i
,
107 struct vertex_buffer
*vb
)
109 const GLubyte
*ptr
= (const GLubyte
*) vb
->AttribPtr
[attr
]->data
;
110 const GLuint stride
= vb
->AttribPtr
[attr
]->stride
;
111 const GLfloat
*data
= (const GLfloat
*) (ptr
+ stride
* i
);
117 (**pro
).UpdateFixedAttribute (pro
, index
, vec
, 0, 3 * sizeof (GLfloat
), GL_TRUE
);
120 static void fetch_input_vec4 (struct gl2_program_intf
**pro
, GLuint index
, GLuint attr
, GLuint i
,
121 struct vertex_buffer
*vb
)
123 const GLubyte
*ptr
= (const GLubyte
*) vb
->AttribPtr
[attr
]->data
;
124 const GLuint size
= vb
->AttribPtr
[attr
]->size
;
125 const GLuint stride
= vb
->AttribPtr
[attr
]->stride
;
126 const GLfloat
*data
= (const GLfloat
*) (ptr
+ stride
* i
);
150 (**pro
).UpdateFixedAttribute (pro
, index
, vec
, 0, 4 * sizeof (GLfloat
), GL_TRUE
);
153 static GLvoid
fetch_output_float (struct gl2_program_intf
**pro
, GLuint index
, GLuint attr
, GLuint i
,
154 arbvs_stage_data
*store
)
156 (**pro
).UpdateFixedAttribute (pro
, index
, &store
->outputs
[attr
].data
[i
], 0, sizeof (GLfloat
),
160 static void fetch_output_vec4 (struct gl2_program_intf
**pro
, GLuint index
, GLuint attr
, GLuint i
,
161 GLuint offset
, arbvs_stage_data
*store
)
163 (**pro
).UpdateFixedAttribute (pro
, index
, &store
->outputs
[attr
].data
[i
], offset
,
164 4 * sizeof (GLfloat
), GL_FALSE
);
167 static GLboolean
run_arb_vertex_shader (GLcontext
*ctx
, struct tnl_pipeline_stage
*stage
)
169 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
170 struct vertex_buffer
*vb
= &tnl
->vb
;
171 arbvs_stage_data
*store
= ARBVS_STAGE_DATA(stage
);
172 struct gl2_program_intf
**pro
;
175 if (!ctx
->ShaderObjects
._VertexShaderPresent
)
178 pro
= ctx
->ShaderObjects
.CurrentProgram
;
179 (**pro
).UpdateFixedUniforms (pro
);
181 for (i
= 0; i
< vb
->Count
; i
++)
183 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_VERTEX
, _TNL_ATTRIB_POS
, i
, vb
);
184 fetch_input_vec3 (pro
, SLANG_VERTEX_FIXED_NORMAL
, _TNL_ATTRIB_NORMAL
, i
, vb
);
185 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_COLOR
, _TNL_ATTRIB_COLOR0
, i
, vb
);
186 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_SECONDARYCOLOR
, _TNL_ATTRIB_COLOR1
, i
, vb
);
187 fetch_input_float (pro
, SLANG_VERTEX_FIXED_FOGCOORD
, _TNL_ATTRIB_FOG
, i
, vb
);
188 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD0
, _TNL_ATTRIB_TEX0
, i
, vb
);
189 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD1
, _TNL_ATTRIB_TEX1
, i
, vb
);
190 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD2
, _TNL_ATTRIB_TEX2
, i
, vb
);
191 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD3
, _TNL_ATTRIB_TEX3
, i
, vb
);
192 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD4
, _TNL_ATTRIB_TEX4
, i
, vb
);
193 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD5
, _TNL_ATTRIB_TEX5
, i
, vb
);
194 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD6
, _TNL_ATTRIB_TEX6
, i
, vb
);
195 fetch_input_vec4 (pro
, SLANG_VERTEX_FIXED_MULTITEXCOORD7
, _TNL_ATTRIB_TEX7
, i
, vb
);
197 _slang_exec_vertex_shader (pro
);
199 fetch_output_vec4 (pro
, SLANG_VERTEX_FIXED_POSITION
, VERT_RESULT_HPOS
, i
, 0, store
);
200 fetch_output_vec4 (pro
, SLANG_VERTEX_FIXED_FRONTCOLOR
, VERT_RESULT_COL0
, i
, 0, store
);
201 fetch_output_vec4 (pro
, SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR
, VERT_RESULT_COL1
, i
, 0, store
);
202 fetch_output_float (pro
, SLANG_VERTEX_FIXED_FOGFRAGCOORD
, VERT_RESULT_FOGC
, i
, store
);
203 for (j
= 0; j
< 8; j
++)
204 fetch_output_vec4 (pro
, SLANG_VERTEX_FIXED_TEXCOORD
, VERT_RESULT_TEX0
+ j
, i
, j
, store
);
205 fetch_output_float (pro
, SLANG_VERTEX_FIXED_POINTSIZE
, VERT_RESULT_PSIZ
, i
, store
);
206 fetch_output_vec4 (pro
, SLANG_VERTEX_FIXED_BACKCOLOR
, VERT_RESULT_BFC0
, i
, 0, store
);
207 fetch_output_vec4 (pro
, SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR
, VERT_RESULT_BFC1
, i
, 0, store
);
208 /* XXX: fetch output SLANG_VERTEX_FIXED_CLIPVERTEX */
211 vb
->ClipPtr
= &store
->outputs
[VERT_RESULT_HPOS
];
212 vb
->ClipPtr
->count
= vb
->Count
;
213 vb
->ColorPtr
[0] = &store
->outputs
[VERT_RESULT_COL0
];
214 vb
->SecondaryColorPtr
[0] = &store
->outputs
[VERT_RESULT_COL1
];
215 for (i
= 0; i
< ctx
->Const
.MaxTextureUnits
; i
++)
216 vb
->TexCoordPtr
[i
] = &store
->outputs
[VERT_RESULT_TEX0
+ i
];
217 vb
->ColorPtr
[1] = &store
->outputs
[VERT_RESULT_BFC0
];
218 vb
->SecondaryColorPtr
[1] = &store
->outputs
[VERT_RESULT_BFC1
];
219 vb
->FogCoordPtr
= &store
->outputs
[VERT_RESULT_FOGC
];
220 vb
->PointSizePtr
= &store
->outputs
[VERT_RESULT_PSIZ
];
222 vb
->AttribPtr
[VERT_ATTRIB_COLOR0
] = vb
->ColorPtr
[0];
223 vb
->AttribPtr
[VERT_ATTRIB_COLOR1
] = vb
->SecondaryColorPtr
[0];
224 vb
->AttribPtr
[VERT_ATTRIB_FOG
] = vb
->FogCoordPtr
;
225 for (i
= 0; i
< ctx
->Const
.MaxTextureUnits
; i
++)
226 vb
->AttribPtr
[VERT_ATTRIB_TEX0
+ i
] = vb
->TexCoordPtr
[i
];
227 vb
->AttribPtr
[_TNL_ATTRIB_POINTSIZE
] = &store
->outputs
[VERT_RESULT_PSIZ
];
230 store
->andmask
= CLIP_ALL_BITS
;
232 if (tnl
->NeedNdcCoords
)
234 vb
->NdcPtr
= _mesa_clip_tab
[vb
->ClipPtr
->size
] (vb
->ClipPtr
, &store
->ndc_coords
,
235 store
->clipmask
, &store
->ormask
, &store
->andmask
);
240 _mesa_clip_np_tab
[vb
->ClipPtr
->size
] (vb
->ClipPtr
, NULL
, store
->clipmask
, &store
->ormask
,
247 vb
->ClipAndMask
= store
->andmask
;
248 vb
->ClipOrMask
= store
->ormask
;
249 vb
->ClipMask
= store
->clipmask
;
254 const struct tnl_pipeline_stage _tnl_arb_vertex_shader_stage
= {
257 construct_arb_vertex_shader
,
258 destruct_arb_vertex_shader
,
259 validate_arb_vertex_shader
,
260 run_arb_vertex_shader