| <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> |
| <html> |
| <head> |
| |
| <title>OpenML ABI/DDI (DRAFT July 19, 2001)</title> |
| |
| <meta name="description" content="OpenML ABI/DDI standards"> |
| <meta name="keywords" content="OpenML, OpenGL, ABI, Linux"> |
| <meta name="owner" content="Jon Leech"> |
| |
| <center> |
| <h2> OpenML® Application Binary Interface (ABI) and Device Driver |
| Interface (DDI) Standards </h2> |
| |
| <p>Version 0.2<br> |
| July 19, 2001<br> |
| Editor: Jon Leech, SGI |
| </center> |
| |
| <p><hr></p> |
| |
| <h2> Index </h2> |
| |
| <ul> |
| <li><a href="#1">1. Overview and Goals </a> |
| <li><a href="#2">2. OpenML Component APIs and Versions</a> |
| <li><a href="#3">3. Calling Conventions</a> |
| <li><a href="#4">4. Libraries</a> |
| <li><a href="#5">5. Header Files</a> |
| <li><a href="#6">6. Extension Mechanism and Extension Headers</a> |
| <li><a href="#7">7. Device Driver Interfaces</a> |
| <li><a href="#app">Appendix: Open Issues</a> |
| <li><a href="#log">Change Log</a> |
| </ul> |
| |
| <a name="1"> |
| <h2> 1. Overview and Goals </h2> |
| |
| <p> 1.1. This document is intended to solve three related problems. |
| First, defining the ABIs and runtime environment for applications |
| using OpenML. This will enable applications using the OpenML APIs |
| for rendering to run on a variety of underlying implementations |
| transparently. |
| |
| <p> Second, defining the Software Development Kit (SDK) (for developing |
| apps using OpenGL. This includes header file locations, conventions |
| for use of extensions, etc. |
| |
| <p> Finally, defining the Device Driver Interface (DDI) for appropriate |
| portions of OpenML. |
| |
| <p> These standards target multiple platforms. For Linux and Microsoft |
| Windows, where multiple vendors will supply OpenML implementations, |
| the standards are <b>proscriptive</b>; all conformant OpenML |
| implementations must satisfy the ABI, SDK, and DDI requirements. For |
| other platforms (at this time, vendor-specific Unix platforms such |
| as IRIX or Solaris), only some parts of the standards are required, |
| while others are <b>recommended</b>, for maximal portability between |
| platforms. |
| |
| <p> It may eventually be appropriate to share these standards with |
| broader standards bodies such as the |
| <a href="http://www.freestandards.org">Free Standards Group</a> on |
| Linux. |
| |
| <p> 1.2. There are many open issues in the initial draft; this is |
| intended for discussion and extensive modification. Open issues are |
| summarized in the <a href="#app">appendix</a>. Some decisions are |
| largely arbitrary (filenames and file locations, for example), and |
| in those cases we have been guided by existing practice where |
| possible. |
| |
| <p> 1.3. This document is intended to become part of the OpenML |
| Specification on its approval, and is a joint work of the |
| <a href="http://www.khronos.org">Khronos SIG</a>.</p> |
| |
| <a name="2"> |
| <h2> 2. OpenML Component APIs and Versions </h2> |
| |
| <h3> 2.1. Component APIs </h3> |
| |
| <p> OpenML requires implementations of several separate APIs: <b>ML</b>, |
| <b>MLdc</b>, and <b>OpenGL</b>. For the most part, the ABIs, SDKs, |
| and DDIs required for each of these APIs are not related, and are |
| described separately. Interactions are documented where needed. |
| |
| <h3> 2.2. ML </h3> |
| |
| <p> ML is the <i>Media Library</i> component of OpenML. It is a |
| low-level API for accessing video and audio hardware. |
| |
| <h3> 2.3. MLdc </h3> |
| |
| <p> MLdc is the <i>Display Control</i> component of OpenML. It manages |
| multiple video <i>channels</i>, including aspects such as video |
| formats, timing, gamma tables, etc. |
| |
| <h3> 2.4. OpenGL </h3> |
| |
| <p> OpenGL is the <i>Graphics</i> component of OpenML. It is a low-level |
| API for performing 3D rendering. OpenGL is standardized separately |
| from OpenML by the <a href="http://www.opengl.org/">OpenGL |
| Architecture Review Board</a>; OpenML simply requires a specific |
| version of OpenGL with a small number of added API extensions for |
| managing video data. |
| |
| <p> Because OpenGL is a pre-existing API with shipping implementations, |
| this document mostly refers to other standards (such as the <a |
| href="http://oss.sgi.com/projects/ogl-sample/ABI/">OpenGL ABI for |
| Linux</a>) when defining OpenGL-specific standards.</p> |
| |
| <h3> 2.5. Versions </h3> |
| |
| <p> This document defines ABIs and DDIs for the OpenML 1.0 APIs. </p> |
| |
| <a name="3"> |
| <h2> 3. Calling Conventions </h2> |
| |
| <h3> 3.1. ML Calling Conventions </h3> |
| |
| <p> <b>OPEN</b> - need to define ML datatype required sizes, Windows / Linux |
| / etc. conventions. |
| |
| <h3> 3.2. MLdc Calling Conventions </h3> |
| |
| <p> <b>OPEN</b> - need to define MLdc datatype required sizes, Windows / |
| Linux / etc. conventions. |
| |
| <h3> 3.3. OpenGL Calling Conventions </h3> |
| |
| <p> 3.3.1. <b>Linux</b> - the OpenGL implementation must follow the |
| calling and datatype conventions defined by the <a |
| href="http://oss.sgi.com/projects/ogl-sample/ABI/">OpenGL ABI for |
| Linux</a>. |
| |
| <p> 3.3.2. <b>Windows</b> - the OpenGL implementation must follow the |
| calling and datatype conventions established <i>de facto</i> by |
| Microsoft's <tt>OPENGL32.DLL</tt> and header files. |
| |
| <p> 3.3.3. <b>Other Platforms</b> - calling conventions are |
| platform-dependent. Datatype conventions are platform dependent so |
| long as they satisfy the minimum size requirements of the OpenGL |
| Specification. |
| |
| <p> <b>Issues:</b> Do we need to address C++ linking issues? Need more |
| detail on calling conventions for Linux?</p> |
| |
| <a name="4"> |
| <h2> 4. Libraries </h2> |
| |
| <h3> 4.1. ML Library </h3> |
| |
| <p> There is a single user-level ML link library. It includes ML entry |
| points, and in general makes use of underlying hardware drivers for |
| hardware device access. Hardware drivers may be incorporated into |
| the link library, but in general they are loaded by the link library |
| at runtime, and accessed through a <a href="#DDIsection">Device |
| Driver Interface</a> defined below. |
| |
| <p> 4.1.1 <b>Linux</b> - the link library has two names: that used on |
| the ld command line, and the <tt>DT_SONAME</tt> within that library |
| (specified by the <i>-soname</i> switch when linking the library), |
| defining where it's looked up at runtime. Both forms must exist so |
| that both linking and running will operate properly. |
| |
| <p> The <tt>DT_SONAME</tt> includes the ML major version number, and is |
| <tt>libML.so.1</tt>. The <i>link library name</i> is |
| <tt>libML.so</tt>. <tt>libML.so</tt> must be implemented as a |
| symbolic link to <tt>libML.so.1</tt>. This allows future major |
| revisions of ML to be implemented transparently to applications by |
| simply changing the link; new applications will link with the new |
| runtime library, while old, compiled applications will continue to |
| use the old runtime. |
| |
| <p> <b>Issues:</b> do we need static link libraries? |
| |
| <p> Both ML libraries must be located in <tt>/usr/lib</tt>. |
| |
| <p> 4.1.2. <b>Windows</b> - the link library is named <tt>ML32.DLL</tt>. |
| It must be located in <tt>\System\???</tt> |
| |
| <p> <b>Issues:</b> What the heck are the Windows system library |
| conventions, anyway? And will we run into the horrid Windows XP |
| "driver signing" mess by mandating the library live in |
| <tt>\System</tt>? |
| |
| <p> 4.1.3. <b>Other Platforms</b> - the base name of the library should |
| be <tt>libML</tt>, so that crossplatform Unix build systems can |
| always use "-lML" on their link lines. The ML major version number |
| (1) should be incorporated into the link library name in appropriate |
| fashion. The library should be shared, and should use whatever the |
| platform's library versioning mechanism is to cause compiled |
| applications to resolve to resolve to the correct version of |
| <tt>libML</tt> (e.g. the one they were linked against), even if a |
| newer major version has become the default. |
| |
| <p> The ML library is typically located in <tt>/usr/lib</tt>, although |
| platform conventions may override this. The important point is that |
| there be a single, standard location for the link library on that |
| platform. |
| |
| <h3> 4.2. MLdc Library </h3> |
| |
| <p> There is a single user-level MLdc link library. It includes MLdc |
| entry points, and in general makes use of underlying hardware |
| drivers for hardware device access. Hardware drivers may be |
| incorporated into the link library, but in general they are loaded |
| by the link library or the window system at runtime, and accessed |
| through a <a href="#DDIsection">Device Driver Interface</a> defined |
| below. |
| |
| <p> 4.2.1 <b>Linux</b> - the link library has two names: that used on |
| the ld command line, and the <tt>DT_SONAME</tt> within that library |
| (specified by the <i>-soname</i> switch when linking the library), |
| defining where it's looked up at runtime. Both forms must exist so |
| that both linking and running will operate properly. |
| |
| <p> The <tt>DT_SONAME</tt> includes the MLdc major version number, and |
| is <tt>libMLdc.so.1</tt>. The <i>link library name</i> is |
| <tt>libMLdc.so</tt>. <tt>libMLdc.so</tt> must be implemented as a |
| symbolic link to <tt>libMLdc.so.1</tt>. This allows future major |
| revisions of MLdc to be implemented transparently to applications by |
| simply changing the link; new applications will link with the new |
| runtime library, while old, compiled applications will continue to |
| use the old runtime. |
| |
| <p> <b>Issues:</b> do we need static link libraries? |
| |
| <p> Both MLdc libraries must be located in <tt>/usr/lib</tt>. |
| |
| <p> 4.2.2. <b>Windows</b> - the link library is named |
| <tt>MLDC32.DLL</tt>. It must be located in <tt>\System\???</tt> |
| |
| <p> <b>Issues:</b> As for <tt>ML32.DLL</tt> - decide where |
| the library lives. |
| "driver signing" mess by mandating the library live in |
| <tt>\System</tt>? |
| |
| <p> 4.2.3. <b>Other Platforms</b> - the base name of the library should |
| be <tt>libMLdc</tt>, so that crossplatform Unix build systems can |
| always use "-lMLdc" on their link lines. The MLdc major version |
| number (1) should be incorporated into the link library name in |
| appropriate fashion. The library should be shared, and should use |
| whatever the platform's library versioning mechanism is to cause |
| compiled applications to resolve to resolve to the correct version |
| of <tt>libMLdc</tt> (e.g. the one they were linked against), even if |
| a newer major version has become the default. |
| |
| <p> The MLdc library is typically located in <tt>/usr/lib</tt>, although |
| platform conventions may override this. The important point is that |
| there be a single, standard location for the link library on that |
| platform. |
| |
| <h3> 4.3. OpenGL Library </h3> |
| |
| <p> There is a single user-level OpenGL link library. It includes OpenGL |
| entry points, and in general makes use of underlying hardware |
| drivers for hardware device access. Hardware drivers may be |
| incorporated into the link library, but in general they are loaded |
| by the link library or the window system at runtime, and accessed |
| through a <a href="#DDIsection">Device Driver Interface</a> defined |
| below. |
| |
| <p> 4.3.1 <b>Linux</b> - the OpenGL library naming, location, and |
| versioning conventions are as defined by the <a |
| href="http://oss.sgi.com/projects/ogl-sample/ABI/">OpenGL ABI for |
| Linux</a>. |
| |
| <p> 4.3.2. <b>Windows</b> - the OpenGL library is shipped by Microsoft |
| in <tt>\System\OPENGL32.DLL</tt>. |
| |
| <p> 4.3.3. <b>Other Platforms</b> - follow existing conventions on those |
| platforms (typically the OpenGL library is linked via "-lGL"). New |
| platforms without existing conventions should follow the Linux |
| conventions insofar as possible. |
| |
| <h3> 4.4. Additional Issues </h3> |
| |
| <p> <ul> |
| <li> C++ runtime issues on Linux? |
| <li> Entry points guaranteed in each library. |
| <li> Thread safety. |
| <li> Transitive linking of required libraries. |
| </ul> |
| |
| <a name="5"> |
| <h2> 5. Header Files </h2> |
| |
| <h3> 5.1. ML Header Files </h3> |
| |
| <p> 5.1.1. The following header files are required for ML: |
| |
| <ul> |
| <li> <b>TBD</b> |
| </ul> |
| |
| <p> Language bindings supported - <b>TBD</b> (C and C++?) |
| |
| <p> Header locations - <b>TBD</b> (presumably /usr/include/ML on |
| Linux/Unix) |
| |
| <p> Header contents - <b>TBD</b> (ML 1.0) |
| |
| <h3> 5.2. MLdc Header Files</h3> |
| |
| <p> 5.2.1. The following header files are required for MLdc: |
| |
| <ul> |
| <li> <b>TBD</b> |
| </ul> |
| |
| <p> Language bindings supported - <b>TBD</b> (C and C++?) |
| |
| <p> Header locations - <b>TBD</b> (/usr/include/ML? check w/Cary) |
| |
| <p> Header contents - <b>TBD</b> (MLdc 1.0) |
| |
| <h3> 5.3. OpenGL Header Files </h3> |
| |
| <p> 5.3.1 <b>Linux</b> - the OpenGL header file requirements are as |
| defined by the <a |
| href="http://oss.sgi.com/projects/ogl-sample/ABI/">OpenGL ABI for |
| Linux</a>. In addition, <tt>glext.h</tt> and <tt>glxext.h</tt> must |
| define interfaces for the OpenGL and GLX extensions, respectively, |
| required by OpenML 1.0. |
| |
| <p> 5.3.2. <b>Windows</b> - the following header files |
| are required: |
| |
| <ul> |
| <li> <tt><GL/gl.h></tt> - OpenGL |
| <li> <tt><GL/wgl.h></tt> - WGL |
| <li> <tt><GL/glu.h></tt> - GLU |
| <li> <tt><GL/glext.h></tt> - OpenGL Extensions |
| <li> <tt><GL/wglext.h></tt> - WGL Extensions |
| </ul> |
| |
| <p> gl.h, glu.h, and wgl.h are typically supplied by Microsoft, |
| while <tt>glext.h</tt> and <tt>wglext.h</tt> should be obtained from |
| the OpenGL extension registry. <tt>glext.h</tt> and |
| <tt>wglext.h</tt> must define interfaces for the OpenGL and WGL |
| extensions, respectively, required by OpenML 1.0. |
| |
| <p> Header locations - <b>TBD</b> (check existing practice for |
| MS-supplied headers; define a location for others). |
| |
| <p> 5.3.3. <b>Other Platforms</b> - follow existing conventions on those |
| platforms (typically header files are placed in |
| <tt>/usr/include/GL</tt>). However, all implementations must provide |
| <tt>glext.h</tt> and, for implementations on the X Window System and |
| GLX, <tt>glxext.h</tt>, and all OpenML 1.0 extensions must be |
| defined in those headers. |
| |
| <p> New platforms without existing conventions should follow the Linux |
| conventions insofar as possible. |
| |
| <h3> 5.4. General Issues </h3> |
| |
| <p> Required header files must not pull in internal headers or headers |
| from other packages where that would cause unexpected namespace |
| pollution. They must be protected against multiple inclusion and |
| should not themselves include any headers that are not so protected. |
| |
| <p> Vendor-specific shortcuts, such as macros for higher performance GL |
| entry points, are intrinsically unportable. These should <b>not</b> |
| be present in any required header files, but instead in a |
| vendor-specific header file that requires explicit effort by |
| developers to access, such as defining a vendor-specific |
| preprocessor symbol or including a vendor-specific header file.</p> |
| |
| <!-- <font face="Arial" size="2">yadda yadda</font> --> |
| |
| <a name="6"> |
| <h2> 6. Extension Mechanism and Extension Headers </h2> |
| |
| <h3> 6.1. General Requirements </h3> |
| |
| <p> The ML, MLdc, and OpenGL APIs may be extended by individual vendors |
| or groups of vendors to provide functionality specific to some |
| implementations. Such extensions take the form of new entry points |
| and/or new parameters to existing functions. |
| |
| <p> In general each API will be exposed to applications as a single link |
| library, with the library dispatching functions to hardware-specific |
| drivers as appropriate. If vendors providing extensions each |
| provided a modified link library, binary applications could not |
| reliably be moved from system to system, because incompatible |
| interfaces would be provided depending on the source of the library. |
| |
| <p> To deal with this, each API provides an <i>extension mechanism</i> |
| which lets applications obtain new entry points (pointers to |
| functions within driver modules) dynamically at runtime. |
| |
| <p> Similarly, if each vendor provided modified header files adding |
| their extensions, it would be difficult to build applications |
| consistently in different environments. To deal with this, each API |
| defines the structure of a <i>extension header</i> which defines |
| interfaces for all known extensions and can be maintained at a |
| central source. |
| |
| <h3> 6.2. ML Extensions </h3> |
| |
| <p> 6.2.1. The ML extension mechanism and extension headers |
| are not defined yet; this will be done for OpenML 1.1. |
| |
| <h3> 6.3. MLdc Extensions </h3> |
| |
| <p> 6.3.1. <i>Need to insert MLdc extension mechanism</i>. |
| |
| <h3> 6.4. OpenGL Extensions </h3> |
| |
| <p> 6.4.1. <b>Linux</b> - The OpenGL ABI for Linux defines the required |
| extension functionality, including the <b>glXGetProcAddressARB</b> |
| function (provided by the <tt>GLX_ARB_get_proc_address</tt> |
| extension) used to query extension interfaces. The <tt>glext.h</tt> |
| and <tt>glxext.h</tt> headers from the OpenGL extension registry |
| define interfaces to known OpenGL and GLX extensions. |
| |
| <p> 6.4.2. <b>Windows</b> - WGL provides the <b>wglGetProcAddress</b> |
| function used to query extension interfaces (unlike the GLX |
| equivalent, returned function pointers are <i>context dependent</i>; |
| portable code must be aware of this difference). <tt>glext.h</tt> |
| (identical to the Linux version) and <tt>wglext.h</tt> headers from |
| the OpenGL extension registry define interfaces to known OpenGL and |
| WGL extensions. |
| |
| <p> 6.4.3. <b>Other Platforms</b> - Unix platforms should follow the |
| Linux conventions, providing the <tt>GLX_ARB_get_proc_address</tt> |
| extension as well as <tt>glext.h</tt> and <tt>glxext.h</tt>. Other |
| platforms should define an extension with similar functionality and |
| provide <tt>glext.h</tt>; a companion extension header for window |
| system interface extensions may also need to be provided. </p> |
| |
| <a name="7"> |
| <h2> 7. Device Driver Interfaces </h2> |
| |
| <p> <b>TBD</b> - waiting on dmSDK DDI. |
| |
| |
| <p><hr></p> |
| |
| <a name="app"> |
| <h2> Appendix: Open Issues </h2> |
| |
| <p> <b>TBD</b> |
| |
| <!-- <p><a name="issue2.1"> |
| <b>Section 2.1</b>: |
| Define GL datatypes for other supported Linux architectures - Alpha, |
| PowerPC, MIPS, etc. (in general these will be identical to the IA32 |
| types). Note: we may want to suggest <tt>GLlong</tt> and |
| <tt>GLulong</tt> as 64-bit datatypes for future OpenGL revisions. |
| --> |
| |
| |
| <a name="log"> |
| <h2> Change Log </h2> |
| |
| <ul> |
| <li> 2001/07/19 - Added extension mechanism section. |
| <li> 2001/04/17 - Initial version. |
| </ul> |
| |
| </body> |
| </html> |