gdi: Port of the gdi mesa driver to gallium (Alan Hourihane).

This commit is contained in:
José Fonseca 2008-06-03 00:03:17 +09:00
parent 6a39bcf375
commit 7c22bb383a
6 changed files with 2554 additions and 0 deletions

View file

@ -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'],
)

View file

@ -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)))

View file

@ -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

View file

@ -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";
}

View file

@ -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

View file

@ -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 */