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
parent 50df6c5f
...@@ -1127,7 +1127,7 @@ Query *Context::getQuery(unsigned int handle, bool create, GLenum type) ...@@ -1127,7 +1127,7 @@ Query *Context::getQuery(unsigned int handle, bool create, GLenum type)
{ {
if (!query->second && create) if (!query->second && create)
{ {
query->second = new Query(mRenderer, handle, type); query->second = new Query(mRenderer, type, handle);
query->second->addRef(); query->second->addRef();
} }
return query->second; return query->second;
......
...@@ -7,124 +7,44 @@ ...@@ -7,124 +7,44 @@
// Query.cpp: Implements the gl::Query class // Query.cpp: Implements the gl::Query class
#include "libGLESv2/Query.h" #include "libGLESv2/Query.h"
#include "libGLESv2/renderer/QueryImpl.h"
#include "libGLESv2/renderer/renderer9_utils.h"
namespace gl 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 = renderer->createQuery(type);
mQuery = NULL;
mStatus = GL_FALSE;
mResult = GL_FALSE;
mType = type;
} }
Query::~Query() Query::~Query()
{ {
if (mQuery != NULL) delete mQuery;
{
mQuery->Release();
mQuery = NULL;
}
} }
void Query::begin() void Query::begin()
{ {
if (mQuery == NULL) mQuery->begin();
{
// 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));
} }
void Query::end() void Query::end()
{ {
if (mQuery == NULL) mQuery->end();
{
return error(GL_INVALID_OPERATION);
}
HRESULT result = mQuery->Issue(D3DISSUE_END);
ASSERT(SUCCEEDED(result));
mStatus = GL_FALSE;
mResult = GL_FALSE;
} }
GLuint Query::getResult() GLuint Query::getResult()
{ {
if (mQuery != NULL) return mQuery->getResult();
{
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;
} }
GLboolean Query::isResultAvailable() GLboolean Query::isResultAvailable()
{ {
if (mQuery != NULL) return mQuery->isResultAvailable();
{
testQuery();
}
return mStatus;
} }
GLenum Query::getType() const 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
}
} }
...@@ -11,11 +11,10 @@ ...@@ -11,11 +11,10 @@
#define GL_APICALL #define GL_APICALL
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#include <d3d9.h>
#include "common/angleutils.h" #include "common/angleutils.h"
#include "common/RefCountObject.h" #include "common/RefCountObject.h"
#include "libGLESv2/renderer/Renderer9.h" #include "libGLESv2/renderer/Renderer.h"
namespace gl namespace gl
{ {
...@@ -23,11 +22,12 @@ namespace gl ...@@ -23,11 +22,12 @@ namespace gl
class Query : public RefCountObject class Query : public RefCountObject
{ {
public: public:
Query(rx::Renderer *renderer, GLuint id, GLenum type); Query(rx::Renderer *renderer, GLenum type, GLuint id);
virtual ~Query(); virtual ~Query();
void begin(); void begin();
void end(); void end();
GLuint getResult(); GLuint getResult();
GLboolean isResultAvailable(); GLboolean isResultAvailable();
...@@ -36,14 +36,7 @@ class Query : public RefCountObject ...@@ -36,14 +36,7 @@ class Query : public RefCountObject
private: private:
DISALLOW_COPY_AND_ASSIGN(Query); DISALLOW_COPY_AND_ASSIGN(Query);
rx::Renderer9 *mRenderer; // D3D9_REPLACE rx::QueryImpl *mQuery;
GLboolean testQuery();
IDirect3DQuery9* mQuery; // D3D9_REPLACE
GLenum mType;
GLboolean mStatus;
GLint mResult;
}; };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment