home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / Tessa / source / D3D9 / FenceManager_D3D9.cpp < prev   
Encoding:
C/C++ Source or Header  |  2009-09-14  |  1.9 KB  |  104 lines

  1. #include "stdafx.h"
  2. #include <d3d9.h>
  3. #include "D3D9/FenceManager_D3D9.h"
  4.  
  5. VDTFenceManagerD3D9::VDTFenceManagerD3D9()
  6. : mpD3DDevice(NULL)
  7. {
  8. }
  9.  
  10. VDTFenceManagerD3D9::~VDTFenceManagerD3D9() {
  11. }
  12.  
  13. void VDTFenceManagerD3D9::Init(IDirect3DDevice9 *dev) {
  14.     HRESULT hr = dev->CreateQuery(D3DQUERYTYPE_EVENT, NULL);
  15.     mbEventQueriesSupported = SUCCEEDED(hr);
  16.  
  17.     mpD3DDevice = dev;
  18.     mpD3DDevice->AddRef();
  19.  
  20.     mFirstFenceId = 1;
  21.     mNextFenceId = 1;
  22. }
  23.  
  24. void VDTFenceManagerD3D9::Shutdown() {
  25.     FlushDefaultResources();
  26.  
  27.     if (mpD3DDevice) {
  28.         mpD3DDevice->Release();
  29.         mpD3DDevice = NULL;
  30.     }
  31. }
  32.  
  33. void VDTFenceManagerD3D9::FlushDefaultResources() {
  34.     while(!mIdleQueries.empty()) {
  35.         IDirect3DQuery9 *q = mIdleQueries.back();
  36.         mIdleQueries.pop_back();
  37.  
  38.         q->Release();
  39.     }
  40.  
  41.     while(!mActiveQueries.empty()) {
  42.         IDirect3DQuery9 *q = mActiveQueries.back();
  43.         mActiveQueries.pop_back();
  44.  
  45.         if (q)
  46.             q->Release();
  47.     }
  48.  
  49.     mFirstFenceId = mNextFenceId;
  50. }
  51.  
  52. uint32 VDTFenceManagerD3D9::InsertFence() {
  53.     if (!mbEventQueriesSupported)
  54.         return mNextFenceId++;
  55.  
  56.     IDirect3DQuery9 *q = NULL;
  57.     HRESULT hr;
  58.  
  59.     if (mIdleQueries.empty()) {
  60.         hr = mpD3DDevice->CreateQuery(D3DQUERYTYPE_EVENT, &q);
  61.         if (FAILED(hr))
  62.             q = NULL;
  63.     } else {
  64.         q = mIdleQueries.back();
  65.         mIdleQueries.pop_back();
  66.     }
  67.  
  68.     if (q) {
  69.         hr = q->Issue(D3DISSUE_END);
  70.  
  71.         if (FAILED(hr)) {
  72.             q->Release();
  73.             q = NULL;
  74.         }
  75.     }
  76.  
  77.     mActiveQueries.push_back(q);
  78.     return mNextFenceId++;
  79. }
  80.  
  81. bool VDTFenceManagerD3D9::CheckFence(uint32 fenceId) {
  82.     uint32 distance = mNextFenceId - fenceId;
  83.     if (distance > mActiveQueries.size())
  84.         return true;
  85.  
  86.     while(!mActiveQueries.empty()) {
  87.         IDirect3DQuery9 *q = mActiveQueries.front();
  88.  
  89.         if (q) {
  90.             HRESULT hr = q->GetData(NULL, 0, D3DGETDATA_FLUSH);
  91.             if (hr == S_FALSE)
  92.                 break;
  93.         }
  94.  
  95.         if (q)
  96.             mIdleQueries.push_back(q);
  97.  
  98.         mActiveQueries.pop_front();
  99.         ++mFirstFenceId;
  100.     }
  101.  
  102.     return distance > mActiveQueries.size();
  103. }
  104.