| Name |
| |
| SGIS_shared_multisample |
| |
| Name Strings |
| |
| GL_SGIS_shared_multisample |
| GLX_SGIS_shared_multisample |
| |
| Version |
| |
| $Date: 1997/10/29 20:41:07 $ $Revision: 1.2 $ |
| |
| Number |
| |
| 143 |
| |
| Dependencies |
| |
| GL_SGIS_multisample and GLX_SGIS_multisample are required |
| |
| Overview |
| |
| While the OpenGL multisample extension (SGIS_multisample) provides |
| good out-of-order antialiasing via subpixel samples, multisample |
| hardware is very expensive because it multiplies the per-pixel |
| framebuffer memory required to maintain color, depth, and stencil |
| state by the number of samples. |
| |
| The cost-sensitive Location Based Entertainment (LBE) market |
| desires good quality antialiasing, but the cost of maintaining |
| multisample memory for every pixel in the framebuffer managed area |
| is often prohibitive. Low-end multi-channel visual simulation may |
| have similar cost constraints. |
| |
| LBE applications typically render several channels that are output |
| to different video display devices. For example, an LBE |
| application may render four 800x600 resolution channels, one per |
| game player. While the total managed area may be 1600x1200, each |
| channel ends up being rendered serially. With traditional |
| multisampling (as specified by SGIS_multisample), multisample |
| memory must be retained across the entire 1600x1200 managed area |
| though in fact the application is never using more than an 800x600 |
| rectangle of multisample pixel state at any given time. |
| |
| This sharing of multisample framebuffer state can result in a |
| substantial competitive advantage for high-end multi-channel |
| multisampling hardware for LBE applications. Unlike a "cheap PC |
| per seat" solution, a high-end solution can be amortized by sharing |
| both texture and multisample memory between the multiple channels |
| (as well as host resources such as disk and CPUs). For cheap PCs |
| to have the same amount of texture memory and quality of |
| antialiasing, texture and multisample memory have to be replicated |
| in every PC. |
| |
| In a typical windowed environment, the entire framebuffer managed |
| area must retain multisample state because windows can be moved |
| dynamically and resized (up to the entire size of the managed |
| area). For LBE applications though, the layout of channel |
| subrectangles in the framebuffer managed area is static and the |
| LBE application monopolizes the graphics device (no other |
| concurrent windowed apps). Because of their channel-oriented, |
| dedicated, cost-sensitive nature, LBE applications can benefit from |
| a means to share the available multisample memory resources among |
| all the channels. |
| |
| The SGIS_shared_multisample extension specifies a single |
| multisample buffer subrectangle sized smaller than the total |
| managed area that is both shared among multiple windows and |
| repositionable within in a window. |
| |
| Use of the SGIS_shared_multisample extension is predicated on |
| specially configuring the window system, typically via a command |
| line option added to the window system server's startup command. |
| When run in this mode, OpenGL applications will see the |
| GL_SGIS_shared_multisample string advertised in the GL_EXTENSIONS |
| string (along with the GL_SGIS_multisample string). In this mode, |
| the behavior of multisample extension changes. Instead of the |
| multisample buffer memory being retained per-pixel across the |
| entire managed area, multisample memory is shared among multisample |
| windows and repositionable within a multisample window. |
| |
| Switching windows or repositioning the multisample subrectangle |
| will make undefined the shared state within the multisample, depth, |
| stencil, and accumulation buffers. |
| |
| When rendering into a multisample window, fragments that fall |
| outside the window's multisample subrectangle are discarded |
| (scissored). By default, the window's multisample rectangle is |
| positioned at its window origin. |
| |
| Issues |
| |
| * As part of the pixel ownership test, when doing a ReadPixels, |
| CopyPixels, CopyTexImage, or CopySubTexImage operation, are the |
| sourced color pixels undefined if they are outside the |
| multisample subrectangle, but otherwise would pass the pixel |
| ownership test? NO, such pixel read/copies should be DEFINED. |
| |
| This behavior is justified because the resolved color buffer is |
| available for copying outside the multisample subrectangle, just |
| not the multisample, depth, stencil, or accumulation buffer |
| values. LBE applications will likely find it useful to copy |
| rendering results from the first channel into the others. For |
| example, copying a radar view shared among all the players into |
| each channel. |
| |
| Note that copies or reads of depth or stencil (or multisamples |
| or accumulation buffer contents if such contents were actually |
| readable) will NOT be expected to be defined. |
| |
| The specification additions below only amend this with respect |
| to ReadPixels, but other language in the 4.3.3 "Copying Pixels" |
| and 3.8 "Texturing, Alternative Texture Image Specification |
| Commands" sections imply that CopyPixels, CopyTexImage2D, and |
| CopyTexImage1D will also not include scissoring against the |
| multisample subrectangle as part of the pixel ownership test |
| when sourcing from color buffers (not depth or stencil though). |
| This is because these other operations read pixels as specified |
| by the ReadPixels operation. |
| |
| * Should the accumulation buffer be associated with the the |
| multisample subrectangle, or should the accumulation buffer be |
| retained (as are the color buffers) for pixels not within the |
| multisample subrectangle? If an accumulation buffer exists, it |
| should be SHARED like the multisample buffer. |
| |
| This behavior is justified because accumulation buffers are big |
| and expensive just like multisample buffers. LBE apps still may |
| want to use the accumulation buffer for motion blur or depth of |
| field. Like the multisample buffer, the accumulation buffer |
| should be shared and retained only within the multisample |
| subrectangle. |
| |
| * What about auxiliary buffers? Does the same logic for |
| accumulation buffers apply? UNRESOLVED. This specification is |
| currently written to assume that an auxiliary buffer is a color |
| buffer and is not shared. |
| |
| * If multiple GL clients must use framebuffers with a shared |
| multisample subrectangle, how can they guarantee reliable |
| rendering results? WITH GLFLUSH. Keep rendering temporally |
| distinct with glFlush issued before rendering thread switches. |
| |
| * Does it make sense for hardware to advertise more than one |
| multisample subrectangle? NO. It would justified if you had |
| two parallel command streams updating distinct channels since |
| two channels would be rendering in parallel. But if this was |
| the case (thinking in the context of LBE applications), it |
| probably makes more sense simply to have two distinct pipes. |
| That's cheaper than trying to support a single pipe with |
| parallel rendering streams, plus the channels are rendering |
| independently (via screen space subdivision) anyway. |
| |
| * Can you clear a window using a shared multisample buffer |
| outside the multisample subrectangle? NO. |
| |
| glClear is controlled by the pixel ownership test and if a |
| fragment is not within the multisample subrectangle, it cannot |
| pass the pixel ownership test when using a multisample |
| subrectangle. |
| |
| * What happens if you run a traditional (existing) multisample |
| application on a window system advertising the shared |
| multisample extension? VERY UNSIGHTLY FRAME BUFFER FIGHTING. |
| |
| The app runs, but its multisample rendering will be constrained |
| to the multisample subrectangle. Multiple concurrent apps using |
| multisampling will "fight" for their use of the shared |
| multisample rectangle. |
| |
| The expectation is that you only configure a window system |
| server to support shared multisample mode when running a single |
| dedicated LBE-style channel API. Note that you can still run |
| non-multisampled windowed apps just fine concurrently with a |
| shared multisample app. |
| |
| * As written, this extension CHANGES the semantics of the |
| existing GL_SGIS_multisample extension. Should this new |
| extension use a GLX attribute distinct from the one used by the |
| GLX_SGIS_multisample extension? NO. |
| |
| Users have to specially configure their window system server to |
| get the special overloaded sharing behavior. Plus LBE |
| applications monopolize the system anyway. |
| |
| The advantage of overloading the existing multisample GLX |
| attributes is that 3D toolkits (IRIS Performer, OpenGL++, OpenGL |
| Optimizer) and multisample apps themselves won't have to be |
| specially tweaked to try them out using the shared multisample |
| mode. |
| |
| * Can a single window system server be configured to advertise |
| an 8 sample shared multisample framebuffer configuration and an |
| 4 sample shared multisample framebuffer configuration? YES, |
| the extension would allow such a case to be advertised. |
| |
| The idea would be perhaps the 4 sample shared multisample |
| configuration could have a large width and height than the more |
| memory intensive 8 sample shared multisample configuration. |
| |
| * Both a GLX and GL extension? YES. The multisample subrectangle |
| dimensions can be advertised for X visuals before actually |
| creating an actual window. Also allows different numbers of |
| samples to be advertised (see above). |
| |
| New Procedures and Functions |
| |
| void glMultisampleSubRectPosSGIS(GLint x, |
| GLint y); |
| |
| New Tokens |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetDoublev, |
| GetIntegerv, and GetFloatv: |
| |
| MULTISAMPLE_SUB_RECT_POSITION_SGIS |
| MULTISAMPLE_SUB_RECT_DIMS_SGIS |
| |
| Accepted by the <attrib> parameter of glXGetConfig, and by the |
| <attrib_list> parameter of glXChooseVisual: |
| |
| GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 |
| GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 |
| |
| Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation) |
| |
| None |
| |
| Additions to Chapter 3 of the 1.1 Specification (Rasterization) |
| |
| None |
| |
| Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations and |
| the Framebuffer) |
| |
| Section 4.1.1 (Pixel Ownership Test) is augmented as follows: |
| |
| 4.1.1.x "Scissoring to the Multisample Subrectangle" |
| |
| The value of MULTISAMPLE_SUB_RECT_DIMS_SGIS is an implementation |
| dependent constant, and is queried by calling GetIntegerv with |
| <pname> set to MULTISAMPLE_SUB_RECT_DIMS_SGIS. |
| MULTISAMPLE_SUB_RECT_DIMS_SGIS specifies the width and height of |
| the multisample subrectangle. Neither the |
| MULTISAMPLE_SUB_RECT_DIMS_SGIS width or height should be greater |
| than zero if SAMPLE_BUFFERS_SGIS is zero. |
| |
| If SAMPLE_BUFFERS_SGIS is one and the |
| MULTISAMPLE_SUB_RECT_DIMS_SGIS width and height are both greater |
| than zero, the pixel ownership test is augmented to also discard |
| fragments not within the multisample subrectangle. Otherwise, the |
| pixel ownership operates normally and irrespective of the |
| multisample subrectangle. |
| |
| The state of MULTISAMPLE_SUB_RECT_POSITION_SGIS is set by: |
| |
| void MultisampleSubRectPosSGIS(GLint x, |
| GLint y); |
| |
| If either MULTISAMPLE_SUB_RECT_DIMS_SGIS width or height is zero or |
| the GL is in color index mode, MultisampleSubRectPosSGIS generates |
| the error INVALID_OPERATION. |
| |
| When MultisampleSubRectPosSGIS is executed, the contents of the |
| multisample, depth, stencil, and accumulation buffers retained in |
| the multisample subrectangle (but not the contents of the resolved |
| color buffers) become undefined. Also when a GL client connects to |
| a different GL context, the multisample, depth, stencil and |
| accumulation buffer values for all pixels within the multisample |
| subrectangle (but not the resolved color buffers) become |
| undefined. |
| |
| The multisample subrectangle can be shared between multiple |
| framebuffers (windows). Whenever the multisample subrectangle |
| becomes undefined, the contents of the multisample, depth, stencil, |
| and accumulation buffers (but not the contents of the resolved |
| color buffers) for all GL framebuffers sharing the multisample |
| subrectangle state become undefined. When two or more GL clients |
| access (render or readback) concurrently framebuffers that share |
| the same multisample subrectangle (whether or not MULTISAMPLE_SGIS |
| is enabled), the rendering results for ALL buffers (including color |
| buffers) of all involved framebuffers are undefined. |
| |
| The origin of the multisample subrectangle is defined by |
| (msrx,msry) specified by MULTISAMPLE_SUB_RECT_POSITION_SGIS in |
| window coordinates. The extent of the multisample subrectangle is |
| defined by (msrwidth,msrheight) specified by |
| MULTISAMPLE_SUB_RECT_DIMS_SGIS in window coordinates. |
| |
| A fragment with window coordinates (xw,yw) is within the |
| multisample subrectangle if msrx <= xw < msrx + msrwidth and msry |
| <= yw < msry + msrheight. |
| |
| 4.2.4 "The Accumulation Buffer" |
| |
| Rewrite the sentence beginning "When the scissor test is enabled" |
| that describes what color buffer pixels are updated by a RETURN |
| Accum operation to read: |
| |
| If either of the MULTISAMPLE_SUB_RECT_DIMS_SGIS width or height is |
| zero, when the scissor test is enabled, then only those pixels |
| within the current scissor box are updated; otherwise, all pixels |
| in the window are updated. If the MULTISAMPLE_SUB_RECT_DIMS_SGIS |
| width and height are both greater than zero, only those pixels |
| within the current multisample subrectangle are updated; in |
| addition, if scissoring is enabled, the updated pixels are further |
| constrained to be within the scissor rectangle. |
| |
| 4.3.2 "Reading Pixels" |
| |
| In the subsection "Obtaining Pixels from the Framebuffer", follow |
| the sentence "Results are also undefined for individual pixels that |
| are not owned by the current context." with: For the purpose of |
| reading the color buffers (not depth and stencil though), the pixel |
| ownership test does not include scissoring against the multisample |
| subrectangle. |
| |
| Additions to Chapter 5 of the 1.1 Specification (Special Functions) |
| |
| None |
| |
| Additions to Chapter 6 of the 1.1 Specification (State and State Requests) |
| |
| None |
| |
| Additions to the GLX Specification |
| |
| When called with <attribute> set to |
| GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGI or |
| GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS, glXGetConfig returns in |
| parameter <value> the respective multisample subrectangle width or |
| height of the specified visual. |
| |
| The GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGI and |
| GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS attributes of a visual or |
| framebuffer configuration determine the respective width and |
| height dimensions of MULTISAMPLE_SUB_RECT_DIMS_SGIS for |
| GLXDrawables created with the visual or framebuffer |
| configuration. |
| |
| glXChooseVisual accepts GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGI and |
| GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS in <attribList>, followed by |
| the respective desired (non-negative) width or height of the |
| multisample rectangle. The smallest width or height of at least |
| the specified size is preferred. If the desired value is zero, |
| visuals with zero multisample rectangle width or height are |
| preferred. |
| |
| Multisample GLXDrawables that reside on the same screen share the |
| same multisample subrectangle. There is at most one shared |
| multisample subrectangle per screen. |
| |
| GLX Protocol |
| |
| A new GL rendering command is added. The following command is sent |
| to the server as part of a glXRender request: |
| |
| MultisampleSubRectPosSGIS |
| 2 12 rendering command length |
| 2 ?? rendering command opcode |
| 4 INT32 x |
| 4 INT32 y |
| |
| Two new property type/property value pairs are included in the |
| property list of each visual returned by glXGetVisualConfigs |
| request. The property type/property value pairs are encoded as. |
| |
| 4 ENUM property type |
| 0x8026 GLX_MULTISAMPLE_SUB_RECT_WIDTH |
| 4 INT32 property value |
| |
| 4 ENUM property type |
| 0x8027 GLX_MULTISAMPLE_SUB_RECT_HEIGHT |
| 4 INT32 property value |
| |
| Errors |
| |
| None |
| |
| New State |
| |
| Get Value Get Command Type Initial Value Attribute |
| --------- ----------- ----- ------------- --------- |
| MULTISAMPLE_SUB_RECT_POSITION_SGIS GetIntegerv 2 x Z 0,0 multisample |
| |
| New Implementation Dependent State |
| |
| Get Value Get Command Type Minimum Value |
| --------- ----------- ----- ------------- |
| MULTISAMPLE_SUB_RECT_DIMS_SGIS GetIntegerv 2 x Z 0,0 |
| |