[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37938] branches/soc-2011-cucumber/source/ gameengine: This commit rearranges the rasterizer to use a strategy design pattern.

Daniel Stokes kupomail at gmail.com
Wed Jun 29 07:24:58 CEST 2011


Revision: 37938
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37938
Author:   kupoman
Date:     2011-06-29 05:24:56 +0000 (Wed, 29 Jun 2011)
Log Message:
-----------
This commit rearranges the rasterizer to use a strategy design pattern. The concrete strategies are various storage methods. Currently these are immediate mode, and vertex arrays. This will make it cleaner to add in the VBO support (rather than having it mixed in with the vertex array rasterizer).

In the process of changing the ListRasterizer to accommodate the changes to OpenGLRasterizer, a check for ATI cards no longer gets acted upon. This check may not have been necessary and would cause slow downs on ATI cards. Some testing will reveal if something needs to be added back in.

Modified Paths:
--------------
    branches/soc-2011-cucumber/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    branches/soc-2011-cucumber/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Added Paths:
-----------
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.cpp
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.h
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h

Removed Paths:
-------------
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h

Modified: branches/soc-2011-cucumber/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2011-06-29 05:07:12 UTC (rev 37937)
+++ branches/soc-2011-cucumber/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2011-06-29 05:24:56 UTC (rev 37938)
@@ -59,7 +59,6 @@
 
 #include "RAS_GLExtensionManager.h"
 #include "RAS_OpenGLRasterizer.h"
-#include "RAS_VAOpenGLRasterizer.h"
 #include "RAS_ListRasterizer.h"
 
 #include "NG_LoopBackNetworkDeviceInterface.h"
@@ -205,9 +204,9 @@
 				rasterizer = new RAS_ListRasterizer(canvas);
 		}
 		else if (GLEW_VERSION_1_1 && !novertexarrays)
-			rasterizer = new RAS_VAOpenGLRasterizer(canvas, false);
+			rasterizer = new RAS_OpenGLRasterizer(canvas, RAS_VA);
 		else
-			rasterizer = new RAS_OpenGLRasterizer(canvas);
+			rasterizer = new RAS_OpenGLRasterizer(canvas, RAS_IMMEDIATE);
 		
 		// create the inputdevices
 		KX_BlenderKeyboardDevice* keyboarddevice = new KX_BlenderKeyboardDevice();

Modified: branches/soc-2011-cucumber/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/GamePlayer/ghost/GPG_Application.cpp	2011-06-29 05:07:12 UTC (rev 37937)
+++ branches/soc-2011-cucumber/source/gameengine/GamePlayer/ghost/GPG_Application.cpp	2011-06-29 05:24:56 UTC (rev 37938)
@@ -78,7 +78,6 @@
 #include "SCA_IActuator.h"
 #include "RAS_MeshObject.h"
 #include "RAS_OpenGLRasterizer.h"
-#include "RAS_VAOpenGLRasterizer.h"
 #include "RAS_ListRasterizer.h"
 #include "RAS_GLExtensionManager.h"
 #include "KX_PythonInit.h"
@@ -574,9 +573,9 @@
 				m_rasterizer = new RAS_ListRasterizer(m_canvas);
 		}
 		else if (GLEW_VERSION_1_1)
-			m_rasterizer = new RAS_VAOpenGLRasterizer(m_canvas);
+			m_rasterizer = new RAS_OpenGLRasterizer(m_canvas, RAS_VA);
 		else
-			m_rasterizer = new RAS_OpenGLRasterizer(m_canvas);
+			m_rasterizer = new RAS_OpenGLRasterizer(m_canvas, RAS_IMMEDIATE);
 
 		/* Stereo parameters - Eye Separation from the UI - stereomode from the command-line/UI */
 		m_rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) stereoMode);

Modified: branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt	2011-06-29 05:07:12 UTC (rev 37937)
+++ branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt	2011-06-29 05:24:56 UTC (rev 37938)
@@ -47,12 +47,17 @@
 	RAS_GLExtensionManager.cpp
 	RAS_ListRasterizer.cpp
 	RAS_OpenGLRasterizer.cpp
-	RAS_VAOpenGLRasterizer.cpp
+    RAS_StorageIM.cpp
+    RAS_StorageVA.cpp
+    RAS_StorageVBO.cpp
 
 	RAS_GLExtensionManager.h
+    RAS_IStorage.h
 	RAS_ListRasterizer.h
 	RAS_OpenGLRasterizer.h
-	RAS_VAOpenGLRasterizer.h
+    RAS_StorageIM.h
+    RAS_StorageVA.h
+    RAS_StorageVBO.h
 )
 
 add_definitions(-DGLEW_STATIC)

Added: branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h	                        (rev 0)
+++ branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h	2011-06-29 05:24:56 UTC (rev 37938)
@@ -0,0 +1,62 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __KX_STORAGE
+#define __KX_STORAGE
+
+#include "RAS_MaterialBucket.h"
+
+enum RAS_STORAGE_TYPE	{
+	RAS_IMMEDIATE,
+	RAS_VA
+};
+
+class RAS_IStorage
+{
+
+public:
+	virtual ~RAS_IStorage() {};
+
+	virtual bool	Init()=0;
+	virtual void	Exit()=0;
+
+	virtual void	IndexPrimitives(RAS_MeshSlot& ms)=0;
+	virtual void	IndexPrimitivesMulti(class RAS_MeshSlot& ms)=0;
+
+	virtual void	SetDrawingMode(int drawingmode)=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+	void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IStorage"); }
+	void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+};
+
+#endif //__KX_STORAGE
\ No newline at end of file

Modified: branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2011-06-29 05:07:12 UTC (rev 37937)
+++ branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2011-06-29 05:24:56 UTC (rev 37938)
@@ -107,8 +107,7 @@
 
 
 RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas, bool useVertexArrays, bool lock)
-:	RAS_VAOpenGLRasterizer(canvas, lock),
-	mUseVertexArrays(useVertexArrays),
+:	RAS_OpenGLRasterizer(canvas, (useVertexArrays) ? RAS_VA : RAS_IMMEDIATE),
 	mATI(false)
 {
 	if (!strcmp((const char*)glGetString(GL_VENDOR), "ATI Technologies Inc."))
@@ -238,11 +237,8 @@
 			return;
 		}
 	}
-	// derived mesh cannot use vertex array
-	if (mUseVertexArrays && !ms.m_pDerivedMesh)
-		RAS_VAOpenGLRasterizer::IndexPrimitives(ms);
-	else
-		RAS_OpenGLRasterizer::IndexPrimitives(ms);
+	
+	RAS_OpenGLRasterizer::IndexPrimitives(ms);
 
 	if(ms.m_bDisplayList) {
 		localSlot->EndList();
@@ -267,13 +263,7 @@
 		}
 	}
 
-	// workaround: note how we do not use vertex arrays for making display
-	// lists, since glVertexAttribPointerARB doesn't seem to work correct
-	// in display lists on ATI? either a bug in the driver or in Blender ..
-	if (mUseVertexArrays && !mATI && !ms.m_pDerivedMesh)
-		RAS_VAOpenGLRasterizer::IndexPrimitivesMulti(ms);
-	else
-		RAS_OpenGLRasterizer::IndexPrimitivesMulti(ms);
+	RAS_OpenGLRasterizer::IndexPrimitivesMulti(ms);
 
 	if(ms.m_bDisplayList) {
 		localSlot->EndList();
@@ -283,29 +273,17 @@
 
 bool RAS_ListRasterizer::Init(void)
 {
-	if (mUseVertexArrays) {
-		return RAS_VAOpenGLRasterizer::Init();
-	} else {
-		return RAS_OpenGLRasterizer::Init();
-	}
+	return RAS_OpenGLRasterizer::Init();
 }
 
 void RAS_ListRasterizer::SetDrawingMode(int drawingmode)
 {
-	if (mUseVertexArrays) {
-		RAS_VAOpenGLRasterizer::SetDrawingMode(drawingmode);
-	} else {
-		RAS_OpenGLRasterizer::SetDrawingMode(drawingmode);
-	}
+	RAS_OpenGLRasterizer::SetDrawingMode(drawingmode);
 }
 
 void RAS_ListRasterizer::Exit()
 {
-	if (mUseVertexArrays) {
-		RAS_VAOpenGLRasterizer::Exit();
-	} else {
-		RAS_OpenGLRasterizer::Exit();
-	}
+	RAS_OpenGLRasterizer::Exit();
 }
 
 // eof

Modified: branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h	2011-06-29 05:07:12 UTC (rev 37937)
+++ branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h	2011-06-29 05:24:56 UTC (rev 37938)
@@ -7,7 +7,7 @@
 #define __RAS_LISTRASTERIZER_H__
 
 #include "RAS_MaterialBucket.h"
-#include "RAS_VAOpenGLRasterizer.h"
+#include "RAS_OpenGLRasterizer.h"
 #include <vector>
 #include <map>
 
@@ -49,7 +49,7 @@
 typedef std::vector<RAS_ListSlot*>					  RAS_ListSlots;	// indexed by material slot number
 typedef std::map<DerivedMesh*, RAS_ListSlots*>		  RAS_DerivedMeshLists;
 
-class RAS_ListRasterizer : public RAS_VAOpenGLRasterizer
+class RAS_ListRasterizer : public RAS_OpenGLRasterizer
 {
 	bool mUseVertexArrays;
 	bool mATI;

Modified: branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2011-06-29 05:07:12 UTC (rev 37937)
+++ branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2011-06-29 05:24:56 UTC (rev 37938)
@@ -44,6 +44,10 @@
 #include "MT_CmMatrix4x4.h"
 #include "RAS_IRenderTools.h" // rendering text
 
+#include "RAS_StorageIM.h"
+#include "RAS_StorageVA.h"
+#include "RAS_StorageVBO.h"
+
 #include "GPU_draw.h"
 #include "GPU_material.h"
 #include "GPU_extensions.h"
@@ -68,7 +72,7 @@
  */
 static GLuint hinterlace_mask[33];
 
-RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas)
+RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas, int storage)
 	:RAS_IRasterizer(canvas),
 	m_2DCanvas(canvas),
 	m_fogenabled(false),
@@ -99,16 +103,27 @@
 		hinterlace_mask[i] = (i&1)*0xFFFFFFFF;
 	}
 	hinterlace_mask[32] = 0;
+	if (storage == RAS_VA)
+	{
+		m_storage = new RAS_StorageVA(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
+		m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
+	}
+	else
+	{
+		m_storage = m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib);
+	}
 }
 
 
 
 RAS_OpenGLRasterizer::~RAS_OpenGLRasterizer()
 {
+	delete m_storage;
 }
 
 bool RAS_OpenGLRasterizer::Init()
 {
+	bool storage_init;
 	GPU_state_init();
 
 
@@ -136,7 +151,9 @@
 
 	glShadeModel(GL_SMOOTH);
 
-	return true;
+	storage_init = m_storage->Init();
+
+	return true && storage_init;
 }
 
 
@@ -257,6 +274,8 @@
 void RAS_OpenGLRasterizer::Exit()
 {
 
+	m_storage->Exit();
+
 	glEnable(GL_CULL_FACE);
 	glEnable(GL_DEPTH_TEST);
 	glClearDepth(1.0); 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list