341 lines
9.3 KiB
NASM
341 lines
9.3 KiB
NASM
|
;---------------------------Module-Header------------------------------;
|
||
|
; Module Name: dl_opt.asm
|
||
|
;
|
||
|
; OpenGL display-list function entries for i386.
|
||
|
;
|
||
|
; Created: 09/20/1996
|
||
|
; Author: Otto Berkes [ottob]
|
||
|
;
|
||
|
; Copyright (c) 1996 Microsoft Corporation
|
||
|
;----------------------------------------------------------------------;
|
||
|
.386
|
||
|
|
||
|
.model small, pascal
|
||
|
|
||
|
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
|
||
|
__imp__OutputDebugStringA@4 PROTO SYSCALL
|
||
|
|
||
|
.data
|
||
|
|
||
|
ifdef DBG
|
||
|
warningStr db 'Display list: playing back POLYDATA outside BEGIN!', 13, 10, 0
|
||
|
endif
|
||
|
|
||
|
.code
|
||
|
|
||
|
__GL_PDATA_FUNC MACRO name
|
||
|
public @&name&@8
|
||
|
@&name&@8 PROC
|
||
|
|
||
|
PROF_ENTRY
|
||
|
|
||
|
mov eax, [ecx].GC_paTeb ;; eax = pa
|
||
|
push ebx
|
||
|
push esi
|
||
|
push edi
|
||
|
|
||
|
if __DL_PDATA_C3F
|
||
|
mov ecx, [ecx].GC_alphaVertexScale
|
||
|
endif
|
||
|
|
||
|
@again:
|
||
|
|
||
|
;; if (pa->flags & POLYARRAY_IN_BEGIN) {
|
||
|
;; pd = pa->pdNextVertex++;
|
||
|
;; pa->flags |= __DL_PDATA_PA_FLAGS;
|
||
|
|
||
|
mov ebx, [eax].PA_flags ;; ebx = flags
|
||
|
mov esi, [eax].PA_pdNextVertex ;; esi = pd
|
||
|
test ebx, POLYARRAY_IN_BEGIN
|
||
|
lea edi, [esi + sizeof_POLYDATA]
|
||
|
je @notInBegin
|
||
|
|
||
|
mov [eax].PA_pdNextVertex, edi
|
||
|
or ebx, __DL_PDATA_PA_FLAGS
|
||
|
|
||
|
;; pd->flags |= __DL_PDATA_PD_FLAGS;
|
||
|
|
||
|
mov edi, [esi].PD_flags
|
||
|
mov [eax].PA_flags, ebx
|
||
|
or edi, __DL_PDATA_PD_FLAGS
|
||
|
|
||
|
|
||
|
if __DL_PDATA_C3F
|
||
|
;; pd->color[0].a = gc->alphaVertexScale;
|
||
|
|
||
|
mov [esi][PD_colors0 + 12], ecx
|
||
|
endif
|
||
|
|
||
|
|
||
|
;;
|
||
|
;; CACHE !!!
|
||
|
;;
|
||
|
;; In the logic below, we try to fill cache lines before we need them
|
||
|
;; by reading into registers that to not use the contents that they
|
||
|
;; fetched. Unfortunatly, the data in the display list is not cached-
|
||
|
;; aligned, so this will be hit-and-miss. It does, however, make a
|
||
|
;; measurable difference.
|
||
|
;;
|
||
|
|
||
|
|
||
|
if __DL_PDATA_T2F
|
||
|
;; pa->pdCurTexture = pd;
|
||
|
mov [eax].PA_pdCurTexture, esi
|
||
|
mov ecx, [edx][__DL_PDATA_TEXTURE_OFFSET + 0] ;; fill cache
|
||
|
endif
|
||
|
|
||
|
if __DL_PDATA_C3F OR __DL_PDATA_C4F
|
||
|
;; pa->pdCurColor = pd;
|
||
|
mov [eax].PA_pdCurColor, esi
|
||
|
mov ebx, [edx][__DL_PDATA_COLOR_OFFSET + 0] ;; fill cache
|
||
|
endif
|
||
|
|
||
|
if __DL_PDATA_N3F
|
||
|
;; pa->pdCurNormal = pd;
|
||
|
mov [eax].PA_pdCurNormal, esi
|
||
|
mov ecx, [edx][__DL_PDATA_NORMAL_OFFSET + 0] ;; fill cache
|
||
|
endif
|
||
|
|
||
|
if __DL_PDATA_V2F or __DL_PDATA_V3F
|
||
|
mov ebx, [edx][__DL_PDATA_VERTEX_OFFSET + 0] ;; fill cache
|
||
|
endif
|
||
|
|
||
|
;; finally, store pd flags:
|
||
|
|
||
|
mov [esi].PD_flags, edi
|
||
|
|
||
|
;; Update pd attributes.
|
||
|
|
||
|
;; constant: esi, edi, eax, edx
|
||
|
;; free: ebx, ecx
|
||
|
|
||
|
if __DL_PDATA_T2F
|
||
|
;; Texture coord
|
||
|
;; pd->texture.x = ((__GLcoord *) &PC[__DL_PDATA_TEXTURE_OFFSET])->x;
|
||
|
;; pd->texture.y = ((__GLcoord *) &PC[__DL_PDATA_TEXTURE_OFFSET])->y;
|
||
|
;; pd->texture.z = __glZero;
|
||
|
;; pd->texture.w = __glOne;
|
||
|
|
||
|
mov ebx, [edx][__DL_PDATA_TEXTURE_OFFSET + 0]
|
||
|
mov ecx, [edx][__DL_PDATA_TEXTURE_OFFSET + 4]
|
||
|
mov [esi][PD_texture + 0 ], ebx
|
||
|
mov [esi][PD_texture + 4 ], ecx
|
||
|
mov DWORD PTR [esi][PD_texture + 8 ], 0
|
||
|
mov DWORD PTR [esi][PD_texture + 12], __FLOAT_ONE;
|
||
|
endif
|
||
|
|
||
|
if __DL_PDATA_C3F
|
||
|
;; Color
|
||
|
;; pd->color[0].r = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->r;
|
||
|
;; pd->color[0].g = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->g;
|
||
|
;; pd->color[0].b = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->b;
|
||
|
|
||
|
mov ebx, [edx][__DL_PDATA_COLOR_OFFSET + 0]
|
||
|
mov ecx, [edx][__DL_PDATA_COLOR_OFFSET + 4]
|
||
|
mov edi, [edx][__DL_PDATA_COLOR_OFFSET + 8]
|
||
|
mov [esi][PD_colors0 + 0 ], ebx
|
||
|
mov [esi][PD_colors0 + 4 ], ecx
|
||
|
mov [esi][PD_colors0 + 8 ], edi
|
||
|
elseif __DL_PDATA_C4F
|
||
|
;; Color
|
||
|
;; pd->color[0] = *((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET]);
|
||
|
|
||
|
mov ebx, [edx][__DL_PDATA_COLOR_OFFSET + 0]
|
||
|
mov ecx, [edx][__DL_PDATA_COLOR_OFFSET + 4]
|
||
|
mov [esi][PD_colors0 + 0 ], ebx
|
||
|
mov [esi][PD_colors0 + 4 ], ecx
|
||
|
mov ebx, [edx][__DL_PDATA_COLOR_OFFSET + 8]
|
||
|
mov ecx, [edx][__DL_PDATA_COLOR_OFFSET + 12]
|
||
|
mov [esi][PD_colors0 + 8 ], ebx
|
||
|
mov [esi][PD_colors0 + 12], ecx
|
||
|
|
||
|
endif
|
||
|
|
||
|
if __DL_PDATA_N3F
|
||
|
;; Normal
|
||
|
;; pd->normal.x = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->x;
|
||
|
;; pd->normal.y = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->y;
|
||
|
;; pd->normal.z = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->z;
|
||
|
|
||
|
mov ebx, [edx][__DL_PDATA_NORMAL_OFFSET + 0]
|
||
|
mov ecx, [edx][__DL_PDATA_NORMAL_OFFSET + 4]
|
||
|
mov edi, [edx][__DL_PDATA_NORMAL_OFFSET + 8]
|
||
|
mov [esi][PD_normal + 0 ], ebx
|
||
|
mov [esi][PD_normal + 4 ], ecx
|
||
|
mov [esi][PD_normal + 8 ], edi
|
||
|
endif
|
||
|
|
||
|
if __DL_PDATA_V2F
|
||
|
;; Vertex
|
||
|
;; pd->obj.x = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->x;
|
||
|
;; pd->obj.y = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->y;
|
||
|
;; pd->obj.z = __glZero;
|
||
|
;; pd->obj.w = __glOne;
|
||
|
|
||
|
mov ebx, [edx][__DL_PDATA_VERTEX_OFFSET + 0]
|
||
|
mov ecx, [edx][__DL_PDATA_VERTEX_OFFSET + 4]
|
||
|
mov [esi][PD_obj + 0 ], ebx
|
||
|
mov [esi][PD_obj + 4 ], ecx
|
||
|
mov DWORD PTR [esi][PD_OBJ + 8 ], 0
|
||
|
mov DWORD PTR [esi][PD_obj + 12], __FLOAT_ONE
|
||
|
|
||
|
elseif __DL_PDATA_V3F
|
||
|
;; Vertex
|
||
|
;; pd->obj.x = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->x;
|
||
|
;; pd->obj.y = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->y;
|
||
|
;; pd->obj.z = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->z;
|
||
|
;; pd->obj.w = __glOne;
|
||
|
|
||
|
mov ebx, [__DL_PDATA_VERTEX_OFFSET + 0][edx]
|
||
|
mov ecx, [__DL_PDATA_VERTEX_OFFSET + 4][edx]
|
||
|
mov edi, [__DL_PDATA_VERTEX_OFFSET + 8][edx]
|
||
|
mov [esi][PD_obj + 0 ], ebx
|
||
|
mov [esi][PD_obj + 4 ], ecx
|
||
|
mov [esi][PD_obj + 8 ], edi
|
||
|
mov DWORD PTR [esi][PD_obj + 12], __FLOAT_ONE
|
||
|
endif
|
||
|
|
||
|
;; pd[1].flags = 0;
|
||
|
;; if (pd >= pa->pdFlush)
|
||
|
;; PolyArrayFlushPartialPrimitive();
|
||
|
|
||
|
mov ebx, [eax].PA_pdFlush
|
||
|
mov DWORD PTR [esi][sizeof_POLYDATA + PD_flags], 0
|
||
|
cmp ebx, esi
|
||
|
|
||
|
mov ebx, [edx - 4]
|
||
|
mov ecx, [edx + __DL_PDATA_SIZE]
|
||
|
|
||
|
ja @noFlush
|
||
|
|
||
|
|
||
|
push esi
|
||
|
push edi
|
||
|
push eax
|
||
|
push ebx
|
||
|
push ecx
|
||
|
push edx
|
||
|
call @PolyArrayFlushPartialPrimitive@0
|
||
|
pop edx
|
||
|
pop ecx
|
||
|
pop ebx
|
||
|
pop eax
|
||
|
pop edi
|
||
|
pop esi
|
||
|
|
||
|
@noFlush:
|
||
|
|
||
|
cmp ebx, ecx
|
||
|
jne @doExit
|
||
|
|
||
|
lea edx, [edx + __DL_PDATA_SIZE + 4]
|
||
|
if __DL_PDATA_C3F
|
||
|
mov ecx, [esi][PD_colors0 + 12]
|
||
|
endif
|
||
|
|
||
|
jmp @again
|
||
|
|
||
|
|
||
|
@doExit:
|
||
|
lea eax, [edx + __DL_PDATA_SIZE]
|
||
|
pop edi
|
||
|
pop esi
|
||
|
pop ebx
|
||
|
ret 0
|
||
|
|
||
|
@notInBegin:
|
||
|
|
||
|
ifdef DBG
|
||
|
push edx
|
||
|
|
||
|
push offset warningStr
|
||
|
call DWORD PTR __imp__OutputDebugStringA@4
|
||
|
|
||
|
pop edx
|
||
|
endif
|
||
|
|
||
|
lea eax, [edx + __DL_PDATA_SIZE]
|
||
|
pop edi
|
||
|
pop esi
|
||
|
pop ebx
|
||
|
ret 0
|
||
|
|
||
|
@&name&@8 ENDP
|
||
|
|
||
|
ENDM
|
||
|
|
||
|
|
||
|
;; Define fast playback routines for PolyData records.
|
||
|
|
||
|
__GLLE_POLYDATA_C3F_V3F = 0
|
||
|
__GLLE_POLYDATA_N3F_V3F = 0
|
||
|
__GLLE_POLYDATA_C3F_N3F_V3F = 0
|
||
|
__GLLE_POLYDATA_C4F_N3F_V3F = 0
|
||
|
__GLLE_POLYDATA_T2F_V3F = 0
|
||
|
__GLLE_POLYDATA_T2F_C3F_V3F = 0
|
||
|
__GLLE_POLYDATA_T2F_N3F_V3F = 0
|
||
|
__GLLE_POLYDATA_T2F_C3F_N3F_V3F = 0
|
||
|
__GLLE_POLYDATA_T2F_C4F_N3F_V3F = 0
|
||
|
|
||
|
|
||
|
__GLLE_POLYDATA_C3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_C3F_V3F>
|
||
|
__GLLE_POLYDATA_C3F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_N3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_N3F_V3F>
|
||
|
__GLLE_POLYDATA_N3F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_C3F_N3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_C3F_N3F_V3F>
|
||
|
__GLLE_POLYDATA_C3F_N3F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_C4F_N3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_C4F_N3F_V3F>
|
||
|
__GLLE_POLYDATA_C4F_N3F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_T2F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_T2F_V3F>
|
||
|
__GLLE_POLYDATA_T2F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_T2F_C3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_T2F_C3F_V3F>
|
||
|
__GLLE_POLYDATA_T2F_C3F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_T2F_N3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_T2F_N3F_V3F>
|
||
|
__GLLE_POLYDATA_T2F_N3F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_T2F_C3F_N3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_T2F_C3F_N3F_V3F>
|
||
|
__GLLE_POLYDATA_T2F_C3F_N3F_V3F = 0
|
||
|
|
||
|
__GLLE_POLYDATA_T2F_C4F_N3F_V3F = 1
|
||
|
include dl_pdata.inc
|
||
|
__GL_PDATA_FUNC <__glle_PolyData_T2F_C4F_N3F_V3F>
|
||
|
__GLLE_POLYDATA_T2F_C4F_N3F_V3F = 0
|
||
|
|
||
|
|
||
|
end
|