1 #include "DX9_BackbufferGrabber.h"
2
DX9_BackbufferGrabber()3 DX9_BackbufferGrabber::DX9_BackbufferGrabber()
4 {
5 pDestSurface=0;
6 pRenderTargetSurface=0;
7 deviceUsedToInit=0;
8 width=0;
9 height=0;
10 needsUnlock=false;
11 }
~DX9_BackbufferGrabber()12 DX9_BackbufferGrabber::~DX9_BackbufferGrabber()
13 {
14 if (pDestSurface)
15 pDestSurface->Release();
16 if (pRenderTargetSurface)
17 pRenderTargetSurface->Release();
18 }
InitBackbufferGrabber(LPDIRECT3DDEVICE9 pd3dDevice,int _width,int _height)19 void DX9_BackbufferGrabber::InitBackbufferGrabber(LPDIRECT3DDEVICE9 pd3dDevice, int _width, int _height)
20 {
21 if (width==_width && height==_height && pDestSurface && pRenderTargetSurface)
22 return;
23
24 if (pDestSurface)
25 pDestSurface->Release();
26 if (pRenderTargetSurface)
27 pRenderTargetSurface->Release();
28
29 width=_width;
30 height=_height;
31 deviceUsedToInit=pd3dDevice;
32
33 HRESULT hr;
34 // KevinJ: Surface to copy to in system memory
35 hr = deviceUsedToInit->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM, &pDestSurface,NULL);
36 if (hr!=S_OK) return;
37 // Surface to downsize to
38 hr = deviceUsedToInit->CreateRenderTarget(
39 width,
40 height,
41 D3DFMT_A8R8G8B8,
42 D3DMULTISAMPLE_NONE,
43 0,
44 false,
45 &pRenderTargetSurface,
46 NULL
47 );
48 }
LockBackbufferCopy(RakNet::RGBImageBlob * blob)49 void DX9_BackbufferGrabber::LockBackbufferCopy(RakNet::RGBImageBlob *blob)
50 {
51 LPDIRECT3DDEVICE9 pd3dDevice;
52 pd3dDevice=deviceUsedToInit;
53
54 IDirect3DSurface9 * pBackBuffer;
55 HRESULT hr;
56 hr = deviceUsedToInit->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
57 hr = deviceUsedToInit->StretchRect(pBackBuffer, NULL, pRenderTargetSurface, NULL, D3DTEXF_NONE);
58 hr = deviceUsedToInit->GetRenderTargetData(pRenderTargetSurface,pDestSurface);
59
60 // RakNetTimeMS t1 = RakNet::GetTimeMS();
61 D3DLOCKED_RECT lockedRect;
62 unsigned int videoMemoryDestOffset=0;
63 unsigned int pDataOffset=0;
64 hr = pDestSurface->LockRect(&lockedRect,0,D3DLOCK_DONOTWAIT|D3DLOCK_READONLY|D3DLOCK_NOSYSLOCK);
65 if (hr==D3D_OK)
66 {
67 blob->data=(unsigned char*)(lockedRect.pBits);
68 blob->imageHeight=height;
69 blob->imageWidth=width;
70 blob->input_components=4;
71 blob->linePitch=lockedRect.Pitch;
72 needsUnlock=true;
73 }
74 }
ReleaseBackbufferCopy(void)75 void DX9_BackbufferGrabber::ReleaseBackbufferCopy(void)
76 {
77 if (needsUnlock)
78 {
79 pDestSurface->UnlockRect();
80 needsUnlock=false;
81 }
82 }
83