windows pixel-format backend
parent
621fed2dd5
commit
95f1ca3d9f
|
@ -10,11 +10,153 @@ windows.messages windows.types windows.offscreen windows.nt
|
||||||
threads libc combinators fry combinators.short-circuit continuations
|
threads libc combinators fry combinators.short-circuit continuations
|
||||||
command-line shuffle opengl ui.render ascii math.bitwise locals
|
command-line shuffle opengl ui.render ascii math.bitwise locals
|
||||||
accessors math.rectangles math.order ascii calendar
|
accessors math.rectangles math.order ascii calendar
|
||||||
io.encodings.utf16n windows.errors ;
|
io.encodings.utf16n windows.errors literals ui.pixel-formats
|
||||||
|
ui.pixel-formats.private memoize ;
|
||||||
IN: ui.backend.windows
|
IN: ui.backend.windows
|
||||||
|
|
||||||
SINGLETON: windows-ui-backend
|
SINGLETON: windows-ui-backend
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
PIXEL-FORMAT-ATTRIBUTE-TABLE: WGL_ARB { $ WGL_SUPPORT_OPENGL_ARB 1 } H{
|
||||||
|
{ double-buffered { $ WGL_DOUBLE_BUFFER_ARB 1 } }
|
||||||
|
{ stereo { $ WGL_STEREO_ARB 1 } }
|
||||||
|
{ offscreen { $ WGL_DRAW_TO_BITMAP_ARB 1 } }
|
||||||
|
{ fullscreen { $ WGL_DRAW_TO_WINDOW_ARB 1 } }
|
||||||
|
{ windowed { $ WGL_DRAW_TO_WINDOW_ARB 1 } }
|
||||||
|
{ accelerated { $ WGL_ACCELERATION_ARB $ WGL_FULL_ACCELERATION_ARB } }
|
||||||
|
{ software-rendered { $ WGL_ACCELERATION_ARB $ WGL_NO_ACCELERATION_ARB } }
|
||||||
|
{ color-float { $ WGL_TYPE_RGBA_FLOAT_ARB 1 } }
|
||||||
|
{ color-bits { $ WGL_COLOR_BITS_ARB } }
|
||||||
|
{ red-bits { $ WGL_RED_BITS_ARB } }
|
||||||
|
{ green-bits { $ WGL_GREEN_BITS_ARB } }
|
||||||
|
{ blue-bits { $ WGL_BLUE_BITS_ARB } }
|
||||||
|
{ alpha-bits { $ WGL_ALPHA_BITS_ARB } }
|
||||||
|
{ accum-bits { $ WGL_ACCUM_BITS_ARB } }
|
||||||
|
{ accum-red-bits { $ WGL_ACCUM_RED_BITS_ARB } }
|
||||||
|
{ accum-green-bits { $ WGL_ACCUM_GREEN_BITS_ARB } }
|
||||||
|
{ accum-blue-bits { $ WGL_ACCUM_BLUE_BITS_ARB } }
|
||||||
|
{ accum-alpha-bits { $ WGL_ACCUM_ALPHA_BITS_ARB } }
|
||||||
|
{ depth-bits { $ WGL_DEPTH_BITS_ARB } }
|
||||||
|
{ stencil-bits { $ WGL_STENCIL_BITS_ARB } }
|
||||||
|
{ aux-buffers { $ WGL_AUX_BUFFERS_ARB } }
|
||||||
|
{ sample-buffers { $ WGL_SAMPLE_BUFFERS_ARB } }
|
||||||
|
{ samples { $ WGL_SAMPLES_ARB } }
|
||||||
|
}
|
||||||
|
|
||||||
|
MEMO: (has-wglChoosePixelFormatARB?) ( dc -- ? )
|
||||||
|
{ "WGL_ARB_pixel_format" } has-wgl-extensions? ;
|
||||||
|
: has-wglChoosePixelFormatARB? ( world -- ? )
|
||||||
|
handle>> hDC>> (has-wglChoosePixelFormatARB?) ;
|
||||||
|
|
||||||
|
: arb-make-pixel-format ( world attributes -- pf )
|
||||||
|
[ handle>> hDC>> ] dip >WGL_ARB-int-array f 1 0 <int> 0 <int>
|
||||||
|
[ wglChoosePixelFormatARB win32-error=0/f ] 2keep drop *int ;
|
||||||
|
|
||||||
|
: arb-pixel-format-attribute ( pixel-format attribute -- value )
|
||||||
|
>WGL_ARB
|
||||||
|
[ drop f ] [
|
||||||
|
[ [ world>> handle>> hDC>> ] [ handle>> ] bi 0 1 ] dip
|
||||||
|
first <int> 0 <int>
|
||||||
|
[ wglGetPixelFormatAttribivARB win32-error=0/f ]
|
||||||
|
keep *int
|
||||||
|
] if-empty ;
|
||||||
|
|
||||||
|
CONSTANT: pfd-flag-map H{
|
||||||
|
{ double-buffered $ PFD_DOUBLEBUFFER }
|
||||||
|
{ stereo $ PFD_STEREO }
|
||||||
|
{ offscreen $ PFD_DRAW_TO_BITMAP }
|
||||||
|
{ fullscreen $ PFD_DRAW_TO_WINDOW }
|
||||||
|
{ windowed $ PFD_DRAW_TO_WINDOW }
|
||||||
|
{ software-rendered $ PFD_GENERIC_FORMAT }
|
||||||
|
}
|
||||||
|
|
||||||
|
: >pfd-flag ( attribute -- value )
|
||||||
|
pfd-flag-map at [ ] [ 0 ] if* ;
|
||||||
|
|
||||||
|
: >pfd-flags ( attributes -- flags )
|
||||||
|
[ >pfd-flag ] map [ bitor ] binary-reduce
|
||||||
|
PFD_SUPPORT_OPENGL bitor ;
|
||||||
|
|
||||||
|
: attr-value ( attributes name -- value )
|
||||||
|
[ instance? ] curry find nip
|
||||||
|
[ value>> ] [ 0 ] if* ;
|
||||||
|
|
||||||
|
: >pfd ( attributes -- pfd )
|
||||||
|
"PIXELFORMATDESCRIPTOR" <c-object>
|
||||||
|
"PIXELFORMATDESCRIPTOR" heap-size over set-PIXELFORMATDESCRIPTOR-nSize
|
||||||
|
1 over set-PIXELFORMATDESCRIPTOR-nVersion
|
||||||
|
over >pfd-flags over set-PIXELFORMATDESCRIPTOR-dwFlags
|
||||||
|
PFD_TYPE_RGBA over set-PIXELFORMATDESCRIPTOR-iPixelType
|
||||||
|
over color-bits attr-value over set-PIXELFORMATDESCRIPTOR-cColorBits
|
||||||
|
over red-bits attr-value over set-PIXELFORMATDESCRIPTOR-cRedBits
|
||||||
|
over green-bits attr-value over set-PIXELFORMATDESCRIPTOR-cGreenBits
|
||||||
|
over blue-bits attr-value over set-PIXELFORMATDESCRIPTOR-cBlueBits
|
||||||
|
over alpha-bits attr-value over set-PIXELFORMATDESCRIPTOR-cAlphaBits
|
||||||
|
over accum-bits attr-value over set-PIXELFORMATDESCRIPTOR-cAccumBits
|
||||||
|
over accum-red-bits attr-value over set-PIXELFORMATDESCRIPTOR-cAccumRedBits
|
||||||
|
over accum-green-bits attr-value over set-PIXELFORMATDESCRIPTOR-cAccumGreenBits
|
||||||
|
over accum-blue-bits attr-value over set-PIXELFORMATDESCRIPTOR-cAccumBlueBits
|
||||||
|
over accum-alpha-bits attr-value over set-PIXELFORMATDESCRIPTOR-cAccumAlphaBits
|
||||||
|
over depth-bits attr-value over set-PIXELFORMATDESCRIPTOR-cDepthBits
|
||||||
|
over stencil-bits attr-value over set-PIXELFORMATDESCRIPTOR-cStencilBits
|
||||||
|
over aux-buffers attr-value over set-PIXELFORMATDESCRIPTOR-cAuxBuffers
|
||||||
|
PFD_MAIN_PLANE over set-PIXELFORMATDESCRIPTOR-dwLayerMask
|
||||||
|
nip ;
|
||||||
|
|
||||||
|
: pfd-make-pixel-format ( world attributes -- pf )
|
||||||
|
[ handle>> hDC>> ] [ >pfd ] bi*
|
||||||
|
ChoosePixelFormat dup win32-error=0/f ;
|
||||||
|
|
||||||
|
: get-pfd ( pixel-format -- pfd )
|
||||||
|
[ world>> handle>> hDC>> ] [ handle>> ] bi
|
||||||
|
"PIXELFORMATDESCRIPTOR" heap-size
|
||||||
|
"PIXELFORMATDESCRIPTOR" <c-object>
|
||||||
|
[ DescribePixelFormat win32-error=0/f ] keep ;
|
||||||
|
|
||||||
|
: pfd-flag? ( pfd flag -- ? )
|
||||||
|
[ PIXELFORMATDESCRIPTOR-dwFlags ] dip bitand c-bool> ;
|
||||||
|
|
||||||
|
: (pfd-pixel-format-attribute) ( pfd attribute -- value )
|
||||||
|
{
|
||||||
|
{ double-buffered [ PFD_DOUBLEBUFFER pfd-flag? ] }
|
||||||
|
{ stereo [ PFD_STEREO pfd-flag? ] }
|
||||||
|
{ offscreen [ PFD_DRAW_TO_BITMAP pfd-flag? ] }
|
||||||
|
{ fullscreen [ PFD_DRAW_TO_WINDOW pfd-flag? ] }
|
||||||
|
{ windowed [ PFD_DRAW_TO_WINDOW pfd-flag? ] }
|
||||||
|
{ software-rendered [ PFD_GENERIC_FORMAT pfd-flag? ] }
|
||||||
|
{ color-bits [ PIXELFORMATDESCRIPTOR-cColorBits ] }
|
||||||
|
{ red-bits [ PIXELFORMATDESCRIPTOR-cRedBits ] }
|
||||||
|
{ green-bits [ PIXELFORMATDESCRIPTOR-cGreenBits ] }
|
||||||
|
{ blue-bits [ PIXELFORMATDESCRIPTOR-cBlueBits ] }
|
||||||
|
{ alpha-bits [ PIXELFORMATDESCRIPTOR-cAlphaBits ] }
|
||||||
|
{ accum-bits [ PIXELFORMATDESCRIPTOR-cAccumBits ] }
|
||||||
|
{ accum-red-bits [ PIXELFORMATDESCRIPTOR-cAccumRedBits ] }
|
||||||
|
{ accum-green-bits [ PIXELFORMATDESCRIPTOR-cAccumGreenBits ] }
|
||||||
|
{ accum-blue-bits [ PIXELFORMATDESCRIPTOR-cAccumBlueBits ] }
|
||||||
|
{ accum-alpha-bits [ PIXELFORMATDESCRIPTOR-cAccumAlphaBits ] }
|
||||||
|
{ depth-bits [ PIXELFORMATDESCRIPTOR-cDepthBits ] }
|
||||||
|
{ stencil-bits [ PIXELFORMATDESCRIPTOR-cStencilBits ] }
|
||||||
|
{ aux-buffers [ PIXELFORMATDESCRIPTOR-cAuxBuffers ] }
|
||||||
|
[ 2drop f ]
|
||||||
|
} case ;
|
||||||
|
|
||||||
|
: pfd-pixel-format-attribute ( pixel-format attribute -- value )
|
||||||
|
[ get-pfd ] dip (pfd-pixel-format-attribute) ;
|
||||||
|
|
||||||
|
M: windows-ui-backend (make-pixel-format)
|
||||||
|
over has-wglChoosePixelFormatARB?
|
||||||
|
[ arb-make-pixel-format ] [ pfd-make-pixel-format ] if ;
|
||||||
|
|
||||||
|
M: windows-ui-backend (free-pixel-format)
|
||||||
|
drop ;
|
||||||
|
|
||||||
|
M: windows-ui-backend (pixel-format-attribute)
|
||||||
|
over world>> has-wglChoosePixelFormatARB?
|
||||||
|
[ arb-pixel-format-attribute ] [ pfd-pixel-format-attribute ] if ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
: lo-word ( wparam -- lo ) <short> *short ; inline
|
: lo-word ( wparam -- lo ) <short> *short ; inline
|
||||||
: hi-word ( wparam -- hi ) -16 shift lo-word ; inline
|
: hi-word ( wparam -- hi ) -16 shift lo-word ; inline
|
||||||
: >lo-hi ( WORD -- array ) [ lo-word ] [ hi-word ] bi 2array ;
|
: >lo-hi ( WORD -- array ) [ lo-word ] [ hi-word ] bi 2array ;
|
||||||
|
@ -477,21 +619,22 @@ M: windows-ui-backend do-events
|
||||||
f class-name-ptr set-global
|
f class-name-ptr set-global
|
||||||
f msg-obj set-global ;
|
f msg-obj set-global ;
|
||||||
|
|
||||||
: setup-pixel-format ( hdc flags -- )
|
|
||||||
32 make-pfd [ ChoosePixelFormat dup win32-error=0/f ] 2keep
|
|
||||||
swapd SetPixelFormat win32-error=0/f ;
|
|
||||||
|
|
||||||
: get-dc ( hWnd -- hDC ) GetDC dup win32-error=0/f ;
|
: get-dc ( hWnd -- hDC ) GetDC dup win32-error=0/f ;
|
||||||
|
|
||||||
: get-rc ( hDC -- hRC )
|
: get-rc ( hDC -- hRC )
|
||||||
dup wglCreateContext dup win32-error=0/f
|
dup wglCreateContext dup win32-error=0/f
|
||||||
[ wglMakeCurrent win32-error=0/f ] keep ;
|
[ wglMakeCurrent win32-error=0/f ] keep ;
|
||||||
|
|
||||||
: setup-gl ( hwnd -- hDC hRC )
|
: set-pixel-format ( pixel-format hdc -- )
|
||||||
get-dc dup windowed-pfd-dwFlags setup-pixel-format dup get-rc ;
|
swap handle>> "PIXELFORMATDESCRIPTOR" <c-object> SetPixelFormat win32-error=0/f ;
|
||||||
|
|
||||||
|
: setup-gl ( world hwnd -- hDC hRC )
|
||||||
|
get-dc
|
||||||
|
[ [ drop ] 2dip [ set-pixel-format ] [ ] [ get-rc ] tri ]
|
||||||
|
curry with-world-pixel-format ;
|
||||||
|
|
||||||
M: windows-ui-backend (open-window) ( world -- )
|
M: windows-ui-backend (open-window) ( world -- )
|
||||||
[ create-window [ setup-gl ] keep ] keep
|
[ dup create-window [ setup-gl ] keep ] keep
|
||||||
[ f <win> ] keep
|
[ f <win> ] keep
|
||||||
[ swap hWnd>> register-window ] 2keep
|
[ swap hWnd>> register-window ] 2keep
|
||||||
dupd (>>handle)
|
dupd (>>handle)
|
||||||
|
@ -504,14 +647,17 @@ M: win-base select-gl-context ( handle -- )
|
||||||
M: win-base flush-gl-context ( handle -- )
|
M: win-base flush-gl-context ( handle -- )
|
||||||
hDC>> SwapBuffers win32-error=0/f ;
|
hDC>> SwapBuffers win32-error=0/f ;
|
||||||
|
|
||||||
: setup-offscreen-gl ( dim -- hDC hRC hBitmap bits )
|
: setup-offscreen-gl ( world -- hDC hRC hBitmap bits )
|
||||||
|
[
|
||||||
|
swap
|
||||||
make-offscreen-dc-and-bitmap [
|
make-offscreen-dc-and-bitmap [
|
||||||
[ dup offscreen-pfd-dwFlags setup-pixel-format ]
|
[ set-pixel-format ]
|
||||||
[ get-rc ] bi
|
[ get-rc ] bi
|
||||||
] 2dip ;
|
] 2dip ;
|
||||||
|
] with-world-pixel-format
|
||||||
|
|
||||||
M: windows-ui-backend (open-offscreen-buffer) ( world -- )
|
M: windows-ui-backend (open-offscreen-buffer) ( world -- )
|
||||||
dup dim>> setup-offscreen-gl <win-offscreen>
|
dup setup-offscreen-gl <win-offscreen>
|
||||||
>>handle drop ;
|
>>handle drop ;
|
||||||
|
|
||||||
M: windows-ui-backend (close-offscreen-buffer) ( handle -- )
|
M: windows-ui-backend (close-offscreen-buffer) ( handle -- )
|
||||||
|
|
|
@ -71,22 +71,6 @@ CONSTANT: WGL_SWAP_UNDERLAY13 HEX: 10000000
|
||||||
CONSTANT: WGL_SWAP_UNDERLAY14 HEX: 20000000
|
CONSTANT: WGL_SWAP_UNDERLAY14 HEX: 20000000
|
||||||
CONSTANT: WGL_SWAP_UNDERLAY15 HEX: 40000000
|
CONSTANT: WGL_SWAP_UNDERLAY15 HEX: 40000000
|
||||||
|
|
||||||
: windowed-pfd-dwFlags ( -- n )
|
|
||||||
{ PFD_DRAW_TO_WINDOW PFD_SUPPORT_OPENGL PFD_DOUBLEBUFFER } flags ;
|
|
||||||
: offscreen-pfd-dwFlags ( -- n )
|
|
||||||
{ PFD_DRAW_TO_BITMAP PFD_SUPPORT_OPENGL } flags ;
|
|
||||||
|
|
||||||
! TODO: compare to http://www.nullterminator.net/opengl32.html
|
|
||||||
: make-pfd ( flags bits -- pfd )
|
|
||||||
"PIXELFORMATDESCRIPTOR" <c-object>
|
|
||||||
"PIXELFORMATDESCRIPTOR" heap-size over set-PIXELFORMATDESCRIPTOR-nSize
|
|
||||||
1 over set-PIXELFORMATDESCRIPTOR-nVersion
|
|
||||||
rot over set-PIXELFORMATDESCRIPTOR-dwFlags
|
|
||||||
PFD_TYPE_RGBA over set-PIXELFORMATDESCRIPTOR-iPixelType
|
|
||||||
[ set-PIXELFORMATDESCRIPTOR-cColorBits ] keep
|
|
||||||
16 over set-PIXELFORMATDESCRIPTOR-cDepthBits
|
|
||||||
PFD_MAIN_PLANE over set-PIXELFORMATDESCRIPTOR-dwLayerMask ;
|
|
||||||
|
|
||||||
|
|
||||||
LIBRARY: gl
|
LIBRARY: gl
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue