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)
{
if (!query->second && create)
{
query->second = new Query(mRenderer, handle, type);
query->second = new Query(mRenderer, type, handle);
query->second->addRef();
}
return query->second;
......
......@@ -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
}
}
......@@ -11,11 +11,10 @@
#define GL_APICALL
#include <GLES2/gl2.h>
#include <d3d9.h>
#include "common/angleutils.h"
#include "common/RefCountObject.h"
#include "libGLESv2/renderer/Renderer9.h"
#include "libGLESv2/renderer/Renderer.h"
namespace gl
{
......@@ -23,11 +22,12 @@ namespace gl
class Query : public RefCountObject
{
public:
Query(rx::Renderer *renderer, GLuint id, GLenum type);
Query(rx::Renderer *renderer, GLenum type, GLuint id);
virtual ~Query();
void begin();
void end();
GLuint getResult();
GLboolean isResultAvailable();
......@@ -36,14 +36,7 @@ class Query : public RefCountObject
private:
DISALLOW_COPY_AND_ASSIGN(Query);
rx::Renderer9 *mRenderer; // D3D9_REPLACE
GLboolean testQuery();
IDirect3DQuery9* mQuery; // D3D9_REPLACE
GLenum mType;
GLboolean mStatus;
GLint mResult;
rx::QueryImpl *mQuery;
};
}
......
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