;---------------------------Module-Header------------------------------; ; Module Name: glivtx.asm ; ; OpenGL vertex API function entries for i386. ; ; Created: 04/16/1996 ; Author: Drew Bliss [drewb] ; ; Copyright (c) 1996 Microsoft Corporation ;----------------------------------------------------------------------; .386 .model small,c assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT assume fs:nothing,gs:nothing .xlist include ks386.inc include gli386.inc PROFILE = 0 include profile.inc .list OPTION PROLOGUE:NONE OPTION EPILOGUE:NONE @PolyArrayFlushPartialPrimitive@0 PROTO SYSCALL @glcltNormal3f_NotInBegin@16 PROTO SYSCALL @glcltTexCoord4f_NotInBegin@24 PROTO SYSCALL @glcltColor4f_InRGBA_NotInBegin@28 PROTO SYSCALL IF POLYARRAY_IN_BEGIN GT 255 .ERR POLYARRAY_IN_BEGIN too large ENDIF IF POLYARRAY_VERTEX3 GT 255 .ERR POLYARRAY_VERTEX3 too large ENDIF IF POLYDATA_VERTEX3 GT 255 .ERR POLYDATA_VERTEX3 too large ENDIF IF POLYARRAY_VERTEX2 GT 255 .ERR POLYARRAY_VERTEX2 too large ENDIF IF POLYDATA_VERTEX2 GT 255 .ERR POLYDATA_VERTEX2 too large ENDIF IF POLYDATA_NORMAL_VALID GT 255 .ERR POLYDATA_NORMAL_VALID too large ENDIF .data extrn dwTlsOffset:DWORD .code ; Gets the current POLYARRAY pointer in eax ; These functions cannot rely on registers being set by ; the dispatch functions because they are also called directly ; in the display list code IFDEF _WIN95_ GET_PATEB MACRO mov eax, fs:[PcTeb] add eax, DWORD PTR [dwTlsOffset] mov eax, [eax] add eax, GtiPaTeb ENDM GL_SETUP MACRO mov eax, fs:[PcTeb] add eax, DWORD PTR [dwTlsOffset] mov eax, [eax] mov ebx, [eax+GtiSectionInfo] add eax, GtiPaTeb ENDM ELSE GET_PATEB MACRO mov eax, fs:[TeglPaTeb] ENDM GL_SETUP MACRO mov eax, fs:[TeglPaTeb] mov ebx, fs:[TeglSectionInfo] ENDM ENDIF PA_VERTEX_STACK_USAGE EQU 4 ; Handles two and three-element vertex calls PA_VERTEX_23 MACRO base, offs, ret_n, pop_ebp, elts, pa_flag, pd_flag LOCAL NotInBegin, Flush GET_PATEB push esi mov ecx, [eax+PA_flags] mov esi, [eax+PA_pdNextVertex] test ecx, POLYARRAY_IN_BEGIN lea edx, [esi+sizeof_POLYDATA] jz NotInBegin or ecx, pa_flag mov [eax+PA_pdNextVertex], edx mov [eax+PA_flags], ecx mov ecx, [esi+PD_flags] mov [edx+PD_flags], 0 or ecx, pd_flag mov eax, [eax+PA_pdFlush] mov [esi+PD_flags], ecx cmp esi, eax mov edx, [base+offs] mov ecx, [base+offs+4] IF elts GT 2 mov eax, [base+offs+8] ELSE ; xor clears flags so don't use it here mov eax, 0 ENDIF mov [esi+PD_obj], edx mov [esi+PD_obj+4], ecx mov [esi+PD_obj+8], eax mov DWORD PTR [esi+PD_obj+12], __FLOAT_ONE jge Flush NotInBegin: pop esi IF pop_ebp pop ebp ENDIF ret ret_n Flush: call @PolyArrayFlushPartialPrimitive@0 pop esi IF pop_ebp pop ebp ENDIF ret ret_n ENDM glcltVertex2f@8 PROC PUBLIC PROF_ENTRY PA_VERTEX_23 esp, 4+PA_VERTEX_STACK_USAGE, 8, 0, 2, \ POLYARRAY_VERTEX2, POLYDATA_VERTEX2 glcltVertex2f@8 ENDP glcltVertex2fv@4 PROC PUBLIC PROF_ENTRY push ebp mov ebp, [esp+8] PA_VERTEX_23 ebp, 0, 4, 1, 2, \ POLYARRAY_VERTEX2, POLYDATA_VERTEX2 glcltVertex2fv@4 ENDP glcltVertex3f@12 PROC PUBLIC PROF_ENTRY PA_VERTEX_23 esp, 4+PA_VERTEX_STACK_USAGE, 12, 0, 3, \ POLYARRAY_VERTEX3, POLYDATA_VERTEX3 glcltVertex3f@12 ENDP glcltVertex3fv@4 PROC PUBLIC PROF_ENTRY push ebp mov ebp, [esp+8] PA_VERTEX_23 ebp, 0, 4, 1, 3, \ POLYARRAY_VERTEX3, POLYDATA_VERTEX3 glcltVertex3fv@4 ENDP PA_NORMAL_STACK_USAGE EQU 4 ; Handles three-element normal calls PA_NORMAL_3 MACRO base, offs, ret_n, pop_ebp LOCAL NotInBegin, Flush GET_PATEB push esi mov ecx, [eax+PA_flags] mov esi, [eax+PA_pdNextVertex] test ecx, POLYARRAY_IN_BEGIN mov edx, [base+offs] jz NotInBegin mov ecx, [esi+PD_flags] mov [eax+PA_pdCurNormal], esi or ecx, POLYDATA_NORMAL_VALID mov eax, [base+offs+4] mov [esi+PD_flags], ecx mov ecx, [base+offs+8] mov [esi+PD_normal], edx mov [esi+PD_normal+4], eax mov [esi+PD_normal+8], ecx pop esi IF pop_ebp pop ebp ENDIF ret ret_n NotInBegin: mov ecx, eax lea edx, [base+offs] push [edx+8] push [edx+4] push [edx] call @glcltNormal3f_NotInBegin@16 pop esi IF pop_ebp pop ebp ENDIF ret ret_n ENDM glcltNormal3f@12 PROC PUBLIC PROF_ENTRY PA_NORMAL_3 esp, 4+PA_NORMAL_STACK_USAGE, 12, 0 glcltNormal3f@12 ENDP glcltNormal3fv@4 PROC PUBLIC PROF_ENTRY push ebp mov ebp, [esp+8] PA_NORMAL_3 ebp, 0, 4, 1 glcltNormal3fv@4 ENDP PA_TEXTURE_STACK_USAGE EQU 4 ; Handles two and three-element texture calls PA_TEXTURE_23 MACRO base, offs, ret_n, pop_ebp, elts, pa_flag, pd_flag LOCAL NotInBegin, Flush GET_PATEB push esi mov ecx, [eax+PA_flags] mov esi, [eax+PA_pdNextVertex] test ecx, POLYARRAY_IN_BEGIN jz NotInBegin or ecx, pa_flag mov [eax+PA_pdCurTexture], esi mov [eax+PA_flags], ecx mov ecx, [esi+PD_flags] mov eax, [base+offs] or ecx, POLYDATA_TEXTURE_VALID OR pd_flag mov edx, [base+offs+4] mov [esi+PD_flags], ecx mov [esi+PD_texture], eax IF elts GT 2 mov ecx, [base+offs+8] ELSE xor ecx, ecx ENDIF mov [esi+PD_texture+4], edx mov [esi+PD_texture+8], ecx mov DWORD PTR [esi+PD_texture+12], __FLOAT_ONE pop esi IF pop_ebp pop ebp ENDIF ret ret_n NotInBegin: mov ecx, eax lea edx, [base+offs] push __FLOAT_ONE IF elts GT 2 push [edx+8] ELSE push 0 ENDIF push [edx+4] push [edx] mov edx, pa_flag call @glcltTexCoord4f_NotInBegin@24 pop esi IF pop_ebp pop ebp ENDIF ret ret_n ENDM glcltTexCoord2f@8 PROC PUBLIC PROF_ENTRY PA_TEXTURE_23 esp, 4+PA_TEXTURE_STACK_USAGE, 8, 0, 2, \ POLYARRAY_TEXTURE2, POLYDATA_DLIST_TEXTURE2 glcltTexCoord2f@8 ENDP glcltTexCoord2fv@4 PROC PUBLIC PROF_ENTRY push ebp mov ebp, [esp+8] PA_TEXTURE_23 ebp, 0, 4, 1, 2, \ POLYARRAY_TEXTURE2, POLYDATA_DLIST_TEXTURE2 glcltTexCoord2fv@4 ENDP glcltTexCoord3f@12 PROC PUBLIC PROF_ENTRY PA_TEXTURE_23 esp, 4+PA_TEXTURE_STACK_USAGE, 12, 0, 3, \ POLYARRAY_TEXTURE3, POLYDATA_DLIST_TEXTURE3 glcltTexCoord3f@12 ENDP glcltTexCoord3fv@4 PROC PUBLIC PROF_ENTRY push ebp mov ebp, [esp+8] PA_TEXTURE_23 ebp, 0, 4, 1, 3, \ POLYARRAY_TEXTURE3, POLYDATA_DLIST_TEXTURE3 glcltTexCoord3fv@4 ENDP if POLYARRAY_CLAMP_COLOR NE 080000000h .err endif PA_COLOR_STACK_USAGE EQU 12 ; Handles three and four-element color calls PA_COLOR_34 MACRO base, offs, ret_n, pop_ebp, elts, pd_flag LOCAL NotInBegin, Flush push ebx GL_SETUP push esi push edi mov ecx, [eax+PA_flags] mov esi, [eax+PA_pdNextVertex] test ecx, POLYARRAY_IN_BEGIN jz NotInBegin IF elts GT 3 fld DWORD PTR [base+offs+12] fmul DWORD PTR [ebx+GC_alphaVertexScale] ENDIF fld DWORD PTR [base+offs] mov [eax+PA_pdCurColor], esi fmul DWORD PTR [ebx+GC_redVertexScale] mov ecx, [esi+PD_flags] fld DWORD PTR [base+offs+4] or ecx, (POLYDATA_COLOR_VALID or pd_flag) fmul DWORD PTR [ebx+GC_greenVertexScale] mov [esi+PD_flags], ecx fld DWORD PTR [base+offs+8] fmul DWORD PTR [ebx+GC_blueVertexScale] ;; b g r (a) fxch ST(2) ;; r g b (a) fstp DWORD PTR [esi+PD_colors0+0] mov eax, [ebx+GC_redVertexScale] fstp DWORD PTR [esi+PD_colors0+4] mov edx, [esi+PD_colors0+0] fstp DWORD PTR [esi+PD_colors0+8] mov ecx, [ebx+GC_greenVertexScale] IF elts GT 3 fstp DWORD PTR [esi+PD_colors0+12] ENDIF mov edi, [esi+PD_colors0+4] sub eax, edx sub ecx, edi or eax, edx or ecx, edi mov edx, [ebx+GC_blueVertexScale] or eax, ecx mov edi, [esi+PD_colors0+8] mov ecx, [ebx+GC_paTeb] ;; we no longer have pa, so or eax, edi ;; reload it sub edx, edi mov edi, [ebx+GC_alphaVertexScale] or eax, edx IF elts GT 3 mov edx, [esi+PD_colors0+12] sub edi, edx mov edx, [ecx+PA_flags] or eax, edi ELSE mov [esi+PD_colors0+12], edi mov edx, [ecx+PA_flags] ENDIF pop edi and eax, POLYARRAY_CLAMP_COLOR pop esi or eax, edx pop ebx IF pop_ebp pop ebp ENDIF mov [ecx+PA_flags], eax ret ret_n NotInBegin: ;; ecx = gc = ebx ;; edx = pa = eax lea edi, [base+offs] mov ecx, ebx mov edx, eax IF elts GT 3 push [edi+12] ELSE push __FLOAT_ONE ENDIF push [edi+8] push [edi+4] push [edi+0] push DWORD PTR POLYDATA_COLOR_VALID OR pd_flag call @glcltColor4f_InRGBA_NotInBegin@28 pop edi pop esi pop ebx IF pop_ebp pop ebp ENDIF ret ret_n ENDM glcltColor3f_InRGBA@12 PROC PUBLIC PROF_ENTRY PA_COLOR_34 esp, 4+PA_COLOR_STACK_USAGE, 12, 0, 3, 0 glcltColor3f_InRGBA@12 ENDP glcltColor3fv_InRGBA@4 PROC PUBLIC PROF_ENTRY push ebp mov ebp, [esp+8] PA_COLOR_34 ebp, 0, 4, 1, 3, 0 glcltColor3fv_InRGBA@4 ENDP glcltColor4f_InRGBA@16 PROC PUBLIC PROF_ENTRY PA_COLOR_34 esp, 4+PA_COLOR_STACK_USAGE, 16, 0, 4, \ POLYDATA_DLIST_COLOR_4 glcltColor4f_InRGBA@16 ENDP glcltColor4fv_InRGBA@4 PROC PUBLIC PROF_ENTRY push ebp mov ebp, [esp+8] PA_COLOR_34 ebp, 0, 4, 1, 4, \ POLYDATA_DLIST_COLOR_4 glcltColor4fv_InRGBA@4 ENDP END