Convert ddraw.txt to ddraw.sgml and add it to the wine-devel
documentation.
diff --git a/documentation/ddraw.sgml b/documentation/ddraw.sgml
new file mode 100644
index 0000000..70e9965
--- /dev/null
+++ b/documentation/ddraw.sgml
@@ -0,0 +1,172 @@
+ <chapter id="ddraw">
+ <title>Outline of DirectDraw Architecture</title>
+
+ <para>
+ This is an outline of the architecture. Many details are
+ skipped, but hopefully this is useful.
+ </para>
+
+ <sect1 id="ddinheritance">
+ <title>DirectDraw inheritance tree</title>
+ <programlisting>
+ Main
+ |
+ User
+ |-----------\
+ XVidMode DGA2
+ </programlisting>
+ <para>
+ Most of the DirectDraw functionality is implemented in a common base
+ class. Derived classes are responsible for providing display
+ mode functions (Enum, Set, Restore), GetCaps, GetDevice identifier
+ and internal functions called to create primary and backbuffer
+ surfaces.
+ </para>
+ <para>
+ User provides for DirectDraw capabilities based on drawing to a
+ Wine window. It uses the User DirectDrawSurface implementation
+ for primary and backbuffer surfaces.
+ <para>
+ XVidMode attempt to use the XFree86 VidMode extension to set the
+ display resolution to match the parameters to SetDisplayMode.
+ </para>
+ <para>
+ DGA2 attempt to use the XFree86 DGA 2.x extension to set the
+ display resolution and direct access to the framebuffer, if the
+ full-screen-exclusive cooperative level is used. If not, it just
+ uses the User implementation.
+ </para>
+ </sect1>
+ <sect1 id="ddsurfaceinheritance">
+ <title>DirectDrawSurface inheritance tree</title>
+ <programlisting>
+ Main
+ |--------------\
+ | |
+ DIB Fake Z-Buffer
+ |
+ |------\---------\
+ | | |
+ User DGA2 DIBTexture
+ </programlisting>
+ <para>
+ Main provides a very simple base class that does not implement any of
+ the image-related functions. Therefore it does not place any
+ constraints on how the surface data is stored.
+ </para>
+ <para>
+ DIB stores the surface data in a DIB section. It is used by the Main
+ DirectDraw driver to create off-screen surfaces.
+ </para>
+ <para>
+ User implements primary and backbuffer surfaces for the User DirectDraw
+ driver. If it is a primary surface, it will attempt to keep itself
+ synchronized to the window.
+ </para>
+ <para>
+ DGA2 surfaces claims an appropriate section of framebuffer space and
+ lets DIB build its DIB section on top of it.
+ </para>
+ <para>
+ Fake Z-Buffer surfaces are used by Direct3D to indicate that a primary
+ surface has an associated z-buffer. For a first implementation, it
+ doesn't need to store any image data since it is just a placeholder.
+ </para>
+ <para>
+ (Actually 3D programs will rarely use Lock or GetDC on primary
+ surfaces, backbuffers or z-buffers so we may want to arrange for
+ lazy allocation of the DIB sections.)
+ </para>
+ </sect1>
+
+ <sect1 id="interfacethunks">
+ <title>Interface Thunks</title>
+ <para>
+ Only the most recent version of an interface needs to be implemented.
+ Other versions are handled by having thunks convert their parameters
+ and call the root version.
+ </para>
+ <para>
+ Not all interface versions have thunks. Some versions could be combined
+ because their parameters were compatible. For example if a structure
+ changes but the structure has a dwSize field, methods using that structure
+ are compatible, as long as the implementation remembers to take the dwSize
+ into account.
+ </para>
+ <para>
+ Interface thunks for Direct3D are more complicated since the paradigm
+ changed between versions.
+ </para>
+ </sect1>
+
+ <sect1 id="logicalobjectlayout">
+ <title>Logical Object Layout</title>
+ <para>
+ The objects are split into the generic part (essentially the fields for
+ Main) and a private part. This is necessary because some objects
+ can be created with CoCreateInstance, then Initialized later. Only
+ at initialization time do we know which class to use. Each class
+ except Main declares a Part structure and adds that to its Impl.
+ </para>
+ <para>
+ For example, the DIBTexture DirectDrawSurface implementation looks
+ like this:
+ </para>
+ <programlisting>
+ struct DIBTexture_DirectDrawSurfaceImpl_Part
+ {
+ union DIBTexture_data data; /*declared in the real header*/
+ };
+
+ typedef struct
+ {
+ struct DIB_DirectDrawSurfaceImpl_Part dib;
+ struct DIBTexture_DirectDrawSurfaceImpl_Part dibtexture;
+ } DIBTexture_DirectDrawSurfaceImpl;
+ </programlisting>
+ <para>
+ So the DIBTexture surface class is derived from the DIB surface
+ class and it adds one piece of data, a union.
+ </para>
+ <para>
+ Main does not have a Part structure. Its fields are stored in
+ IDirectDrawImpl/IDirectDrawSurfaceImpl.
+ </para>
+ <para>
+ To access private data, one says
+ </para>
+ <programlisting>
+ DIBTexture_DirectDrawSurfaceImpl* priv = This->private;
+ do_something_with(priv->dibtexture.data);
+ </programlisting>
+ </sect1>
+
+ <sect1 id="creatingobject">
+ <title>Creating Objects</title>
+ <para>
+ Classes have two functions relevant to object creation, Create and
+ Construct. To create a new object, the class' Create function is
+ called. It allocates enough memory for IDirectDrawImpl or
+ IDirectDrawSurfaceImpl as well as the private data for derived
+ classes and then calls Construct.
+ </para>
+ <para>
+ Each class's Construct function calls the base class's Construct,
+ then does the necessary initialization.
+ </para>
+ <para>
+ For example, creating a primary surface with the user ddraw driver
+ calls User_DirectDrawSurface_Create which allocates memory for the
+ object and calls User_DirectDrawSurface_Construct to initialize it.
+ This calls DIB_DirectDrawSurface_Construct which calls
+ Main_DirectDrawSurface_Construct.
+ </para>
+ </sect1>
+ </chapter>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-parent-document:("wine-devel.sgml" "set" "book" "chapter" "")
+End:
+-->