DX9_BackbufferGrabber.cpp 2.2 KB

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