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