gl::Query now uses the abstract rx::Query.

TRAC #22418

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Geoff Lang

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1840 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Query.cpp b/src/libGLESv2/Query.cpp
index f9f1bff..d0d9000 100644
--- a/src/libGLESv2/Query.cpp
+++ b/src/libGLESv2/Query.cpp
@@ -7,124 +7,44 @@
 // Query.cpp: Implements the gl::Query class
 
 #include "libGLESv2/Query.h"
-
-#include "libGLESv2/renderer/renderer9_utils.h"
+#include "libGLESv2/renderer/QueryImpl.h"
 
 namespace gl
 {
 
-Query::Query(rx::Renderer *renderer, GLuint id, GLenum type) : RefCountObject(id)
+Query::Query(rx::Renderer *renderer, GLenum type, GLuint id) : RefCountObject(id)
 { 
-    mRenderer = rx::Renderer9::makeRenderer9(renderer);   // D3D9_REPLACE
-
-    mQuery = NULL;
-    mStatus = GL_FALSE;
-    mResult = GL_FALSE;
-    mType = type;
+    mQuery = renderer->createQuery(type);
 }
 
 Query::~Query()
 {
-    if (mQuery != NULL)
-    {
-        mQuery->Release();
-        mQuery = NULL;
-    }
+    delete mQuery;
 }
 
 void Query::begin()
 {
-    if (mQuery == NULL)
-    {
-        // D3D9_REPLACE
-        if (FAILED(mRenderer->getDevice()->CreateQuery(D3DQUERYTYPE_OCCLUSION, &mQuery)))
-        {
-            return error(GL_OUT_OF_MEMORY);
-        }
-    }
-
-    HRESULT result = mQuery->Issue(D3DISSUE_BEGIN);
-    ASSERT(SUCCEEDED(result));
+    mQuery->begin();
 }
 
 void Query::end()
 {
-    if (mQuery == NULL)
-    {
-        return error(GL_INVALID_OPERATION);
-    }
-
-    HRESULT result = mQuery->Issue(D3DISSUE_END);
-    ASSERT(SUCCEEDED(result));
-    
-    mStatus = GL_FALSE;
-    mResult = GL_FALSE;
+    mQuery->end();
 }
 
 GLuint Query::getResult()
 {
-    if (mQuery != NULL)
-    {
-        while (!testQuery())
-        {
-            Sleep(0);
-            // explicitly check for device loss
-            // some drivers seem to return S_FALSE even if the device is lost
-            // instead of D3DERR_DEVICELOST like they should
-            if (mRenderer->testDeviceLost(true))
-            {
-                return error(GL_OUT_OF_MEMORY, 0);
-            }
-        }
-    }
-
-    return (GLuint)mResult;
+    return mQuery->getResult();
 }
 
 GLboolean Query::isResultAvailable()
 {
-    if (mQuery != NULL)
-    {
-        testQuery();
-    }
-    
-    return mStatus;
+    return mQuery->isResultAvailable();
 }
 
 GLenum Query::getType() const
 {
-    return mType;
+    return mQuery->getType();
 }
 
-GLboolean Query::testQuery()
-{
-    if (mQuery != NULL && mStatus != GL_TRUE)
-    {
-        DWORD numPixels = 0;
-
-        HRESULT hres = mQuery->GetData(&numPixels, sizeof(DWORD), D3DGETDATA_FLUSH);
-        if (hres == S_OK)
-        {
-            mStatus = GL_TRUE;
-
-            switch (mType)
-            {
-              case GL_ANY_SAMPLES_PASSED_EXT:
-              case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
-                mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE;
-                break;
-              default:
-                ASSERT(false);
-            }
-        }
-        else if (checkDeviceLost(hres))
-        {
-            return error(GL_OUT_OF_MEMORY, GL_TRUE);
-        }
-        
-        return mStatus;
-    }
-
-    return GL_TRUE; // prevent blocking when query is null
-}
 }