Re: DDraw issues, etc.

2004-04-06 Thread Tim Hentenaar
On Sun, 4 Apr 2004 10:58:44 +0200
Lionel Ulmer [EMAIL PROTECTED] wrote:

 So you should just have to loop over all the rectangles and do the
 'copy_on_screen' as many times as there are rectangles.
 
 Of course, if they overlap, this method will still work except that we would
 're-Blit' some parts multiple times (we would just need to do the
 optimisations later on).
 

Hmm... should this be implemented in DirectDrawSurface::Blt()? 

 Well, it's in my plans to do the GL 'port'... It could even be done pretty
 easily (as almost all of the code already exists in the D3D part of the
 code). It would be mightily hacky, but well, it may even work :-)


I'd say it'd be a bit faster than the current implementation, at least in most cases :P

Sorry it took so long for me to reply, I've had a stroke of bad luck recently and had 
lost my will to code for a short time, and my will is back :) If there's anything I 
hate, it's losing my will to code, there isn't much else that's worse :P
 
Tim



Re: DDraw issues, etc.

2004-04-04 Thread Lionel Ulmer
On Sat, Apr 03, 2004 at 08:34:38PM -0500, Tim Hentenaar wrote:
 I had a look, and implemented a clip list with one rect to use the same
 code as with an hWnd since they are virtually the same. This app is wierd in
 the fact that it dosen't use the hWnd for clipping with one rect, but rather
 a clip list with one rect. That fixed the drawing somewhat.

Well, it's not THAT strange... Ie if you want to use the features of the
clipper in, for example, a full screen applications, you do not need to
create a HWND which is the size of the rectangle, you can just add your own
clip list. And, if the hardware supports clipping with Blits, you gain time
as you do not have to do a lot of stuff in the game engine (all the
rectangle intersection code).

In OpenGL-land, this is called 'glScissor' :-)

So, if your game uses only one rectangle, it should be pretty easy to map to
the current code. Of course, if it uses more than one, some adaptations
would be needed :-/

 For instance, I noticed that the app sets the clip list, then tries to blit
 to a destination rect that isn't present in the clip list. I'm guessing that
 it's meaning to clip the source rect, but why you would clip the source
 surface is foreign to me. :P

What do you mean by 'a destination rect that isn't present in the clip list' ?

 I'll have to dig a little deeper yet to figure this out. The main thing
 that irks me, is that even with clipping implemented, wherever it has to
 draw any sort of constant animation it's horribly slow (most of the time).
 Though when it plays a movie it plays perfectly. I'm guessing this would be
 a flaw in the game engine.

Oh well, it can be LOTS of stuff... In Windows, they have direct frame
buffer access so some games (like MI3) did a lot of updates of the screen
(which leads to a lots of traffic in Wine between game memory, X11 and the
frame buffer). It works perfectly well in Windows and will be slow as hell
in Wine.

Lionel

-- 
 Lionel Ulmer - http://www.bbrox.org/



Re: DDraw issues, etc.

2004-04-04 Thread Tim Hentenaar
On Sun, 4 Apr 2004 10:26:34 +0200
Lionel Ulmer [EMAIL PROTECTED] wrote:

Of course, if it uses more than one, some adaptations
 would be needed :-/

And that it does :/ It seems not to update the screen properly, but then again, it 
could be something not completely implemented in Wine, or the game engine.

 What do you mean by 'a destination rect that isn't present in the clip list' ?

According to M$ DX7 Documentation, DirectDrawSurface::Blt() should only bit to areas 
that are in the clip list. And apparently 98% of the time that it's trying to blit to 
a rect that it's not putting in the clip list, it's almost identical to the 
RGNDATA.rcBound value, so i'm guessing it's for some type of back-buffer used by the 
engine :P

 Oh well, it can be LOTS of stuff... In Windows, they have direct frame
 buffer access so some games (like MI3) did a lot of updates of the screen
 (which leads to a lots of traffic in Wine between game memory, X11 and the
 frame buffer). It works perfectly well in Windows and will be slow as hell
 in Wine.

Yeah, that is unless the current DD code was rewritten to use GL and also assuming 
that the person running it had Direct Rendering, but then again, that would take a lot 
of time to do, and could possibly be horridly slow if the person happened not to have 
direct rendering :P

I'm also looking at some of the wave driver stuff. WineX's wave driver (at least the 
OSS driver) does the sound for the game perfectly whereas Wine's wave output sounds 
rather odd, crackling, and it seems not to flush the buffer properly. :P

Tim



Re: DDraw issues, etc.

2004-04-04 Thread Tim Hentenaar
On Sun, 4 Apr 2004 16:17:29 +0200 (CEST)
Francois Gouget [EMAIL PROTECTED] wrote:

 Do you have an i810 sound card by any chance?

00:1f.5 Multimedia audio controller: Intel Corp. 82801BA/BAM AC'97 Audio (rev 05)

 I'm asking this because there are known problems with sound on i810
 soundcards, especially if you are using the Alsa drivers.

I'm using the 2.6.0 kernel with the alsa kernel modules, and OSS emulation.

 
 It seems to be caused by a kernel bug which is triggered by the
 full-duplex mode:
 
 http://crossover.codeweavers.com/pipermail/discuss/2003-December/005653.html
 

Hmm.. I don't believe that my card is an i810, it could be, but I have the alsa 
drivers statically linked into my kernel and I forgot exactly which one it is.

Tim



Re: DDraw issues, etc.

2004-04-04 Thread Francois Gouget
On Sun, 4 Apr 2004, Tim Hentenaar wrote:
[...]
 00:1f.5 Multimedia audio controller: Intel Corp. 82801BA/BAM AC'97 Audio (rev 05)
[...]
 Hmm.. I don't believe that my card is an i810, it could be, but I have
 the alsa drivers statically linked into my kernel and I forgot exactly
 which one it is.

It looks like an i810 to me (but I have never actually seen one so...)

Do you know if it is integrated on the motherboard? And then is it an
Intel chipset?

Also, cat /proc/asound/cards will tell you what type of sound card you
have.


-- 
Francois Gouget [EMAIL PROTECTED]http://fgouget.free.fr/
   If it stinks, it's chemistry. If it moves, it's biology.
  If it does not work, It's computer science.



Re: DDraw issues, etc.

2004-04-04 Thread Tim Hentenaar
On Mon, 5 Apr 2004 02:20:51 +0200 (CEST)
Francois Gouget [EMAIL PROTECTED] wrote:

 It looks like an i810 to me (but I have never actually seen one so...)
 
 Do you know if it is integrated on the motherboard? And then is it an
 Intel chipset?
 
 Also, cat /proc/asound/cards will tell you what type of sound card you
 have.

0 [I82801BAICH2   ]: ICH - Intel 82801BA-ICH2
 Intel 82801BA-ICH2 at 0x1200, irq 10

apparently it's an ICH2 and not an i810, and yes it is integrated on the motherboard. 
(My computer is a laptop :P)

The odd thing about it is that the sound works fine in WineX (after a little hacking 
to get it to even run the app :/).

Tim



Re: DDraw issues, etc.

2004-04-03 Thread Lionel Ulmer
 I've implemented SetClipList and GetClipList in the DirectDraw Clipper,
 and I'm wondering how I should go about implementing clipping in
 DirectDraw's Blt() (if it isn't already done somewhere).

Usually, games use the Clipper to do 'non-full screen' DirectX applications.
There is no way to do a work-around to have it running in full-screen :-) ?

Anyway, all this clipping is not really implemented properly as most of the
effort was spent on full screen apps. As far as I can see in the code, the
only case supported with clipping is the case where only one rectangle is
given in the clip list via the SetHWnd method (see, for example,
User_copy_to_screen in dlls/ddraw/dsurface/user.c) which is the 'standard'
case for windowed DirectX applications (like Media player) : a menu bar + a
DirectX display zone.

After, if the list is only one rectangle, it should be easy to re-use the
existing code. Otherwise (ie multiple rectangles), you should check if you
can support with the 'BitBlt' API something like the 'XSetClipRectangles'
X11 API (which can't be called directly from DirectX anymore) which would
prevent us rewriting in the DirectX code some generic 'multi-rectangle'
clipping code.

 Lionel

-- 
 Lionel Ulmer - http://www.bbrox.org/



Re: DDraw issues, etc.

2004-04-03 Thread Tim Hentenaar
On Sat, 3 Apr 2004 10:26:12 +0200
Lionel Ulmer [EMAIL PROTECTED] wrote:

 Usually, games use the Clipper to do 'non-full screen' DirectX applications.
 There is no way to do a work-around to have it running in full-screen :-) ?

While it doesn't make sense it does use the Clipper even in fullscreen mode. :P

A little hacking, using FIXME() to reveal some info (I didn't want to enable TRACE() 
because it makes the app way too slow :P):

fixme:ddraw:Main_DirectDrawClipper_SetClipList (0x47c9cfe0)-SetClipList(0x49d8cbe0,0)
fixme:ddraw:Main_DirectDrawClipper_SetClipList - RGNDATA --
fixme:ddraw:Main_DirectDrawClipper_SetClipList  dwSize: 32
fixme:ddraw:Main_DirectDrawClipper_SetClipList  nCount: 3
fixme:ddraw:Main_DirectDrawClipper_SetClipList  rcBound: 313,234,365,265
fixme:ddraw:Main_DirectDrawClipper_SetClipList 
fixme:ddraw:DIB_DirectDrawSurface_Blt 
(0x47c9bba8)-(0x406dfd34,0x46c4c640,0x406dfd24,0002,0x406dfc94)
fixme:ddraw:DIB_DirectDrawSurface_Blt   destrect :313x234-365x265
fixme:ddraw:DIB_DirectDrawSurface_Blt   srcrect  :313x234-365x265
fixme:ddraw:DIB_DirectDrawSurface_Blt   flags: DDBLT_ROP

 
 Anyway, all this clipping is not really implemented properly as most of the
 effort was spent on full screen apps. 

I might be up for fixing that, at least partially :P

 As far as I can see in the code, the
 only case supported with clipping is the case where only one rectangle is
 given in the clip list via the SetHWnd method (see, for example,
 User_copy_to_screen in dlls/ddraw/dsurface/user.c) which is the 'standard'
 case for windowed DirectX applications (like Media player) : a menu bar + a
 DirectX display zone.
 

I'll have a look at that. I did implement SetClipList/GetClipList even though I did it 
a bit hackishly IMO, it dosen't give any problems :P

 Otherwise (ie multiple rectangles), you should check if you
 can support with the 'BitBlt' API something like the 'XSetClipRectangles'
 X11 API (which can't be called directly from DirectX anymore) which would
 prevent us rewriting in the DirectX code some generic 'multi-rectangle'
 clipping code.

I'm guessing that the current DX implementation uses a user32-based rendering via 
BitBlit? I know that DX allows for HAL and User32-based drawing. 

I'll have a look at the XSetClipRectangles() man page and hope and pray that I can 
find a way to implement this :P Any further help you could give me would be 
appreciated.

Thanks,

Tim





Re: DDraw issues, etc.

2004-04-03 Thread Tim Hentenaar
On Sat, 3 Apr 2004 04:00:23 -0500
Tim Hentenaar [EMAIL PROTECTED] wrote:

  As far as I can see in the code, the
  only case supported with clipping is the case where only one rectangle is
  given in the clip list via the SetHWnd method (see, for example,
  User_copy_to_screen in dlls/ddraw/dsurface/user.c) which is the 'standard'
  case for windowed DirectX applications (like Media player) : a menu bar + a
  DirectX display zone.
  
 

I had a look, and implemented a clip list with one rect to use the same code as with 
an hWnd since they are virtually the same. This app is wierd in the fact that it 
dosen't use the hWnd for clipping with one rect, but rather a clip list with one rect. 
That fixed the drawing somewhat.

  Otherwise (ie multiple rectangles), you should check if you
  can support with the 'BitBlt' API something like the 'XSetClipRectangles'
  X11 API (which can't be called directly from DirectX anymore) which would
  prevent us rewriting in the DirectX code some generic 'multi-rectangle'
  clipping code.
 

I read through some of the M$ Docs, and it claims that DirectDrawSurface::Blt 
shouldn't be drawing to any area outside the destination surface's clip list if one 
exists. I accounted for this, and I'll say that the drawing looks a hell of a lot 
better, though the app has some now-obvious flaws that aren't apparent under native 
Winblows (at least when I tested it via VMWare), and in some places the drawing is 
quite slow. For instance, I noticed that the app sets the clip list, then tries to 
blit to a destination rect that isn't present in the clip list. I'm guessing that it's 
meaning to clip the source rect, but why you would clip the source surface is foreign 
to me. :P

I'll have to dig a little deeper yet to figure this out. The main thing that irks me, 
is that even with clipping implemented, wherever it has to draw any sort of constant 
animation it's horribly slow (most of the time). Though when it plays a movie it plays 
perfectly. I'm guessing this would be a flaw in the game engine.

I wrote an email to the company that made the game, asking for info, and haven't even 
gotten a responce :/

Tim



DDraw issues, etc.

2004-04-02 Thread Tim Hentenaar
Hi all,

I've implemented SetClipList and GetClipList in the DirectDraw Clipper, and I'm 
wondering how I should go about implementing clipping in DirectDraw's Blt() (if it 
isn't already done somewhere). 

M$'s documentation isn't too great, so I figured I should ask around. There's a game 
one of my relatives wants to run under Linux (it's a children's program), and the 
major problem is that it dosen't seem to handle clipping properly when blitting. (e.g. 
every time you move the mouse, it calls SetClipList).

FYI, the binkw32.dll that came with the program was originally causing it to hang, but 
I patched the DLL and it works fine. If anyone else has had such problems, I could 
provide a patch.

Also, I'm going to take a look at some of the DirectSound stuff too. The sound isn't 
very good quality for some reason, but under the WineX 3.3 CVS, sound works perfectly.

Tim