Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
c21de847
Commit
c21de847
authored
Dec 20, 1999
by
Lionel Ulmer
Committed by
Alexandre Julliard
Dec 20, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adds resolution / depth switching with DGA 2.0.
parent
000c9800
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
146 additions
and
46 deletions
+146
-46
ddraw.c
graphics/ddraw.c
+144
-46
ddraw_private.h
graphics/ddraw_private.h
+2
-0
No files found.
graphics/ddraw.c
View file @
c21de847
...
...
@@ -3693,6 +3693,56 @@ static int _common_depth_to_pixelformat(DWORD depth,
return
index
;
}
#ifdef HAVE_LIBXXF86DGA2
static
void
_DGA_Initialize_FrameBuffer
(
IDirectDrawImpl
*
This
,
int
mode
)
{
DDPIXELFORMAT
*
pf
=
&
(
This
->
d
.
directdraw_pixelformat
);
/* Now, get the device / mode description */
This
->
e
.
dga
.
dev
=
TSXDGASetMode
(
display
,
DefaultScreen
(
display
),
mode
);
This
->
e
.
dga
.
fb_width
=
This
->
e
.
dga
.
dev
->
mode
.
imageWidth
;
TSXDGASetViewport
(
display
,
DefaultScreen
(
display
),
0
,
0
,
XDGAFlipImmediate
);
This
->
e
.
dga
.
fb_height
=
This
->
e
.
dga
.
dev
->
mode
.
viewportHeight
;
TRACE
(
"video framebuffer: begin %p, width %d, memsize %d
\n
"
,
This
->
e
.
dga
.
dev
->
data
,
This
->
e
.
dga
.
dev
->
mode
.
imageWidth
,
(
This
->
e
.
dga
.
dev
->
mode
.
imageWidth
*
This
->
e
.
dga
.
dev
->
mode
.
imageHeight
*
(
This
->
e
.
dga
.
dev
->
mode
.
bitsPerPixel
/
8
))
);
TRACE
(
"viewport height: %d
\n
"
,
This
->
e
.
dga
.
dev
->
mode
.
viewportHeight
);
/* Get the screen dimensions as seen by Wine.
In that case, it may be better to ignore the -desktop mode and return the
real screen size => print a warning */
This
->
d
.
height
=
MONITOR_GetHeight
(
&
MONITOR_PrimaryMonitor
);
This
->
d
.
width
=
MONITOR_GetWidth
(
&
MONITOR_PrimaryMonitor
);
This
->
e
.
dga
.
fb_addr
=
This
->
e
.
dga
.
dev
->
data
;
This
->
e
.
dga
.
fb_memsize
=
(
This
->
e
.
dga
.
dev
->
mode
.
imageWidth
*
This
->
e
.
dga
.
dev
->
mode
.
imageHeight
*
(
This
->
e
.
dga
.
dev
->
mode
.
bitsPerPixel
/
8
));
This
->
e
.
dga
.
vpmask
=
0
;
/* Fill the screen pixelformat */
pf
->
dwSize
=
sizeof
(
DDPIXELFORMAT
);
pf
->
dwFourCC
=
0
;
pf
->
u
.
dwRGBBitCount
=
This
->
e
.
dga
.
dev
->
mode
.
bitsPerPixel
;
if
(
This
->
e
.
dga
.
dev
->
mode
.
depth
==
8
)
{
pf
->
dwFlags
=
DDPF_PALETTEINDEXED8
;
pf
->
u1
.
dwRBitMask
=
0
;
pf
->
u2
.
dwGBitMask
=
0
;
pf
->
u3
.
dwBBitMask
=
0
;
}
else
{
pf
->
dwFlags
=
DDPF_RGB
;
pf
->
u1
.
dwRBitMask
=
This
->
e
.
dga
.
dev
->
mode
.
redMask
;
pf
->
u2
.
dwGBitMask
=
This
->
e
.
dga
.
dev
->
mode
.
greenMask
;
pf
->
u3
.
dwBBitMask
=
This
->
e
.
dga
.
dev
->
mode
.
blueMask
;
}
pf
->
u4
.
dwRGBAlphaBitMask
=
0
;
This
->
d
.
screen_pixelformat
=
*
pf
;
}
#endif
/* defined(HAVE_LIBXXF86DGA2) */
#ifdef HAVE_LIBXXF86DGA
static
HRESULT
WINAPI
DGA_IDirectDrawImpl_SetDisplayMode
(
LPDIRECTDRAW
iface
,
DWORD
width
,
DWORD
height
,
DWORD
depth
...
...
@@ -3703,9 +3753,43 @@ static HRESULT WINAPI DGA_IDirectDrawImpl_SetDisplayMode(
TRACE
(
"(%p)->(%ld,%ld,%ld)
\n
"
,
This
,
width
,
height
,
depth
);
#ifdef HAVE_LIBXXF86DGA2
if
(
This
->
e
.
dga
.
version
==
2
)
/* For the moment, we suppose we have the correct display settings when in DGA 2.0 mode */
if
(
This
->
e
.
dga
.
version
==
2
)
{
XDGAMode
*
modes
=
This
->
e
.
dga
.
modes
;
int
mode_to_use
=
-
1
;
/* Search in the list a display mode that corresponds to what is requested */
for
(
i
=
0
;
i
<
This
->
e
.
dga
.
num_modes
;
i
++
)
{
if
((
height
==
modes
[
i
].
viewportHeight
)
&&
(
width
==
modes
[
i
].
viewportWidth
)
&&
(
depth
==
modes
[
i
].
depth
))
{
mode_to_use
=
modes
[
i
].
num
;
}
}
if
(
mode_to_use
<
0
)
{
ERR
(
"Could not find matching mode !!!
\n
"
);
return
DDERR_UNSUPPORTEDMODE
;
}
else
{
TRACE
(
"Using mode number %d
\n
"
,
mode_to_use
);
TSXDGACloseFramebuffer
(
display
,
DefaultScreen
(
display
));
if
(
!
TSXDGAOpenFramebuffer
(
display
,
DefaultScreen
(
display
)))
{
ERR
(
"Error opening the frame buffer !!!
\n
"
);
return
DDERR_GENERIC
;
}
/* Initialize the frame buffer */
_DGA_Initialize_FrameBuffer
(
This
,
mode_to_use
);
/* Re-get (if necessary) the DGA events */
TSXDGASelectInput
(
display
,
DefaultScreen
(
display
),
KeyPressMask
|
KeyReleaseMask
|
ButtonPressMask
|
ButtonReleaseMask
|
PointerMotionMask
);
}
return
DD_OK
;
}
#endif
/* defined(HAVE_LIBXXF86DGA2) */
/* We hope getting the asked for depth */
...
...
@@ -4234,6 +4318,9 @@ static ULONG WINAPI DGA_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) {
/* Remove the handling of DGA2 events */
X11DRV_EVENT_SetDGAStatus
(
0
,
-
1
);
/* Free the modes list */
TSXFree
(
This
->
e
.
dga
.
modes
);
}
else
#endif
/* defined(HAVE_LIBXXF86DGA2) */
TSXF86DGADirectVideo
(
display
,
DefaultScreen
(
display
),
0
);
...
...
@@ -4462,7 +4549,55 @@ static HRESULT WINAPI DGA_IDirectDraw2Impl_EnumDisplayModes(
ddsfd
.
dwFlags
|=
DDSD_REFRESHRATE
;
ddsfd
.
u
.
dwRefreshRate
=
60
;
}
ddsfd
.
ddsCaps
.
dwCaps
=
0
;
ddsfd
.
dwBackBufferCount
=
1
;
#ifdef HAVE_LIBXXF86DGA2
if
(
This
->
e
.
dga
.
version
==
2
)
{
XDGAMode
*
modes
=
This
->
e
.
dga
.
modes
;
ddsfd
.
dwFlags
|=
DDSD_PITCH
;
for
(
i
=
0
;
i
<
This
->
e
.
dga
.
num_modes
;
i
++
)
{
if
(
TRACE_ON
(
ddraw
))
{
DPRINTF
(
" Enumerating mode %d : %s (FB: %dx%d / VP: %dx%d) - depth %d -"
,
modes
[
i
].
num
,
modes
[
i
].
name
,
modes
[
i
].
imageWidth
,
modes
[
i
].
imageHeight
,
modes
[
i
].
viewportWidth
,
modes
[
i
].
viewportHeight
,
modes
[
i
].
depth
);
if
(
modes
[
i
].
flags
&
XDGAConcurrentAccess
)
DPRINTF
(
" XDGAConcurrentAccess "
);
if
(
modes
[
i
].
flags
&
XDGASolidFillRect
)
DPRINTF
(
" XDGASolidFillRect "
);
if
(
modes
[
i
].
flags
&
XDGABlitRect
)
DPRINTF
(
" XDGABlitRect "
);
if
(
modes
[
i
].
flags
&
XDGABlitTransRect
)
DPRINTF
(
" XDGABlitTransRect "
);
if
(
modes
[
i
].
flags
&
XDGAPixmap
)
DPRINTF
(
" XDGAPixmap "
);
DPRINTF
(
"
\n
"
);
}
/* Fill the pixel format */
ddsfd
.
ddpfPixelFormat
.
dwSize
=
sizeof
(
DDPIXELFORMAT
);
ddsfd
.
ddpfPixelFormat
.
dwFourCC
=
0
;
ddsfd
.
ddpfPixelFormat
.
u4
.
dwRGBAlphaBitMask
=
0
;
ddsfd
.
ddpfPixelFormat
.
u
.
dwRGBBitCount
=
modes
[
i
].
bitsPerPixel
;
if
(
modes
[
i
].
depth
==
8
)
{
ddsfd
.
ddpfPixelFormat
.
dwFlags
=
DDPF_PALETTEINDEXED8
;
ddsfd
.
ddpfPixelFormat
.
u1
.
dwRBitMask
=
0
;
ddsfd
.
ddpfPixelFormat
.
u2
.
dwGBitMask
=
0
;
ddsfd
.
ddpfPixelFormat
.
u3
.
dwBBitMask
=
0
;
ddsfd
.
ddsCaps
.
dwCaps
=
DDSCAPS_PALETTE
;
}
else
{
ddsfd
.
ddpfPixelFormat
.
dwFlags
=
DDPF_RGB
;
ddsfd
.
ddpfPixelFormat
.
u1
.
dwRBitMask
=
modes
[
i
].
redMask
;
ddsfd
.
ddpfPixelFormat
.
u2
.
dwGBitMask
=
modes
[
i
].
greenMask
;
ddsfd
.
ddpfPixelFormat
.
u3
.
dwBBitMask
=
modes
[
i
].
blueMask
;
}
ddsfd
.
dwWidth
=
modes
[
i
].
viewportWidth
;
ddsfd
.
dwHeight
=
modes
[
i
].
viewportHeight
;
ddsfd
.
lPitch
=
modes
[
i
].
imageWidth
;
/* Send mode to the application */
if
(
!
modescb
(
&
ddsfd
,
context
))
return
DD_OK
;
}
}
else
{
#endif
for
(
i
=
0
;
i
<
sizeof
(
depths
)
/
sizeof
(
depths
[
0
]);
i
++
)
{
ddsfd
.
dwBackBufferCount
=
1
;
ddsfd
.
ddpfPixelFormat
.
dwFourCC
=
0
;
...
...
@@ -4520,6 +4655,9 @@ static HRESULT WINAPI DGA_IDirectDraw2Impl_EnumDisplayModes(
if
(
!
modescb
(
&
ddsfd
,
context
))
return
DD_OK
;
}
}
#ifdef HAVE_LIBXXF86DGA2
}
#endif
return
DD_OK
;
}
#endif
/* defined(HAVE_LIBXXF86DGA) */
...
...
@@ -5257,7 +5395,6 @@ static HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnk
#endif
#ifdef HAVE_LIBXXF86DGA2
}
else
{
DDPIXELFORMAT
*
pf
=
&
((
*
ilplpDD
)
->
d
.
directdraw_pixelformat
);
XDGAMode
*
modes
;
int
i
,
num_modes
;
int
mode_to_use
=
0
;
...
...
@@ -5276,6 +5413,8 @@ static HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnk
/* List all available modes */
modes
=
TSXDGAQueryModes
(
display
,
DefaultScreen
(
display
),
&
num_modes
);
(
*
ilplpDD
)
->
e
.
dga
.
modes
=
modes
;
(
*
ilplpDD
)
->
e
.
dga
.
num_modes
=
num_modes
;
if
(
TRACE_ON
(
ddraw
))
{
TRACE
(
"Available modes :
\n
"
);
for
(
i
=
0
;
i
<
num_modes
;
i
++
)
{
...
...
@@ -5304,52 +5443,11 @@ static HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnk
}
else
{
DPRINTF
(
"Using mode number %d
\n
"
,
mode_to_use
);
}
/* Now, get the device / mode description */
(
*
ilplpDD
)
->
e
.
dga
.
dev
=
TSXDGASetMode
(
display
,
DefaultScreen
(
display
),
mode_to_use
);
/* Initialize the frame buffer */
_DGA_Initialize_FrameBuffer
(
*
ilplpDD
,
mode_to_use
);
/* Set the input handling for relative mouse movements */
X11DRV_EVENT_SetInputMehod
(
X11DRV_INPUT_RELATIVE
);
(
*
ilplpDD
)
->
e
.
dga
.
fb_width
=
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
imageWidth
;
TSXDGASetViewport
(
display
,
DefaultScreen
(
display
),
0
,
0
,
XDGAFlipImmediate
);
(
*
ilplpDD
)
->
e
.
dga
.
fb_height
=
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
viewportHeight
;
TRACE
(
"video framebuffer: begin %p, width %d, memsize %d
\n
"
,
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
data
,
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
imageWidth
,
((
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
imageWidth
*
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
imageHeight
*
((
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
bitsPerPixel
/
8
))
);
TRACE
(
"viewport height: %d
\n
"
,
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
viewportHeight
);
/* Get the screen dimensions as seen by Wine.
In that case, it may be better to ignore the -desktop mode and return the
real screen size => print a warning */
(
*
ilplpDD
)
->
d
.
height
=
MONITOR_GetHeight
(
&
MONITOR_PrimaryMonitor
);
(
*
ilplpDD
)
->
d
.
width
=
MONITOR_GetWidth
(
&
MONITOR_PrimaryMonitor
);
(
*
ilplpDD
)
->
e
.
dga
.
fb_addr
=
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
data
;
(
*
ilplpDD
)
->
e
.
dga
.
fb_memsize
=
((
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
imageWidth
*
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
imageHeight
*
((
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
bitsPerPixel
/
8
));
(
*
ilplpDD
)
->
e
.
dga
.
vpmask
=
0
;
/* Fill the screen pixelformat */
if
((
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
depth
==
8
)
{
pf
->
dwFlags
=
DDPF_PALETTEINDEXED8
;
pf
->
u1
.
dwRBitMask
=
0
;
pf
->
u2
.
dwGBitMask
=
0
;
pf
->
u3
.
dwBBitMask
=
0
;
}
else
{
pf
->
dwFlags
=
DDPF_RGB
;
pf
->
u1
.
dwRBitMask
=
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
redMask
;
pf
->
u2
.
dwGBitMask
=
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
greenMask
;
pf
->
u3
.
dwBBitMask
=
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
blueMask
;
}
pf
->
dwFourCC
=
0
;
pf
->
u
.
dwRGBBitCount
=
(
*
ilplpDD
)
->
e
.
dga
.
dev
->
mode
.
bitsPerPixel
;
pf
->
u4
.
dwRGBAlphaBitMask
=
0
;
(
*
ilplpDD
)
->
d
.
screen_pixelformat
=
*
pf
;
}
#endif
/* defined(HAVE_LIBXXF86DGA2) */
return
DD_OK
;
...
...
graphics/ddraw_private.h
View file @
c21de847
...
...
@@ -86,6 +86,8 @@ struct _dga_directdrawdata
#ifdef HAVE_LIBXXF86DGA2
int
version
;
XDGADevice
*
dev
;
XDGAMode
*
modes
;
int
num_modes
;
#endif
/* define(HAVE_LIBXXF86DGA2) */
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment