第16月第9天 opengl glCltDispatchTable

1.glCltDispatchTable

typedef struct _GLTEBINFO {
    // glCltDispatchTable must be the first field for the assembly code to work.
    // We pad the table with an extra entry if necessary to make glMsgBatchInfo
    // start at a qword boundary.
    PVOID glCltDispatchTable[(OPENGL_VERSION_110_ENTRIES+GL_EXT_PROC_TABLE_SIZE+1)/2*2];

    // This field must be qword aligned!
    BYTE glMsgBatchInfo[SHARED_SECTION_SIZE];

#ifdef _WIN95_
    // These fields must match the NT TEB definitions!

    PVOID glDispatchTable[280]; // fast dispatch table
    ULONG glReserved1[26];      // POLYARRAY structure
    PVOID glReserved2;          // pointer to POLYMATERIAL structure
    PVOID glSectionInfo;        // generic server GC
    PVOID glSection;            // Not used
    PVOID glTable;              // Used only for NT x86
    PVOID glCurrentRC;          // generic client RC
    PVOID glContext;            // reserved by OpenGL ICD drivers
#endif // _WIN95_
} GLTEBINFO, *PGLTEBINFO;

 

// There are now 2 tables!
// One table is used for RGBA mode and the other is for CI mode.

GLCLTPROCTABLE glCltRGBAProcTable = {

/* Number of function entries in the table */

     sizeof(GLDISPATCHTABLE) / sizeof(PROC),

/* gl Entry points */
  {
     glcltNewList                ,
     glcltEndList                ,
     glcltCallList               ,
     glcltCallLists              ,
     glcltDeleteLists            ,
     glcltGenLists               ,
     glcltListBase               ,
     glcltBegin                  ,
     glcltBitmap                 ,
     glcltColor3b_InRGBA         ,
     glcltColor3bv_InRGBA        ,
     glcltColor3d_InRGBA         ,
     glcltColor3dv_InRGBA        ,
     glcltColor3f_InRGBA         ,
     glcltColor3fv_InRGBA        ,
     glcltColor3i_InRGBA         ,
     glcltColor3iv_InRGBA        ,
     glcltColor3s_InRGBA         ,
     glcltColor3sv_InRGBA        ,
     glcltColor3ub_InRGBA        ,
     glcltColor3ubv_InRGBA       ,
     glcltColor3ui_InRGBA        ,
     glcltColor3uiv_InRGBA       ,
     glcltColor3us_InRGBA        ,
     glcltColor3usv_InRGBA       ,
     glcltColor4b_InRGBA         ,
     glcltColor4bv_InRGBA        ,
     glcltColor4d_InRGBA         ,
     glcltColor4dv_InRGBA        ,
     glcltColor4f_InRGBA         ,
     glcltColor4fv_InRGBA        ,
     glcltColor4i_InRGBA         ,
     glcltColor4iv_InRGBA        ,
     glcltColor4s_InRGBA         ,
     glcltColor4sv_InRGBA        ,
     glcltColor4ub_InRGBA        ,
     glcltColor4ubv_InRGBA       ,
     glcltColor4ui_InRGBA        ,
     glcltColor4uiv_InRGBA       ,
     glcltColor4us_InRGBA        ,
     glcltColor4usv_InRGBA       ,
     glcltEdgeFlag               ,
     glcltEdgeFlagv              ,
     glcltEnd                    ,
     glcltIndexd_InRGBA          ,
     glcltIndexdv_InRGBA         ,
     glcltIndexf_InRGBA          ,
     glcltIndexfv_InRGBA         ,
     glcltIndexi_InRGBA          ,
     glcltIndexiv_InRGBA         ,
     glcltIndexs_InRGBA          ,
     glcltIndexsv_InRGBA         ,
     glcltNormal3b               ,
     glcltNormal3bv              ,
     glcltNormal3d               ,
     glcltNormal3dv              ,
     glcltNormal3f               ,
     glcltNormal3fv              ,
     glcltNormal3i               ,
     glcltNormal3iv              ,
     glcltNormal3s               ,
     glcltNormal3sv              ,
     glcltRasterPos2d            ,
     glcltRasterPos2dv           ,
     glcltRasterPos2f            ,
     glcltRasterPos2fv           ,
     glcltRasterPos2i            ,
     glcltRasterPos2iv           ,
     glcltRasterPos2s            ,
     glcltRasterPos2sv           ,
     glcltRasterPos3d            ,
     glcltRasterPos3dv           ,
     glcltRasterPos3f            ,
     glcltRasterPos3fv           ,
     glcltRasterPos3i            ,
     glcltRasterPos3iv           ,
     glcltRasterPos3s            ,
     glcltRasterPos3sv           ,
     glcltRasterPos4d            ,
     glcltRasterPos4dv           ,
     glcltRasterPos4f            ,
     glcltRasterPos4fv           ,
     glcltRasterPos4i            ,
     glcltRasterPos4iv           ,
     glcltRasterPos4s            ,
     glcltRasterPos4sv           ,
     glcltRectd                  ,
     glcltRectdv                 ,
     glcltRectf                  ,
     glcltRectfv                 ,
     glcltRecti                  ,
     glcltRectiv                 ,
     glcltRects                  ,
     glcltRectsv                 ,
     glcltTexCoord1d             ,
     glcltTexCoord1dv            ,
     glcltTexCoord1f             ,
     glcltTexCoord1fv            ,
     glcltTexCoord1i             ,
     glcltTexCoord1iv            ,
     glcltTexCoord1s             ,
     glcltTexCoord1sv            ,
     glcltTexCoord2d             ,
     glcltTexCoord2dv            ,
     glcltTexCoord2f             ,
     glcltTexCoord2fv            ,
     glcltTexCoord2i             ,
     glcltTexCoord2iv            ,
     glcltTexCoord2s             ,
     glcltTexCoord2sv            ,
     glcltTexCoord3d             ,
     glcltTexCoord3dv            ,
     glcltTexCoord3f             ,
     glcltTexCoord3fv            ,
     glcltTexCoord3i             ,
     glcltTexCoord3iv            ,
     glcltTexCoord3s             ,
     glcltTexCoord3sv            ,
     glcltTexCoord4d             ,
     glcltTexCoord4dv            ,
     glcltTexCoord4f             ,
     glcltTexCoord4fv            ,
     glcltTexCoord4i             ,
     glcltTexCoord4iv            ,
     glcltTexCoord4s             ,
     glcltTexCoord4sv            ,
     glcltVertex2d               ,
     glcltVertex2dv              ,
     glcltVertex2f               ,
     glcltVertex2fv              ,
     glcltVertex2i               ,
     glcltVertex2iv              ,
     glcltVertex2s               ,
     glcltVertex2sv              ,
     glcltVertex3d               ,
     glcltVertex3dv              ,
     glcltVertex3f               ,
     glcltVertex3fv              ,
     glcltVertex3i               ,
     glcltVertex3iv              ,
     glcltVertex3s               ,
     glcltVertex3sv              ,
     glcltVertex4d               ,
     glcltVertex4dv              ,
     glcltVertex4f               ,
     glcltVertex4fv              ,
     glcltVertex4i               ,
     glcltVertex4iv              ,
     glcltVertex4s               ,
     glcltVertex4sv              ,
     glcltClipPlane              ,
     glcltColorMaterial          ,
     glcltCullFace               ,
     glcltFogf                   ,
     glcltFogfv                  ,
     glcltFogi                   ,
     glcltFogiv                  ,
     glcltFrontFace              ,
     glcltHint                   ,
     glcltLightf                 ,
     glcltLightfv                ,
     glcltLighti                 ,
     glcltLightiv                ,
     glcltLightModelf            ,
     glcltLightModelfv           ,
     glcltLightModeli            ,
     glcltLightModeliv           ,
     glcltLineStipple            ,
     glcltLineWidth              ,
     glcltMaterialf              ,
     glcltMaterialfv             ,
     glcltMateriali              ,
     glcltMaterialiv             ,
     glcltPointSize              ,
     glcltPolygonMode            ,
     glcltPolygonStipple         ,
     glcltScissor                ,
     glcltShadeModel             ,
     glcltTexParameterf          ,
     glcltTexParameterfv         ,
     glcltTexParameteri          ,
     glcltTexParameteriv         ,
     glcltTexImage1D             ,
     glcltTexImage2D             ,
     glcltTexEnvf                ,
     glcltTexEnvfv               ,
     glcltTexEnvi                ,
     glcltTexEnviv               ,
     glcltTexGend                ,
     glcltTexGendv               ,
     glcltTexGenf                ,
     glcltTexGenfv               ,
     glcltTexGeni                ,
     glcltTexGeniv               ,
     glcltFeedbackBuffer         ,
     glcltSelectBuffer           ,
     glcltRenderMode             ,
     glcltInitNames              ,
     glcltLoadName               ,
     glcltPassThrough            ,
     glcltPopName                ,
     glcltPushName               ,
     glcltDrawBuffer             ,
     glcltClear                  ,
     glcltClearAccum             ,
     glcltClearIndex             ,
     glcltClearColor             ,
     glcltClearStencil           ,
     glcltClearDepth             ,
     glcltStencilMask            ,
     glcltColorMask              ,
     glcltDepthMask              ,
     glcltIndexMask              ,
     glcltAccum                  ,
     glcltDisable                ,
     glcltEnable                 ,
     glcltFinish                 ,
     glcltFlush                  ,
     glcltPopAttrib              ,
     glcltPushAttrib             ,
     glcltMap1d                  ,
     glcltMap1f                  ,
     glcltMap2d                  ,
     glcltMap2f                  ,
     glcltMapGrid1d              ,
     glcltMapGrid1f              ,
     glcltMapGrid2d              ,
     glcltMapGrid2f              ,
     glcltEvalCoord1d            ,
     glcltEvalCoord1dv           ,
     glcltEvalCoord1f            ,
     glcltEvalCoord1fv           ,
     glcltEvalCoord2d            ,
     glcltEvalCoord2dv           ,
     glcltEvalCoord2f            ,
     glcltEvalCoord2fv           ,
     glcltEvalMesh1              ,
     glcltEvalPoint1             ,
     glcltEvalMesh2              ,
     glcltEvalPoint2             ,
     glcltAlphaFunc              ,
     glcltBlendFunc              ,
     glcltLogicOp                ,
     glcltStencilFunc            ,
     glcltStencilOp              ,
     glcltDepthFunc              ,
     glcltPixelZoom              ,
     glcltPixelTransferf         ,
     glcltPixelTransferi         ,
     glcltPixelStoref            ,
     glcltPixelStorei            ,
     glcltPixelMapfv             ,
     glcltPixelMapuiv            ,
     glcltPixelMapusv            ,
     glcltReadBuffer             ,
     glcltCopyPixels             ,
     glcltReadPixels             ,
     glcltDrawPixels             ,
     glcltGetBooleanv            ,
     glcltGetClipPlane           ,
     glcltGetDoublev             ,
     glcltGetError               ,
     glcltGetFloatv              ,
     glcltGetIntegerv            ,
     glcltGetLightfv             ,
     glcltGetLightiv             ,
     glcltGetMapdv               ,
     glcltGetMapfv               ,
     glcltGetMapiv               ,
     glcltGetMaterialfv          ,
     glcltGetMaterialiv          ,
     glcltGetPixelMapfv          ,
     glcltGetPixelMapuiv         ,
     glcltGetPixelMapusv         ,
     glcltGetPolygonStipple      ,
     glcltGetString              ,
     glcltGetTexEnvfv            ,
     glcltGetTexEnviv            ,
     glcltGetTexGendv            ,
     glcltGetTexGenfv            ,
     glcltGetTexGeniv            ,
     glcltGetTexImage            ,
     glcltGetTexParameterfv      ,
     glcltGetTexParameteriv      ,
     glcltGetTexLevelParameterfv ,
     glcltGetTexLevelParameteriv ,
     glcltIsEnabled              ,
     glcltIsList                 ,
     glcltDepthRange             ,
     glcltFrustum                ,
     glcltLoadIdentity           ,
     glcltLoadMatrixf            ,
     glcltLoadMatrixd            ,
     glcltMatrixMode             ,
     glcltMultMatrixf            ,
     glcltMultMatrixd            ,
     glcltOrtho                  ,
     glcltPopMatrix              ,
     glcltPushMatrix             ,
     glcltRotated                ,
     glcltRotatef                ,
     glcltScaled                 ,
     glcltScalef                 ,
     glcltTranslated             ,
     glcltTranslatef             ,
     glcltViewport               ,
     glcltArrayElement           ,
     glcltBindTexture            ,
     glcltColorPointer           ,
     glcltDisableClientState     ,
     glcltDrawArrays             ,
     glcltDrawElements           ,
     glcltEdgeFlagPointer        ,
     glcltEnableClientState      ,
     glcltIndexPointer           ,
     glcltIndexub_InRGBA         ,
     glcltIndexubv_InRGBA        ,
     glcltInterleavedArrays      ,
     glcltNormalPointer          ,
     glcltPolygonOffset          ,
     glcltTexCoordPointer        ,
     glcltVertexPointer          ,
     glcltAreTexturesResident    ,
     glcltCopyTexImage1D         ,
     glcltCopyTexImage2D         ,
     glcltCopyTexSubImage1D      ,
     glcltCopyTexSubImage2D      ,
     glcltDeleteTextures         ,
     glcltGenTextures            ,
     glcltGetPointerv            ,
     glcltIsTexture              ,
     glcltPrioritizeTextures     ,
     glcltTexSubImage1D          ,
     glcltTexSubImage2D          ,
     glcltPopClientAttrib        ,
     glcltPushClientAttrib       ,
  }

};

GLCLTPROCTABLE glCltCIProcTable = {

/* Number of function entries in the table */

     sizeof(GLDISPATCHTABLE) / sizeof(PROC),

/* gl Entry points */
  {
...

 

2.ntstubs.c

HWND _CreateWindowEx(
    DWORD dwExStyle,
    LPCTSTR pClassName,
    LPCTSTR pWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hwndParent,
    HMENU hmenu,
    HANDLE hModule,
    LPVOID pParam,
    DWORD dwFlags,
    LPDWORD pWOW)
{
...

HWND NtUserCreateWindowEx(
    IN DWORD dwExStyle,
    IN PLARGE_STRING pstrClassName,
    IN PLARGE_STRING pstrWindowName OPTIONAL,
    IN DWORD dwStyle,
    IN int x,
    IN int y,
    IN int nWidth,
    IN int nHeight,
    IN HWND hwndParent,
    IN HMENU hmenu,
    IN HANDLE hModule,
    IN LPVOID pParam,
    IN DWORD dwFlags,
    IN LPDWORD pWOW OPTIONAL)
{
...

PWND xxxCreateWindowExWOW(
    DWORD         dwExStyle,
    PLARGE_STRING pstrClass,
    PLARGE_STRING pstrName,
    DWORD         style,
    int           x,
    int           y,
    int           cx,
    int           cy,
    PWND          pwndParent,
    PMENU         pMenu,
    HANDLE        hInstance,
    LPVOID        lpCreateParams,
    DWORD         dwExpWinVerAndFlags,
    LPDWORD       lpWOW)
{
...

 

3.CreateThread

 

CWinThread::CWinThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam)
{
        m_pfnThreadProc = pfnThreadProc;
        m_pThreadParams = pParam;

        CommonConstruct();
}

...

BOOL CWinThread::CreateThread(DWORD dwCreateFlags, UINT nStackSize,
        LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{
#if !defined(_MT) || defined(_NTSDK)
        dwCreateFlags;
        nStackSize;
        lpSecurityAttrs;

        return FALSE;
#else
        ASSERT(m_hThread == NULL);  // already created?

        // create thread state
        AFX_THREAD_STATE* pThreadState = new AFX_THREAD_STATE;
        if (pThreadState == NULL)
                return FALSE;

        // hook up the CWinThread object to the thread state
        pThreadState->m_pCurrentWinThread = this;

        // create the thread (it may or may not start to run)
        m_hThread = (HANDLE)_beginthreadex(lpSecurityAttrs, nStackSize,
                &_AfxThreadEntry, pThreadState, dwCreateFlags, (UINT*)&m_nThreadID);
        if (m_hThread == NULL)
        {
                // cleanup before returning
                pThreadState->m_pCurrentWinThread = NULL;
                delete pThreadState;
                return FALSE;
        }

        return TRUE;
#endif //!defined(_MT) || defined(_NTSDK)
}

...

UINT APIENTRY _AfxThreadEntry(void* pParam)
{
        // initialize the thread state to point to this thread
        AFX_THREAD_STATE* pThreadState = (AFX_THREAD_STATE*)pParam;
        CWinThread* pThread = pThreadState->m_pCurrentWinThread;
        TlsSetValue(_afxThreadTlsIndex, pThreadState);
        ASSERT(AfxGetThreadState() == pThreadState);
        ASSERT(AfxGetThread() == pThread);

        // initialize MFC exception handling
#ifndef _AFX_OLD_EXCEPTIONS
        set_terminate(&AfxStandardTerminate);
#endif
        _set_new_handler(&AfxNewHandler);

        // thread inherits app's main window if not already set
        CWnd threadWnd;
        CWinApp* pApp = AfxGetApp();
        ASSERT(pApp != NULL);
        if (pThread->m_pMainWnd == NULL && pApp->m_pMainWnd->GetSafeHwnd() != NULL)
        {
                // just attach the HWND
                threadWnd.Attach(pApp->m_pMainWnd->m_hWnd);
                pThread->m_pMainWnd = &threadWnd;
        }

#if !defined(_USRDLL) && !defined(_AFXCTL)
        // initialize gray dialogs for this thread
        AFX_WIN_STATE* pWinState = AfxGetWinState();

        // initalize window creation hook
        ASSERT(pThreadState->m_hHookOldCbtFilter == NULL);
        pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,
                _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());

        // initialize message filter hook
        ASSERT(pThreadState->m_hHookOldMsgFilter == NULL);
        pThreadState->m_hHookOldMsgFilter = ::SetWindowsHookEx(WH_MSGFILTER,
                (HOOKPROC)_AfxMsgFilterHook, NULL, ::GetCurrentThreadId());

#ifndef _MAC
        // intialize CTL3D for this thread
        if (pWinState->m_pfnAutoSubclass != NULL)
                (*pWinState->m_pfnAutoSubclass)(AfxGetInstanceHandle());
#endif
#endif

        // first -- check for simple worker thread
        DWORD nResult;
        if (pThread->m_pfnThreadProc != NULL)
        {
                nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams);
                ASSERT_VALID(pThread);
        }
        // else -- check for thread with message loop
        else if (!pThread->InitInstance())
        {
                ASSERT_VALID(pThread);
                nResult = pThread->ExitInstance();
        }
        else
        {
                // will stop after PostQuitMessage called
                ASSERT_VALID(pThread);
                nResult = pThread->Run();
        }
        AfxEndThread(nResult);

        return 0;   // not reached
}

 

posted @ 2018-01-09 14:04  lianhuaren  阅读(248)  评论(0编辑  收藏  举报