The MASM Forum Archive 2004 to 2012

General Forums => The Campus => Topic started by: Farabi on July 03, 2005, 07:40:42 AM

Title: Direct Draw
Post by: Farabi on July 03, 2005, 07:40:42 AM
Hai. How to move my buffer to DDraw screen? And how to get the memory address? And how set the resolution? Any example?
Title: Re: Direct Draw
Post by: daydreamer on July 03, 2005, 08:04:19 AM
Quote from: Farabi on July 03, 2005, 07:40:42 AM
Hai. How to move my buffer to DDraw screen? And how to get the memory address? And how set the resolution? Any example?
search for a dirextx plasma demo w source
here is how to setup dx, note you need to set cooperative level DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN when using setdisplaymode
windowed mode, use DDSCL_NORMAL or DDSCL_NOWINDOWCHANGES
put these code right after you created your window

INVOKE DirectDrawCreate, NULL, ADDR lpDD, NULL
DDINVOKE SetCooperativeLevel, lpDD, hWnd,DDSCL_NORMAL or DDSCL_NOWINDOWCHANGES;DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN
;DDINVOKE SetDisplayMode, lpDD, ddwidth, ddheight, ddbpp

mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_CAPS
mov [ddsd.ddsCaps.dwCaps], DDSCAPS_PRIMARYSURFACE
DDINVOKE CreateSurface, lpDD, ADDR ddsd, ADDR lpDDSPrimary, NULL


here is my mainloop, lock and unlock surface, wait for verticalblank
mov ddsd.dwFlags, DDSD_PITCH for let lock return Lpitch


mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_PITCH

;.WHILE 1
DDSINVOKE mLock, lpDDSPrimary, NULL, ADDR ddsd, DDLOCK_WAIT, NULL

;.BREAK .IF eax == DD_OK

;.IF eax == DDERR_SURFACELOST
; DDSINVOKE Restore, lpDDSPrimary
;.ELSE
;FATAL "Couldn't lock surface"
;.ENDIF
;.ENDW

DDINVOKE WaitForVerticalBlank, lpDD, DDWAITVB_BLOCKBEGIN, NULL
                       

call render

DDSINVOKE Unlock, lpDDSPrimary, ddsd.lpSurface



here is how I start my loop with getting adress of buffer in ebx and increment to get to next line in edi
this is normal for ddraw as some videocards doesnt have a linear buffer
so a normal loop is to have a innerloop that transfers lines, outer loop that decrement your counter back to start of line and adds lPitch


mov ebx,[ddsd.lpSurface]
mov edi,[ddsd.lPitch]


you also need data section from plasma demo for this to work