Multi head / multi card questions

Started by
2 comments, last by dginside 16 years, 10 months ago
I've been trying to get a direct3d app to write as fast as possible to 4 seperate monitors which are connected to 2 nvidia 8800 cards on a PCIe 16x bus. So far I've had mixed results.. I've managed to get 4 heads working nicely at 60fps, but theres still some gaps in my understanding. The most annoying thing is I don't seem to be able to get exclusive mode access on both cards, the 2nd call to createDevice() [for adapter 1 [2nd card]] seems to return a valid d3dDevice but then when I actually draw anything the machine hangs or bsod's So my interim solution is to create an exclusive mode device for the first two heads of adapter 0, then on adapter 1 I create two windowed devices. This gives me the 60fps result. odly though when I just run the 1st 3 heads i get 1200fps+. As soon as I touch the 4th display I get a slow down to 60-62fps. Does anybody have any experience of writing to 4 heads across 2 cards who may be able to shed light on my findings?
Advertisement
Haven't really played with it, but here's my limited knowledge on this stuff. You may know all this, as you're actually using multiple device and multi-head, whereas I've just read a wee bit about it.

When you create a second device, it causes a lost device on the first device. If you're handling lost devices, you should be fine. The trick here is that your init code may not check for lost devices before attempting to create all your D3D resources, so all the init code fails. A quick check and handling of lost devices after creating all your devices, but before any other init, may fix this up.

Usually a bad frame rate drop like that would indicate that you're displaying the window on card 2, but have created the device on card 1. Card 1 renders, and must lock and copy the data to card 2 to display. It could even be as simple as being off by 1 pixel somewhere, not accounting for the window border size, etc. There's some way to get the monitor ID for a device/adapter, from there you can get the monitor rectangle. Compare that to the client rect of the window you're drawing to.
Quote:Original post by dginside
The most annoying thing is I don't seem to be able to get exclusive mode access on both cards, the 2nd call to createDevice() [for adapter 1 [2nd card]] seems to return a valid d3dDevice but then when I actually draw anything the machine hangs or bsod's

I'd suggest contacting NVIDIA about this. Sounds like a driver bug.
Quote:Original post by Namethatnobodyelsetook
Usually a bad frame rate drop like that would indicate that you're displaying the window on card 2, but have created the device on card 1. Card 1 renders, and must lock and copy the data to card 2 to display. It could even be as simple as being off by 1 pixel somewhere, not accounting for the window border size, etc. There's some way to get the monitor ID for a device/adapter, from there you can get the monitor rectangle. Compare that to the client rect of the window you're drawing to.


Thankyou! that prompted me to find it - for the fourth window i had to give it an adapter index of 2 because it wasn't in exclusive mode it needed to have a per head adapter index, whereas exclusive mode dual monitor shares an adapter index :s

so for reference its now doing 1200 fps in the following configuration.

head 1: exclusive mode, GPU 0, adpater index 0, device0, swapchain0
head 2: exclusive mode, GPU 0, adapter index 0, device0, swapchain1
head 3: windowed mode, GPU 1, adapter index 1, device1, swapchain2
head 4: windowed mode, GPU 1, adapter index 2, device2, swapchain3

I would be interested to know if exclusive mode on both cards is possible, I tried all that lost device reset stuff, but maybe I was doing something wrong, anyway 1200 fps serves my purpose for now, so maybe I'll come back to multi GPU exclusive mode when we have 4 GPU's on the next upgrade :D

This topic is closed to new replies.

Advertisement