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