Patch [#7743] Enable display lists when vertex arrays are enabled, by Ovidiu Sabou.

this patch enable GE two use both vertex array and display lists. and speed up the engine a little, by the way thanks ovidiu.
This commit is contained in:
Hamed Zaghaghi 2007-11-06 18:39:16 +00:00
parent af169b41fd
commit bf4d79c47b
4 changed files with 84 additions and 23 deletions

@ -176,9 +176,13 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
bool lock_arrays = (displaylists && useVertexArrays); bool lock_arrays = (displaylists && useVertexArrays);
if(displaylists && !useVertexArrays) if(displaylists){
rasterizer = new RAS_ListRasterizer(canvas); if (useVertexArrays) {
else if (useVertexArrays && bgl::QueryVersion(1, 1)) rasterizer = new RAS_ListRasterizer(canvas, true, lock_arrays);
} else {
rasterizer = new RAS_ListRasterizer(canvas);
}
} else if (useVertexArrays && bgl::QueryVersion(1, 1))
rasterizer = new RAS_VAOpenGLRasterizer(canvas, lock_arrays); rasterizer = new RAS_VAOpenGLRasterizer(canvas, lock_arrays);
else else
rasterizer = new RAS_OpenGLRasterizer(canvas); rasterizer = new RAS_OpenGLRasterizer(canvas);
@ -663,4 +667,4 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area,
} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME); } while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
if (bfd) BLO_blendfiledata_free(bfd); if (bfd) BLO_blendfiledata_free(bfd);
} }

@ -533,7 +533,11 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
goto initFailed; goto initFailed;
if(useLists) if(useLists)
m_rasterizer = new RAS_ListRasterizer(m_canvas); if (useVertexArrays) {
m_rasterizer = new RAS_ListRasterizer(m_canvas, true);
} else {
m_rasterizer = new RAS_ListRasterizer(m_canvas);
}
else if (useVertexArrays && bgl::QueryVersion(1, 1)) else if (useVertexArrays && bgl::QueryVersion(1, 1))
m_rasterizer = new RAS_VAOpenGLRasterizer(m_canvas); m_rasterizer = new RAS_VAOpenGLRasterizer(m_canvas);
else else

@ -96,8 +96,9 @@ bool RAS_ListSlot::End()
RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas) RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas, bool useVertexArrays, bool lock)
: RAS_OpenGLRasterizer(canvas) : RAS_VAOpenGLRasterizer(canvas, lock),
mUseVertexArrays(useVertexArrays)
{ {
// -- // --
} }
@ -159,13 +160,22 @@ void RAS_ListRasterizer::IndexPrimitives(
if(localSlot->End()) if(localSlot->End())
return; return;
} }
RAS_OpenGLRasterizer::IndexPrimitives( if (mUseVertexArrays) {
vertexarrays, indexarrays, RAS_VAOpenGLRasterizer::IndexPrimitives(
mode, polymat, vertexarrays, indexarrays,
rendertools, useObjectColor, mode, polymat,
rgbacolor,slot rendertools, useObjectColor,
); rgbacolor,slot
);
} else {
RAS_OpenGLRasterizer::IndexPrimitives(
vertexarrays, indexarrays,
mode, polymat,
rendertools, useObjectColor,
rgbacolor,slot
);
}
if(!useObjectColor) { if(!useObjectColor) {
localSlot->EndList(); localSlot->EndList();
@ -195,16 +205,53 @@ void RAS_ListRasterizer::IndexPrimitivesMulti(
return; return;
} }
RAS_OpenGLRasterizer::IndexPrimitivesMulti( if (mUseVertexArrays) {
vertexarrays, indexarrays, RAS_VAOpenGLRasterizer::IndexPrimitivesMulti(
mode, polymat, vertexarrays, indexarrays,
rendertools, useObjectColor, mode, polymat,
rgbacolor,slot rendertools, useObjectColor,
); rgbacolor,slot
);
} else {
RAS_OpenGLRasterizer::IndexPrimitivesMulti(
vertexarrays, indexarrays,
mode, polymat,
rendertools, useObjectColor,
rgbacolor,slot
);
}
if(!useObjectColor) { if(!useObjectColor) {
localSlot->EndList(); localSlot->EndList();
*slot = localSlot; *slot = localSlot;
} }
} }
bool RAS_ListRasterizer::Init(void)
{
if (mUseVertexArrays) {
return RAS_VAOpenGLRasterizer::Init();
} else {
return RAS_OpenGLRasterizer::Init();
}
}
void RAS_ListRasterizer::SetDrawingMode(int drawingmode)
{
if (mUseVertexArrays) {
RAS_VAOpenGLRasterizer::SetDrawingMode(drawingmode);
} else {
RAS_OpenGLRasterizer::SetDrawingMode(drawingmode);
}
}
void RAS_ListRasterizer::Exit()
{
if (mUseVertexArrays) {
RAS_VAOpenGLRasterizer::Exit();
} else {
RAS_OpenGLRasterizer::Exit();
}
}
// eof // eof

@ -2,7 +2,7 @@
#define __RAS_LISTRASTERIZER_H__ #define __RAS_LISTRASTERIZER_H__
#include "RAS_MaterialBucket.h" #include "RAS_MaterialBucket.h"
#include "RAS_OpenGLRasterizer.h" #include "RAS_VAOpenGLRasterizer.h"
#include <vector> #include <vector>
class RAS_ListSlot : public KX_ListSlot class RAS_ListSlot : public KX_ListSlot
@ -33,15 +33,16 @@ enum RAS_ListSlotFlags {
typedef std::map<const vecVertexArray, RAS_ListSlot*> RAS_Lists; typedef std::map<const vecVertexArray, RAS_ListSlot*> RAS_Lists;
class RAS_ListRasterizer : public RAS_OpenGLRasterizer class RAS_ListRasterizer : public RAS_VAOpenGLRasterizer
{ {
bool mUseVertexArrays;
RAS_Lists mLists; RAS_Lists mLists;
RAS_ListSlot* FindOrAdd(const vecVertexArray& vertexarrays, KX_ListSlot** slot); RAS_ListSlot* FindOrAdd(const vecVertexArray& vertexarrays, KX_ListSlot** slot);
void ReleaseAlloc(); void ReleaseAlloc();
public: public:
RAS_ListRasterizer(RAS_ICanvas* canvas); RAS_ListRasterizer(RAS_ICanvas* canvas, bool useVertexArrays=false, bool lock=false);
virtual ~RAS_ListRasterizer(); virtual ~RAS_ListRasterizer();
virtual void IndexPrimitives( virtual void IndexPrimitives(
@ -66,6 +67,11 @@ public:
class KX_ListSlot** slot class KX_ListSlot** slot
); );
virtual bool Init();
virtual void Exit();
virtual void SetDrawingMode(int drawingmode);
virtual bool QueryLists(){return true;} virtual bool QueryLists(){return true;}
}; };