• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Name
2
3    AMD_name_gen_delete
4
5
6Name Strings
7
8    GL_AMD_name_gen_delete
9
10
11Contributors
12
13    Balaji Calidas
14    Mark Young
15    Murat Balci
16    Benedikt Kessler
17
18Contact
19
20    Mark Young (mark.young 'at' amd.com)
21
22
23Status
24
25    In Progress.
26
27
28Version
29
30    Last Modified Date: February 10, 2010
31    Author Revision:    1
32
33
34Number
35
36    394
37
38
39Dependencies
40
41    OpenGL 2.1 is required.
42
43    ARB_framebuffer_object affects this spec.
44
45    ARB_vertex_array_object affects this spec.
46
47    EXT_transform_feedback affects this spec.
48
49    EXT_transform_feedback2 affects this spec.
50
51    AMD_performance_monitor affects this spec
52
53    ARB_sampler_objects affects this spec
54
55
56Overview
57
58    This extension simply creates 2 new entry-points that name generic
59    creation and deletion of names.  The intent is to go away from API
60    functionality that provides a create/delete function for each specific
61    object.
62
63    For example:
64        glGenTextures/glDeleteTextures/glIsTexture
65        glGenBuffers/glDeleteBuffers/IsBuffer
66        glGenFramebuffers/glDeleteFramebuffers/IsFramebuffer
67
68    Instead, everything is created using one entry-point GenNamesAMD and
69    everything is now deleted with another entry-point DeleteNamesAMD with
70    the appropriate identifier set.  In addition, everything can now be
71    queried with IsNameAMD.
72
73    This alleviates the problem we may eventually encounter where we have
74    many Gen/Delete/Is functions where 3 might suffice.  All that is needed
75    in the new case is to add a valid identifier to the accepted parameters
76    list.
77
78
79IP Status
80
81    No known IP claims.
82
83
84New Procedures and Functions
85
86    void GenNamesAMD(enum identifier, uint num, uint *names);
87
88    void DeleteNamesAMD(enum identifier, uint num, const uint *names);
89
90    boolean IsNameAMD(enum identifier, uint name);
91
92New Types
93
94    None.
95
96
97New Tokens
98
99    Accepted as the <identifier> parameter of GenNamesAMD and DeleteNamesAMD:
100
101    DATA_BUFFER_AMD                               0x9151
102    PERFORMANCE_MONITOR_AMD                       0x9152
103    QUERY_OBJECT_AMD                              0x9153
104    VERTEX_ARRAY_OBJECT_AMD                       0x9154
105    SAMPLER_OBJECT_AMD                            0x9155
106
107
108Additions to Chapter 2 of the OpenGL 2.1 Specification (OpenGL Operation)
109
110    Insert a new section before section 2.9 "Buffer Objects" titled
111    "Object Name Handling"
112    ----------------------------------------------------------------
113
114    2.x Object Name Handling
115
116    2.x.1 Name Generation
117
118    Objects in OpenGL are created, modified, and deleted using names.  These
119    names are unique per object type, but can be common across multiple types.
120    For example, a texture and a query object may both be named 127, but two
121    query different query objects cannot have the name 127 in the same context.
122    These names are generated using each types own specific GenXXX command, but
123    can also be created using the more generic command
124
125        void GenNamesAMD( enum identifier, sizei n, uint *names );
126
127    where <identifier> indicates the type of object that is to be created, <n>
128    is used to indicate how many objects to create, and <names> is a previously
129    allocated array that the new generated names will be supplied in.  These
130    names for marked as used for the purposes of the type of object specified by
131    <identifier> (and their own individual GenXXX command), but they do not
132    typically acquire any state until they are first bound, just as if they were
133    unused.
134
135    Valid values for <identifier> currently are:
136      - DATA_BUFFER_AMD   (For ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,
137                            PIXEL_PACK_BUFFER, and PIXEL_UNPACK_BUFFER)
138      - FRAMEBUFFER
139      - RENDERBUFFER
140      - TEXTURE
141      - TRANSFORM_FEEDBACK_EXT
142      - VERTEX_ARRAY_OBJECT_AMD (For VAOs instead of VERTEX_ARRAY_BINDING)
143      - QUERY_OBJECT_AMD        (For query objects)
144      - PERFORMANCE_MONITOR_AMD (For a performance monitor object)
145      - SAMPLER_OBJECT_AMD      (For a sampler object)
146
147    If <identifier> is not one of these valid values, the error INVALID_ENUM
148    will be triggered.  If <n> is a number zero or <names> is NULL, the error
149    INVALID_VALUE is triggered.
150
151
152    2.x.2 Name Deletion
153
154    Object names can be deleted when they are no longer needed using the command
155
156        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
157
158    where <identifier> indicates one of the above valid types, and <n> indicates
159    how many object names are provided in the <names> array. Similar to
160    GenNamesAMD, each object type also has its own DeleteXXX command.
161    DeleteNamesAMD with a given object type behaves in the same way that the
162    object types specific DeleteXXX command does.
163
164    If <identifier> is not one of these valid values, the error INVALID_ENUM
165    will be triggered.  If <n> is a number zero or <names> is NULL, the error
166    INVALID_VALUE is triggered.
167
168
169    2.x.3 Name Querying
170
171    Object names can be queried to make sure that an object of the given type
172    exists using the command
173
174        boolean IsNameAMD( enum identifier, uint name );
175
176    where <identifier> indicates one of the above valid types, and <name>
177    is the name that is being identified as a valid name for that object
178    type. Similar to GenNamesAMD and DeleteNamesAMD, each object type also
179    has its own IsXXX command.  IsNameAMD with a given object type behaves in
180    the same way that the object types specific IsXXX command does.
181
182    If <identifier> is not one of these valid values, the error INVALID_ENUM
183    will be triggered.
184
185
186    2.x.4 Name Binding
187
188    Objects are typically enabled for usage through a Bind call or something
189    similar.  The process for binding objects for usage is handled differently
190    per object type.  For further information on how to use each object, refer
191    to its section later in this spec.
192
193
194
195    Modify section 2.9 "Buffer Objects", page 33.
196    ----------------------------------------------------------------
197
198
199    After the paragraphs talking about 'DeleteBuffers' insert:
200    ----------------------------------------------------------------
201
202    Calling the command
203
204        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
205
206    with <identifier> set to DATA_BUFFER_AMD behaves the same as using the
207    DeleteBuffers command.
208
209
210    Modify the paragraphs talking about 'GenBuffers':
211    ----------------------------------------------------------------
212
213    The commands
214
215        void GenBuffers( sizei n, uint *buffers );
216
217    returns <n> previously unused buffer object names in <buffers>. These names
218    are marked as used, for the purposes of GenBuffers and GenNamesAMD when used
219    with <identifier> set to DATA_BUFFER_AMD only, but they acquire buffer state
220    only when they are first bound, just as if they were unused.
221
222    Calling the command
223
224        void GenNamesAMD( enum identifier, sizei n, uint *names );
225
226    with <identifier> set to DATA_BUFFER_AMD behaves the same as using the
227    GenBuffers command.
228
229    While a buffer object is bound, any GL operations on that object affect any
230    other bindings of that object. If a buffer object is deleted while it is
231    bound, all bindings to that object in the current context (i.e. in the
232    thread that called DeleteBuffers or DeleteNamesAMD with <identifier> set to
233    DATA_BUFFER_AMD) are reset to zero. Bindings to that buffer in other
234    contexts and other threads are not affected, but attempting to use a deleted
235    buffer in another thread...
236
237
238
239    Modify the new section 2.y "Vertex Array Objects".
240           Added by ARB_vertex_array_object
241    ----------------------------------------------------------------
242
243    Modify the paragraphs talking about 'GenVertexArrays':
244    ----------------------------------------------------------------
245
246    The commands
247
248        void GenVertexArrays( sizei n, uint *arrays );
249
250    returns <n> previous unused vertex array object names in <arrays>.  These
251    names are marked as used, for the purposes of GenVertexArrays and
252    GenNamesAMD (when <identifier> is set to VERTEX_ARRAY_OBJECT_AMD) only,
253    and are initialized with the state listed in tables 6.6 (except for
254    the CLIENT_ACTIVE_TEXTURE selector state), 6.7 and 6.8.
255
256    Calling the command
257
258        void GenNamesAMD( enum identifier, sizei n, uint *names );
259
260    with <identifier> set to VERTEX_ARRAY_OBJECT_AMD behaves the same as using
261    the GenVertexArrays command.
262
263
264    After the paragraphs talking about 'DeleteVertexArrays' insert:
265    ----------------------------------------------------------------
266
267    Calling the command
268
269        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
270
271    with <identifier> set to VERTEX_ARRAY_OBJECT_AMD behaves the same as using
272    the DeleteVertexArrays command.
273
274
275    Modify the paragraph that starts with
276    'BindVertexArray fails and an INVALID_OPERATION error'... to:
277    ----------------------------------------------------------------
278    BindVertexArray fails and an INVALID_OPERATION error is generated if
279    array is not a name returned from a previous call to
280    GenVertexArrays (or GenNamesAMD with <identifier> set to
281    VERTEX_ARRAY_OBJECT), or if such a name has since been deleted with
282    either DeleteVertexArrays or DeleteNamesAMD (with <identifier> set to
283    VERTEX_ARRAY_OBJECT). An INVALID_OPERATION error is generated
284    if VertexAttribPointer or VertexAttribIPointer is called while a
285    non-zero vertex array object is bound and zero is bound to the
286    ARRAY_BUFFER buffer object binding point[fn].
287
288
289
290    Modify the new section 2.z.1 "Transform Feedback Objects"
291           Added by EXT_transform_feedback2
292    ----------------------------------------------------------------
293
294    Add after the paragraphs talking about 'DeleteTransformFeedbacksEXT':
295    ----------------------------------------------------------------
296
297    Calling the command
298
299        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
300
301    with <identifier> set to TRANSFORM_FEEDBACK_EXT behaves the same as using
302    the DeleteTransformFeedbacksEXT command.
303
304
305    Modify the paragraphs talking about 'GenTransformFeedbacksEXT':
306    ----------------------------------------------------------------
307
308    The command
309
310        void GenTransformFeedbacksEXT(sizei n, uint *ids)
311
312    returns <n> previously unused transform feedback object names in <ids>.
313    These names are marked as used, for the purposes of
314    GenTransformFeedbacksEXT and GenNamesAMD (when <identifier> is set to
315    TRANSFORM_FEEDBACK_EXT) only, but they acquire transform feedback state
316    only when they are first bound, just as if they were unused.
317
318    Calling the command
319
320        void GenNamesAMD( enum identifier, sizei n, uint *names );
321
322    with <identifier> set to TRANSFORM_FEEDBACK_EXT behaves the same as using
323    the GenTransformFeedbacksEXT command.
324
325
326    Modify the paragraph that starts with
327    'BindVertexArray fails and an INVALID_OPERATION error'... to:
328    ----------------------------------------------------------------
329    BindVertexArray fails and an INVALID_OPERATION error is generated if
330    array is not a name returned from a previous call to
331    GenVertexArrays (or GenNamesAMD with <identifier> set to
332    VERTEX_ARRAY_OBJECT), or if such a name has since been deleted with
333    either DeleteVertexArrays or DeleteNamesAMD (with <identifier> set to
334    VERTEX_ARRAY_OBJECT). An INVALID_OPERATION error is generated
335    if VertexAttribPointer or VertexAttribIPointer is called while a
336    non-zero vertex array object is bound and zero is bound to the
337    ARRAY_BUFFER buffer object binding point[fn].
338
339
340
341Additions to Chapter 3 of the OpenGL 2.1 Specification (Rasterization)
342
343    Modify section 3.8.12 "Texture Objects", page 182.
344    ----------------------------------------------------------------
345
346    After the paragraphs talking about 'DeleteTextures' insert:
347    ----------------------------------------------------------------
348
349    Calling the command
350
351        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
352
353    with <identifier> set to TEXTURE behaves the same as using the
354    DeleteTextures command.
355
356
357    Modify the paragraphs talking about 'GenTextures':
358    ----------------------------------------------------------------
359
360    The commands
361
362        void GenTextures( sizei n, uint *textures );
363
364    returns <n> previously unused texture object names in <textures>.  These names
365    are marked as used, for the purposes of GenTextures and GenNamesAMD when used
366    with <identifier> set to TEXTURE only, but they acquire texture state and
367    dimensionality only when they are first bound, just as if they were unused.
368
369    Calling the command
370
371        void GenNamesAMD( enum identifier, sizei n, uint *names );
372
373    with <identifier> set to TEXTURE behaves the same as using the
374    GenBuffers command.
375
376
377
378    Modify section 3.9.2 "Sampler Objects".
379    ----------------------------------------------------------------
380
381    After the paragraphs talking about 'GenSamplers' insert:
382    ----------------------------------------------------------------
383
384    Calling the command
385
386        void GenNamesAMD( enum identifier, sizei n, uint *names );
387
388    with <identifier> set to SAMPLER_OBJECT_AMD behaves the same as using the
389    GenSamplers command.
390
391    After the paragraphs talking about 'DeleteSamplers' insert:
392    ----------------------------------------------------------------
393
394    Calling the command
395
396        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
397
398    with <identifier> set to SAMPLER_OBJECT_AMD behaves the same as using the
399    DeleteSamplers command.
400
401
402
403Additions to Chapter 4 of the OpenGL 2.1 Specification (Per-Fragment Operations
404and the Framebuffer)
405
406    Modify section 4.1.7 "Occlusion Queries", page 207.
407    ----------------------------------------------------------------
408
409    Insert after the paragraph talking about 'GenQueries':
410    ----------------------------------------------------------------
411
412     Calling the command
413
414        void GenNamesAMD( enum identifier, sizei n, uint *names );
415
416    with <identifier> set to QUERY_OBJECT_AMD behaves the same as using the
417    GenQueries command.
418
419
420    After the paragraphs talking about 'DeleteQueries' insert:
421    ----------------------------------------------------------------
422
423    Calling the command
424
425        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
426
427    with <identifier> set to QUERY_OBJECT_AMD behaves the same as using the
428    DeleteTextures command.
429
430
431    Modify the paragraph that talks about GenQueries and DeleteQueries errors
432    after that:
433    ----------------------------------------------------------------
434
435    Calling either GenQueries, DeleteQueries, GenNamesAMD(QUERY_OBJECT_AMD),
436    or DeleteNamesAMD(QUERY_OBJECT_AMD), while any query of any target is
437    active causes an INVALID OPERATION error to be generated.
438
439
440    Modify section 4.4.1 "Binding and Managing Framebuffer Objects"
441    ----------------------------------------------------------------
442
443
444    Modify the 2nd paragraph to read:
445    ----------------------------------------------------------------
446
447    A framebuffer object is created by binding a name returned by
448    GenFramebuffers or GenNamesAMD (see below) to DRAW_FRAMEBUFFER or
449    READ_FRAMEBUFFER. The binding is effected by calling
450
451
452    Modify the 5th paragraph to read:
453    ----------------------------------------------------------------
454
455    BindFramebuffer fails and an INVALID_OPERATION error is generated if
456    <framebuffer> is not zero or a name returned from a previous call to
457    GenFramebuffers or GenNamesAMD, or if such a name has since been
458    deleted with DeleteFramebuffers or DeleteNamesAMD.
459
460
461    After the paragraphs talking about 'DeleteFramebuffers' insert:
462    ----------------------------------------------------------------
463
464    Calling the command
465
466        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
467
468    with <identifier> set to FRAMEBUFFER behaves the same as using the
469    DeleteFramebuffers command.
470
471
472    After the paragraphs talking about 'GenFramebuffers' insert:
473    ----------------------------------------------------------------
474
475    Calling the command
476
477        void GenNamesAMD( enum identifier, sizei n, uint *names );
478
479    with <identifier> set to FRAMEBUFFER behaves the same as using the
480    GenFramebuffers command.
481
482
483    Modify section 4.4.2.1 "Renderbuffer Objects"
484    ----------------------------------------------------------------
485
486    Modify the 2nd paragraph to read:
487    ----------------------------------------------------------------
488
489    The name space for renderbuffer objects is the unsigned integers,
490    with zero reserved for the GL.  A renderbuffer object is created by
491    binding a name returned by GenRenderbuffers or GenNamesAMD (see below)
492    to RENDERBUFFER.  The binding is effected by calling
493
494    Modify the 9th paragraph to read:
495    ----------------------------------------------------------------
496
497    BindRenderbuffer fails and an INVALID_OPERATION error is generated
498    if <renderbuffer> is not a name returned from a previous call to
499    GenRenderbuffers or GenNamesAMD, or if such a name has since been
500    deleted with DeleteRenderbuffers or DeleteNamesAMD.
501
502
503    After the paragraphs talking about 'DeleteRenderbuffers' insert:
504    ----------------------------------------------------------------
505
506    Calling the command
507
508        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
509
510    with <identifier> set to RENDERBUFFER behaves the same as using the
511    DeleteFramebuffers command.
512
513
514    After the paragraphs talking about 'GenRenderbuffers' insert:
515    ----------------------------------------------------------------
516
517    Calling the command
518
519        void GenNamesAMD( enum identifier, sizei n, uint *names );
520
521    with <identifier> set to RENDERBUFFER behaves the same as using the
522    GenFramebuffers command.
523
524
525Additions to Chapter 5 of the OpenGL 2.1 Specification (Special
526Functions)
527
528    Modify section 5.4 "Display Lists", page 240.
529    ----------------------------------------------------------------
530
531    Add the following to the list of things not allowed inside of a
532      display list:
533    ----------------------------------------------------------------
534
535        Name generation: GenNamesAMD and DeleteNamesAMD
536
537
538Additions to Chapter 6 of the OpenGL 2.1 Specification (State and
539State Requests)
540
541    Modify section 6.1.4 "Texture Queries"
542    ----------------------------------------------------------------
543
544    After the paragraphs talking about 'IsTexture' insert:
545    ----------------------------------------------------------------
546
547    Calling the command
548
549        void IsNameAMD( enum identifier, uint name );
550
551    with <identifier> set to TEXTURE behaves the same as using the
552    IsTexture command.
553
554
555    Modify section 6.1.12 "Occlusion Queries"
556    ----------------------------------------------------------------
557
558    After the paragraphs talking about 'IsQuery' insert:
559    ----------------------------------------------------------------
560
561    Calling the command
562
563        void IsNameAMD( enum identifier, uint name );
564
565    with <identifier> set to QUERY_OBJECT_AMD behaves differently from
566    calling IsQuery.  IsQuery only returns if an object is a
567    query once it has been used.  However, IsName returns TRUE if
568    a QUERY_OBJECT_AMD object had been created either through
569    GenQueries or GenNamesAMD.
570
571
572    Modify section 6.1.13 "Buffer Object Queries"
573    ----------------------------------------------------------------
574
575    After the paragraphs talking about 'IsBuffer' insert:
576    ----------------------------------------------------------------
577
578    Calling the command
579
580        void IsNameAMD( enum identifier, uint name );
581
582    with <identifier> set to DATA_BUFFER_AMD behaves the same as using the
583    IsBuffer command.
584
585
586Additions to new section for Performance Monitoring (added by
587  AMD_performance_monitor)
588
589
590    After the paragraphs talking about 'GenPerfMonitorsAMD' insert:
591    ----------------------------------------------------------------
592
593    Calling the command
594
595        void GenNamesAMD( enum identifier, sizei n, uint *names );
596
597    with <identifier> set to PERFORMANCE_MONITOR_AMD behaves the same as
598    using the GenPerfMonitorsAMD command.
599
600
601    Modify the paragraphs talking about 'DeletePerfMonitorsAMD' to:
602    ----------------------------------------------------------------
603
604    The command
605
606        void DeletePerfMonitorsAMD(sizei n, uint *monitors)
607
608    is used to delete the list of monitors created by a previous call to
609    GenPerfMonitors or GenNamesAMD (with <identifier> set to
610    PERFORMANCE_MONITOR_AMD).  If a monitor ID in the list <monitors> does not
611    reference a previously generated performance monitor, an INVALID_VALUE
612    error is generated.
613
614    Calling the command
615
616        void DeleteNamesAMD( enum identifier, sizei n, const uint *names );
617
618    with <identifier> set to PERFORMANCE_MONITOR_AMD behaves the same as using
619    the DeletePerfMonitors command.
620
621
622    Modify the paragraph after the protoype for SelectPerfMonitorCountersAMD
623    to read:
624    ----------------------------------------------------------------
625
626    is used to enable or disable a list of counters from a group to be monitored
627    as identified by <monitor>.  The <enable> argument determines whether the
628    counters should be enabled or disabled.  <group> specifies the group
629    ID under which counters will be enabled or disabled.  The <numCounters>
630    argument gives the number of counters to be selected from the list
631    <counterList>.  If <monitor> is not a valid monitor created by either
632    GenPerfMonitorsAMD or GneNamesAMD (with <identifier> set to
633    PERFORMANCE_MONITOR_AMD), then INVALID_VALUE error will be generated.  If
634    <group> is not a valid group, the INVALID_VALUE error will be generated.  If
635    <numCounters> is less than 0, an INVALID_VALUE error will be generated.
636
637
638Additions to the OpenGL / GLX / GLX Protocol Specifications
639
640    None.
641
642
643Additions to the WGL Specification
644
645    None.
646
647
648Errors
649
650    The error INVALID_ENUM is generated by GenNamesAMD, DeleteNamesAMD, or
651    IsNameAMD if <identifier> is not one of:
652      - DATA_BUFFER_AMD   (For ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,
653                            PIXEL_PACK_BUFFER, and PIXEL_UNPACK_BUFFER)
654      - FRAMEBUFFER
655      - RENDERBUFFER
656      - TEXTURE
657      - TRANSFORM_FEEDBACK_EXT
658      - VERTEX_ARRAY_OBJECT_AMD (For VAOs instead of VERTEX_ARRAY_BINDING)
659      - QUERY_OBJECT_AMD        (For query objects)
660      - PERFORMANCE_MONITOR_AMD (For a performance monitor object)
661      - SAMPLER_OBJECT_AMD      (For a sampler object)
662
663    The error INVALID_VALUE is generated by GenNamesAMD or DeleteNamesAMD
664    if <num> is 0.
665
666    The error INVALID_VALUE is generated by GenNamesAMD or DeleteNamesAMD
667    if <names> is NULL.
668
669
670New State
671
672    None
673
674
675New Implementation Dependent State
676
677    If ARB_vertex_array_object is not present, remove any reference to
678    VERTEX_ARRAY or VERTEX_ARRAY_BINDING and VAOs.
679
680
681Sample Code
682
683    glGenTextures/glDeleteTextures
684
685      Before:
686
687          GLuint texID[12];
688          glGenTextures(12, &texID[0]);
689          ...
690          // Use textures
691          ...
692          glDeleteTextures(12, &texID[0]);
693
694      After:
695
696          GLuint texID[12];
697          glGenNames(GL_TEXTURE, 12, &texID[0]);
698          ...
699          // Use textures
700          ...
701          glDeleteNames(GL_TEXTURE, 12, &texID[0]);
702
703
704Issues
705
706    01)   What is the main benefit of these new entry-points?
707
708          To reduce the requirement of new entry-points for generating and
709          deleting names.
710
711
712    02)   Do we want to use VERTEX_ARRAY_BINDING for a vertex array object?
713
714          RECOMMENDATION - I suggest using a new variable called
715                           VERTEX_ARRAY_OBJECT_AMD. This makes it clear
716                           what's being generated.
717
718
719    03)   What do we want the generic buffer object name to be called
720
721          RESOLVED - Use DATA_BUFFER_AMD.
722
723
724    04)   Do we want to include display list generation?
725
726          RECOMMENDATION - No.  There is additional restrictions on display list
727                           name generation specifically items being
728                           consecutively generated.
729
730
731    05)   Should DeleteNamesAMD verify that the names exist and throw an error
732          if not?
733
734          RECOMMENDATION - I think not since it might cause issues with multi-
735                           context multi-thread cases where sharing is enabled
736                           and one context deletes them follwed by another
737                           context deleting items.
738
739
740
741Revision History
742
743    1) September 11, 2009: myoung
744        - Initial revision of AMDX extension
745
746    2) February 10, 2010: myoung
747        - Change from AMDX to AMD extension
748
749    2) February 12, 2010: myoung
750        - Add in IsNameAMD functionality requested by Benedikt
751
752