Windows2003-3790/multimedia/opengl/dlist/i386/dl_optx.asm
2020-09-30 16:53:55 +02:00

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