mesa: remove outdated version lines in comments
[mesa.git] / src / mapi / mapi_glapi.c
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2010 LunarG Inc.
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 OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 *
25 * Authors:
26 * Chia-I Wu <olv@lunarg.com>
27 */
28
29 #include <string.h>
30 #include "glapi/glapi.h"
31 #include "u_current.h"
32 #include "table.h" /* for MAPI_TABLE_NUM_SLOTS */
33 #include "stub.h"
34
35 /*
36 * Global variables, _glapi_get_context, and _glapi_get_dispatch are defined in
37 * u_current.c.
38 */
39
40 #ifdef GLX_USE_TLS
41 /* not used, but defined for compatibility */
42 const struct _glapi_table *_glapi_Dispatch;
43 const void *_glapi_Context;
44 #endif /* GLX_USE_TLS */
45
46 void
47 _glapi_destroy_multithread(void)
48 {
49 u_current_destroy();
50 }
51
52 void
53 _glapi_check_multithread(void)
54 {
55 u_current_init();
56 }
57
58 void
59 _glapi_set_context(void *context)
60 {
61 u_current_set_user((const void *) context);
62 }
63
64 void
65 _glapi_set_dispatch(struct _glapi_table *dispatch)
66 {
67 u_current_set((const struct mapi_table *) dispatch);
68 }
69
70 /**
71 * Return size of dispatch table struct as number of functions (or
72 * slots).
73 */
74 unsigned int
75 _glapi_get_dispatch_table_size(void)
76 {
77 return MAPI_TABLE_NUM_SLOTS;
78 }
79
80 /**
81 * Fill-in the dispatch stub for the named function.
82 *
83 * This function is intended to be called by a hardware driver. When called,
84 * a dispatch stub may be created created for the function. A pointer to this
85 * dispatch function will be returned by glXGetProcAddress.
86 *
87 * \param function_names Array of pointers to function names that should
88 * share a common dispatch offset.
89 * \param parameter_signature String representing the types of the parameters
90 * passed to the named function. Parameter types
91 * are converted to characters using the following
92 * rules:
93 * - 'i' for \c GLint, \c GLuint, and \c GLenum
94 * - 'p' for any pointer type
95 * - 'f' for \c GLfloat and \c GLclampf
96 * - 'd' for \c GLdouble and \c GLclampd
97 *
98 * \returns
99 * The offset in the dispatch table of the named function. A pointer to the
100 * driver's implementation of the named function should be stored at
101 * \c dispatch_table[\c offset]. Return -1 if error/problem.
102 *
103 * \sa glXGetProcAddress
104 *
105 * \warning
106 * This function can only handle up to 8 names at a time. As far as I know,
107 * the maximum number of names ever associated with an existing GL function is
108 * 4 (\c glPointParameterfSGIS, \c glPointParameterfEXT,
109 * \c glPointParameterfARB, and \c glPointParameterf), so this should not be
110 * too painful of a limitation.
111 *
112 * \todo
113 * Check parameter_signature.
114 */
115 int
116 _glapi_add_dispatch( const char * const * function_names,
117 const char * parameter_signature )
118 {
119 const struct mapi_stub *function_stubs[8];
120 const struct mapi_stub *alias = NULL;
121 unsigned i;
122
123 (void) memset(function_stubs, 0, sizeof(function_stubs));
124
125 /* find the missing stubs, and decide the alias */
126 for (i = 0; function_names[i] != NULL && i < 8; i++) {
127 const char * funcName = function_names[i];
128 const struct mapi_stub *stub;
129 int slot;
130
131 if (!funcName || funcName[0] != 'g' || funcName[1] != 'l')
132 return -1;
133 funcName += 2;
134
135 stub = stub_find_public(funcName);
136 if (!stub)
137 stub = stub_find_dynamic(funcName, 0);
138
139 slot = (stub) ? stub_get_slot(stub) : -1;
140 if (slot >= 0) {
141 if (alias && stub_get_slot(alias) != slot)
142 return -1;
143 /* use the first existing stub as the alias */
144 if (!alias)
145 alias = stub;
146
147 function_stubs[i] = stub;
148 }
149 }
150
151 /* generate missing stubs */
152 for (i = 0; function_names[i] != NULL && i < 8; i++) {
153 const char * funcName = function_names[i] + 2;
154 struct mapi_stub *stub;
155
156 if (function_stubs[i])
157 continue;
158
159 stub = stub_find_dynamic(funcName, 1);
160 if (!stub)
161 return -1;
162
163 stub_fix_dynamic(stub, alias);
164 if (!alias)
165 alias = stub;
166 }
167
168 return (alias) ? stub_get_slot(alias) : -1;
169 }
170
171 static const struct mapi_stub *
172 _glapi_get_stub(const char *name, int generate)
173 {
174 const struct mapi_stub *stub;
175
176 #ifdef USE_MGL_NAMESPACE
177 if (name)
178 name++;
179 #endif
180
181 if (!name || name[0] != 'g' || name[1] != 'l')
182 return NULL;
183 name += 2;
184
185 stub = stub_find_public(name);
186 if (!stub)
187 stub = stub_find_dynamic(name, generate);
188
189 return stub;
190 }
191
192 /**
193 * Return offset of entrypoint for named function within dispatch table.
194 */
195 int
196 _glapi_get_proc_offset(const char *funcName)
197 {
198 const struct mapi_stub *stub = _glapi_get_stub(funcName, 0);
199 return (stub) ? stub_get_slot(stub) : -1;
200 }
201
202 /**
203 * Return pointer to the named function. If the function name isn't found
204 * in the name of static functions, try generating a new API entrypoint on
205 * the fly with assembly language.
206 */
207 _glapi_proc
208 _glapi_get_proc_address(const char *funcName)
209 {
210 const struct mapi_stub *stub = _glapi_get_stub(funcName, 1);
211 return (stub) ? (_glapi_proc) stub_get_addr(stub) : NULL;
212 }
213
214 /**
215 * Return the name of the function at the given dispatch offset.
216 * This is only intended for debugging.
217 */
218 const char *
219 _glapi_get_proc_name(unsigned int offset)
220 {
221 const struct mapi_stub *stub = stub_find_by_slot(offset);
222 return stub ? stub_get_name(stub) : NULL;
223 }
224
225 unsigned long
226 _glthread_GetID(void)
227 {
228 return u_thread_self();
229 }
230
231 void
232 _glapi_noop_enable_warnings(unsigned char enable)
233 {
234 }
235
236 void
237 _glapi_set_warning_func(_glapi_proc func)
238 {
239 }