dmx: Ignore linuxdoc generated docs
dmx.txt and scaled.txt are generated from SGML, so they probably never should have been in version control in the first place. Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net> Acked-by: Peter Hutterer <peter.hutterer@who-t.net> Acked-by: Dan Nicholson <dbn.lists@gmail.com>
This commit is contained in:
		
							parent
							
								
									40972576b6
								
							
						
					
					
						commit
						3ba2ce5d10
					
				| 
						 | 
					@ -1,2 +1,10 @@
 | 
				
			||||||
#		Add & Override for this directory and it's subdirectories
 | 
					#		Add & Override for this directory and it's subdirectories
 | 
				
			||||||
html/
 | 
					html/
 | 
				
			||||||
 | 
					dmx.html
 | 
				
			||||||
 | 
					dmx.pdf
 | 
				
			||||||
 | 
					dmx.ps
 | 
				
			||||||
 | 
					dmx.txt
 | 
				
			||||||
 | 
					scaled.html
 | 
				
			||||||
 | 
					scaled.pdf
 | 
				
			||||||
 | 
					scaled.ps
 | 
				
			||||||
 | 
					scaled.txt
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2989
									
								
								hw/dmx/doc/dmx.txt
								
								
								
								
							
							
						
						
									
										2989
									
								
								hw/dmx/doc/dmx.txt
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -1,579 +0,0 @@
 | 
				
			||||||
  Scaled Window Support in DMX
 | 
					 | 
				
			||||||
  Rickard E. Faith and Kevin E. Martin
 | 
					 | 
				
			||||||
  15 October 2003 (created 19 September 2003)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  This document investigates the possibility of adding scaled window
 | 
					 | 
				
			||||||
  support to the DMX X server, thereby allowing a window or some
 | 
					 | 
				
			||||||
  selected part of the logical DMX area to be displayed using a scaling
 | 
					 | 
				
			||||||
  factor.  For example, this might allow the contents of a window to be
 | 
					 | 
				
			||||||
  magnified for easier viewing.  In particular, scaling for the VNC
 | 
					 | 
				
			||||||
  client is explored.  _C_o_p_y_r_i_g_h_t _2_0_0_3 _b_y _R_e_d _H_a_t_, _I_n_c_._, _R_a_l_e_i_g_h_, _N_o_r_t_h
 | 
					 | 
				
			||||||
  _C_a_r_o_l_i_n_a
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ______________________________________________________________________
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Table of Contents
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  1. Introduction
 | 
					 | 
				
			||||||
     1.1 DMX
 | 
					 | 
				
			||||||
     1.2 Problem Statement
 | 
					 | 
				
			||||||
     1.3 Task
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  2. Previous Work
 | 
					 | 
				
			||||||
     2.1 VNC
 | 
					 | 
				
			||||||
        2.1.1 Scaling under VNC
 | 
					 | 
				
			||||||
     2.2 The X Video Extension
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  3. Possible Solutions
 | 
					 | 
				
			||||||
     3.1 VNC-like Scaling
 | 
					 | 
				
			||||||
        3.1.1 Software Scaling
 | 
					 | 
				
			||||||
        3.1.2 Scaling with the X Video Extension
 | 
					 | 
				
			||||||
           3.1.2.1 Implementing the X Video Extension for DMX
 | 
					 | 
				
			||||||
           3.1.2.2 Supporting RGB formats for the X Video Extension
 | 
					 | 
				
			||||||
        3.1.3 Scaling with an XPutImageScaled Extension
 | 
					 | 
				
			||||||
        3.1.4 Scaling with an XCopyAreaScaled Extension
 | 
					 | 
				
			||||||
        3.1.5 Scaling with OpenGL
 | 
					 | 
				
			||||||
     3.2 Application-transparent Scaling for DMX
 | 
					 | 
				
			||||||
        3.2.1 Back-end Scaling Without Disconnect/Reconnect
 | 
					 | 
				
			||||||
        3.2.2 Back-end Scaling With Disconnect/Reconnect
 | 
					 | 
				
			||||||
        3.2.3 Server-side Scaling
 | 
					 | 
				
			||||||
     3.3 XCreateScaledWindow API
 | 
					 | 
				
			||||||
        3.3.1 XCreateWindow
 | 
					 | 
				
			||||||
        3.3.2 XSetWindowAttributes
 | 
					 | 
				
			||||||
        3.3.3 XGetWindowAttributes, XGetGeometry
 | 
					 | 
				
			||||||
        3.3.4 Popup and Child window positions
 | 
					 | 
				
			||||||
        3.3.5 Events
 | 
					 | 
				
			||||||
        3.3.6 Implementation
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  4. Conclusion and Recommendations
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ______________________________________________________________________
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  11..  IInnttrroodduuccttiioonn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  11..11..  DDMMXX
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The DMX X server (Xdmx) is a proxy server that is designed to allow X
 | 
					 | 
				
			||||||
  servers on multiple machines to be combined into a single multi-headed
 | 
					 | 
				
			||||||
  X server.  Combined with Xinerama, these heads can appear as a single
 | 
					 | 
				
			||||||
  very high-resolution screen.  Typical applications include the
 | 
					 | 
				
			||||||
  creation of a video wall with 16 1280x1024 displays arranged in a
 | 
					 | 
				
			||||||
  rectangle, for a total resolution of of 5120x4096.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  11..22..  PPrroobblleemm SSttaatteemmeenntt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Applications displayed on a physically large video wall that provides
 | 
					 | 
				
			||||||
  high pixel-resolution may be difficult to see, especially if the
 | 
					 | 
				
			||||||
  application is designed for use on a typical desktop computer with a
 | 
					 | 
				
			||||||
  relatively small display located close to the human operator.  The
 | 
					 | 
				
			||||||
  goal of this paper is to describe and discuss solutions to this
 | 
					 | 
				
			||||||
  problem.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The original driving problem for this work is to provide scaling for
 | 
					 | 
				
			||||||
  the vncviewer application when displayed using DMX (VNC scaling is
 | 
					 | 
				
			||||||
  currently available only with the Windows client, and there is no plan
 | 
					 | 
				
			||||||
  to extend that capability to other clients).  While this specific
 | 
					 | 
				
			||||||
  problem will be addressed in this paper, the general solution space
 | 
					 | 
				
			||||||
  will also be explored, since this may lead to a good solution not only
 | 
					 | 
				
			||||||
  for vncviewer but also for other applications.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  11..33..  TTaasskk
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  For reference, here is the original description of the task this paper
 | 
					 | 
				
			||||||
  addresses:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Scaled window support (for VNC)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  Investigate possibility of implementing a "scaled window"
 | 
					 | 
				
			||||||
        extension:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        +o  Add XCreateScaledWindow call that could be used in place of
 | 
					 | 
				
			||||||
           XCreateWindow
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        +o  All primitives drawn to scaled window would be scaled by
 | 
					 | 
				
			||||||
           appropriate (integral?) scaling factor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  Alternate approach: special case VNC support
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  22..  PPrreevviioouuss WWoorrkk
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  This section reviews relevant previous work.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  22..11..  VVNNCC
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  22..11..11..  SSccaalliinngg uunnddeerr VVNNCC
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  When using the vncviewer program for Windows, it is possible to
 | 
					 | 
				
			||||||
  specify a scaling factor (as numerator and denominator).  When scaling
 | 
					 | 
				
			||||||
  is in effect, the viewer software uses StretchBlt (instead of BitBlt)
 | 
					 | 
				
			||||||
  to display the pixels for the user.  When this call is made, the
 | 
					 | 
				
			||||||
  viewer already has received all of the pixel information (at full
 | 
					 | 
				
			||||||
  unscaled resolution).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The scaling in VNC is primitive.  It does not conserve bandwidth, it
 | 
					 | 
				
			||||||
  does not treat textual information differently (i.e., by using a
 | 
					 | 
				
			||||||
  suitably scaled font), and it does not provide any anti-aliasing other
 | 
					 | 
				
			||||||
  than that provided by the underlying (Windows-only) system library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  22..22..  TThhee XX VViiddeeoo EExxtteennssiioonn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The X Video Extension is a widely-available extension to the X11
 | 
					 | 
				
			||||||
  protocol that provides support for streaming video.  Integral to this
 | 
					 | 
				
			||||||
  support is the ability to arbitrarily scale the output.  In version
 | 
					 | 
				
			||||||
  2.2 of the X Video specification, support for scaled still images was
 | 
					 | 
				
			||||||
  provided, using both shared memory and traditional transport.  The API
 | 
					 | 
				
			||||||
  for this support uses calls that are quite similar to XCreateWindow,
 | 
					 | 
				
			||||||
  XPutImage, and XShmPutImage.  Currently, most of the drivers
 | 
					 | 
				
			||||||
  implemented in XFree86 only support data in various YUV formats.
 | 
					 | 
				
			||||||
  However, several modern video adaptors support RGB as well.
 | 
					 | 
				
			||||||
  Note, though, that the target output for this scaling is an overlay
 | 
					 | 
				
			||||||
  plane -- so X Video provides functionality that is fundamentally
 | 
					 | 
				
			||||||
  different from that provided by the Windows StrechBlt call.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..  PPoossssiibbllee SSoolluuttiioonnss
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  This section briefly discusses possible solutions, including major
 | 
					 | 
				
			||||||
  advantages and disadvantages from both the implementation and the end-
 | 
					 | 
				
			||||||
  user programmer standpoint.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..  VVNNCC--lliikkee SSccaalliinngg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..11..  SSooffttwwaarree SSccaalliinngg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The vncviewer application could be modified to provide software
 | 
					 | 
				
			||||||
  scaling.  This is not a general solution, but it does solve one of the
 | 
					 | 
				
			||||||
  goals of this work.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  A prototype of this solution was implemented and a patch against
 | 
					 | 
				
			||||||
  vnc-3.3.7-unixsrc is available in the dmx/external directory.  Because
 | 
					 | 
				
			||||||
  of limited time available for this work, all of the edge cases were
 | 
					 | 
				
			||||||
  not considered and the solution works well mainly for integer scaling.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Currently, vncviewer writes to the X display with XPutImage,
 | 
					 | 
				
			||||||
  XCopyArea, and XFillRectangle.  All instances of these calls have to
 | 
					 | 
				
			||||||
  be aware of scaling and must round correctly.  In the prototype
 | 
					 | 
				
			||||||
  solution, rounding is incorrect and can cause artifacts.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  A better solution would be to cache all updates to the desktop image
 | 
					 | 
				
			||||||
  in vncviewer and only send the damaged area to the X display with
 | 
					 | 
				
			||||||
  XPutImage.  This would allow the damaged area to be computed so that
 | 
					 | 
				
			||||||
  rounding errors do not create artifacts.  This method is probably
 | 
					 | 
				
			||||||
  similar to what is used in the Window client.  (The whole VNC suite is
 | 
					 | 
				
			||||||
  being re-written in C++ and the forthcoming version 4 has not been
 | 
					 | 
				
			||||||
  evaluated.)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..22..  SSccaalliinngg wwiitthh tthhee XX VViiddeeoo EExxtteennssiioonn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The scaling in the Windows vncviewer application makes use of a scaled
 | 
					 | 
				
			||||||
  blit that is supplied by the underlying system library.  Several video
 | 
					 | 
				
			||||||
  cards currently provide support for a scaled blit, and some X servers
 | 
					 | 
				
			||||||
  (including XFree86) expose this capability to applications via the
 | 
					 | 
				
			||||||
  XvPutImage interface of the X Video Extension.  The capability exposed
 | 
					 | 
				
			||||||
  by XvPutImage results in the scaled image being drawn to an overlay
 | 
					 | 
				
			||||||
  plane.  Most video cards also provide support for a scaled blit into
 | 
					 | 
				
			||||||
  the normal output planes, but this is not exposed via XvPutImage.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The vncviewer program could be modified to use the X Video Extension
 | 
					 | 
				
			||||||
  to provide scaling under X11 that is similar to the scaling currently
 | 
					 | 
				
			||||||
  provided under Windows.  Unfortunately, Xdmx does not currently export
 | 
					 | 
				
			||||||
  the X Video Extension, so this would not provide an immediate solution
 | 
					 | 
				
			||||||
  usable with DMX.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  A very early-stage proof-of-concept prototype was implemented and a
 | 
					 | 
				
			||||||
  preliminary patch against vnc-3.3.7-unixsrc is available in the
 | 
					 | 
				
			||||||
  dmx/external directory.  This prototype was implemented to better
 | 
					 | 
				
			||||||
  understand the problems that must be solved to make this solution
 | 
					 | 
				
			||||||
  viable:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  As noted under the software scaling section above, vncviewer writes
 | 
					 | 
				
			||||||
     to the X display with several different calls.  These calls write
 | 
					 | 
				
			||||||
     to the normal output planes and are compatible with XvPutImage,
 | 
					 | 
				
			||||||
     which writes to an overlay plane.  To eliminate artifacts caused by
 | 
					 | 
				
			||||||
     this problem, vncviewer should be modified so that a cached copy of
 | 
					 | 
				
			||||||
     the desktop is available, either as a client-side image or a
 | 
					 | 
				
			||||||
     server-side off-screen pixmap, so that XvPutImage would be the only
 | 
					 | 
				
			||||||
     method for writing to the X display.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     Although several modern graphics adaptors support hardware scaling
 | 
					 | 
				
			||||||
     using an RGB format (e.g., ATI Radeon, nVidia, etc.), XFree86
 | 
					 | 
				
			||||||
     drivers typically only implement YUV formats.  YUV generally
 | 
					 | 
				
			||||||
     compress the pixel information in some way.  For example, two
 | 
					 | 
				
			||||||
     commonly implemented formats, YUY2 and UYVY provide intensity
 | 
					 | 
				
			||||||
     information for every RGB pixel, but only provide chroma and
 | 
					 | 
				
			||||||
     luminance information for pairs of horizontal pixels.  Since VNC
 | 
					 | 
				
			||||||
     uses pixel-resolution for communicating updates on the wire,
 | 
					 | 
				
			||||||
     additional artifacts are introduced (because there may not be
 | 
					 | 
				
			||||||
     enough information from the wire to update a pair of pixels).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     Further, the well-known problem with YUV encoding is even more
 | 
					 | 
				
			||||||
     evident when the image is a desktop instead of a movie.  For
 | 
					 | 
				
			||||||
     example, consider a 1-pixel-wide vertical window border.  If the
 | 
					 | 
				
			||||||
     border changes in color but not intensity (e.g., because a window
 | 
					 | 
				
			||||||
     manager uses color to indicate focus), there may or may not be a
 | 
					 | 
				
			||||||
     change in the YUY2 image, depending on the algorithm used for RGB
 | 
					 | 
				
			||||||
     to YUV conversion and on how the border pixel is ordered in the
 | 
					 | 
				
			||||||
     pair of pixels used by the algorithm.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     Many of these artifacts could be eliminated if vncviewer cached a
 | 
					 | 
				
			||||||
     complete RGB image of the desktop, and only did the conversion to
 | 
					 | 
				
			||||||
     YUV for properly aligned areas of damage.  The remaining artifacts
 | 
					 | 
				
			||||||
     could be eliminated if an RGB format was used with X Video (which
 | 
					 | 
				
			||||||
     may require the extension of existing XFree86 drivers to support
 | 
					 | 
				
			||||||
     RGB).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Most modern video cards support exactly one overlay plane that is
 | 
					 | 
				
			||||||
     suitable for use with X Video.  Therefore, only one application can
 | 
					 | 
				
			||||||
     use X Video at any given time.  This is a severe limitation in a
 | 
					 | 
				
			||||||
     desktop environment.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..22..11..  IImmpplleemmeennttiinngg tthhee XX VViiddeeoo EExxtteennssiioonn ffoorr DDMMXX
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The user-level API for X Video is fairly simple, but the underlying
 | 
					 | 
				
			||||||
  support required for the full specification is large.  However, since
 | 
					 | 
				
			||||||
  the API provides a method to query supported capabilities, a usable
 | 
					 | 
				
			||||||
  subset of X Video can be implemented that would support XvPutImage and
 | 
					 | 
				
			||||||
  little else.  This would require support for the following:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  X Video Extension API calls, including the following:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvQueryExtension
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvQueryAdaptors
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvQueryPortAttributes
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvFreeAdaptorInfo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvListImageFormats
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvGrabPort
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvCreateImage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvPutImage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvShmCreateImage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     +o  XvShmPutImage
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Support for querying back-end X Video Extension capabilities.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Support for sending the image to the back-ends.  Because X Video
 | 
					 | 
				
			||||||
     requires sending full images, there may be a trade-off between
 | 
					 | 
				
			||||||
     bandwidth limitations and additional complexity to divide the image
 | 
					 | 
				
			||||||
     up such that is scales properly.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Possible support for a software fall-back.  For example, if all of
 | 
					 | 
				
			||||||
     the back-ends do not support the X Video Extension, software
 | 
					 | 
				
			||||||
     scaling can be implemented such that the image is sent to the back-
 | 
					 | 
				
			||||||
     end with XPutImage.  This pathway would have poor performance.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..22..22..  SSuuppppoorrttiinngg RRGGBB ffoorrmmaattss ffoorr tthhee XX VViiddeeoo EExxtteennssiioonn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Assuming an XFree86 driver already supports the X Video Extension, and
 | 
					 | 
				
			||||||
  assuming the target hardware supports an RGB format, then adding
 | 
					 | 
				
			||||||
  support for that format is relatively simple and straightforward.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..33..  SSccaalliinngg wwiitthh aann XXPPuuttIImmaaggeeSSccaalleedd EExxtteennssiioonn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Instead of (or in addition to) implementing the X Video Extension in
 | 
					 | 
				
			||||||
  DMX, one obvious solution would be to implement a new extension that
 | 
					 | 
				
			||||||
  provides access to hardware-assisted scaled blits, similar to the
 | 
					 | 
				
			||||||
  StretchBlt call available under Windows.  This call would scale RGB
 | 
					 | 
				
			||||||
  images and would not use the overlay plane (unlike the X Video
 | 
					 | 
				
			||||||
  Extension).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  This approach has many of the same advantages and disadvantages as the
 | 
					 | 
				
			||||||
  XCopyAreaScaled Extension, discussed in the next section.  Discussion
 | 
					 | 
				
			||||||
  of XPutImageScaled is deferred in favor of XCopyAreaScaled for the
 | 
					 | 
				
			||||||
  following reasons:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  XPutImageScaled can be emulated with XCopyAreaScaled by first using
 | 
					 | 
				
			||||||
     XPutImage to copy the image to an off-screen pixmap, and then
 | 
					 | 
				
			||||||
     calling XCopyAreaScaled between that off-screen pixmap and the
 | 
					 | 
				
			||||||
     target drawable.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Since XCopyAreaScaled would copy between two areas of on-screen or
 | 
					 | 
				
			||||||
     off-screen memory, it has additional uses and can be viewed as
 | 
					 | 
				
			||||||
     efficiently providing a superset of XPutImageScaled functionality.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..44..  SSccaalliinngg wwiitthh aann XXCCooppyyAArreeaaSSccaalleedd EExxtteennssiioonn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  As noted in the previous section, because XCopyAreaScaled provides a
 | 
					 | 
				
			||||||
  superset of the functionality provided by XPutImageScaled, we will
 | 
					 | 
				
			||||||
  consider this extension instead.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  First, XCopyAreaScaled would provide for RGB scaling between pixmaps
 | 
					 | 
				
			||||||
  (i.e., on-screen or off-screen areas of memory that reside on the
 | 
					 | 
				
			||||||
  video card).  Unlike the X Video Extension, which writes into an
 | 
					 | 
				
			||||||
  overlay plane, XCopyAreaScaled would write into the non-overlay areas
 | 
					 | 
				
			||||||
  of the screen.  Key points to consider are as follows:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Because different planes are involved, the two scaling operations
 | 
					 | 
				
			||||||
     are usually implemented in hardware differently, so an
 | 
					 | 
				
			||||||
     XCopyAreaScaled extension could be added in a manner that would
 | 
					 | 
				
			||||||
     neither conflict with nor interact with the X Video extension in
 | 
					 | 
				
			||||||
     any way.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  The XCopyAreaScaled extension provides new functionality that the X
 | 
					 | 
				
			||||||
     Video Extension does not provide.  Based on anecdotal feedback, we
 | 
					 | 
				
			||||||
     believe that many people outside the DMX and VNC communities would
 | 
					 | 
				
			||||||
     be excited about this extension.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  The main drawback to this extension is that it is new and needs to
 | 
					 | 
				
			||||||
     be implemented at the driver level in XFree86 for each video card
 | 
					 | 
				
			||||||
     to be supported.  At the present time, it is more likely that the X
 | 
					 | 
				
			||||||
     Video Extension will be implemented for a particular piece hardware
 | 
					 | 
				
			||||||
     because the X Video extension has multimedia uses.  However, over
 | 
					 | 
				
			||||||
     time, we would expect the XCopyAreaScaled extension to be
 | 
					 | 
				
			||||||
     implemented along with the X Video extension, especially if it
 | 
					 | 
				
			||||||
     becomes popular.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Another drawback is that not all modern cards provide support for a
 | 
					 | 
				
			||||||
     simple scaled blit operation.  However, these cards usually do
 | 
					 | 
				
			||||||
     provide a 3D pipeline which could be used to provide this
 | 
					 | 
				
			||||||
     functionality in a manner that is transparent to the client
 | 
					 | 
				
			||||||
     application that is using the XCopyAreaScaled extension.  However,
 | 
					 | 
				
			||||||
     this implementation pathway would make this extension somewhat more
 | 
					 | 
				
			||||||
     difficult to implement on certain cards.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..11..55..  SSccaalliinngg wwiitthh OOppeennGGLL
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Another general solution to the scaling problem is to use the texture
 | 
					 | 
				
			||||||
  scaling found in all 3D hardware.  This ability is already exposed
 | 
					 | 
				
			||||||
  through OpenGL and can be exploited by clients without X server
 | 
					 | 
				
			||||||
  modification (i.e., other than the ability to support OpenGL).  An
 | 
					 | 
				
			||||||
  application using OpenGL would transmit the non-scaled image to the X
 | 
					 | 
				
			||||||
  server as a texture, and would then display a single non-transformed
 | 
					 | 
				
			||||||
  rect using that texture.  This also works around the single overlay
 | 
					 | 
				
			||||||
  problem with the X Video Extension as well as the need to implement
 | 
					 | 
				
			||||||
  additional scaled primitive extensions.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The downside is that most OpenGL implementations require power of 2
 | 
					 | 
				
			||||||
  texture sizes and this can be very wasteful of memory if, for example,
 | 
					 | 
				
			||||||
  the application needs to scale a 1025x1025 image, which would require
 | 
					 | 
				
			||||||
  a 2048x2048 texture area (even a 640x480 image would require a
 | 
					 | 
				
			||||||
  1024x512 texture).  Another downside is that some OpenGL
 | 
					 | 
				
			||||||
  implementations have a limited about of texture memory and cannot
 | 
					 | 
				
			||||||
  handle textures that are very large.  For example, they might limit
 | 
					 | 
				
			||||||
  the texture size to 1024x1024.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..22..  AApppplliiccaattiioonn--ttrraannssppaarreenntt SSccaalliinngg ffoorr DDMMXX
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..22..11..  BBaacckk--eenndd SSccaalliinngg WWiitthhoouutt DDiissccoonnnneecctt//RReeccoonnnneecctt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  VNC does scaling on the client side (in the vncviewer application).
 | 
					 | 
				
			||||||
  Implementing a similar solution for DMX would require support in the
 | 
					 | 
				
			||||||
  back-end X servers and, therefore, is not a general solution.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  XFree86 already implements some support for "scaling" that could be
 | 
					 | 
				
			||||||
  used with DMX: if, in the XF86Config file, multiple Modes are listed
 | 
					 | 
				
			||||||
  in the Display Subsection of the Screen Section, then pressing Ctrl-
 | 
					 | 
				
			||||||
  Alt-Plus and Ctrl-Alt-Minus can be used to iterate through the listed
 | 
					 | 
				
			||||||
  modes.  The display dimensions will change to the dimensions in the
 | 
					 | 
				
			||||||
  Modes line, but the logical dimensions of the X server (i.e., the
 | 
					 | 
				
			||||||
  dimensions that Xdmx knows about) will not change.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Further, the dimensions of the XFree86 display are under software
 | 
					 | 
				
			||||||
  control (via the XFree86-VidModeExtension), so the Xdmx server could
 | 
					 | 
				
			||||||
  change the screen dimensions on a per-display basis, thereby scaling
 | 
					 | 
				
			||||||
  the information on part of that display.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  However, this scaling appears to have limited use.  For example,
 | 
					 | 
				
			||||||
  assume a 4 by 4 display wall consisting of 16 1280x1024 displays.  If
 | 
					 | 
				
			||||||
  all of the back-end servers were simultaneously configured to display
 | 
					 | 
				
			||||||
  640x480, the left hand corner of each display would be magnified, but
 | 
					 | 
				
			||||||
  the composite result would be unreadable.  Magnifying one display at a
 | 
					 | 
				
			||||||
  time could be usable, but could have limited utility, since the result
 | 
					 | 
				
			||||||
  would still be no larger than a single display.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..22..22..  BBaacckk--eenndd SSccaalliinngg WWiitthh DDiissccoonnnneecctt//RReeccoonnnneecctt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Disconnect and reconnect features are not currently supported in DMX,
 | 
					 | 
				
			||||||
  but are scheduled to be implemented in the future.  These features,
 | 
					 | 
				
			||||||
  combined with the XFree86-VidModeExtension Extension, would allow an
 | 
					 | 
				
			||||||
  application to do the following:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Disconnect a specific back-end server (via the DMX Extension),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  reconfigure the XFree86 back-end server resolution, and
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  reconnect the back-end server to DMX -- at a new origin with the
 | 
					 | 
				
			||||||
     new screen resolution.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  For example, consider a display wall consisting of 16 1280x1024
 | 
					 | 
				
			||||||
  displays with a total resolution of 5120x4096.  All of the screens
 | 
					 | 
				
			||||||
  could be disconnected, repositioned, and reconnected each at a
 | 
					 | 
				
			||||||
  resolution of 640x480.  The total resolution of the display wall would
 | 
					 | 
				
			||||||
  be 2560x1920, allowing a view of a selected area approximately one-
 | 
					 | 
				
			||||||
  fourth of the size of the DMX display.  This change would be
 | 
					 | 
				
			||||||
  completely application independent (except, perhaps, for a DMX-aware
 | 
					 | 
				
			||||||
  window manager).  When work at the increased resolution was completed,
 | 
					 | 
				
			||||||
  the back-end servers could be disconnected, reconfigured, and
 | 
					 | 
				
			||||||
  reconnected for the original 5120x4096 view.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Support for this type of scaling can be implemented in a DMX-aware X11
 | 
					 | 
				
			||||||
  client assuming the DMX server support arbitrary disconnect and
 | 
					 | 
				
			||||||
  reconnect semantics.  Because this application cannot be written
 | 
					 | 
				
			||||||
  before disconnect/reconnect is implemented, this solution will not be
 | 
					 | 
				
			||||||
  discussed further in this paper.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..22..33..  SSeerrvveerr--ssiiddee SSccaalliinngg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  In earlier versions of DMX, a frame buffer was maintained on the
 | 
					 | 
				
			||||||
  server side, and XPutImage was used to move the information from the
 | 
					 | 
				
			||||||
  server to the client (similar to some early VNC implementations).  The
 | 
					 | 
				
			||||||
  use of a server-side frame buffer would allow the server to do
 | 
					 | 
				
			||||||
  scaling, but is not a recommended solution because of overall
 | 
					 | 
				
			||||||
  performance issues and server-side memory issues (i.e., the frame
 | 
					 | 
				
			||||||
  buffer would be very large for large display walls).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Exploration of this path is not recommended.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..33..  XXCCrreeaatteeSSccaalleeddWWiinnddooww AAPPII
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The implementation of X Video Extension in DMX, and the use of
 | 
					 | 
				
			||||||
  XvPutImage by applications requiring scaling requires significant
 | 
					 | 
				
			||||||
  changes in DMX Further, XvPutImage is, essentially a scaled blit, and
 | 
					 | 
				
			||||||
  it is only useful for applications which are already using (or can be
 | 
					 | 
				
			||||||
  modified to use) XPutImage.  Therefore, a more general API will be
 | 
					 | 
				
			||||||
  discussed as another possibility.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  X applications typically create windows with the XCreateWindow call.
 | 
					 | 
				
			||||||
  A new extension could provide an XCreateScaledWindow call that could
 | 
					 | 
				
			||||||
  be used in place of the XCreateWindow call and be otherwise
 | 
					 | 
				
			||||||
  transparent to the application.  This would allow applications, even
 | 
					 | 
				
			||||||
  those that do not depend on XPutImage, to take advantage of window
 | 
					 | 
				
			||||||
  scaling.  In this section we describe how the call would work, what
 | 
					 | 
				
			||||||
  transparency it provides, and how to solve the potential problems that
 | 
					 | 
				
			||||||
  transparency creates.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..33..11..  XXCCrreeaatteeWWiinnddooww
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The XCreateWindow call takes width and height as parameters.  An
 | 
					 | 
				
			||||||
  XCreateScaledWindow call could take all the same parameters, with the
 | 
					 | 
				
			||||||
  addition of a scaling factor.
 | 
					 | 
				
			||||||
  33..33..22..  XXSSeettWWiinnddoowwAAttttrriibbuutteess
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  An X11 window has several attributes that would have to be scaled:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Background and border pixmaps
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Border width
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  +o  Cursor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..33..33..  XXGGeettWWiinnddoowwAAttttrriibbuutteess,, XXGGeettGGeeoommeettrryy
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  For transparency, calls that query the window attributes should return
 | 
					 | 
				
			||||||
  unscaled information.  This suggests that all unscaled pixmaps and
 | 
					 | 
				
			||||||
  window attributes should be cached.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Unfortunately, a window manager requires the scaled geometry to
 | 
					 | 
				
			||||||
  properly decorate the window.  The X server can probably determine
 | 
					 | 
				
			||||||
  which client is acting as the window manager (e.g., because that
 | 
					 | 
				
			||||||
  client will select events that are used exclusively by the window
 | 
					 | 
				
			||||||
  manager).  However, other Scaled Window Extension aware clients may
 | 
					 | 
				
			||||||
  also need to determine the scaled geometry.  Therefore, at least two
 | 
					 | 
				
			||||||
  additional extension calls should be implemented:
 | 
					 | 
				
			||||||
  XGetScaledWindowAttributes and XGetScaledGeometry.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..33..44..  PPooppuupp aanndd CChhiilldd wwiinnddooww ppoossiittiioonnss
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Some applications may position popup and child windows based on an
 | 
					 | 
				
			||||||
  unscaled notion of the main window geometry.  In this case, additional
 | 
					 | 
				
			||||||
  modifications to the client would be required.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..33..55..  EEvveennttss
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Most events (e.g., for mouse motion) return information about the
 | 
					 | 
				
			||||||
  coordinates at which the even occurred.  These coordinates would have
 | 
					 | 
				
			||||||
  to be modified so that unscaled values were presented to the client.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  33..33..66..  IImmpplleemmeennttaattiioonn
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  There are many implementation issues, some of which are similar to the
 | 
					 | 
				
			||||||
  issues involved in implementing the X Video Extension for DMX.  The
 | 
					 | 
				
			||||||
  window contents must be scaled, either by performing all operations to
 | 
					 | 
				
			||||||
  a frame buffer and then writing the image to the display (perhaps
 | 
					 | 
				
			||||||
  using hardware scaling support), or by modifying all of the various
 | 
					 | 
				
			||||||
  drawing operations to perform scaling.  Because of the complexity
 | 
					 | 
				
			||||||
  involved, the frame buffer option is recommended.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  44..  CCoonncclluussiioonn aanndd RReeccoommmmeennddaattiioonnss
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  We recommend a three phase implementation strategy, based on how an
 | 
					 | 
				
			||||||
  application could be written to take advantage of scaling:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     The XCopyAreaScaled extension should be implemented, since this is
 | 
					 | 
				
			||||||
     the ideal solution for applications like VNC, and since making use
 | 
					 | 
				
			||||||
     of this extension will require minimal changes to applications that
 | 
					 | 
				
			||||||
     already use XPutImage or XCopyArea.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     The initial implementation work would include the design of the X
 | 
					 | 
				
			||||||
     protocol extension, writing this up in the usual format for
 | 
					 | 
				
			||||||
     extension documentation, implementation of the protocol transport
 | 
					 | 
				
			||||||
     pieces in XFree86, implementation of a software fall-back in
 | 
					 | 
				
			||||||
     XFree86 and DMX, one example hardware implementation for XFree86,
 | 
					 | 
				
			||||||
     and implementation of support for this extension in DMX.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     We suggest implementing the extension first on the ATI Radeon
 | 
					 | 
				
			||||||
     cards.  However, since these cards do not provide a 2D scaled blit
 | 
					 | 
				
			||||||
     primitive, the implementation would have to make use of the 3D
 | 
					 | 
				
			||||||
     texture engine to emulate a scaled blit.  This is recommended,
 | 
					 | 
				
			||||||
     since other modern graphics cards also do not provide a simple 2D
 | 
					 | 
				
			||||||
     scaled blit operation and an example of the more difficult
 | 
					 | 
				
			||||||
     implementation pathway would be helpful to others.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     Until XCopyAreaScaled is widely supported, applications that
 | 
					 | 
				
			||||||
     require scaling will have to fall back to another scaling method.
 | 
					 | 
				
			||||||
     We suggest OpenGL as the first fall-back method because it is
 | 
					 | 
				
			||||||
     widely available and supported by DMX.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     A project centered around OpenGL-based scaling would implement this
 | 
					 | 
				
			||||||
     scaling in VNC as an example.  This work would include re-writing
 | 
					 | 
				
			||||||
     the vncviewer rendering engine to cache a master copy of the
 | 
					 | 
				
			||||||
     desktop image for all operations.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  3.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     Since OpenGL is not implemented everywhere, and may not provide
 | 
					 | 
				
			||||||
     hardware-assisted performance in every implementation, an
 | 
					 | 
				
			||||||
     application that requires scaling should also fall back to using
 | 
					 | 
				
			||||||
     the X Video Extension.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     This project would add support for the X Video Extension to DMX and
 | 
					 | 
				
			||||||
     would add support to VNC to take advantage of this extension
 | 
					 | 
				
			||||||
     without introducing artifacts.  This would require modifying the
 | 
					 | 
				
			||||||
     vncviewer rendering engine to cache a master copy of the desktop
 | 
					 | 
				
			||||||
     image for all operations.  This project should also add support for
 | 
					 | 
				
			||||||
     the RGB format to at least one XFree86 driver (e.g., ATI Radeon).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     The X Video Extension is one of the few popular extensions that DMX
 | 
					 | 
				
			||||||
     does not support.  We recommend implementing the X Video Extension
 | 
					 | 
				
			||||||
     even if scaling is the specific goal of that work.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  We do nnoott recommend implementation of the XCreateScaledWindow
 | 
					 | 
				
			||||||
  extension because of the complexity involved.  We do nnoott recommend
 | 
					 | 
				
			||||||
  implementation of the XPutImageScaled extension because it requires
 | 
					 | 
				
			||||||
  the same amount of work as the XCopyAreaScaled extension, but provides
 | 
					 | 
				
			||||||
  less functionality.  Further, server-side scaling with a large frame
 | 
					 | 
				
			||||||
  buffer is nnoott recommended because of the performance implications.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  The back-end scaling, especially with disconnect/reconnect support
 | 
					 | 
				
			||||||
  should be explored in the future after disconnect/reconnect is
 | 
					 | 
				
			||||||
  implemented, but not at the present time.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue