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