home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2001 May / SGI IRIX Base Documentation 2001 May.iso / usr / relnotes / gl_dev / ch7.z / ch7
Encoding:
Text File  |  2001-04-17  |  42.6 KB  |  1,189 lines

  1.  
  2.  
  3.  
  4.                                   - 1 -
  5.  
  6.  
  7.  
  8.        7.  _D_e_v_i_c_e__S_p_e_c_i_f_i_c__H_i_n_t_s__a_n_d__F_e_a_t_u_r_e_s
  9.  
  10.  
  11.  
  12.        7.1  _M_a_x__I_m_p_a_c_t_,__H_i_g_h__I_m_p_a_c_t_,__S_o_l_i_d__I_m_p_a_c_t_,__M_X_I_,__S_S_I_,__S_I
  13.  
  14.  
  15.  
  16.        7.1.1  _P_b_u_f_f_e_r_s__o_n__I_m_p_a_c_t  The OpenGL Pbuffer extension is
  17.        now supported on all impact configurations:  Max Impact,
  18.        High Impact, and Solid Impact.  These release notes describe
  19.        the Impact Pbuffer implementation in detail.  This will be
  20.        of use primarily to developers of opengl applications that
  21.        use pbuffers.
  22.  
  23.  
  24.        7.1.1.1  _P_b_u_f_f_e_r__E_x_t_e_n_s_i_o_n_s  Note that you will have to use
  25.        the FBConfig extension to create pbuffers.  Also, if you
  26.        want to copy between pbuffers and windows, you will need to
  27.        use the MakeCurrentRead extension.  This release includes
  28.        all three extensions:  Pbuffers, MakeCurrentRead, and
  29.        FBConfig.
  30.  
  31.  
  32.        7.1.1.2  _P_b_u_f_f_e_r__S_i_z_e_s  Each pbuffer allocated consumes a
  33.        set of bitplanes with the same geometry as the entire
  34.        screen.  So, if you run the monitor at 1280x1024, allocating
  35.        a single buffer will actually consume 1280x1024 of offscreen
  36.        framebuffer memory.  It is impossible to create a pbuffer
  37.        larger than the screen size.  You can create one smaller,
  38.        but the remaining screen memory will be wasted and cannot be
  39.        allocated.
  40.  
  41.  
  42.        In some Impact configurations, there are actually multiple
  43.        sets of bitplanes available to pbuffers (pbuffer banks), so
  44.        it is in some cases (e.g. max impact) it is possible to
  45.        allocate more than one pbuffer at a time.  See the section
  46.        below called "Recommended pbuffer and window combinations."
  47.  
  48.  
  49.        7.1.1.3  _P_b_u_f_f_e_r__f_o_r_m_a_t_s  This release supports the
  50.        following pbuffer formats:  All X visuals (except overlays)
  51.        support pbuffers.  This includes double buffered, and stereo
  52.        quad-buffered visuals, and visuals with depth and stencil
  53.        planes.
  54.  
  55.  
  56.        All appear to work fine, and allow copies from pbuffers to
  57.        windows, and windows to pbuffers.  Note that the context
  58.        used to do this copy must be created with the same fbconfig
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.                                   - 2 -
  71.  
  72.  
  73.  
  74.        as the window (not the pbuffer).  See the "glXMakeCurrent
  75.        compatibility workaround" section below for details.
  76.  
  77.  
  78.        7.1.1.4  _g_l_X_M_a_k_e_C_u_r_r_e_n_t__c_o_m_p_a_t_i_b_i_l_i_t_y__r_e_l_a_x_a_t_i_o_n  In this
  79.        release, glXMakeCurrent's strict compatibility requirements
  80.        have been relaxed for pbuffers (but not for windows).  Any
  81.        context that meets certain very minimal requirements can be
  82.        used to render into a pbuffer, or copy from a pbuffer.  The
  83.        requirements are simply that the window and context must
  84.        have the same renderType; in other words, they must both be
  85.        color index, or rgba.  There are no requirements that the
  86.        color depths of the context match those of the pbuffer, or
  87.        anything of the sort.
  88.  
  89.  
  90.        Note that windows still have strict similarity requirements.
  91.        Contexts and windows bound together with glXMakeCurrent must
  92.        have been created from the same visual.
  93.  
  94.  
  95.        7.1.1.5  _g_l_X_M_a_k_e_C_u_r_r_e_n_t__c_o_m_p_a_t_i_b_i_l_i_t_y__w_o_r_k_a_r_o_u_n_d  In order
  96.        to copy between pbuffers and windows, you will need to use
  97.        the glXMakeCurrentReadSGIX extension.  This is all very
  98.        straightforward if the window, pbuffer, and context you are
  99.        using were all created with the same FBConfigID (using
  100.        glXCreateContextWithConfigSGIX).
  101.  
  102.  
  103.        If they weren't created from the same fbconfigid, things get
  104.        more complicated.  A problem arises since there is a bug in
  105.        the X server which requires that windows (but not pbuffers)
  106.        and contexts be created from the exact same visual (or
  107.        fbconfig).  (This does not follow the spec since the
  108.        fbconfig spec specifies that windows should work with any
  109.        "compatible" context if the context was created from an
  110.        fbconfig.)  You must make sure that the window and context
  111.        were always created with the EXACT SAME fbconfig or visual
  112.        id.  So, to copy from a single buffered pbuffer to a double
  113.        buffered window, you must:
  114.  
  115.  
  116.           +o create an sb pbuffer
  117.  
  118.           +o create a db window
  119.  
  120.           +o create a db context
  121.  
  122.  
  123.        This will allow glXMakeCurrentReadSGIX to work correctly
  124.        around this bug.  Note that the above example would not work
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.                                   - 3 -
  137.  
  138.  
  139.  
  140.        if the context were created single-buffered.  This is due to
  141.        the fact that makecurrent between the sb context and db
  142.        window would fail since the window and context were not
  143.        created with reference to the exact same visual (or
  144.        fbconfig).
  145.  
  146.  
  147.        Note that the db context in the example above may be used
  148.        with makecurrent(pbuffer), makecurrent(window), and
  149.        makecurrentread(window, pbuffer), or
  150.        makecurrentread(pbuffer, window) even though the pbuffer is
  151.        single buffered and the context double buffered.  This is
  152.        correct behavior according to the pbuffer spec.  Window
  153.        behavior should be corrected in a subsequent release so that
  154.        window compatibility is properly tested against contexts.
  155.  
  156.  
  157.        See the section at the end about Impact-specific
  158.        glxMakeCurrentRead Compatibility.
  159.  
  160.  
  161.        7.1.1.6  _P_b_u_f_f_e_r__p_e_r_f_o_r_m_a_n_c_e  The single most important
  162.        thing you can do to insure good pbuffer performance on
  163.        impact is to make sure that the windows that your
  164.        applications are using are not using X visuals with Z
  165.        bitplanes unless absolutely necessary.  There are conditions
  166.        outlined below under "pbuffer bank calculations" which cause
  167.        zbuffers to have to swap into host memory when their bank
  168.        usage conflicts with pbuffers.  The simplest way to avoid
  169.        this is to create all windows using visuals without
  170.        zbuffers.
  171.  
  172.  
  173.        The most expensive operation with pbuffers is actually
  174.        glXMakeCurrentReadSGIX.  Try to minimize your use of this
  175.        routine in order to maximize performance.  In pursuit of
  176.        this goal, you should try to minimize the number of contexts
  177.        you use in your application.
  178.  
  179.  
  180.        7.1.1.7  _P_b_u_f_f_e_r__b_a_n_k__c_a_l_c_u_l_a_t_i_o_n_s  In order to calculate
  181.        how many pbuffers you can have concurrently with your
  182.        windows, use the following procedure.  Determine how many
  183.        pbuffer banks are available in your system, using the table
  184.        below called "Pbuffer bank availability".  This is the
  185.        number of pbuffer banks available on your system.
  186.  
  187.  
  188.        Now you need to determine how many banks your application
  189.        requires.  Use the table below called "Pbuffer bank usage"
  190.        to look up how many banks each of the buffers that your
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.                                   - 4 -
  203.  
  204.  
  205.  
  206.        application uses requires.  Note that this is a global
  207.        resource, so you must include in your calculations all
  208.        applications running the on the machine.  If another
  209.        application allocates a pbuffer, then there is one fewer
  210.        pbuffer bank available for your application.  Similarly, if
  211.        any application uses a Z buffer, there will not be enough
  212.        pbuffer banks to support a pbuffer at the same time.
  213.  
  214.  
  215.        Pbuffers are capable of sharing the pbuffer banks with Z
  216.        buffers, and the X server supports swapping the pbuffer bank
  217.        when necessary so the bitplanes may be used for both
  218.        purposes at once.  This will incur a substantial performance
  219.        penalty which may be prohibitive for some applications.  In
  220.        other cases where applications are willing to accept
  221.        pbuffer/zbuffer swapping, you may allow a pbuffer to "share"
  222.        bitplanes with a zbuffer in your calculations.  The one
  223.        exception to this sharing is that you cannot use
  224.        glXMakeCurrentReadSGIX with both a window with a zbuffer and
  225.        a pbuffer that resides in the same bitplanes as that
  226.        zbuffer.  In such a case, glXMakeCurrentReadSGIX will return
  227.        GL_FALSE and fail.
  228.  
  229.  
  230.        7.1.1.8  _E_x_a_m_p_l_e__p_b_u_f_f_e_r__b_a_n_k__c_a_l_c_u_l_a_t_i_o_n_s  Note that
  231.        "overlap" in the table below refers to zbuffer/pbuffer
  232.        overlap.  Such overlap is not allowed in a single call to
  233.        glXMakeCurrentReadSGIX.  Such overlap may incur swapping
  234.        performance penalties.
  235.  
  236.  
  237.        7.1.1.8.1  _n_o__o_v_e_r_l_a_p
  238.  
  239.           +o 0 banks window
  240.  
  241.           +o 1 bank  window + z/s buffer
  242.  
  243.           +o 1 bank  window + 12(L) pbuffer
  244.  
  245.           +o 1 bank  window + 8888 pbuffer
  246.  
  247.           +o 2 banks window + (2) 12(L) pbuffers
  248.  
  249.           +o 2 banks window + (2) 8888 pbuffers
  250.  
  251.           +o 2 banks window + 8888 pbuffer + z/s buffer
  252.  
  253.           +o 3 banks window + (2) 8888 pbuffer + z/s buffer
  254.  
  255.           +o 2 banks window + 12/12/12 pbuffer + z/s buffer
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.                                   - 5 -
  269.  
  270.  
  271.  
  272.        7.1.1.8.2  _w_i_t_h__o_v_e_r_l_a_p
  273.  
  274.           +o 0 banks window
  275.  
  276.           +o 1 bank  window + z/s buffer
  277.  
  278.           +o 1 bank  window + 12(L) pbuffer
  279.  
  280.           +o 1 bank  window + 8888 pbuffer
  281.  
  282.           +o 2 banks window + (2) 12(L) pbuffers
  283.  
  284.           +o 2 banks window + (2) 8888 pbuffers
  285.  
  286.           +o 1 banks window + 8888 pbuffer + z/s buffer
  287.  
  288.           +o 2 banks window + (2) 8888 pbuffer + z/s buffer
  289.  
  290.           +o 2 banks window + 12/12/12 pbuffer + z/s buffer
  291.  
  292.  
  293.        7.1.1.9  _P_b_u_f_f_e_r__b_a_n_k__a_v_a_i_l_a_b_i_l_i_t_y  The framebuffer memory
  294.        available for pbuffers in Max and High Impact systems are
  295.        organized as follows.  Note that on High Impact, the number
  296.        of banks available for pbuffers depends on the timing table
  297.        which is loaded when the X Server starts.
  298.  
  299.  
  300.        7.1.1.9.1  _M_a_x__I_m_p_a_c_t
  301.  
  302.           +o normal timing tables: 2 pbuffer banks
  303.  
  304.           +o 1024x768 timing tables: 4 pbuffer banks
  305.  
  306.           +o 1600x1200 timing table: 1 pbuffer bank
  307.  
  308.           +o 1600x1200 32db: none
  309.  
  310.  
  311.        7.1.1.9.2  _H_i_g_h__I_m_p_a_c_t__a_n_d__S_o_l_i_d__I_m_p_a_c_t
  312.  
  313.           +o normal timing tables: 1 pbuffer bank
  314.  
  315.           +o 1024x768 timing tables: 1 pbuffer bank
  316.  
  317.           +o 1024x768 pbuf: 2 pbuffer banks
  318.  
  319.           +o 32db timing tables: none
  320.  
  321.           +o 1600x1200 timing table: none
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.                                   - 6 -
  335.  
  336.  
  337.  
  338.        7.1.1.10  _P_b_u_f_f_e_r__b_a_n_k__u_s_a_g_e  OpenGL pbuffer bank usage:
  339.  
  340.  
  341.        7.1.1.10.1  _C_o_l_o_r__b_u_f_f_e_r_s
  342.  
  343.           +o two banks       db 8/8/8/8
  344.  
  345.           +o two banks       db 12/12/12
  346.  
  347.           +o two banks       stereo db (any resolution)
  348.  
  349.           +o one bank        all other color resolutions
  350.  
  351.        7.1.1.10.2  _A_n_c_i_l_l_a_r_y__b_u_f_f_e_r_s
  352.  
  353.           +o add one extra bank for visuals with Z and/or stencil
  354.  
  355.  
  356.        N.B.: 12-12-12 color buffers (without depth) are prohibited
  357.        from being allocated in the bitplanes normally used by the
  358.        zbuffer (pbuffer bank 0).  The zbuffer bank will be
  359.        allocated last when you are allocating a series of pbuffers,
  360.        so the simplest workaround is simply to make sure that you
  361.        allocate any 12-12-12 pbuffers before your other pbuffers.
  362.        This restriction will manifest itself as
  363.        glxCreateGLXPbufferSGIX failing due to BadAlloc.
  364.  
  365.  
  366.        7.1.1.11  _I_m_p_a_c_t_-_s_p_e_c_i_f_i_c__g_l_X_M_a_k_e_C_u_r_r_e_n_t_R_e_a_d__C_o_m_p_a_t_i_b_i_l_i_t_y
  367.  
  368.           +o 1) Render types must match (color index/rgba).
  369.  
  370.           +o 2) Pbuf with depth & window with depth are
  371.             incompatible.
  372.  
  373.           +o 3) Pbufs in bank 0 and window with z are incompatible.
  374.             (Pbuffers will be put in bank 0 last.)  (Pbuffers
  375.             allocated earlier are not likely to be in bank 0.)
  376.  
  377.           +o 4) Color depths of drawables do NOT need to match.
  378.  
  379.           +o 5) DB/Stereo do NOT need to match.
  380.  
  381.        7.1.2  _O_p_t_i_m_i_z_e_d__V_e_r_t_e_x__A_r_r_a_y_s   IRIX 6.5.1 introduces
  382.        performance optimizations for back-face culled primitives
  383.        drawn using OpenGL vertex arrays.  Acceleration is currently
  384.        available in direct-rendered OpenGL contexts for
  385.        GL_TRIANGLE_STRIP primitives rendered using glDrawArrays
  386.        with back-face culling (GL_CULL_FACE) enabled.  To enable
  387.        acceleration for an OpenGL context, the GLMGRARRAYOPT
  388.        environment variable must be defined when the context is
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.                                   - 7 -
  401.  
  402.  
  403.  
  404.        created and first made the current rendering context.
  405.        Enabling this optimization may yield incorrect back-face
  406.        culling results when combined with noncanonical usage of the
  407.        projection and modelview matrices.
  408.  
  409.  
  410.        7.1.3  _Y_i_e_l_d_i_n_g _C_P_U _C_y_c_l_e_s _t_o _a _L_o_w_e_r _P_r_i_o_r_i_t_y _T_h_r_e_a_d _D_u_r_i_n_g
  411.        _D_M_A _O_p_e_r_a_t_i_o_n_s   The MXI, SSI and SI OpenGL implementations
  412.        utilize a DMA completion synchronization mechanism that will
  413.        not explicitly yield CPU cycles to lower priority threads
  414.        while a DMA operation is outstanding.
  415.  
  416.  
  417.        IRIX 6.5.5 supports a new systune variable which configures
  418.        the OpenGL implementation for these products (only) to
  419.        provide that behavior. The systune variable is in the gfx
  420.        group and is named gfxdmasleepthreshold. The default value
  421.        of 0 configures the system for the pre 6.5.5 behavior. Non
  422.        zero values are interpreted as the number of bytes of
  423.        transfer size within a DMA operation beyond which an
  424.        explicit yielding of the CPU until completion will occur.
  425.  
  426.  
  427.        Enabling this property of the MXI, SSI and SI OpenGL
  428.        implementations can have undesirable performance effects
  429.        upon imaging operations if not tuned properly.  At small
  430.        transfer size threshold values aggregate throughput
  431.        degradations of up to 15 percent have been measured (for
  432.        16KB glDrawPixels transfers). Empirical testing on a two
  433.        processor 250MHz R10K MXI system has shown that setting the
  434.        value to 80000 yields a marked improvement in regaining CPU
  435.        cycles for lower priority threads with about a 5 percent
  436.        degradation in pixel transfer rate.  Individual application
  437.        performance will vary; this suggested value should be used
  438.        only as a guide.
  439.  
  440.  
  441.        Note that the default behavior will yield to threads of
  442.        equal or higher priority.  Therefore, consider enabling this
  443.        only if it is desirable to have a lower priority thread run
  444.        during lengthy pixel movement operations.
  445.  
  446.  
  447.        7.2  _I_n_f_i_n_i_t_e_R_e_a_l_i_t_y__P_e_r_f_o_r_m_a_n_c_e__H_i_n_t_s
  448.  
  449.        Set all texture parameters (especially the minification
  450.        filter) before downloading a texture.
  451.  
  452.        Enable texturing before downloading any textures.
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.                                   - 8 -
  467.  
  468.  
  469.  
  470.        For best performance and greatest control over texture
  471.        memory allocation, use subtexture loads to manage texture
  472.        memory.
  473.  
  474.        7.3  _I_n_f_i_n_i_t_e_R_e_a_l_i_t_y__S_p_e_c_i_f_i_c__F_e_a_t_u_r_e_s
  475.  
  476.        7.3.1  _D_i_g_i_t_a_l__D_i_s_p_l_a_y__O_p_t_i_o_n__(_D_D_O_)__s_u_p_p_o_r_t  DDO is a new
  477.        video option board for Onyx InfiniteReality systems.
  478.  
  479.        7.3.2  _H_i_g_h__Q_u_a_l_i_t_y__M_u_l_t_i_s_a_m_p_l_e_d__A_n_t_i_-_A_l_i_a_s_e_d__P_o_i_n_t_s  The
  480.        quality of multisampled anti-aliased points has been
  481.        improved.  To use these new improved points:
  482.  
  483.                glDisable(GL_POINT_SMOOTH);
  484.  
  485.                glEnable(GL_MULTISAMPLE_SGIS);
  486.  
  487.        To get the best looking points, some care must be taken to
  488.        set the GL_POINT_FADE_THRESHOLD_SIZE correctly.  For general
  489.        use we suggest using a threshold of zero to disable the
  490.        threshold size feature.
  491.  
  492.        glPointParameterfSGIS(GL_POINT_FADE_THRESHOLD_SIZE, 0.0);
  493.  
  494.        7.3.3  _P_i_p_e_l_i_n_e__I_n_s_t_r_u_m_e_n_t_a_t_i_o_n  The SGIX_instruments OpenGL
  495.        extension defines a new mechanism for measuring the
  496.        performance of the graphics pipeline.  It can be used to
  497.        determine when an application is limited by pixel fill,
  498.        geometry processing load, etc.  This is helpful for general
  499.        performance tuning and for maintaining a guaranteed frame
  500.        rate in simulation systems.
  501.  
  502.        7.3.4  _F_o_r_c_i_n_g__C_o_m_p_l_e_t_i_o_n__o_f__R_a_s_t_e_r_i_z_a_t_i_o_n  The
  503.        SGIX_flush_raster OpenGL extension forces all rasterization
  504.        operations to be completed before processing the next OpenGL
  505.        command.  Unlike glFinish(), it does not prevent the
  506.        application from issuing new commands.  This is used in
  507.        conjunction with the SGIX_instruments extension to ensure
  508.        that rasterization is complete before taking a measurement
  509.        of the graphics pipeline.
  510.  
  511.        7.3.5  _D_i_s_p_l_a_y_-_L_i_s_t__M_e_m_o_r_y__M_a_n_a_g_e_m_e_n_t  One of the new
  512.        hardware features of InfiniteReality is a display-list cache
  513.        memory.  Display lists may be transferred from this memory
  514.        at roughly twice the maximum speed possible for display
  515.        lists stored in main memory.  The SGIX_list_priority OpenGL
  516.        extension allows applications to manage the contents of the
  517.        display list cache by setting residence priorities for
  518.        display lists.
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.                                   - 9 -
  533.  
  534.  
  535.  
  536.        Note that this interface is experimental and its behavior is
  537.        subject to change.  We are very interested in feedback
  538.        concerning it.
  539.  
  540.        7.3.6  _C_a_l_l_i_g_r_a_p_h_i_c__L_i_g_h_t__S_u_p_p_o_r_t  The
  541.        SGIX_calligraphic_fragment OpenGL extension allows position
  542.        and coverage information for light points to be transmitted
  543.        to a combination calligraphic/raster display system.  This
  544.        is valuable for night-time flight simulation.
  545.  
  546.        7.3.7  _L_a_r_g_e__C_o_l_o_r__T_a_b_l_e_s  Luminance-format color tables may
  547.        now have up to 32K entries. Non-luminance color tables may
  548.        have up to 16K entries. (Performance is maximized when color
  549.        tables have 4K or fewer entries, however.)
  550.  
  551.        7.3.8  _V_i_r_t_u_a_l__C_l_i_p_m_a_p_s  Clipmaps are an extension of
  552.        mipmaps, intended to handle texture mapping for extremely
  553.        large textures (such as high-resolution satellite
  554.        photographs of the entire Earth). The first release of
  555.        clipmaps was limited to 15 levels (implying a maximum
  556.        texture size of 32Kx32K).  This has been changed to allow a
  557.        much larger number of levels, provided that no more than 15
  558.        adjacent levels are resident in texture memory at any one
  559.        time.
  560.  
  561.        Even now though, there remains a limitation that over-
  562.        subscribing texture memory with two 17-level clipmaps will
  563.        fail.  For now, you must not allocate more clipmaps than
  564.        will fit into your physical texture memory.
  565.  
  566.        7.3.9  _V_i_d_e_o__P_a_n_/_Z_o_o_m  libXvc now supports the ability to
  567.        pan over a framebuffer area larger than the display, as well
  568.        as to zoom the display up or down without re-rendering.
  569.  
  570.        7.3.10  _O_l_d_-_S_t_y_l_e__S_t_e_r_e_o  The first InfiniteReality release
  571.        included support only for stereo-in-a-window (``new-style''
  572.        stereo).  This release also supports old-style stereo, in
  573.        which the screen is split into two parts and each part is
  574.        scaled up by a factor of two.
  575.  
  576.        7.3.11  _D_e_p_t_h__T_e_x_t_u_r_e_s  The SGIX_depth_texture extension
  577.        defines the behavior of depth textures (analogous to color
  578.        textures).  Currently depth textures are used for real-time
  579.        shadows.
  580.  
  581.        7.3.12  _S_y_n_c_h_r_o_n_i_z_e_d__B_u_f_f_e_r__S_w_a_p  The SGIX_swap_barrier
  582.        extension allows buffer swaps to be synchronized with an
  583.        external event.  Normally this is used to coordinate
  584.        swapping among several machines, each of which is
  585.        responsible for a portion of a video wall or other
  586.        sophisticated multiple-display system.
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.                                   - 10 -
  599.  
  600.  
  601.  
  602.        7.3.13  _S_w_a_p__G_r_o_u_p_s  The SGIX_swap_group OpenGL extension
  603.        provides the ability to synchronize the buffer swaps of a
  604.        group of windows.  For example, a double-buffered main
  605.        window and its associated double-buffered overlay window can
  606.        be placed in a swap group so that they will always be
  607.        buffer-swapped together.
  608.  
  609.        7.3.14  _D_i_s_p_l_a_y__L_i_s_t_s  Display lists can now be transferred
  610.        from main memory to the graphics pipeline by DMA.  This is
  611.        substantially faster than immediate mode, though not as fast
  612.        as display lists in the display list cache memory.
  613.  
  614.        For now, applications are limited to 128M of DMA-able
  615.        display lists.  Beyond that, the code falls back to non-DMA
  616.        display lists.
  617.  
  618.        7.3.15  _P_a_c_k_e_d__V_e_r_t_e_x__A_r_r_a_y__F_o_r_m_a_t_s  Support for certain
  619.        vertex array formats has been optimized with special
  620.        microcode.  See ``man glvertexpointerext'' for details.
  621.  
  622.        7.3.16  _B_i_t_m_a_p_s__(_T_e_x_t_)  Drawing display-listed bitmaps
  623.        (OpenGL-based text) is dramatically faster.
  624.  
  625.        7.3.17  _H_i_s_t_o_g_r_a_m_s  Single-component histograms (a common
  626.        case for luminance-only image-processing operations) and the
  627.        glGetHistogramEXT() command have been tuned.
  628.  
  629.        7.3.18  _S_m_a_l_l_-_A_r_e_a__P_i_x_e_l__O_p_e_r_a_t_i_o_n_s  The overhead for
  630.        glCopyPixels() and glDrawPixels() operations has been
  631.        reduced, allowing significantly better throughput for those
  632.        operations when applied to small pixel arrays.
  633.  
  634.        7.3.19  _M_o_d_e__C_h_a_n_g_e_s  Performance for a variety of mode-
  635.        change operations has been improved.
  636.  
  637.        7.3.20  _C_u_l_l_i_n_g  Backface culling performance has been
  638.        improved, though the penalty for using culling remains
  639.        higher than it was on RealityEngine.
  640.  
  641.        7.3.21  _E_v_a_l_u_a_t_o_r_s  A number of optimizations have been
  642.        applied to parametric polynomial surfaces (evaluators).
  643.  
  644.        7.3.22  _C_o_n_v_o_l_u_t_i_o_n  Performance has been improved
  645.        substantially, especially for separable convolutions and for
  646.        luminance-only convolutions.
  647.  
  648.        7.3.23  _T_e_x_t_u_r_e__B_i_n_d_s  Binding to a texture that is resident
  649.        in texture memory is now over three times faster than it was
  650.        in the first release.
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.                                   - 11 -
  665.  
  666.  
  667.  
  668.        7.3.24  _Q_u_a_d_r_i_l_a_t_e_r_a_l_s  Decomposition of quadrilaterals into
  669.        triangles has been changed, yielding 30%-50% better
  670.        performance for geometry-limited quadrilateral strips.
  671.  
  672.  
  673.        7.4  _O_c_t_a_n_e_2__V_P_r_o__P_e_r_f_o_r_m_a_n_c_e__H_i_n_t_s
  674.  
  675.  
  676.        Octane2 VPro host software support is optimized for the n32
  677.        and n64 object file formats, and the mips4 instruction set.
  678.        The old o32 object file format is supported, but cannot use
  679.        the mips4 instruction set.  Programs in this format will
  680.        therefore miss out on optimizations in matrix arithmetic and
  681.        in efficient submission of display lists to the graphics
  682.        hardware.
  683.  
  684.        Users who run applications which make heavy use of the
  685.        glAccum() function should configure their Octane2 VPro
  686.        systems to take advantage of the hardware accumulation
  687.        buffer.  This buffer is not part of the default
  688.        configuration as these systems are shipped.  See the
  689.        xsetmon(1) man page, and the "Unified Graphics Memory" topic
  690.        in the Features section below, for details.
  691.  
  692.        Octane2 VPro provides optimized transfer paths for a
  693.        selection of vertex array layouts.  Use of these formats may
  694.        substantially increase performance in glDrawArrays(),
  695.        glDrawElements() and glDrawRangeElements().  This set of
  696.        formats includes some in the set of enums provided for
  697.        glInterleavedArrays() and some others as well.  Using any
  698.        means (either glInterleavedArrays() or explicit use of
  699.        glVertexPointer() and related functions) for specifying the
  700.        optimized formats will result in the optimized path being
  701.        taken.
  702.  
  703.        The list of optimized formats follows.  In this list,
  704.        abbreviations are used which are akin to the enums provided
  705.        for glInterleaveArrays(), even though some of these
  706.        abbreviations are not actual legal enums.  In the latter
  707.        case, one would use glVertexPointer() and related functions
  708.        to specify the array format.  We hope the meaning is clear.
  709.  
  710.           +o Packed V3F
  711.  
  712.           +o Interleaved C3F_V3F
  713.  
  714.           +o Packed separate C3F_V3F
  715.  
  716.           +o Interleaved N3F_V3F
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.                                   - 12 -
  731.  
  732.  
  733.  
  734.           +o Interleaved V3F_N3F
  735.  
  736.           +o Packed separate N3F_V3F
  737.  
  738.           +o Packed separate N3S_V3F
  739.  
  740.           +o Interleaved T2F_V3F
  741.  
  742.           +o Packed separate T2F_V3F
  743.  
  744.  
  745.        Octane2 VPro provides a way to improve precision of
  746.        parameter interpolation across primitives (especially those
  747.        primitives which are large in screen space), using the
  748.        SGIX_vertex_preclip extension.  See the man pages for
  749.        glIntro(3G), glEnable(3G) and glHint(3G) for details.
  750.  
  751.        When vertex preclipping is disabled
  752.        (glDisable(GL_VERTEX_PRECLIP_SGIX)), primitive performance
  753.        is maximized.  When it is enabled
  754.        (glEnable(GL_VERTEX_PRECLIP_SGIX)), there is a hint which
  755.        controls how much work is done to detect primitives for
  756.        which enhanced interpolation may be beneficial.  This hint,
  757.        glHint(GL_VERTEX_PRECLIP_HINT_SGIX, ...), may as usual be
  758.        set to either GL_FASTEST, GL_NICEST or GL_DONT_CARE.
  759.        (GL_DONT_CARE operates identically to GL_FASTEST.)  Use of
  760.        vertex preclipping results in a decrease in peak primitive
  761.        rates, with GL_NICEST costing more than GL_FASTEST.
  762.  
  763.        The initial state of vertex preclipping is disabled; the
  764.        initial state of the hint is GL_DONT_CARE.  However, we have
  765.        provided an environment variable which sets the initial
  766.        values, so that an unmodified application may operate in any
  767.        of these modes.  (If the application uses the
  768.        SGIX_vertex_preclip extension at runtime, the application's
  769.        settings will override the initial settings provided by the
  770.        environment variable.)
  771.  
  772.        This environment variable is called GL_VERTEX_PRECLIP.  It
  773.        can have three values:  the string "DISABLED" disables
  774.        vertex preclipping (this simply confirms the default case);
  775.        the string "FASTEST" both enables vertex preclipping and
  776.        sets the hint to GL_FASTEST; and the string "NICEST" both
  777.        enables vertex preclipping and sets the hint to GL_NICEST.
  778.  
  779.        Octane2 VPro systems represent the depth buffer in eye space
  780.        rather than in window space (see the topic "Depth Buffer in
  781.        Eye Space" in the Features section below for details).  As a
  782.        result, glReadPixels() and glDrawPixels() incur a cost to
  783.        convert GL_DEPTH_COMPONENT data to and from the hardware
  784.        format.  Applications can use the GL_DEPTH_COMPONENT24_SGIX
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.                                   - 13 -
  797.  
  798.  
  799.  
  800.        format parameter to cause depth buffer reads and writes to
  801.        be done directly in the hardware format, thus avoiding this
  802.        cost.  See the man pages for glReadPixels() and
  803.        glDrawPixels().
  804.  
  805.        Octane2 VPro systems are capable of asynchronous transfers
  806.        of pixel data and texture images.  This feature can provide
  807.        dramatic performance gains for certain kinds of
  808.        applications.  One example is applications which engage in
  809.        frequent, ongoing texture downloads, such as those which use
  810.        dynamically changing textures.  Another example is
  811.        applications which can overlap substantial CPU work with
  812.        glDrawPixels or glReadPixels operations, and can't easily
  813.        structure themselves to be multithreaded.
  814.  
  815.        This feature is provided via the SGIX_async and
  816.        SGIX_async_pixel extensions.  For information on SGIX_async,
  817.        see the man pages for glAsyncMarkerSGIX(3G),
  818.        glPollAsyncSGIX(3G), glFinishAsyncSGIX(3G),
  819.        glGenAsyncMarkersSGIX(3G), glIsAsyncMarkerSGIX(3G),
  820.        glDeleteAsyncMarkersSGIX(3G), and glFinish(3G).  For
  821.        information on SGIX_async_pixel, see the man pages for
  822.        glEnable(3G), glDrawPixels(3G), glReadPixels(3G),
  823.        glTexImage1D(3G), glTexImage2D(3G), glTexImage3D(3G),
  824.        glTexSubImage1D(3G), glTexSubImage2D(3G), and
  825.        glTexSubImage3D(3G).
  826.  
  827.        The SGIX_async and SGIX_async_pixel extensions relax the
  828.        normal OpenGL semantics of sequentiality.  In particular,
  829.        asynchronous transfers of pixel or texel data may happen
  830.        out-of-order with respect to each other and with respect to
  831.        any synchronous OpenGL commands that follow.  Buffers for
  832.        asynchronous glDrawPixels and glTexImage commands must not
  833.        be modified before the transfers have finished.  Likewise,
  834.        buffers for asynchronous glReadPixels commands will not be
  835.        valid until the transfers have finished.
  836.  
  837.        Applications must take care to enforce their own
  838.        dependencies on asynchronously transferred data.  To support
  839.        this, the SGIX_async extension provides bookkeeping
  840.        mechanisms and both blocking and non-blocking
  841.        synchronization commands.  Failure to enforce all
  842.        dependencies may result in obscure, timing-related bugs, as
  843.        well as bugs which remain latent until the application is
  844.        run on higher-performance systems than may presently be
  845.        available.
  846.  
  847.        As with all SGIX extensions, this feature may not be
  848.        available on future products.
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.                                   - 14 -
  863.  
  864.  
  865.  
  866.        7.5  _O_c_t_a_n_e_2__V_P_r_o__S_p_e_c_i_f_i_c__F_e_a_t_u_r_e_s
  867.  
  868.  
  869.  
  870.        7.5.1  _U_n_i_f_i_e_d__G_r_a_p_h_i_c_s__M_e_m_o_r_y  The Octane2 VPro graphics
  871.        architecture supplies a pool of memory out of which many
  872.        graphics memory resources are allocated.  (This pool of
  873.        memory is, however, separate from system memory and not
  874.        addressable in the system's virtual address space.)  The set
  875.        of resources present in this "unified graphics memory" are:
  876.        the framebuffer (including the color, depth and stencil
  877.        buffers, and optionally the accumulation buffer);
  878.        framebuffer overlays; pbuffers; textures; and some system
  879.        overhead.
  880.  
  881.        The amount of unified graphics memory present, in megabytes,
  882.        can be found as the last field of the string returned by
  883.        glGetString(GL_RENDERER).  See the man page for
  884.        glGetString() for details.
  885.  
  886.        The xsetmon(1) program (also accessible from the IRIX
  887.        desktop at Toolchest->System->Display Properties) is used to
  888.        statically allocate the framebuffer.  The user may choose
  889.        among a variety of framebuffer X and Y dimensions; a
  890.        framebuffer depth of 8 or 16 bytes; and the optional
  891.        presence of a hardware accumulation buffer.  The unified
  892.        graphics memory remaining after this static allocation (and
  893.        after a small amount of system overhead) is available for
  894.        dynamic allocation of pbuffers and textures.
  895.  
  896.        If the hardware accumulation buffer is selected, it provides
  897.        24 bits of precision per component.  When no hardware
  898.        accumulation buffer is present, OpenGL will allocate a host
  899.        software accumulation buffer for use by the glAccum()
  900.        function.  This software accumulation buffer provides 16
  901.        bits per component.
  902.  
  903.        The default configuration is a 1280x1024 framebuffer with 16
  904.        bytes per pixel, and no hardware accumulation buffer.
  905.  
  906.        Depending on the amount of memory present in the graphics
  907.        subsystem, some framebuffer configurations may not fit.  A
  908.        rough calculation of the amount of memory consumed by a
  909.        framebuffer configuration may be done as follows.  Count
  910.        pixels simply by multiplying the X and Y dimensions of the
  911.        framebuffer.  For each pixel, allow 8 or 16 bytes according
  912.        to the selection made in xsetmon(1).  Add 2 bytes per pixel
  913.        for the overlay/WID buffer.  If the hardware accumulation
  914.        buffer is selected, add 12 more bytes per pixel.
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.                                   - 15 -
  929.  
  930.  
  931.  
  932.        7.5.2  _C_l_i_p_p_i_n_g__a_s__S_c_i_s_s_o_r_i_n_g  The Octane2 VPro architecture
  933.        substitutes a function with scissoring semantics for fine-
  934.        grained geometry clipping of the usual kind.  This includes
  935.        both view-frustum clipping and glClipPlane() clipping.  In
  936.        the latter case, fragments lying on the wrong side of the
  937.        clip plane are efficiently killed in rasterization hardware.
  938.  
  939.        Therefore, the OpenGL clipping semantics with respect to the
  940.        glPolygonMode(..., GL_LINES) function are modified so that
  941.        new edges are not supplied when such polygons are clipped.
  942.        As well, wide points and wide lines never slop over the
  943.        bounds of the viewport.  Although these are technical
  944.        violations of the OpenGL specification, in practice most
  945.        users consider the specified behaviors to be bugs, and their
  946.        absence to be features.
  947.  
  948.  
  949.        7.5.3  _W_i_d_e__L_i_n_e_s  Octane2 VPro systems use a "french-cut"
  950.        style of line endings for anti-aliased wide lines.  This
  951.        means that the ends of wide line segments are either
  952.        vertical, if the line has an X-major slope on the screen, or
  953.        horizontal if the line has a Y-major slope.
  954.  
  955.  
  956.        7.5.4  _D_e_c_o_m_p_o_s_i_t_i_o_n__o_f__Q_u_a_d_s  Unlike most other OpenGL
  957.        implementations, Octane2 VPro systems decompose quads into
  958.        triangles using the diagonal between the first and third
  959.        vertices, rather than between the second and fourth
  960.        vertices.  This may produce different interpolations of
  961.        parameters such as color, texture coordinates or Z
  962.        coordinate at given interior points of the quad.  This is
  963.        most likely to be noticeable when the four values of a given
  964.        parameter at the four vertices are not planar in the
  965.        parameter space.  One example would be a square with three
  966.        vertices white and one vertex red.  Another would be a quad
  967.        whose geometry is grossly non-planar.  In such cases, the
  968.        application has underspecified the desired interpolation,
  969.        and different OpenGL implementations are free to behave
  970.        differently.
  971.  
  972.  
  973.        7.5.5  _C_o_m_p_u_t_a_t_i_o_n__o_f__T_e_x_t_u_r_e__L_e_v_e_l__o_f__D_e_t_a_i_l  In computing
  974.        the lambda parameter controlling level-of-detail while
  975.        sampling a texture, the Octane2 VPro hardware uses a
  976.        diagonal distance between pixels rather than the usual
  977.        rectangular distances in estimating the partial derivatives
  978.        of s and t with respect to x and y.  The contours where
  979.        level-of-detail changes across the surface of the primitive
  980.        may be of different shape as a result.
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994.                                   - 16 -
  995.  
  996.  
  997.  
  998.        7.5.6  _V_i_s_u_a_l_s__w_i_t_h__M_u_l_t_i_p_l_e__B_u_f_f_e_r_s  To provide maximum
  999.        rasterization performance, Octane2 VPro systems provide
  1000.        duplicate depth buffers in double-buffered visuals which
  1001.        have depth.  The depth buffer associated with the current
  1002.        draw buffer is used for depth tests.  Therefore, the depth
  1003.        buffer should ideally be cleared at the same time as the
  1004.        color buffer.  In any case, the depth buffer may be observed
  1005.        to have different contents as the result of a call to
  1006.        glXSwapBuffers() or glDrawBuffer().
  1007.  
  1008.  
  1009.        7.5.7  _C_l_e_a_r_s  On Octane2 VPro systems, dithering is not
  1010.        applied to screen clears.
  1011.  
  1012.  
  1013.        7.5.8  _D_e_p_t_h__B_u_f_f_e_r__i_n__E_y_e__S_p_a_c_e   The Octane2 VPro graphics
  1014.        system stores eye Z values in the depth buffer instead of
  1015.        device Zvalues as many other graphics chips do.
  1016.        Specifically, it stores eye Z divided by eye W.  Let us call
  1017.        this divided eye Z.  In addition, the eye Z values are
  1018.        stored in the depth buffer in an internal floating point
  1019.        representation.
  1020.  
  1021.        Note: Eye coordinates are obtained by multiplying the object
  1022.        coordinates by the modelview matrix.  Eye coordinates
  1023.        multiplied by the projection matrix yield clip coordinates.
  1024.        Clip coordinates divided by their W coordinates (clip W)
  1025.        result in device coordinates.
  1026.  
  1027.        The advantage of this approach is in improved resolution of
  1028.        Z values in areas where objects are most often located, that
  1029.        is in the first half of the viewing frustum (closer to the
  1030.        camera).  First, divided eye Z values are always uniformly
  1031.        spaced in the view frustum, even in case of perspective
  1032.        projection.  Second, the use of floating point values
  1033.        increases the resolution at the beginning of the viewing
  1034.        frustum.  Thus for objects closer to the camera (both in
  1035.        perspective and orthographic projection) the precision of
  1036.        depth tests is increased, compared to objects further away
  1037.        from the camera.  The increase in resolution close to the
  1038.        camera is not as drastic as in the case of device Z values
  1039.        in perspective projection.  For example, in case of a
  1040.        frustum with near plane at 1 and far plane at 1001, the
  1041.        precision in the interval of eye Z values from -501 to -1001
  1042.        is 18 bits, in the interval (-251,-501) is 19 bits, in the
  1043.        interval (-126,-251) is 20 bits and so on (the values have a
  1044.        6 bit mantissa).  On the other hand, device Z values would
  1045.        have 20 bit precision around -16, 19 bit around -32, and 18
  1046.        bit around -64, assuming that the values are stored as
  1047.        integers or fixed point numbers.
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.                                   - 17 -
  1061.  
  1062.  
  1063.  
  1064.        Thus eye Z values have about 4 bits better precision than
  1065.        device Z values in the first half of the Z range, except the
  1066.        very beginning when device Z values are more precise.  The
  1067.        difference increases as one moves further away from the
  1068.        camera, because eye Z values have 18 bit precision in the
  1069.        whole second half of the frustum, while device Z values
  1070.        still lose precision with higher distance from the camera.
  1071.  
  1072.        There are a few caveats the user should be aware of:
  1073.  
  1074.        The resolution of the depth buffer in orthographic
  1075.        projection is lower for objects in the second half of the
  1076.        view frustum (further away from the camera), compared to the
  1077.        same size depth buffer with integer values.
  1078.  
  1079.        If your application changes the projection matrix without
  1080.        clearing the depth buffer, the behavior of your program may
  1081.        be different, since the values are distributed uniformly in
  1082.        case of perspective projection.  For example, if you draw an
  1083.        instrument panel using orthographic projection and then the
  1084.        cockpit view using perspective projection, you may have to
  1085.        adjust the parameters of your projections (or even better,
  1086.        use glDepthRange()).
  1087.  
  1088.        If you specify perspective projection it is very important
  1089.        to make the proper distinction between modelview and
  1090.        projection matrices, and to correctly specify the projection
  1091.        on the projection matrix.  Most programmers who use lighting
  1092.        in their application are familiar with this condition, since
  1093.        lighting works in eye coordinates and it is necessary to
  1094.        specify the projection on the projection matrix stack to
  1095.        obtain correct eye coordinates.
  1096.  
  1097.  
  1098.        7.5.9  _V_i_s_u_a_l_s__w_i_t_h__1_6_-_b_i_t__D_e_p_t_h   On Octane2 VPro V12
  1099.        systems, there is a new visual type which provides a 16-bit
  1100.        depth buffer in combination with color buffers of 12 bits
  1101.        each for red, green, blue and alpha channels; it may be
  1102.        either single- or double-buffered.  (This visual type does
  1103.        not provide a stencil buffer.)
  1104.  
  1105.        Because most applications that use a depth buffer need the
  1106.        full precision of 24 bits, we have arranged the visual
  1107.        ranking algorithms in glXChooseVisual() and
  1108.        glXChooseFBConfig() to prefer the visuals with 24-bit depth
  1109.        buffers, even though they have fewer bits of color
  1110.        precision.  If an application directly requests 24 bits of
  1111.        depth, then of course only those visuals will be considered
  1112.        by these GLX functions.  Conversely, an application may get
  1113.        one of the new visuals by asking for 12 bits of red, green,
  1114.        blue and alpha, along with from 1 to 16 bits of depth.
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.                                   - 18 -
  1127.  
  1128.  
  1129.  
  1130.        7.5.10  _S_p_e_c_u_l_a_r__H_i_g_h_l_i_g_h_t_s   The Octane2 VPro graphics
  1131.        system is the first system from SGI to implement the
  1132.        GL_SGIX_fragment_lighting extension.   The implementation is
  1133.        optimized for providing improved lighting effects with no
  1134.        loss of performance at interactive frame rates.  If only a
  1135.        fragment light is enabled, and if a single highlight
  1136.        occupies a large area of the screen (more than 200 or so
  1137.        pixels across), some slight mach banding may be visible in
  1138.        the highlight.  The effect is ameliorated by enabling other
  1139.        lights in addition to the fragment light, and is
  1140.        unnoticeable in the normal case where highlights are only a
  1141.        small part of the visible window area.
  1142.  
  1143.        For materials with very low shininess the extent of a
  1144.        specular highlight will also be slightly different from the
  1145.        value given by the formula in the OpenGL specification.  The
  1146.        discrepancy becomes less as the shininess increases, and has
  1147.        disappeared by the time the shininess gets into the range
  1148.        typical of glossy surfaces where specular reflection is most
  1149.        significant.
  1150.  
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.  
  1162.  
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.