Commit b6d83d97 authored by hybrid's avatar hybrid

Fix 64bit precision problem due to pointer/uint casts.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3275 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 7e12ac9b
......@@ -1245,8 +1245,8 @@ void CD3D9Driver::createOcclusionQuery(scene::ISceneNode* node,
return;
CNullDriver::createOcclusionQuery(node, mesh);
const s32 index = OcclusionQueries.linear_search(SOccQuery(node));
if ((index != -1) && (OcclusionQueries[index].ID == 0))
pID3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, reinterpret_cast<IDirect3DQuery9**>(&OcclusionQueries[index].ID));
if ((index != -1) && (OcclusionQueries[index].PID == 0))
pID3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, reinterpret_cast<IDirect3DQuery9**>(&OcclusionQueries[index].PID));
}
......@@ -1256,8 +1256,8 @@ void CD3D9Driver::removeOcclusionQuery(scene::ISceneNode* node)
const s32 index = OcclusionQueries.linear_search(SOccQuery(node));
if (index != -1)
{
if (OcclusionQueries[index].ID != 0)
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].ID)->Release();
if (OcclusionQueries[index].PID != 0)
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].PID)->Release();
CNullDriver::removeOcclusionQuery(node);
}
}
......@@ -1274,11 +1274,11 @@ void CD3D9Driver::runOcclusionQuery(scene::ISceneNode* node, bool visible)
const s32 index = OcclusionQueries.linear_search(SOccQuery(node));
if (index != -1)
{
if (OcclusionQueries[index].ID)
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].ID)->Issue(D3DISSUE_BEGIN);
if (OcclusionQueries[index].PID)
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].PID)->Issue(D3DISSUE_BEGIN);
CNullDriver::runOcclusionQuery(node,visible);
if (OcclusionQueries[index].ID)
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].ID)->Issue(D3DISSUE_END);
if (OcclusionQueries[index].PID)
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].PID)->Issue(D3DISSUE_END);
}
}
......@@ -1297,12 +1297,12 @@ void CD3D9Driver::updateOcclusionQuery(scene::ISceneNode* node, bool block)
bool available = block?true:false;
int tmp=0;
if (!block)
available=(reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].ID)->GetData(&tmp, sizeof(DWORD), 0)==S_OK);
available=(reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].PID)->GetData(&tmp, sizeof(DWORD), 0)==S_OK);
else
{
do
{
HRESULT hr = reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].ID)->GetData(&tmp, sizeof(DWORD), D3DGETDATA_FLUSH);
HRESULT hr = reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[index].PID)->GetData(&tmp, sizeof(DWORD), D3DGETDATA_FLUSH);
available = (hr == S_OK);
if (hr!=S_FALSE)
break;
......@@ -2838,10 +2838,10 @@ bool CD3D9Driver::reset()
}
for (i=0; i<OcclusionQueries.size(); ++i)
{
if (OcclusionQueries[i].ID)
if (OcclusionQueries[i].PID)
{
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[i].ID)->Release();
OcclusionQueries[i].ID=0;
reinterpret_cast<IDirect3DQuery9*>(OcclusionQueries[i].PID)->Release();
OcclusionQueries[i].PID=0;
}
}
// this does not require a restore in the reset method, it's updated
......@@ -2891,7 +2891,7 @@ bool CD3D9Driver::reset()
}
for (i=0; i<OcclusionQueries.size(); ++i)
{
pID3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, reinterpret_cast<IDirect3DQuery9**>(&OcclusionQueries[i].ID));
pID3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, reinterpret_cast<IDirect3DQuery9**>(&OcclusionQueries[i].PID));
}
if (FAILED(hr))
......
......@@ -718,7 +718,7 @@ namespace video
struct SOccQuery
{
SOccQuery(scene::ISceneNode* node, const scene::IMesh* mesh=0) : Node(node), Mesh(mesh), ID(0), Result(~0), Run(~0)
SOccQuery(scene::ISceneNode* node, const scene::IMesh* mesh=0) : Node(node), Mesh(mesh), PID(0), Result(~0), Run(~0)
{
if (Node)
Node->grab();
......@@ -726,7 +726,7 @@ namespace video
Mesh->grab();
}
SOccQuery(const SOccQuery& other) : Node(other.Node), Mesh(other.Mesh), ID(other.ID), Result(other.Result), Run(other.Run)
SOccQuery(const SOccQuery& other) : Node(other.Node), Mesh(other.Mesh), PID(other.PID), Result(other.Result), Run(other.Run)
{
if (Node)
Node->grab();
......@@ -746,7 +746,7 @@ namespace video
{
Node=other.Node;
Mesh=other.Mesh;
ID=other.ID;
PID=other.PID;
Result=other.Result;
Run=other.Run;
if (Node)
......@@ -763,7 +763,11 @@ namespace video
scene::ISceneNode* Node;
const scene::IMesh* Mesh;
void* ID;
union
{
void* PID;
unsigned int UID;
};
u32 Result;
u32 Run;
};
......
......@@ -1239,8 +1239,8 @@ void COpenGLDriver::createOcclusionQuery(scene::ISceneNode* node,
CNullDriver::createOcclusionQuery(node, mesh);
const s32 index = OcclusionQueries.linear_search(SOccQuery(node));
if ((index != -1) && (OcclusionQueries[index].ID == 0))
extGlGenQueries(1, reinterpret_cast<GLuint*>(&OcclusionQueries[index].ID));
if ((index != -1) && (OcclusionQueries[index].UID == 0))
extGlGenQueries(1, &OcclusionQueries[index].UID);
}
......@@ -1250,8 +1250,8 @@ void COpenGLDriver::removeOcclusionQuery(scene::ISceneNode* node)
const s32 index = OcclusionQueries.linear_search(SOccQuery(node));
if (index != -1)
{
if (OcclusionQueries[index].ID != 0)
extGlDeleteQueries(1, reinterpret_cast<GLuint*>(&OcclusionQueries[index].ID));
if (OcclusionQueries[index].UID != 0)
extGlDeleteQueries(1, &OcclusionQueries[index].UID);
CNullDriver::removeOcclusionQuery(node);
}
}
......@@ -1268,16 +1268,16 @@ void COpenGLDriver::runOcclusionQuery(scene::ISceneNode* node, bool visible)
const s32 index = OcclusionQueries.linear_search(SOccQuery(node));
if (index != -1)
{
if (OcclusionQueries[index].ID)
if (OcclusionQueries[index].UID)
extGlBeginQuery(
#ifdef GL_ARB_occlusion_query
GL_SAMPLES_PASSED_ARB,
#else
0,
#endif
reinterpret_cast<GLuint>(OcclusionQueries[index].ID));
OcclusionQueries[index].UID);
CNullDriver::runOcclusionQuery(node,visible);
if (OcclusionQueries[index].ID)
if (OcclusionQueries[index].UID)
extGlEndQuery(
#ifdef GL_ARB_occlusion_query
GL_SAMPLES_PASSED_ARB);
......@@ -1302,7 +1302,7 @@ void COpenGLDriver::updateOcclusionQuery(scene::ISceneNode* node, bool block)
return;
GLint available = block?GL_TRUE:GL_FALSE;
if (!block)
extGlGetQueryObjectiv(reinterpret_cast<GLuint>(OcclusionQueries[index].ID),
extGlGetQueryObjectiv(OcclusionQueries[index].UID,
#ifdef GL_ARB_occlusion_query
GL_QUERY_RESULT_AVAILABLE_ARB,
#elif defined(GL_NV_occlusion_query)
......@@ -1314,7 +1314,7 @@ void COpenGLDriver::updateOcclusionQuery(scene::ISceneNode* node, bool block)
testGLError();
if (available==GL_TRUE)
{
extGlGetQueryObjectiv(reinterpret_cast<GLuint>(OcclusionQueries[index].ID),
extGlGetQueryObjectiv(OcclusionQueries[index].UID,
#ifdef GL_ARB_occlusion_query
GL_QUERY_RESULT_ARB,
#elif defined(GL_NV_occlusion_query)
......
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