gdi: Port of the gdi mesa driver to gallium (Alan Hourihane).
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Mon, 2 Jun 2008 15:03:17 +0000 (00:03 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Mon, 2 Jun 2008 15:05:54 +0000 (00:05 +0900)
src/gallium/winsys/gdi/SConscript [new file with mode: 0644]
src/gallium/winsys/gdi/colors.h [new file with mode: 0644]
src/gallium/winsys/gdi/opengl32.def [new file with mode: 0644]
src/gallium/winsys/gdi/wgl.c [new file with mode: 0644]
src/gallium/winsys/gdi/wmesa.c [new file with mode: 0644]
src/gallium/winsys/gdi/wmesadef.h [new file with mode: 0644]

diff --git a/src/gallium/winsys/gdi/SConscript b/src/gallium/winsys/gdi/SConscript
new file mode 100644 (file)
index 0000000..170fdf5
--- /dev/null
@@ -0,0 +1,33 @@
+#######################################################################
+# SConscript for gdi winsys
+
+Import('*')
+
+if env['platform'] == 'windows':
+
+       env = env.Clone()
+
+       env.Append(CPPPATH = [
+               '#src/mesa/glapi',
+               '#src/mesa',
+               '#src/mesa/main',
+       ])
+
+       sources = [
+               'opengl32.def',
+               'wgl.c',
+               'wmesa.c',
+       ]
+               
+       drivers = [
+               softpipe,
+       ]
+
+       env.Append(LIBS = ['gdi32', 'user32'])
+
+       # TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions
+       env.SharedLibrary(
+               target ='opengl32',
+               source = sources,
+               LIBS = glapi + mesa + drivers + auxiliaries + env['LIBS'],
+       )
diff --git a/src/gallium/winsys/gdi/colors.h b/src/gallium/winsys/gdi/colors.h
new file mode 100644 (file)
index 0000000..03e512c
--- /dev/null
@@ -0,0 +1,29 @@
+/* Values for wmesa->pixelformat: */
+
+#define PF_8A8B8G8R    3       /* 32-bit TrueColor:  8-A, 8-B, 8-G, 8-R */
+#define PF_8R8G8B      4       /* 32-bit TrueColor:  8-R, 8-G, 8-B */
+#define PF_5R6G5B      5       /* 16-bit TrueColor:  5-R, 6-G, 5-B bits */
+#define PF_DITHER8     6       /* Dithered RGB using a lookup table */
+#define PF_LOOKUP      7       /* Undithered RGB using a lookup table */
+#define PF_GRAYSCALE   10      /* Grayscale or StaticGray */
+#define PF_BADFORMAT   11
+#define PF_INDEX8      12
+
+
+#define BGR8(r,g,b) (unsigned)(((BYTE)((b & 0xc0) | ((g & 0xe0)>>2) | \
+                                      ((r & 0xe0)>>5))))
+
+/* Windows uses 5,5,5 for 16-bit */
+#define BGR16(r,g,b) (  (((unsigned short)b       ) >> 3) | \
+                        (((unsigned short)g & 0xf8) << 2) | \
+                        (((unsigned short)r & 0xf8) << 7) )
+
+#define BGR24(r,g,b) (unsigned long)((DWORD)(((BYTE)(b)| \
+                                    ((WORD)((BYTE)(g))<<8))| \
+                                    (((DWORD)(BYTE)(r))<<16)))
+
+#define BGR32(r,g,b) (unsigned long)((DWORD)(((BYTE)(b)| \
+                                    ((WORD)((BYTE)(g))<<8))| \
+                                    (((DWORD)(BYTE)(r))<<16)))
+
+
diff --git a/src/gallium/winsys/gdi/opengl32.def b/src/gallium/winsys/gdi/opengl32.def
new file mode 100644 (file)
index 0000000..54e72f5
--- /dev/null
@@ -0,0 +1,859 @@
+; DO NOT EDIT - This file generated automatically by mesadef.py script
+;DESCRIPTION 'Mesa (OpenGL work-alike) for Win32'
+VERSION 6.5
+;
+; Module definition file for Mesa (OPENGL32.DLL)
+;
+; Note: The OpenGL functions use the STDCALL
+; function calling convention.  Microsoft's
+; OPENGL32 uses this convention and so must the
+; Mesa OPENGL32 so that the Mesa DLL can be used
+; as a drop-in replacement.
+;
+; The linker exports STDCALL entry points with
+; 'decorated' names; e.g., _glBegin@0, where the
+; trailing number is the number of bytes of 
+; parameter data pushed onto the stack.  The
+; callee is responsible for popping this data
+; off the stack, usually via a RETF n instruction.
+;
+; However, the Microsoft OPENGL32.DLL does not export
+; the decorated names, even though the calling convention
+; is STDCALL.  So, this module definition file is
+; needed to force the Mesa OPENGL32.DLL to export the
+; symbols in the same manner as the Microsoft DLL.
+; Were it not for this problem, this file would not
+; be needed (for the gl* functions) since the entry
+; points are compiled with dllexport declspec.
+;
+; However, this file is still needed to export "internal"
+; Mesa symbols for the benefit of the OSMESA32.DLL.
+;
+EXPORTS
+       glNewList
+       glEndList
+       glCallList
+       glCallLists
+       glDeleteLists
+       glGenLists
+       glListBase
+       glBegin
+       glBitmap
+       glColor3b
+       glColor3bv
+       glColor3d
+       glColor3dv
+       glColor3f
+       glColor3fv
+       glColor3i
+       glColor3iv
+       glColor3s
+       glColor3sv
+       glColor3ub
+       glColor3ubv
+       glColor3ui
+       glColor3uiv
+       glColor3us
+       glColor3usv
+       glColor4b
+       glColor4bv
+       glColor4d
+       glColor4dv
+       glColor4f
+       glColor4fv
+       glColor4i
+       glColor4iv
+       glColor4s
+       glColor4sv
+       glColor4ub
+       glColor4ubv
+       glColor4ui
+       glColor4uiv
+       glColor4us
+       glColor4usv
+       glEdgeFlag
+       glEdgeFlagv
+       glEnd
+       glIndexd
+       glIndexdv
+       glIndexf
+       glIndexfv
+       glIndexi
+       glIndexiv
+       glIndexs
+       glIndexsv
+       glNormal3b
+       glNormal3bv
+       glNormal3d
+       glNormal3dv
+       glNormal3f
+       glNormal3fv
+       glNormal3i
+       glNormal3iv
+       glNormal3s
+       glNormal3sv
+       glRasterPos2d
+       glRasterPos2dv
+       glRasterPos2f
+       glRasterPos2fv
+       glRasterPos2i
+       glRasterPos2iv
+       glRasterPos2s
+       glRasterPos2sv
+       glRasterPos3d
+       glRasterPos3dv
+       glRasterPos3f
+       glRasterPos3fv
+       glRasterPos3i
+       glRasterPos3iv
+       glRasterPos3s
+       glRasterPos3sv
+       glRasterPos4d
+       glRasterPos4dv
+       glRasterPos4f
+       glRasterPos4fv
+       glRasterPos4i
+       glRasterPos4iv
+       glRasterPos4s
+       glRasterPos4sv
+       glRectd
+       glRectdv
+       glRectf
+       glRectfv
+       glRecti
+       glRectiv
+       glRects
+       glRectsv
+       glTexCoord1d
+       glTexCoord1dv
+       glTexCoord1f
+       glTexCoord1fv
+       glTexCoord1i
+       glTexCoord1iv
+       glTexCoord1s
+       glTexCoord1sv
+       glTexCoord2d
+       glTexCoord2dv
+       glTexCoord2f
+       glTexCoord2fv
+       glTexCoord2i
+       glTexCoord2iv
+       glTexCoord2s
+       glTexCoord2sv
+       glTexCoord3d
+       glTexCoord3dv
+       glTexCoord3f
+       glTexCoord3fv
+       glTexCoord3i
+       glTexCoord3iv
+       glTexCoord3s
+       glTexCoord3sv
+       glTexCoord4d
+       glTexCoord4dv
+       glTexCoord4f
+       glTexCoord4fv
+       glTexCoord4i
+       glTexCoord4iv
+       glTexCoord4s
+       glTexCoord4sv
+       glVertex2d
+       glVertex2dv
+       glVertex2f
+       glVertex2fv
+       glVertex2i
+       glVertex2iv
+       glVertex2s
+       glVertex2sv
+       glVertex3d
+       glVertex3dv
+       glVertex3f
+       glVertex3fv
+       glVertex3i
+       glVertex3iv
+       glVertex3s
+       glVertex3sv
+       glVertex4d
+       glVertex4dv
+       glVertex4f
+       glVertex4fv
+       glVertex4i
+       glVertex4iv
+       glVertex4s
+       glVertex4sv
+       glClipPlane
+       glColorMaterial
+       glCullFace
+       glFogf
+       glFogfv
+       glFogi
+       glFogiv
+       glFrontFace
+       glHint
+       glLightf
+       glLightfv
+       glLighti
+       glLightiv
+       glLightModelf
+       glLightModelfv
+       glLightModeli
+       glLightModeliv
+       glLineStipple
+       glLineWidth
+       glMaterialf
+       glMaterialfv
+       glMateriali
+       glMaterialiv
+       glPointSize
+       glPolygonMode
+       glPolygonStipple
+       glScissor
+       glShadeModel
+       glTexParameterf
+       glTexParameterfv
+       glTexParameteri
+       glTexParameteriv
+       glTexImage1D
+       glTexImage2D
+       glTexEnvf
+       glTexEnvfv
+       glTexEnvi
+       glTexEnviv
+       glTexGend
+       glTexGendv
+       glTexGenf
+       glTexGenfv
+       glTexGeni
+       glTexGeniv
+       glFeedbackBuffer
+       glSelectBuffer
+       glRenderMode
+       glInitNames
+       glLoadName
+       glPassThrough
+       glPopName
+       glPushName
+       glDrawBuffer
+       glClear
+       glClearAccum
+       glClearIndex
+       glClearColor
+       glClearStencil
+       glClearDepth
+       glStencilMask
+       glColorMask
+       glDepthMask
+       glIndexMask
+       glAccum
+       glDisable
+       glEnable
+       glFinish
+       glFlush
+       glPopAttrib
+       glPushAttrib
+       glMap1d
+       glMap1f
+       glMap2d
+       glMap2f
+       glMapGrid1d
+       glMapGrid1f
+       glMapGrid2d
+       glMapGrid2f
+       glEvalCoord1d
+       glEvalCoord1dv
+       glEvalCoord1f
+       glEvalCoord1fv
+       glEvalCoord2d
+       glEvalCoord2dv
+       glEvalCoord2f
+       glEvalCoord2fv
+       glEvalMesh1
+       glEvalPoint1
+       glEvalMesh2
+       glEvalPoint2
+       glAlphaFunc
+       glBlendFunc
+       glLogicOp
+       glStencilFunc
+       glStencilOp
+       glDepthFunc
+       glPixelZoom
+       glPixelTransferf
+       glPixelTransferi
+       glPixelStoref
+       glPixelStorei
+       glPixelMapfv
+       glPixelMapuiv
+       glPixelMapusv
+       glReadBuffer
+       glCopyPixels
+       glReadPixels
+       glDrawPixels
+       glGetBooleanv
+       glGetClipPlane
+       glGetDoublev
+       glGetError
+       glGetFloatv
+       glGetIntegerv
+       glGetLightfv
+       glGetLightiv
+       glGetMapdv
+       glGetMapfv
+       glGetMapiv
+       glGetMaterialfv
+       glGetMaterialiv
+       glGetPixelMapfv
+       glGetPixelMapuiv
+       glGetPixelMapusv
+       glGetPolygonStipple
+       glGetString
+       glGetTexEnvfv
+       glGetTexEnviv
+       glGetTexGendv
+       glGetTexGenfv
+       glGetTexGeniv
+       glGetTexImage
+       glGetTexParameterfv
+       glGetTexParameteriv
+       glGetTexLevelParameterfv
+       glGetTexLevelParameteriv
+       glIsEnabled
+       glIsList
+       glDepthRange
+       glFrustum
+       glLoadIdentity
+       glLoadMatrixf
+       glLoadMatrixd
+       glMatrixMode
+       glMultMatrixf
+       glMultMatrixd
+       glOrtho
+       glPopMatrix
+       glPushMatrix
+       glRotated
+       glRotatef
+       glScaled
+       glScalef
+       glTranslated
+       glTranslatef
+       glViewport
+       glArrayElement
+       glColorPointer
+       glDisableClientState
+       glDrawArrays
+       glDrawElements
+       glEdgeFlagPointer
+       glEnableClientState
+       glGetPointerv
+       glIndexPointer
+       glInterleavedArrays
+       glNormalPointer
+       glTexCoordPointer
+       glVertexPointer
+       glPolygonOffset
+       glCopyTexImage1D
+       glCopyTexImage2D
+       glCopyTexSubImage1D
+       glCopyTexSubImage2D
+       glTexSubImage1D
+       glTexSubImage2D
+       glAreTexturesResident
+       glBindTexture
+       glDeleteTextures
+       glGenTextures
+       glIsTexture
+       glPrioritizeTextures
+       glIndexub
+       glIndexubv
+       glPopClientAttrib
+       glPushClientAttrib
+       glBlendColor
+       glBlendEquation
+       glDrawRangeElements
+       glColorTable
+       glColorTableParameterfv
+       glColorTableParameteriv
+       glCopyColorTable
+       glGetColorTable
+       glGetColorTableParameterfv
+       glGetColorTableParameteriv
+       glColorSubTable
+       glCopyColorSubTable
+       glConvolutionFilter1D
+       glConvolutionFilter2D
+       glConvolutionParameterf
+       glConvolutionParameterfv
+       glConvolutionParameteri
+       glConvolutionParameteriv
+       glCopyConvolutionFilter1D
+       glCopyConvolutionFilter2D
+       glGetConvolutionFilter
+       glGetConvolutionParameterfv
+       glGetConvolutionParameteriv
+       glGetSeparableFilter
+       glSeparableFilter2D
+       glGetHistogram
+       glGetHistogramParameterfv
+       glGetHistogramParameteriv
+       glGetMinmax
+       glGetMinmaxParameterfv
+       glGetMinmaxParameteriv
+       glHistogram
+       glMinmax
+       glResetHistogram
+       glResetMinmax
+       glTexImage3D
+       glTexSubImage3D
+       glCopyTexSubImage3D
+       glActiveTextureARB
+       glClientActiveTextureARB
+       glMultiTexCoord1dARB
+       glMultiTexCoord1dvARB
+       glMultiTexCoord1fARB
+       glMultiTexCoord1fvARB
+       glMultiTexCoord1iARB
+       glMultiTexCoord1ivARB
+       glMultiTexCoord1sARB
+       glMultiTexCoord1svARB
+       glMultiTexCoord2dARB
+       glMultiTexCoord2dvARB
+       glMultiTexCoord2fARB
+       glMultiTexCoord2fvARB
+       glMultiTexCoord2iARB
+       glMultiTexCoord2ivARB
+       glMultiTexCoord2sARB
+       glMultiTexCoord2svARB
+       glMultiTexCoord3dARB
+       glMultiTexCoord3dvARB
+       glMultiTexCoord3fARB
+       glMultiTexCoord3fvARB
+       glMultiTexCoord3iARB
+       glMultiTexCoord3ivARB
+       glMultiTexCoord3sARB
+       glMultiTexCoord3svARB
+       glMultiTexCoord4dARB
+       glMultiTexCoord4dvARB
+       glMultiTexCoord4fARB
+       glMultiTexCoord4fvARB
+       glMultiTexCoord4iARB
+       glMultiTexCoord4ivARB
+       glMultiTexCoord4sARB
+       glMultiTexCoord4svARB
+       glLoadTransposeMatrixfARB
+       glLoadTransposeMatrixdARB
+       glMultTransposeMatrixfARB
+       glMultTransposeMatrixdARB
+       glSampleCoverageARB
+       glCompressedTexImage3DARB
+       glCompressedTexImage2DARB
+       glCompressedTexImage1DARB
+       glCompressedTexSubImage3DARB
+       glCompressedTexSubImage2DARB
+       glCompressedTexSubImage1DARB
+       glGetCompressedTexImageARB
+       glActiveTexture
+       glClientActiveTexture
+       glMultiTexCoord1d
+       glMultiTexCoord1dv
+       glMultiTexCoord1f
+       glMultiTexCoord1fv
+       glMultiTexCoord1i
+       glMultiTexCoord1iv
+       glMultiTexCoord1s
+       glMultiTexCoord1sv
+       glMultiTexCoord2d
+       glMultiTexCoord2dv
+       glMultiTexCoord2f
+       glMultiTexCoord2fv
+       glMultiTexCoord2i
+       glMultiTexCoord2iv
+       glMultiTexCoord2s
+       glMultiTexCoord2sv
+       glMultiTexCoord3d
+       glMultiTexCoord3dv
+       glMultiTexCoord3f
+       glMultiTexCoord3fv
+       glMultiTexCoord3i
+       glMultiTexCoord3iv
+       glMultiTexCoord3s
+       glMultiTexCoord3sv
+       glMultiTexCoord4d
+       glMultiTexCoord4dv
+       glMultiTexCoord4f
+       glMultiTexCoord4fv
+       glMultiTexCoord4i
+       glMultiTexCoord4iv
+       glMultiTexCoord4s
+       glMultiTexCoord4sv
+       glLoadTransposeMatrixf
+       glLoadTransposeMatrixd
+       glMultTransposeMatrixf
+       glMultTransposeMatrixd
+       glSampleCoverage
+       glCompressedTexImage3D
+       glCompressedTexImage2D
+       glCompressedTexImage1D
+       glCompressedTexSubImage3D
+       glCompressedTexSubImage2D
+       glCompressedTexSubImage1D
+       glGetCompressedTexImage
+       glBlendColorEXT
+       glPolygonOffsetEXT
+       glTexImage3DEXT
+       glTexSubImage3DEXT
+       glTexSubImage1DEXT
+       glTexSubImage2DEXT
+       glCopyTexImage1DEXT
+       glCopyTexImage2DEXT
+       glCopyTexSubImage1DEXT
+       glCopyTexSubImage2DEXT
+       glCopyTexSubImage3DEXT
+       glAreTexturesResidentEXT
+       glBindTextureEXT
+       glDeleteTexturesEXT
+       glGenTexturesEXT
+       glIsTextureEXT
+       glPrioritizeTexturesEXT
+       glArrayElementEXT
+       glColorPointerEXT
+       glDrawArraysEXT
+       glEdgeFlagPointerEXT
+       glGetPointervEXT
+       glIndexPointerEXT
+       glNormalPointerEXT
+       glTexCoordPointerEXT
+       glVertexPointerEXT
+       glBlendEquationEXT
+       glPointParameterfEXT
+       glPointParameterfvEXT
+       glPointParameterfARB
+       glPointParameterfvARB
+       glColorTableEXT
+       glGetColorTableEXT
+       glGetColorTableParameterivEXT
+       glGetColorTableParameterfvEXT
+       glLockArraysEXT
+       glUnlockArraysEXT
+       glDrawRangeElementsEXT
+       glSecondaryColor3bEXT
+       glSecondaryColor3bvEXT
+       glSecondaryColor3dEXT
+       glSecondaryColor3dvEXT
+       glSecondaryColor3fEXT
+       glSecondaryColor3fvEXT
+       glSecondaryColor3iEXT
+       glSecondaryColor3ivEXT
+       glSecondaryColor3sEXT
+       glSecondaryColor3svEXT
+       glSecondaryColor3ubEXT
+       glSecondaryColor3ubvEXT
+       glSecondaryColor3uiEXT
+       glSecondaryColor3uivEXT
+       glSecondaryColor3usEXT
+       glSecondaryColor3usvEXT
+       glSecondaryColorPointerEXT
+       glMultiDrawArraysEXT
+       glMultiDrawElementsEXT
+       glFogCoordfEXT
+       glFogCoordfvEXT
+       glFogCoorddEXT
+       glFogCoorddvEXT
+       glFogCoordPointerEXT
+       glBlendFuncSeparateEXT
+       glFlushVertexArrayRangeNV
+       glVertexArrayRangeNV
+       glCombinerParameterfvNV
+       glCombinerParameterfNV
+       glCombinerParameterivNV
+       glCombinerParameteriNV
+       glCombinerInputNV
+       glCombinerOutputNV
+       glFinalCombinerInputNV
+       glGetCombinerInputParameterfvNV
+       glGetCombinerInputParameterivNV
+       glGetCombinerOutputParameterfvNV
+       glGetCombinerOutputParameterivNV
+       glGetFinalCombinerInputParameterfvNV
+       glGetFinalCombinerInputParameterivNV
+       glResizeBuffersMESA
+       glWindowPos2dMESA
+       glWindowPos2dvMESA
+       glWindowPos2fMESA
+       glWindowPos2fvMESA
+       glWindowPos2iMESA
+       glWindowPos2ivMESA
+       glWindowPos2sMESA
+       glWindowPos2svMESA
+       glWindowPos3dMESA
+       glWindowPos3dvMESA
+       glWindowPos3fMESA
+       glWindowPos3fvMESA
+       glWindowPos3iMESA
+       glWindowPos3ivMESA
+       glWindowPos3sMESA
+       glWindowPos3svMESA
+       glWindowPos4dMESA
+       glWindowPos4dvMESA
+       glWindowPos4fMESA
+       glWindowPos4fvMESA
+       glWindowPos4iMESA
+       glWindowPos4ivMESA
+       glWindowPos4sMESA
+       glWindowPos4svMESA
+       glWindowPos2dARB
+       glWindowPos2fARB
+       glWindowPos2iARB
+       glWindowPos2sARB
+       glWindowPos2dvARB
+       glWindowPos2fvARB
+       glWindowPos2ivARB
+       glWindowPos2svARB
+       glWindowPos3dARB
+       glWindowPos3fARB
+       glWindowPos3iARB
+       glWindowPos3sARB
+       glWindowPos3dvARB
+       glWindowPos3fvARB
+       glWindowPos3ivARB
+       glWindowPos3svARB
+       glAreProgramsResidentNV
+       glBindProgramNV
+       glDeleteProgramsNV
+       glExecuteProgramNV
+       glGenProgramsNV
+       glGetProgramParameterdvNV
+       glGetProgramParameterfvNV
+       glGetProgramivNV
+       glGetProgramStringNV
+       glGetTrackMatrixivNV
+       glGetVertexAttribdvNV
+       glGetVertexAttribfvNV
+       glGetVertexAttribivNV
+       glGetVertexAttribPointervNV
+       glIsProgramNV
+       glLoadProgramNV
+       glProgramParameter4dNV
+       glProgramParameter4dvNV
+       glProgramParameter4fNV
+       glProgramParameter4fvNV
+       glProgramParameters4dvNV
+       glProgramParameters4fvNV
+       glRequestResidentProgramsNV
+       glTrackMatrixNV
+       glVertexAttribPointerNV
+       glVertexAttrib1dNV
+       glVertexAttrib1dvNV
+       glVertexAttrib1fNV
+       glVertexAttrib1fvNV
+       glVertexAttrib1sNV
+       glVertexAttrib1svNV
+       glVertexAttrib2dNV
+       glVertexAttrib2dvNV
+       glVertexAttrib2fNV
+       glVertexAttrib2fvNV
+       glVertexAttrib2sNV
+       glVertexAttrib2svNV
+       glVertexAttrib3dNV
+       glVertexAttrib3dvNV
+       glVertexAttrib3fNV
+       glVertexAttrib3fvNV
+       glVertexAttrib3sNV
+       glVertexAttrib3svNV
+       glVertexAttrib4dNV
+       glVertexAttrib4dvNV
+       glVertexAttrib4fNV
+       glVertexAttrib4fvNV
+       glVertexAttrib4sNV
+       glVertexAttrib4svNV
+       glVertexAttrib4ubNV
+       glVertexAttrib4ubvNV
+       glVertexAttribs1dvNV
+       glVertexAttribs1fvNV
+       glVertexAttribs1svNV
+       glVertexAttribs2dvNV
+       glVertexAttribs2fvNV
+       glVertexAttribs2svNV
+       glVertexAttribs3dvNV
+       glVertexAttribs3fvNV
+       glVertexAttribs3svNV
+       glVertexAttribs4dvNV
+       glVertexAttribs4fvNV
+       glVertexAttribs4svNV
+       glVertexAttribs4ubvNV
+       glPointParameteriNV
+       glPointParameterivNV
+       glFogCoordf
+       glFogCoordfv
+       glFogCoordd
+       glFogCoorddv
+       glFogCoordPointer
+       glMultiDrawArrays
+       glMultiDrawElements
+       glPointParameterf
+       glPointParameterfv
+       glPointParameteri
+       glPointParameteriv
+       glSecondaryColor3b
+       glSecondaryColor3bv
+       glSecondaryColor3d
+       glSecondaryColor3dv
+       glSecondaryColor3f
+       glSecondaryColor3fv
+       glSecondaryColor3i
+       glSecondaryColor3iv
+       glSecondaryColor3s
+       glSecondaryColor3sv
+       glSecondaryColor3ub
+       glSecondaryColor3ubv
+       glSecondaryColor3ui
+       glSecondaryColor3uiv
+       glSecondaryColor3us
+       glSecondaryColor3usv
+       glSecondaryColorPointer
+       glWindowPos2d
+       glWindowPos2dv
+       glWindowPos2f
+       glWindowPos2fv
+       glWindowPos2i
+       glWindowPos2iv
+       glWindowPos2s
+       glWindowPos2sv
+       glWindowPos3d
+       glWindowPos3dv
+       glWindowPos3f
+       glWindowPos3fv
+       glWindowPos3i
+       glWindowPos3iv
+       glWindowPos3s
+       glWindowPos3sv
+       glVertexAttrib1sARB
+       glVertexAttrib1fARB
+       glVertexAttrib1dARB
+       glVertexAttrib2sARB
+       glVertexAttrib2fARB
+       glVertexAttrib2dARB
+       glVertexAttrib3sARB
+       glVertexAttrib3fARB
+       glVertexAttrib3dARB
+       glVertexAttrib4sARB
+       glVertexAttrib4fARB
+       glVertexAttrib4dARB
+       glVertexAttrib4NubARB
+       glVertexAttrib1svARB
+       glVertexAttrib1fvARB
+       glVertexAttrib1dvARB
+       glVertexAttrib2svARB
+       glVertexAttrib2fvARB
+       glVertexAttrib2dvARB
+       glVertexAttrib3svARB
+       glVertexAttrib3fvARB
+       glVertexAttrib3dvARB
+       glVertexAttrib4bvARB
+       glVertexAttrib4svARB
+       glVertexAttrib4ivARB
+       glVertexAttrib4ubvARB
+       glVertexAttrib4usvARB
+       glVertexAttrib4uivARB
+       glVertexAttrib4fvARB
+       glVertexAttrib4dvARB
+       glVertexAttrib4NbvARB
+       glVertexAttrib4NsvARB
+       glVertexAttrib4NivARB
+       glVertexAttrib4NubvARB
+       glVertexAttrib4NusvARB
+       glVertexAttrib4NuivARB
+       glVertexAttribPointerARB
+       glEnableVertexAttribArrayARB
+       glDisableVertexAttribArrayARB
+       glProgramStringARB
+       glBindProgramARB
+       glDeleteProgramsARB
+       glGenProgramsARB
+       glIsProgramARB
+       glProgramEnvParameter4dARB
+       glProgramEnvParameter4dvARB
+       glProgramEnvParameter4fARB
+       glProgramEnvParameter4fvARB
+       glProgramLocalParameter4dARB
+       glProgramLocalParameter4dvARB
+       glProgramLocalParameter4fARB
+       glProgramLocalParameter4fvARB
+       glGetProgramEnvParameterdvARB
+       glGetProgramEnvParameterfvARB
+       glGetProgramLocalParameterdvARB
+       glGetProgramLocalParameterfvARB
+       glGetProgramivARB
+       glGetProgramStringARB
+       glGetVertexAttribdvARB
+       glGetVertexAttribfvARB
+       glGetVertexAttribivARB
+       glGetVertexAttribPointervARB
+       glProgramNamedParameter4fNV
+       glProgramNamedParameter4dNV
+       glProgramNamedParameter4fvNV
+       glProgramNamedParameter4dvNV
+       glGetProgramNamedParameterfvNV
+       glGetProgramNamedParameterdvNV
+       glBindBufferARB
+       glBufferDataARB
+       glBufferSubDataARB
+       glDeleteBuffersARB
+       glGenBuffersARB
+       glGetBufferParameterivARB
+       glGetBufferPointervARB
+       glGetBufferSubDataARB
+       glIsBufferARB
+       glMapBufferARB
+       glUnmapBufferARB
+       glGenQueriesARB
+       glDeleteQueriesARB
+       glIsQueryARB
+       glBeginQueryARB
+       glEndQueryARB
+       glGetQueryivARB
+       glGetQueryObjectivARB
+       glGetQueryObjectuivARB
+       glBindBuffer
+       glBufferData
+       glBufferSubData
+       glDeleteBuffers
+       glGenBuffers
+       glGetBufferParameteriv
+       glGetBufferPointerv
+       glGetBufferSubData
+       glIsBuffer
+       glMapBuffer
+       glUnmapBuffer
+       glGenQueries
+       glDeleteQueries
+       glIsQuery
+       glBeginQuery
+       glEndQuery
+       glGetQueryiv
+       glGetQueryObjectiv
+       glGetQueryObjectuiv
+;
+; WGL API
+       wglChoosePixelFormat
+       wglCopyContext
+       wglCreateContext
+       wglCreateLayerContext
+       wglDeleteContext
+       wglDescribeLayerPlane
+       wglDescribePixelFormat
+       wglGetCurrentContext
+       wglGetCurrentDC
+       wglGetLayerPaletteEntries
+       wglGetPixelFormat
+       wglGetProcAddress
+       wglMakeCurrent
+       wglRealizeLayerPalette
+       wglSetLayerPaletteEntries
+       wglSetPixelFormat
+       wglShareLists
+       wglSwapBuffers
+       wglSwapLayerBuffers
+       wglUseFontBitmapsA
+       wglUseFontBitmapsW
+       wglUseFontOutlinesA
+       wglUseFontOutlinesW
+       wglGetExtensionsStringARB
diff --git a/src/gallium/winsys/gdi/wgl.c b/src/gallium/winsys/gdi/wgl.c
new file mode 100644 (file)
index 0000000..5012601
--- /dev/null
@@ -0,0 +1,703 @@
+/* $Id: wgl.c,v 1.12 2006/03/30 07:58:24 kschultz Exp $ */
+
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * File name   : wgl.c
+ * WGL stuff. Added by Oleg Letsinsky, ajl@ultersys.ru
+ * Some things originated from the 3Dfx WGL functions
+ */
+
+/* 
+ * This file contains the implementation of the wgl* functions for
+ * Mesa on Windows.  Since these functions are provided by Windows in
+ * GDI/OpenGL, we must supply our versions that work with Mesa here.
+ */
+
+
+/* We're essentially building part of GDI here, so define this so that
+ * we get the right export linkage. */
+#ifdef __MINGW32__
+
+#include <stdarg.h>
+#include <windef.h>
+#include <wincon.h>
+#include <winbase.h>
+
+#  if defined(BUILD_GL32)
+#    define WINGDIAPI __declspec(dllexport)    
+#  else
+#    define __W32API_USE_DLLIMPORT__
+#  endif
+
+#include <wingdi.h>
+#include "GL/mesa_wgl.h"
+#include <stdlib.h>
+
+#else
+
+#define _GDI32_
+#include <windows.h>
+
+#endif
+
+#include "glapi.h"
+#include "GL/wmesa.h"   /* protos for wmesa* functions */
+
+/*
+ * Pixel Format Descriptors
+ */
+
+/* Extend the PFD to include DB flag */
+struct __pixelformat__
+{
+    PIXELFORMATDESCRIPTOR pfd;
+    GLboolean doubleBuffered;
+};
+
+/* These are the PFD's supported by this driver. */
+struct __pixelformat__ pfd[] =
+{
+    /* Double Buffer, alpha */
+    {  
+       {       
+           sizeof(PIXELFORMATDESCRIPTOR),      1,
+           PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
+           PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,
+           PFD_TYPE_RGBA,
+           24, 
+           8, 0,       
+           8, 8,       
+           8, 16,      
+           8, 24,
+           0, 0, 0, 0, 0,      
+           16, 8,      
+           0, 0, 0,    
+           0, 0, 0 
+       },
+        GL_TRUE
+    },
+    /* Single Buffer, alpha */
+    {  
+       {       
+           sizeof(PIXELFORMATDESCRIPTOR),      1,
+           PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
+           PFD_GENERIC_FORMAT,
+           PFD_TYPE_RGBA,
+           24, 
+           8, 0,       
+           8, 8,       
+           8, 16,      
+           8, 24,
+           0, 0, 0, 0, 0,      
+           16, 8,
+           0, 0, 0,    
+           0, 0, 0
+       },
+        GL_FALSE
+    },
+    /* Double Buffer, no alpha */
+    {  
+       {       
+           sizeof(PIXELFORMATDESCRIPTOR),      1,
+           PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
+           PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,
+           PFD_TYPE_RGBA,
+           24, 
+           8, 0,
+           8, 8,
+           8, 16,
+           0, 0,
+           0, 0, 0, 0, 0,
+           16, 8,
+           0, 0, 0, 
+           0, 0, 0 
+       },
+        GL_TRUE
+    },
+    /* Single Buffer, no alpha */
+    {  
+       {
+           sizeof(PIXELFORMATDESCRIPTOR),      1,
+           PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
+           PFD_GENERIC_FORMAT,
+           PFD_TYPE_RGBA,
+           24, 
+           8, 0,
+           8, 8,
+           8, 16,
+           0, 0,
+           0, 0, 0, 0, 0,
+           16, 8,
+           0, 0, 0,
+           0, 0, 0 
+       },
+        GL_FALSE
+    },
+};
+
+int npfd = sizeof(pfd) / sizeof(pfd[0]);
+
+
+/*
+ * Contexts
+ */
+
+typedef struct {
+    WMesaContext ctx;
+} MesaWglCtx;
+
+#define MESAWGL_CTX_MAX_COUNT 20
+
+static MesaWglCtx wgl_ctx[MESAWGL_CTX_MAX_COUNT];
+
+static unsigned ctx_count = 0;
+static int ctx_current = -1;
+static unsigned curPFD = 0;
+
+static HDC CurrentHDC = 0;
+
+
+WINGDIAPI HGLRC GLAPIENTRY wglCreateContext(HDC hdc)
+{
+    int i = 0;
+    if (!ctx_count) {
+       for(i=0;i<MESAWGL_CTX_MAX_COUNT;i++) {
+           wgl_ctx[i].ctx = NULL;
+       }
+    }
+    for( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {
+        if ( wgl_ctx[i].ctx == NULL ) {
+            wgl_ctx[i].ctx = 
+               WMesaCreateContext(hdc, NULL, (GLboolean)GL_TRUE,
+                                  (GLboolean) (pfd[curPFD-1].doubleBuffered ?
+                                   GL_TRUE : GL_FALSE), 
+                                  (GLboolean)(pfd[curPFD-1].pfd.cAlphaBits ? 
+                                  GL_TRUE : GL_FALSE) );
+            if (wgl_ctx[i].ctx == NULL)
+                break;
+            ctx_count++;
+            return ((HGLRC)wgl_ctx[i].ctx);
+        }
+    }
+    SetLastError(0);
+    return(NULL);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglDeleteContext(HGLRC hglrc)
+{
+    int i;
+    for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {
+       if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ){
+            WMesaMakeCurrent((WMesaContext) hglrc, NULL);
+            WMesaDestroyContext(wgl_ctx[i].ctx);
+            wgl_ctx[i].ctx = NULL;
+            ctx_count--;
+            return(TRUE);
+       }
+    }
+    SetLastError(0);
+    return(FALSE);
+}
+
+WINGDIAPI HGLRC GLAPIENTRY wglGetCurrentContext(VOID)
+{
+    if (ctx_current < 0)
+       return 0;
+    else
+       return (HGLRC) wgl_ctx[ctx_current].ctx;
+}
+
+WINGDIAPI HDC GLAPIENTRY wglGetCurrentDC(VOID)
+{
+    return CurrentHDC;
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglMakeCurrent(HDC hdc, HGLRC hglrc)
+{
+    int i;
+    
+    CurrentHDC = hdc;
+
+    if (!hdc || !hglrc) {
+       WMesaMakeCurrent(NULL, NULL);
+       ctx_current = -1;
+       return TRUE;
+    }
+    
+    for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {
+       if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ) {
+           WMesaMakeCurrent( (WMesaContext) hglrc, hdc );
+           ctx_current = i;
+           return TRUE;
+       }
+    }
+    return FALSE;
+}
+
+
+WINGDIAPI int GLAPIENTRY wglChoosePixelFormat(HDC hdc,
+                                             CONST 
+                                             PIXELFORMATDESCRIPTOR *ppfd)
+{
+    int                i,best = -1,bestdelta = 0x7FFFFFFF,delta;
+    (void) hdc;
+    
+    if(ppfd->nSize != sizeof(PIXELFORMATDESCRIPTOR) || ppfd->nVersion != 1)
+       {
+           SetLastError(0);
+           return(0);
+       }
+    for(i = 0; i < npfd;i++)
+       {
+           delta = 0;
+           if(
+               (ppfd->dwFlags & PFD_DRAW_TO_WINDOW) &&
+               !(pfd[i].pfd.dwFlags & PFD_DRAW_TO_WINDOW))
+               continue;
+           if(
+               (ppfd->dwFlags & PFD_DRAW_TO_BITMAP) &&
+               !(pfd[i].pfd.dwFlags & PFD_DRAW_TO_BITMAP))
+               continue;
+           if(
+               (ppfd->dwFlags & PFD_SUPPORT_GDI) &&
+               !(pfd[i].pfd.dwFlags & PFD_SUPPORT_GDI))
+               continue;
+           if(
+               (ppfd->dwFlags & PFD_SUPPORT_OPENGL) &&
+               !(pfd[i].pfd.dwFlags & PFD_SUPPORT_OPENGL))
+               continue;
+           if(
+               !(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) &&
+               ((ppfd->dwFlags & PFD_DOUBLEBUFFER) != 
+                (pfd[i].pfd.dwFlags & PFD_DOUBLEBUFFER)))
+               continue;
+           if(
+               !(ppfd->dwFlags & PFD_STEREO_DONTCARE) &&
+               ((ppfd->dwFlags & PFD_STEREO) != 
+                (pfd[i].pfd.dwFlags & PFD_STEREO)))
+               continue;
+           if(ppfd->iPixelType != pfd[i].pfd.iPixelType)
+               delta++;
+           if(ppfd->cAlphaBits != pfd[i].pfd.cAlphaBits)
+               delta++;
+           if(delta < bestdelta)
+               {
+                   best = i + 1;
+                   bestdelta = delta;
+                   if(bestdelta == 0)
+                       break;
+               }
+       }
+    if(best == -1)
+       {
+           SetLastError(0);
+           return(0);
+       }
+    return(best);
+}
+
+WINGDIAPI int GLAPIENTRY wglDescribePixelFormat(HDC hdc,
+                                               int iPixelFormat,
+                                               UINT nBytes,
+                                               LPPIXELFORMATDESCRIPTOR ppfd)
+{
+    (void) hdc;
+    
+    if(ppfd == NULL)
+       return(npfd);
+    if(iPixelFormat < 1 || iPixelFormat > npfd || 
+       nBytes != sizeof(PIXELFORMATDESCRIPTOR))
+       {
+           SetLastError(0);
+           return(0);
+       }
+    *ppfd = pfd[iPixelFormat - 1].pfd;
+    return(npfd);
+}
+
+WINGDIAPI PROC GLAPIENTRY wglGetProcAddress(LPCSTR lpszProc)
+{
+    PROC p = (PROC) _glapi_get_proc_address((const char *) lpszProc);
+    if (p)
+       return p;
+    
+    SetLastError(0);
+    return(NULL);
+}
+
+WINGDIAPI int GLAPIENTRY wglGetPixelFormat(HDC hdc)
+{
+    (void) hdc;
+    if(curPFD == 0) {
+       SetLastError(0);
+       return(0);
+    }
+    return(curPFD);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglSetPixelFormat(HDC hdc,int iPixelFormat,
+                                       const PIXELFORMATDESCRIPTOR *ppfd)
+{
+    (void) hdc;
+    
+    if(iPixelFormat < 1 || iPixelFormat > npfd || 
+       ppfd->nSize != sizeof(PIXELFORMATDESCRIPTOR)) {
+       SetLastError(0);
+       return(FALSE);
+    }
+    curPFD = iPixelFormat;
+    return(TRUE);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglSwapBuffers(HDC hdc)
+{
+    WMesaSwapBuffers(hdc);
+    return TRUE;
+}
+
+static FIXED FixedFromDouble(double d)
+{
+   long l = (long) (d * 65536L);
+   return *(FIXED *) (void *) &l;
+}
+
+
+/*
+** This is cribbed from FX/fxwgl.c, and seems to implement support
+** for bitmap fonts where the wglUseFontBitmapsA() code implements
+** support for outline fonts.  In combination they hopefully give
+** fairly generic support for fonts.
+*/
+static BOOL wglUseFontBitmaps_FX(HDC fontDevice, DWORD firstChar,
+                                 DWORD numChars, DWORD listBase)
+{
+#define VERIFY(a) a
+    
+    TEXTMETRIC metric;
+    BITMAPINFO *dibInfo;
+    HDC bitDevice;
+    COLORREF tempColor;
+    int i;
+    
+    VERIFY(GetTextMetrics(fontDevice, &metric));
+    
+    dibInfo = (BITMAPINFO *) calloc(sizeof(BITMAPINFO) + sizeof(RGBQUAD), 1);
+    dibInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    dibInfo->bmiHeader.biPlanes = 1;
+    dibInfo->bmiHeader.biBitCount = 1;
+    dibInfo->bmiHeader.biCompression = BI_RGB;
+    
+    bitDevice = CreateCompatibleDC(fontDevice);
+    
+    /* Swap fore and back colors so the bitmap has the right polarity */
+    tempColor = GetBkColor(bitDevice);
+    SetBkColor(bitDevice, GetTextColor(bitDevice));
+    SetTextColor(bitDevice, tempColor);
+    
+    /* Place chars based on base line */
+    VERIFY(SetTextAlign(bitDevice, TA_BASELINE) != GDI_ERROR ? 1 : 0);
+    
+    for(i = 0; i < (int)numChars; i++) {
+       SIZE size;
+       char curChar;
+       int charWidth,charHeight,bmapWidth,bmapHeight,numBytes,res;
+       HBITMAP bitObject;
+       HGDIOBJ origBmap;
+       unsigned char *bmap;
+       
+       curChar = (char)(i + firstChar);
+       
+       /* Find how high/wide this character is */
+       VERIFY(GetTextExtentPoint32(bitDevice, (LPCWSTR)&curChar, 1, &size));
+       
+       /* Create the output bitmap */
+       charWidth = size.cx;
+       charHeight = size.cy;
+       /* Round up to the next multiple of 32 bits */
+       bmapWidth = ((charWidth + 31) / 32) * 32;   
+       bmapHeight = charHeight;
+       bitObject = CreateCompatibleBitmap(bitDevice,
+                                          bmapWidth,
+                                          bmapHeight);
+       /* VERIFY(bitObject); */
+       
+       /* Assign the output bitmap to the device */
+       origBmap = SelectObject(bitDevice, bitObject);
+       (void) VERIFY(origBmap);
+       
+       VERIFY( PatBlt( bitDevice, 0, 0, bmapWidth, bmapHeight,BLACKNESS ) );
+       
+       /* Use our source font on the device */
+       VERIFY(SelectObject(bitDevice, GetCurrentObject(fontDevice,OBJ_FONT)));
+       
+       /* Draw the character */
+       VERIFY(TextOut(bitDevice, 0, metric.tmAscent, (LPCWSTR)&curChar, 1));
+       
+       /* Unselect our bmap object */
+       VERIFY(SelectObject(bitDevice, origBmap));
+       
+       /* Convert the display dependant representation to a 1 bit deep DIB */
+       numBytes = (bmapWidth * bmapHeight) / 8;
+       bmap = (unsigned char *)malloc(numBytes);
+       dibInfo->bmiHeader.biWidth = bmapWidth;
+       dibInfo->bmiHeader.biHeight = bmapHeight;
+       res = GetDIBits(bitDevice, bitObject, 0, bmapHeight, bmap,
+                       dibInfo,
+                       DIB_RGB_COLORS);
+       /* VERIFY(res); */
+       
+       /* Create the GL object */
+       glNewList(i + listBase, GL_COMPILE);
+       glBitmap(bmapWidth, bmapHeight, 0.0, (GLfloat)metric.tmDescent,
+                (GLfloat)charWidth, 0.0,
+                bmap);
+       glEndList();
+       /* CheckGL(); */
+       
+       /* Destroy the bmap object */
+       DeleteObject(bitObject);
+       
+       /* Deallocate the bitmap data */
+       free(bmap);
+    }
+    
+    /* Destroy the DC */
+    VERIFY(DeleteDC(bitDevice));
+    
+    free(dibInfo);
+    
+    return TRUE;
+#undef VERIFY
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglUseFontBitmapsA(HDC hdc, DWORD first,
+                                            DWORD count, DWORD listBase)
+{
+    int i;
+    GLuint font_list;
+    DWORD size;
+    GLYPHMETRICS gm;
+    HANDLE hBits;
+    LPSTR lpBits;
+    MAT2 mat;
+    int  success = TRUE;
+    
+    if (count == 0)
+       return FALSE;
+    
+    font_list = listBase;
+    
+    mat.eM11 = FixedFromDouble(1);
+    mat.eM12 = FixedFromDouble(0);
+    mat.eM21 = FixedFromDouble(0);
+    mat.eM22 = FixedFromDouble(-1);
+    
+    memset(&gm,0,sizeof(gm));
+    
+    /*
+    ** If we can't get the glyph outline, it may be because this is a fixed
+    ** font.  Try processing it that way.
+    */
+    if( GetGlyphOutline(hdc, first, GGO_BITMAP, &gm, 0, NULL, &mat)
+       == GDI_ERROR ) {
+       return wglUseFontBitmaps_FX( hdc, first, count, listBase );
+    }
+    
+    /*
+    ** Otherwise process all desired characters.
+    */
+    for (i = 0; i < (int)count; i++) {
+       DWORD err;
+       
+       glNewList( font_list+i, GL_COMPILE );
+       
+       /* allocate space for the bitmap/outline */
+       size = GetGlyphOutline(hdc, first + i, GGO_BITMAP, 
+                              &gm, 0, NULL, &mat);
+       if (size == GDI_ERROR) {
+           glEndList( );
+           err = GetLastError();
+           success = FALSE;
+           continue;
+       }
+       
+       hBits  = GlobalAlloc(GHND, size+1);
+       lpBits = GlobalLock(hBits);
+       
+       err = 
+           GetGlyphOutline(hdc,         /* handle to device context */
+                           first + i,   /* character to query */
+                           GGO_BITMAP,  /* format of data to return */
+                           &gm,         /* ptr to structure for metrics*/
+                           size,        /* size of buffer for data */
+                           lpBits,      /* pointer to buffer for data */
+                           &mat         /* pointer to transformation */
+                           /* matrix structure */
+               );
+       
+       if (err == GDI_ERROR) {
+           GlobalUnlock(hBits);
+           GlobalFree(hBits);
+           
+           glEndList( );
+           err = GetLastError();
+           success = FALSE;
+           continue;
+       }
+       
+       glBitmap(gm.gmBlackBoxX,gm.gmBlackBoxY,
+                (GLfloat)-gm.gmptGlyphOrigin.x,
+                (GLfloat)gm.gmptGlyphOrigin.y,
+                (GLfloat)gm.gmCellIncX,
+                (GLfloat)gm.gmCellIncY,
+                (const GLubyte * )lpBits);
+       
+       GlobalUnlock(hBits);
+       GlobalFree(hBits);
+       
+       glEndList( );
+    }
+    
+    return success;
+}
+
+
+
+/* NOT IMPLEMENTED YET */
+WINGDIAPI BOOL GLAPIENTRY wglCopyContext(HGLRC hglrcSrc,
+                                        HGLRC hglrcDst,
+                                        UINT mask)
+{
+    (void) hglrcSrc; (void) hglrcDst; (void) mask;
+    return(FALSE);
+}
+
+WINGDIAPI HGLRC GLAPIENTRY wglCreateLayerContext(HDC hdc,
+                                                int iLayerPlane)
+{
+    (void) hdc; (void) iLayerPlane;
+    SetLastError(0);
+    return(NULL);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglShareLists(HGLRC hglrc1,
+                                       HGLRC hglrc2)
+{
+    (void) hglrc1; (void) hglrc2;
+    return(TRUE);
+}
+
+
+WINGDIAPI BOOL GLAPIENTRY wglUseFontBitmapsW(HDC hdc,
+                                            DWORD first,
+                                            DWORD count,
+                                            DWORD listBase)
+{
+    (void) hdc; (void) first; (void) count; (void) listBase;
+    return FALSE;
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglUseFontOutlinesA(HDC hdc,
+                                             DWORD first,
+                                             DWORD count,
+                                             DWORD listBase,
+                                             FLOAT deviation,
+                                             FLOAT extrusion,
+                                             int format,
+                                             LPGLYPHMETRICSFLOAT lpgmf)
+{
+    (void) hdc; (void) first; (void) count;
+    (void) listBase; (void) deviation; (void) extrusion; (void) format;
+    (void) lpgmf;
+    SetLastError(0);
+    return(FALSE);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglUseFontOutlinesW(HDC hdc,
+                                             DWORD first,
+                                             DWORD count,
+                                             DWORD listBase,
+                                             FLOAT deviation,
+                                             FLOAT extrusion,
+                                             int format,
+                                             LPGLYPHMETRICSFLOAT lpgmf)
+{
+    (void) hdc; (void) first; (void) count;
+    (void) listBase; (void) deviation; (void) extrusion; (void) format;
+    (void) lpgmf;
+    SetLastError(0);
+    return(FALSE);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglDescribeLayerPlane(HDC hdc,
+                                               int iPixelFormat,
+                                               int iLayerPlane,
+                                               UINT nBytes,
+                                               LPLAYERPLANEDESCRIPTOR plpd)
+{
+    (void) hdc; (void) iPixelFormat; (void) iLayerPlane; 
+    (void) nBytes; (void) plpd;
+    SetLastError(0);
+    return(FALSE);
+}
+
+WINGDIAPI int GLAPIENTRY wglSetLayerPaletteEntries(HDC hdc,
+                                                  int iLayerPlane,
+                                                  int iStart,
+                                                  int cEntries,
+                                                  CONST COLORREF *pcr)
+{
+    (void) hdc; (void) iLayerPlane; (void) iStart; 
+    (void) cEntries; (void) pcr;
+    SetLastError(0);
+    return(0);
+}
+
+WINGDIAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC hdc,
+                                                  int iLayerPlane,
+                                                  int iStart,
+                                                  int cEntries,
+                                                  COLORREF *pcr)
+{
+    (void) hdc; (void) iLayerPlane; (void) iStart; (void) cEntries; (void) pcr;
+    SetLastError(0);
+    return(0);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglRealizeLayerPalette(HDC hdc,
+                                                int iLayerPlane,
+                                                BOOL bRealize)
+{
+    (void) hdc; (void) iLayerPlane; (void) bRealize;
+    SetLastError(0);
+    return(FALSE);
+}
+
+WINGDIAPI BOOL GLAPIENTRY wglSwapLayerBuffers(HDC hdc,
+                                             UINT fuPlanes)
+{
+    (void) hdc; (void) fuPlanes;
+    SetLastError(0);
+    return(FALSE);
+}
+
+WINGDIAPI const char * GLAPIENTRY wglGetExtensionsStringARB(HDC hdc)
+{
+    return "WGL_ARB_extensions_string";
+}
diff --git a/src/gallium/winsys/gdi/wmesa.c b/src/gallium/winsys/gdi/wmesa.c
new file mode 100644 (file)
index 0000000..74a8292
--- /dev/null
@@ -0,0 +1,890 @@
+/*
+ * Windows (Win32/Win64) device driver for Mesa
+ *
+ */
+
+#include "mtypes.h"
+#include <GL/wmesa.h>
+#include "wmesadef.h"
+
+#undef Elements
+
+#include "pipe/p_winsys.h"
+#include "pipe/p_format.h"
+#include "pipe/p_context.h"
+#include "pipe/p_util.h"
+#include "pipe/p_inlines.h"
+#include "softpipe/sp_winsys.h"
+#include "glapi/glapi.h"
+#include "colors.h"
+
+extern GLvisual *
+_mesa_create_visual( GLboolean rgbFlag,
+                     GLboolean dbFlag,
+                     GLboolean stereoFlag,
+                     GLint redBits,
+                     GLint greenBits,
+                     GLint blueBits,
+                     GLint alphaBits,
+                     GLint indexBits,
+                     GLint depthBits,
+                     GLint stencilBits,
+                     GLint accumRedBits,
+                     GLint accumGreenBits,
+                     GLint accumBlueBits,
+                     GLint accumAlphaBits,
+                     GLint numSamples );
+
+/* linked list of our Framebuffers (windows) */
+WMesaFramebuffer FirstFramebuffer = NULL;
+
+struct wmesa_pipe_winsys
+{
+   struct pipe_winsys base;
+};
+
+/**
+ * Choose the pixel format for the given visual.
+ * This will tell the gallium driver how to pack pixel data into
+ * drawing surfaces.
+ */
+static GLuint
+choose_pixel_format(GLvisual *v)
+{
+#if 1
+   return PIPE_FORMAT_A8R8G8B8_UNORM;
+#else
+   if (   GET_REDMASK(v)   == 0x0000ff
+       && GET_GREENMASK(v) == 0x00ff00
+       && GET_BLUEMASK(v)  == 0xff0000
+       && v->BitsPerPixel == 32) {
+      if (CHECK_BYTE_ORDER(v)) {
+         /* no byteswapping needed */
+         return 0 /* PIXEL_FORMAT_U_A8_B8_G8_R8 */;
+      }
+      else {
+         return PIPE_FORMAT_R8G8B8A8_UNORM;
+      }
+   }
+   else if (   GET_REDMASK(v)   == 0xff0000
+            && GET_GREENMASK(v) == 0x00ff00
+            && GET_BLUEMASK(v)  == 0x0000ff
+            && v->BitsPerPixel == 32) {
+      if (CHECK_BYTE_ORDER(v)) {
+         /* no byteswapping needed */
+         return PIPE_FORMAT_A8R8G8B8_UNORM;
+      }
+      else {
+         return PIPE_FORMAT_B8G8R8A8_UNORM;
+      }
+   }
+   else if (   GET_REDMASK(v)   == 0xf800
+            && GET_GREENMASK(v) == 0x07e0
+            && GET_BLUEMASK(v)  == 0x001f
+            && CHECK_BYTE_ORDER(v)
+            && v->BitsPerPixel == 16) {
+      /* 5-6-5 RGB */
+      return PIPE_FORMAT_R5G6B5_UNORM;
+   }
+
+printf("BITS %d\n",v->BitsPerPixel);
+   assert(0);
+   return 0;
+#endif
+}
+
+/*
+ * Determine the pixel format based on the pixel size.
+ */
+static void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC)
+{
+    /* Only 16 and 32 bit targets are supported now */
+    assert(pwfb->cColorBits == 0 ||
+          pwfb->cColorBits == 16 || 
+          pwfb->cColorBits == 32);
+
+    switch(pwfb->cColorBits){
+    case 8:
+       pwfb->pixelformat = PF_INDEX8;
+       break;
+    case 16:
+       pwfb->pixelformat = PF_5R6G5B;
+       break;
+    case 32:
+       pwfb->pixelformat = PF_8R8G8B;
+       break;
+    default:
+       pwfb->pixelformat = PF_BADFORMAT;
+    }
+}
+
+
+/**
+ * Create DIB for back buffer.
+ * We write into this memory with the span routines and then blit it
+ * to the window on a buffer swap.
+ */
+BOOL wmCreateBackingStore(WMesaFramebuffer pwfb, long lxSize, long lySize)
+{
+    HDC          hdc = pwfb->hDC;
+    BITMAPINFO   bmi;
+    LPBITMAPINFO pbmi = &bmi;
+    HDC          hic;
+
+    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    pbmi->bmiHeader.biWidth = lxSize;
+    pbmi->bmiHeader.biHeight= -lySize;
+    pbmi->bmiHeader.biPlanes = 1;
+    pbmi->bmiHeader.biBitCount = pwfb->cColorBits;
+    pbmi->bmiHeader.biCompression = BI_RGB;
+    pbmi->bmiHeader.biSizeImage = 0;
+    pbmi->bmiHeader.biXPelsPerMeter = 0;
+    pbmi->bmiHeader.biYPelsPerMeter = 0;
+    pbmi->bmiHeader.biClrUsed = 0;
+    pbmi->bmiHeader.biClrImportant = 0;
+    
+    hic = CreateIC("display", NULL, NULL, NULL);
+    pwfb->dib_hDC = CreateCompatibleDC(hic);
+    
+    pwfb->hbmDIB = CreateDIBSection(hic,
+                                  pbmi,
+                                  DIB_RGB_COLORS,
+                                  (void **)&(pwfb->pbPixels),
+                                  0,
+                                  0);
+    pwfb->hOldBitmap = SelectObject(pwfb->dib_hDC, pwfb->hbmDIB);
+    
+    DeleteDC(hic);
+
+    wmSetPixelFormat(pwfb, pwfb->hDC);
+    return TRUE;
+}
+
+/**
+ * Create a new WMesaFramebuffer object which will correspond to the
+ * given HDC (Window handle).
+ */
+WMesaFramebuffer
+wmesa_new_framebuffer(HDC hdc, GLvisual *visual, GLuint width, GLuint height)
+{
+    WMesaFramebuffer pwfb
+        = (WMesaFramebuffer) malloc(sizeof(struct wmesa_framebuffer));
+    if (pwfb) {
+       enum pipe_format colorFormat, depthFormat, stencilFormat;
+
+       /* determine PIPE_FORMATs for buffers */
+       colorFormat = choose_pixel_format(visual);
+
+       if (visual->depthBits == 0)
+               depthFormat = PIPE_FORMAT_NONE;
+       else if (visual->depthBits <= 16)
+               depthFormat = PIPE_FORMAT_Z16_UNORM;
+       else if (visual->depthBits <= 24)
+               depthFormat = PIPE_FORMAT_S8Z24_UNORM;
+       else
+               depthFormat = PIPE_FORMAT_Z32_UNORM;
+
+       if (visual->stencilBits == 8) {
+               if (depthFormat == PIPE_FORMAT_S8Z24_UNORM)
+                       stencilFormat = depthFormat;
+               else
+                       stencilFormat = PIPE_FORMAT_S8_UNORM;
+       }
+       else {
+               stencilFormat = PIPE_FORMAT_NONE;
+       }
+
+       pwfb->stfb = st_create_framebuffer(visual,
+                                   colorFormat, depthFormat, stencilFormat,
+                                   width, height,
+                                   (void *) pwfb);
+
+        pwfb->cColorBits = GetDeviceCaps(hdc, BITSPIXEL);
+
+#if 0
+       wmCreateBackingStore(pwfb, width, height);
+#endif
+
+        pwfb->hDC = hdc;
+        /* insert at head of list */
+       pwfb->next = FirstFramebuffer;
+        FirstFramebuffer = pwfb;
+    }
+    return pwfb;
+}
+
+/**
+ * Given an hdc, free the corresponding WMesaFramebuffer
+ */
+void
+wmesa_free_framebuffer(HDC hdc)
+{
+    WMesaFramebuffer pwfb, prev;
+    for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
+        if (pwfb->hDC == hdc)
+            break;
+       prev = pwfb;
+    }
+    if (pwfb) {
+       if (pwfb == FirstFramebuffer)
+           FirstFramebuffer = pwfb->next;
+       else
+           prev->next = pwfb->next;
+       free(pwfb);
+    }
+}
+
+/**
+ * Given an hdc, return the corresponding WMesaFramebuffer
+ */
+WMesaFramebuffer
+wmesa_lookup_framebuffer(HDC hdc)
+{
+    WMesaFramebuffer pwfb;
+    for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
+        if (pwfb->hDC == hdc)
+            return pwfb;
+    }
+    return NULL;
+}
+
+
+/**
+ * Given a GLframebuffer, return the corresponding WMesaFramebuffer.
+ */
+static WMesaFramebuffer wmesa_framebuffer(GLframebuffer *fb)
+{
+    return (WMesaFramebuffer) fb;
+}
+
+
+/**
+ * Given a GLcontext, return the corresponding WMesaContext.
+ */
+static WMesaContext wmesa_context(const GLcontext *ctx)
+{
+    return (WMesaContext) ctx;
+}
+
+static wmDeleteBackingStore(WMesaFramebuffer pwfb)
+{
+    if (pwfb->hbmDIB) {
+       SelectObject(pwfb->dib_hDC, pwfb->hOldBitmap);
+       DeleteDC(pwfb->dib_hDC);
+       DeleteObject(pwfb->hbmDIB);
+    }
+}
+
+
+/**
+ * Find the width and height of the window named by hdc.
+ */
+static void
+get_window_size(HDC hdc, GLuint *width, GLuint *height)
+{
+    if (WindowFromDC(hdc)) {
+        RECT rect;
+        GetClientRect(WindowFromDC(hdc), &rect);
+        *width = rect.right - rect.left;
+        *height = rect.bottom - rect.top;
+    }
+    else { /* Memory context */
+        /* From contributed code - use the size of the desktop
+         * for the size of a memory context (?) */
+        *width = GetDeviceCaps(hdc, HORZRES);
+        *height = GetDeviceCaps(hdc, VERTRES);
+    }
+}
+
+/**
+ * Low-level OS/window system memory buffer
+ */
+struct wm_buffer
+{
+   struct pipe_buffer base;
+   boolean userBuffer;  /** Is this a user-space buffer? */
+   void *data;
+   void *mapped;
+};
+
+struct wmesa_surface
+{
+   struct pipe_surface surface;
+
+   int no_swap;
+};
+
+
+/** Cast wrapper */
+static INLINE struct wmesa_surface *
+wmesa_surface(struct pipe_surface *ps)
+{
+//   assert(0);
+   return (struct wmesa_surface *) ps;
+}
+
+/**
+ * Turn the softpipe opaque buffer pointer into a dri_bufmgr opaque
+ * buffer pointer...
+ */
+static INLINE struct wm_buffer *
+wm_buffer( struct pipe_buffer *buf )
+{
+   return (struct wm_buffer *)buf;
+}
+
+
+
+/* Most callbacks map direcly onto dri_bufmgr operations:
+ */
+static void *
+wm_buffer_map(struct pipe_winsys *pws, struct pipe_buffer *buf,
+              unsigned flags)
+{
+   struct wm_buffer *wm_buf = wm_buffer(buf);
+   wm_buf->mapped = wm_buf->data;
+   return wm_buf->mapped;
+}
+
+static void
+wm_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer *buf)
+{
+   struct wm_buffer *wm_buf = wm_buffer(buf);
+   wm_buf->mapped = NULL;
+}
+
+static void
+wm_buffer_destroy(struct pipe_winsys *pws,
+                  struct pipe_buffer *buf)
+{
+   struct wm_buffer *oldBuf = wm_buffer(buf);
+
+   if (oldBuf->data) {
+      {
+         if (!oldBuf->userBuffer) {
+            align_free(oldBuf->data);
+         }
+      }
+
+      oldBuf->data = NULL;
+   }
+
+   free(oldBuf);
+}
+
+
+static void
+wm_flush_frontbuffer(struct pipe_winsys *pws,
+                     struct pipe_surface *surf,
+                     void *context_private)
+{
+    WMesaContext pwc = context_private;
+    WMesaFramebuffer pwfb = wmesa_lookup_framebuffer(pwc->hDC);
+   struct wm_buffer *wm_buf;
+    BITMAPINFO bmi, *pbmi;
+
+#if 0
+    if (pwfb)
+       BitBlt(pwfb->hDC, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height,
+              pwfb->dib_hDC, 0, 0, SRCCOPY);
+#else
+    wm_buf = wm_buffer(surf->buffer);
+
+    pbmi = &bmi;
+    memset(pbmi, 0, sizeof(BITMAPINFO));
+    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    pbmi->bmiHeader.biWidth = pwfb->stfb->Base.Width;
+    pbmi->bmiHeader.biHeight= -((long)pwfb->stfb->Base.Height);
+    pbmi->bmiHeader.biPlanes = 1;
+    pbmi->bmiHeader.biBitCount = pwfb->cColorBits;
+    pbmi->bmiHeader.biCompression = BI_RGB;
+    pbmi->bmiHeader.biSizeImage = 0;
+    pbmi->bmiHeader.biXPelsPerMeter = 0;
+    pbmi->bmiHeader.biYPelsPerMeter = 0;
+    pbmi->bmiHeader.biClrUsed = 0;
+    pbmi->bmiHeader.biClrImportant = 0;
+
+    StretchDIBits(pwfb->hDC, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height, wm_buf->data, pbmi, 0, SRCCOPY);
+#endif
+}
+
+
+
+static const char *
+wm_get_name(struct pipe_winsys *pws)
+{
+   return "gdi";
+}
+
+static struct pipe_buffer *
+wm_buffer_create(struct pipe_winsys *pws, 
+                 unsigned alignment, 
+                 unsigned usage,
+                 unsigned size)
+{
+   struct wm_buffer *buffer = CALLOC_STRUCT(wm_buffer);
+
+   buffer->base.refcount = 1;
+   buffer->base.alignment = alignment;
+   buffer->base.usage = usage;
+   buffer->base.size = size;
+
+   if (buffer->data == NULL) {
+      /* align to 16-byte multiple for Cell */
+      buffer->data = align_malloc(size, max(alignment, 16));
+   }
+
+   return &buffer->base;
+}
+
+
+/**
+ * Create buffer which wraps user-space data.
+ */
+static struct pipe_buffer *
+wm_user_buffer_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
+{
+   struct wm_buffer *buffer = CALLOC_STRUCT(wm_buffer);
+   buffer->base.refcount = 1;
+   buffer->base.size = bytes;
+   buffer->userBuffer = TRUE;
+   buffer->data = ptr;
+
+   return &buffer->base;
+}
+
+
+
+/**
+ * Round n up to next multiple.
+ */
+static INLINE unsigned
+round_up(unsigned n, unsigned multiple)
+{
+   return (n + multiple - 1) & ~(multiple - 1);
+}
+
+static int
+wm_surface_alloc_storage(struct pipe_winsys *winsys,
+                         struct pipe_surface *surf,
+                         unsigned width, unsigned height,
+                         enum pipe_format format, 
+                         unsigned flags)
+{
+   const unsigned alignment = 64;
+
+   surf->width = width;
+   surf->height = height;
+   surf->format = format;
+   surf->cpp = pf_get_size(format);
+   surf->pitch = round_up(width, alignment / surf->cpp);
+
+   assert(!surf->buffer);
+   surf->buffer = winsys->buffer_create(winsys, alignment,
+                                        PIPE_BUFFER_USAGE_PIXEL,
+                                        surf->pitch * surf->cpp * height);
+   if(!surf->buffer)
+      return -1;
+   
+   return 0;
+}
+
+
+/**
+ * Called via winsys->surface_alloc() to create new surfaces.
+ */
+static struct pipe_surface *
+wm_surface_alloc(struct pipe_winsys *ws)
+{
+   struct wmesa_surface *wms = CALLOC_STRUCT(wmesa_surface);
+   static boolean no_swap = 0;
+   static boolean firsttime = 1;
+
+   if (firsttime) {
+      no_swap = getenv("SP_NO_RAST") != NULL;
+      firsttime = 0;
+   }
+
+   assert(ws);
+
+   wms->surface.refcount = 1;
+   wms->surface.winsys = ws;
+
+   wms->no_swap = no_swap;
+   
+   return &wms->surface;
+}
+
+static void
+wm_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s)
+{
+   struct pipe_surface *surf = *s;
+   surf->refcount--;
+   if (surf->refcount == 0) {
+      if (surf->buffer)
+       pipe_buffer_reference(winsys, &surf->buffer, NULL);
+      free(surf);
+   }
+   *s = NULL;
+}
+
+
+/*
+ * Fence functions - basically nothing to do, as we don't create any actual
+ * fence objects.
+ */
+
+static void
+wm_fence_reference(struct pipe_winsys *sws, struct pipe_fence_handle **ptr,
+                   struct pipe_fence_handle *fence)
+{
+}
+
+
+static int
+wm_fence_signalled(struct pipe_winsys *sws, struct pipe_fence_handle *fence,
+                   unsigned flag)
+{
+   return 0;
+}
+
+
+static int
+wm_fence_finish(struct pipe_winsys *sws, struct pipe_fence_handle *fence,
+                unsigned flag)
+{
+   return 0;
+}
+
+
+
+struct pipe_winsys *
+wmesa_get_pipe_winsys(GLvisual *visual)
+{
+   static struct wmesa_pipe_winsys *ws = NULL;
+
+   if (!ws) {
+      ws = CALLOC_STRUCT(wmesa_pipe_winsys);
+
+      /* Fill in this struct with callbacks that pipe will need to
+       * communicate with the window system, buffer manager, etc. 
+       */
+      ws->base.buffer_create = wm_buffer_create;
+      ws->base.user_buffer_create = wm_user_buffer_create;
+      ws->base.buffer_map = wm_buffer_map;
+      ws->base.buffer_unmap = wm_buffer_unmap;
+      ws->base.buffer_destroy = wm_buffer_destroy;
+
+      ws->base.surface_alloc = wm_surface_alloc;
+      ws->base.surface_alloc_storage = wm_surface_alloc_storage;
+      ws->base.surface_release = wm_surface_release;
+
+      ws->base.fence_reference = wm_fence_reference;
+      ws->base.fence_signalled = wm_fence_signalled;
+      ws->base.fence_finish = wm_fence_finish;
+
+      ws->base.flush_frontbuffer = wm_flush_frontbuffer;
+      ws->base.get_name = wm_get_name;
+   }
+
+   return &ws->base;
+}
+
+
+
+/**********************************************************************/
+/*****                   WMESA Functions                          *****/
+/**********************************************************************/
+
+WMesaContext WMesaCreateContext(HDC hDC, 
+                               HPALETTE* Pal,
+                               GLboolean rgb_flag,
+                               GLboolean db_flag,
+                               GLboolean alpha_flag)
+{
+   WMesaContext c;
+   struct pipe_winsys *pws;
+   struct pipe_context *pipe;
+   struct pipe_screen *screen;
+   GLint red_bits, green_bits, blue_bits, alpha_bits;
+   GLvisual *visual;
+
+   (void) Pal;
+    
+   /* Indexed mode not supported */
+   if (!rgb_flag)
+       return NULL;
+
+   /* Allocate wmesa context */
+   c = CALLOC_STRUCT(wmesa_context);
+   if (!c)
+       return NULL;
+
+   c->hDC = hDC;
+
+    /* Get data for visual */
+    /* Dealing with this is actually a bit of overkill because Mesa will end
+     * up treating all color component size requests less than 8 by using 
+     * a single byte per channel.  In addition, the interface to the span
+     * routines passes colors as an entire byte per channel anyway, so there
+     * is nothing to be saved by telling the visual to be 16 bits if the device
+     * is 16 bits.  That is, Mesa is going to compute colors down to 8 bits per
+     * channel anyway.
+     * But we go through the motions here anyway.
+     */
+    c->cColorBits = GetDeviceCaps(c->hDC, BITSPIXEL);
+
+    switch (c->cColorBits) {
+    case 16:
+       red_bits = green_bits = blue_bits = 5;
+       alpha_bits = 0;
+       break;
+    default:
+       red_bits = green_bits = blue_bits = 8;
+       alpha_bits = 8;
+       break;
+    }
+    /* Create visual based on flags */
+    visual = _mesa_create_visual(rgb_flag,
+                                 db_flag,    /* db_flag */
+                                 GL_FALSE,   /* stereo */
+                                 red_bits, green_bits, blue_bits, /* color RGB */
+                                 alpha_flag ? alpha_bits : 0, /* color A */
+                                 0,          /* index bits */
+                                 DEFAULT_SOFTWARE_DEPTH_BITS, /* depth_bits */
+                                 8,          /* stencil_bits */
+                                 16,16,16,   /* accum RGB */
+                                 alpha_flag ? 16 : 0, /* accum A */
+                                 1);         /* num samples */
+    
+    if (!visual) {
+       _mesa_free(c);
+       return NULL;
+    }
+
+    pws = wmesa_get_pipe_winsys(visual);
+
+    screen = softpipe_create_screen(pws);
+
+    if (!screen) {
+        _mesa_free(c);
+       return NULL;
+   }
+
+   pipe = softpipe_create(screen, pws, NULL);
+
+   if (!pipe) {
+      /* FIXME - free screen */
+      _mesa_free(c);
+      return NULL;
+   }
+
+   pipe->priv = c;
+
+   c->st = st_create_context(pipe, visual, NULL);
+
+   c->st->ctx->DriverCtx = c;
+
+   return c;
+}
+
+
+void WMesaDestroyContext( WMesaContext pwc )
+{
+    GLcontext *ctx = pwc->st->ctx;
+    WMesaFramebuffer pwfb;
+    GET_CURRENT_CONTEXT(cur_ctx);
+
+    if (cur_ctx == ctx) {
+        /* unbind current if deleting current context */
+        WMesaMakeCurrent(NULL, NULL);
+    }
+
+    /* clean up frame buffer resources */
+    pwfb = wmesa_lookup_framebuffer(pwc->hDC);
+    if (pwfb) {
+#if 0
+       wmDeleteBackingStore(pwfb);
+#endif
+       wmesa_free_framebuffer(pwc->hDC);
+    }
+
+    /* Release for device, not memory contexts */
+    if (WindowFromDC(pwc->hDC) != NULL)
+    {
+      ReleaseDC(WindowFromDC(pwc->hDC), pwc->hDC);
+    }
+    
+    st_destroy_context(pwc->st);
+    _mesa_free(pwc);
+}
+
+
+void WMesaMakeCurrent(WMesaContext c, HDC hdc)
+{
+    GLuint width = 0, height = 0;
+    WMesaFramebuffer pwfb;
+
+    {
+        /* return if already current */
+        GET_CURRENT_CONTEXT(ctx);
+        WMesaContext pwc = wmesa_context(ctx);
+        if (pwc && c == pwc && pwc->hDC == hdc)
+            return;
+    }
+
+    pwfb = wmesa_lookup_framebuffer(hdc);
+
+    if (hdc) {
+        get_window_size(hdc, &width, &height);
+    }
+
+    /* Lazy creation of framebuffers */
+    if (c && !pwfb && (hdc != 0)) {
+        GLvisual *visual = &c->st->ctx->Visual;
+
+        pwfb = wmesa_new_framebuffer(hdc, visual, width, height);
+    }
+
+    if (c && pwfb) {
+       st_make_current(c->st, pwfb->stfb, pwfb->stfb);
+
+       st_resize_framebuffer(pwfb->stfb, width, height);
+   }
+   else {
+      /* Detach */
+      st_make_current( NULL, NULL, NULL );
+   }
+}
+
+
+void WMesaSwapBuffers( HDC hdc )
+{
+   struct pipe_surface *surf;
+   struct wm_buffer *wm_buf;
+    WMesaFramebuffer pwfb = wmesa_lookup_framebuffer(hdc);
+    BITMAPINFO bmi, *pbmi;
+
+    if (!pwfb) {
+        _mesa_problem(NULL, "wmesa: swapbuffers on unknown hdc");
+        return;
+    }
+
+
+    /* If we're swapping the buffer associated with the current context
+     * we have to flush any pending rendering commands first.
+     */
+    st_notify_swapbuffers(pwfb->stfb);
+
+#if 0
+    BitBlt(pwfb->hDC, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height,
+              pwfb->dib_hDC, 0, 0, SRCCOPY);
+#else
+    surf = st_get_framebuffer_surface(pwfb->stfb, ST_SURFACE_BACK_LEFT);
+    wm_buf = wm_buffer(surf->buffer);
+
+    pbmi = &bmi;
+    memset(pbmi, 0, sizeof(BITMAPINFO));
+    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    pbmi->bmiHeader.biWidth = pwfb->stfb->Base.Width;
+    pbmi->bmiHeader.biHeight= -((long)pwfb->stfb->Base.Height);
+    pbmi->bmiHeader.biPlanes = 1;
+    pbmi->bmiHeader.biBitCount = pwfb->cColorBits;
+    pbmi->bmiHeader.biCompression = BI_RGB;
+    pbmi->bmiHeader.biSizeImage = 0;
+    pbmi->bmiHeader.biXPelsPerMeter = 0;
+    pbmi->bmiHeader.biYPelsPerMeter = 0;
+    pbmi->bmiHeader.biClrUsed = 0;
+    pbmi->bmiHeader.biClrImportant = 0;
+
+    StretchDIBits(pwfb->hDC, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height, 0, 0, pwfb->stfb->Base.Width, pwfb->stfb->Base.Height, wm_buf->data, pbmi, 0, SRCCOPY);
+
+    {
+        GLuint width = 0, height = 0;
+
+        get_window_size(pwfb->hDC, &width, &height);
+
+       st_resize_framebuffer(pwfb->stfb, width, height);
+    }
+#endif
+}
+
+/* This is hopefully a temporary hack to define some needed dispatch
+ * table entries.  Hopefully, I'll find a better solution.  The
+ * dispatch table generation scripts ought to be making these dummy
+ * stubs as well. */
+#if !defined(__MINGW32__) || !defined(GL_NO_STDCALL)
+void gl_dispatch_stub_543(void){}
+void gl_dispatch_stub_544(void){}
+void gl_dispatch_stub_545(void){}
+void gl_dispatch_stub_546(void){}
+void gl_dispatch_stub_547(void){}
+void gl_dispatch_stub_548(void){}
+void gl_dispatch_stub_549(void){}
+void gl_dispatch_stub_550(void){}
+void gl_dispatch_stub_551(void){}
+void gl_dispatch_stub_552(void){}
+void gl_dispatch_stub_553(void){}
+void gl_dispatch_stub_554(void){}
+void gl_dispatch_stub_555(void){}
+void gl_dispatch_stub_556(void){}
+void gl_dispatch_stub_557(void){}
+void gl_dispatch_stub_558(void){}
+void gl_dispatch_stub_559(void){}
+void gl_dispatch_stub_560(void){}
+void gl_dispatch_stub_561(void){}
+void gl_dispatch_stub_565(void){}
+void gl_dispatch_stub_566(void){}
+void gl_dispatch_stub_577(void){}
+void gl_dispatch_stub_578(void){}
+void gl_dispatch_stub_603(void){}
+void gl_dispatch_stub_645(void){}
+void gl_dispatch_stub_646(void){}
+void gl_dispatch_stub_647(void){}
+void gl_dispatch_stub_648(void){}
+void gl_dispatch_stub_649(void){}
+void gl_dispatch_stub_650(void){}
+void gl_dispatch_stub_651(void){}
+void gl_dispatch_stub_652(void){}
+void gl_dispatch_stub_653(void){}
+void gl_dispatch_stub_733(void){}
+void gl_dispatch_stub_734(void){}
+void gl_dispatch_stub_735(void){}
+void gl_dispatch_stub_736(void){}
+void gl_dispatch_stub_737(void){}
+void gl_dispatch_stub_738(void){}
+void gl_dispatch_stub_744(void){}
+void gl_dispatch_stub_745(void){}
+void gl_dispatch_stub_746(void){}
+void gl_dispatch_stub_760(void){}
+void gl_dispatch_stub_761(void){}
+void gl_dispatch_stub_763(void){}
+void gl_dispatch_stub_765(void){}
+void gl_dispatch_stub_766(void){}
+void gl_dispatch_stub_767(void){}
+void gl_dispatch_stub_768(void){}
+
+void gl_dispatch_stub_562(void){}
+void gl_dispatch_stub_563(void){}
+void gl_dispatch_stub_564(void){}
+void gl_dispatch_stub_567(void){}
+void gl_dispatch_stub_568(void){}
+void gl_dispatch_stub_569(void){}
+void gl_dispatch_stub_580(void){}
+void gl_dispatch_stub_581(void){}
+void gl_dispatch_stub_606(void){}
+void gl_dispatch_stub_654(void){}
+void gl_dispatch_stub_655(void){}
+void gl_dispatch_stub_656(void){}
+void gl_dispatch_stub_739(void){}
+void gl_dispatch_stub_740(void){}
+void gl_dispatch_stub_741(void){}
+void gl_dispatch_stub_748(void){}
+void gl_dispatch_stub_749(void){}
+void gl_dispatch_stub_769(void){}
+void gl_dispatch_stub_770(void){}
+void gl_dispatch_stub_771(void){}
+void gl_dispatch_stub_772(void){}
+void gl_dispatch_stub_773(void){}
+
+#endif
diff --git a/src/gallium/winsys/gdi/wmesadef.h b/src/gallium/winsys/gdi/wmesadef.h
new file mode 100644 (file)
index 0000000..fb8ce30
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef WMESADEF_H
+#define WMESADEF_H
+#ifdef __MINGW32__
+#include <windows.h>
+#endif
+#if 0
+#include "context.h"
+#endif
+#include "state_tracker/st_context.h"
+#include "state_tracker/st_public.h"
+
+
+/**
+ * The Windows Mesa rendering context, derived from GLcontext.
+ */
+struct wmesa_context {
+    struct st_context  *st;
+    HDC                 hDC;
+    BYTE               cColorBits;
+};
+
+/**
+ * Windows framebuffer, derived from gl_framebuffer
+ */
+struct wmesa_framebuffer
+{
+    struct st_framebuffer *stfb;
+    HDC                 hDC;
+    int                        pixelformat;
+    BYTE               cColorBits;
+    HDC                 dib_hDC;
+    HBITMAP             hbmDIB;
+    HBITMAP             hOldBitmap;
+    PBYTE               pbPixels;
+    struct wmesa_framebuffer *next;
+};
+
+typedef struct wmesa_framebuffer *WMesaFramebuffer;
+
+#endif /* WMESADEF_H */