Commit: fe2f3a131d96e4b0d1c85e1379b30c73f6378ffd
Author: Mitchell Stokes
Date:   Sun Dec 6 15:24:55 2015 -0800
Branches: master
https://developer.blender.org/rBfe2f3a131d96e4b0d1c85e1379b30c73f6378ffd

OpenGL/BGE: Remove RAS_StorageIM (glBegin/glEnd rendering of mesh data)

The only use we had for RAS_StorageIM was to render derived meshes using
Blender's mesh drawing. This is now handled as a special case in
RAS_OpenGLRasterizer instead of in RAS_StorageIM.

We are now left with RAS_StorageVA and RAS_StorageVBO. At the moment
vertex arrays are still the default since our vertex array with display
lists implementation is still much faster than our VBO code in a lot of
cases. As we improve our VBO code, we can drop vertex arrays since
Blender's minimum OpenGL version is being bumped up to 2.1, which
supports VBOs.

===================================================================

M       source/blender/makesrna/intern/rna_scene.c
M       source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
M       source/gameengine/GamePlayer/ghost/GPG_Application.cpp
M       source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
M       source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
M       source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
M       
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
M       source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
D       source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.cpp
D       source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.h

===================================================================

diff --git a/source/blender/makesrna/intern/rna_scene.c 
b/source/blender/makesrna/intern/rna_scene.c
index 3011288..4f9fe8b 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -3774,12 +3774,9 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
 
        static EnumPropertyItem storage_items[] = {
                {RAS_STORE_AUTO, "AUTO", 0, "Auto Select", "Choose the best 
supported mode"},
-               {RAS_STORE_IMMEDIATE, "IMMEDIATE", 0, "Immediate Mode", 
"Slowest performance, requires OpenGL (any version)"},
-               {RAS_STORE_VA, "VERTEX_ARRAY", 0, "Vertex Arrays", "Better 
performance, requires at least OpenGL 1.1"},
-#if 0  /* XXX VBOS are currently disabled since they cannot beat vertex array 
with display lists in performance. */
+               {RAS_STORE_VA, "VERTEX_ARRAY", 0, "Vertex Arrays", "Usually the 
best choice (good performance with display lists)"},
                {RAS_STORE_VBO, "VERTEX_BUFFER_OBJECT", 0, "Vertex Buffer 
Objects",
-                               "Best performance, requires at least OpenGL 
1.4"}, 
-#endif
+                               "Typically slower than vertex arrays with 
display lists, requires at least OpenGL 1.4"},
                {0, NULL, 0, NULL, NULL}};
 
        srna = RNA_def_struct(brna, "SceneGameData", NULL);
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp 
b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 976590c..0d04ab6 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -302,12 +302,20 @@ extern "C" void StartKetsjiShell(struct bContext *C, 
struct ARegion *ar, rcti *c
                        canvas->SetSwapInterval((startscene->gm.vsync == 
VSYNC_ON) ? 1 : 0);
 
                RAS_IRasterizer* rasterizer = NULL;
+               RAS_STORAGE_TYPE raster_storage = RAS_AUTO_STORAGE;
+
+               if (startscene->gm.raster_storage == RAS_STORE_VBO) {
+                       raster_storage = RAS_VBO;
+               }
+               else if (startscene->gm.raster_storage == RAS_STORE_VA) {
+                       raster_storage = RAS_VA;
+               }
                //Don't use displaylists with VBOs
                //If auto starts using VBOs, make sure to check for that here
-               if (displaylists && startscene->gm.raster_storage != 
RAS_STORE_VBO)
-                       rasterizer = new RAS_ListRasterizer(canvas, true, 
startscene->gm.raster_storage);
+               if (displaylists && raster_storage != RAS_VBO)
+                       rasterizer = new RAS_ListRasterizer(canvas, true, 
raster_storage);
                else
-                       rasterizer = new RAS_OpenGLRasterizer(canvas, 
startscene->gm.raster_storage);
+                       rasterizer = new RAS_OpenGLRasterizer(canvas, 
raster_storage);
 
                RAS_IRasterizer::MipmapOption mipmapval = 
rasterizer->GetMipmapping();
 
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp 
b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index 2b357f4..2940e6d 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -607,12 +607,20 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, 
const int stereoMode)
                if (gm->flag & GAME_SHOW_MOUSE)
                        m_canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
                
+               RAS_STORAGE_TYPE raster_storage = RAS_AUTO_STORAGE;
+
+               if (gm->raster_storage == RAS_STORE_VBO) {
+                       raster_storage = RAS_VBO;
+               }
+               else if (gm->raster_storage == RAS_STORE_VA) {
+                       raster_storage = RAS_VA;
+               }
                //Don't use displaylists with VBOs
                //If auto starts using VBOs, make sure to check for that here
-               if (useLists && gm->raster_storage != RAS_STORE_VBO)
-                       m_rasterizer = new RAS_ListRasterizer(m_canvas, false, 
gm->raster_storage);
+               if (useLists && raster_storage != RAS_VBO)
+                       m_rasterizer = new RAS_ListRasterizer(m_canvas, true, 
raster_storage);
                else
-                       m_rasterizer = new RAS_OpenGLRasterizer(m_canvas, 
gm->raster_storage);
+                       m_rasterizer = new RAS_OpenGLRasterizer(m_canvas, 
raster_storage);
 
                /* Stereo parameters - Eye Separation from the UI - stereomode 
from the command-line/UI */
                m_rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) 
stereoMode);
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt 
b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
index 888a711..168e3fa 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
@@ -53,7 +53,6 @@ set(SRC
        RAS_ListRasterizer.cpp
        RAS_OpenGLLight.cpp
        RAS_OpenGLRasterizer.cpp
-       RAS_StorageIM.cpp
        RAS_StorageVA.cpp
        RAS_StorageVBO.cpp
 
@@ -62,7 +61,6 @@ set(SRC
        RAS_ListRasterizer.h
        RAS_OpenGLLight.h
        RAS_OpenGLRasterizer.h
-       RAS_StorageIM.h
        RAS_StorageVA.h
        RAS_StorageVBO.h
 )
diff --git 
a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp 
b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
index 275e4b4..b2d5801 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
@@ -122,7 +122,7 @@ bool RAS_ListSlot::End()
 
 
 
-RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas, bool lock, int 
storage)
+RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas, bool lock, 
RAS_STORAGE_TYPE storage)
 :      RAS_OpenGLRasterizer(canvas, storage)
 {
 }
diff --git 
a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h 
b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
index 420bf5d..e3e6931 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
@@ -56,7 +56,7 @@ class RAS_ListRasterizer : public RAS_OpenGLRasterizer
 
 public:
        void RemoveListSlot(RAS_ListSlot* list);
-       RAS_ListRasterizer(RAS_ICanvas* canvas, bool lock=false, int 
storage=RAS_AUTO_STORAGE);
+       RAS_ListRasterizer(RAS_ICanvas* canvas, bool lock, RAS_STORAGE_TYPE 
storage);
        virtual ~RAS_ListRasterizer();
 
        virtual void    IndexPrimitives(class RAS_MeshSlot& ms);
diff --git 
a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 
b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 4629b91..8ba4ab7 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -47,15 +47,16 @@
 
 #include "RAS_OpenGLLight.h"
 
-#include "RAS_StorageIM.h"
 #include "RAS_StorageVA.h"
 #include "RAS_StorageVBO.h"
 
 #include "GPU_draw.h"
 #include "GPU_material.h"
+#include "GPU_extensions.h"
 
 extern "C"{
        #include "BLF_api.h"
+       #include "BKE_DerivedMesh.h"
 }
 
 
@@ -83,7 +84,7 @@ static GLuint right_eye_vinterlace_mask[32];
  */
 static GLuint hinterlace_mask[33];
 
-RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas, int storage)
+RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas, 
RAS_STORAGE_TYPE storage)
        :RAS_IRasterizer(canvas),
        m_2DCanvas(canvas),
        m_fogenabled(false),
@@ -122,22 +123,15 @@ RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* 
canvas, int storage)
 
        m_prevafvalue = GPU_get_anisotropic();
 
-       if (m_storage_type == RAS_VBO /*|| m_storage_type == RAS_AUTO_STORAGE 
&& GLEW_ARB_vertex_buffer_object*/)
-       {
+       if (m_storage_type == RAS_VBO /*|| m_storage_type == RAS_AUTO_STORAGE 
&& GLEW_ARB_vertex_buffer_object*/) {
                m_storage = new RAS_StorageVBO(&m_texco_num, m_texco, 
&m_attrib_num, m_attrib, m_attrib_layer);
-               m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, 
&m_attrib_num, m_attrib, m_attrib_layer);
-               m_storage_type = RAS_VBO;
        }
-       else if ((m_storage_type == RAS_VA) || (m_storage_type == 
RAS_AUTO_STORAGE && GLEW_VERSION_1_1))
-       {
+       else if ((m_storage_type == RAS_VA) || (m_storage_type == 
RAS_AUTO_STORAGE)) {
                m_storage = new RAS_StorageVA(&m_texco_num, m_texco, 
&m_attrib_num, m_attrib, m_attrib_layer);
-               m_failsafe_storage = new RAS_StorageIM(&m_texco_num, m_texco, 
&m_attrib_num, m_attrib, m_attrib_layer);
-               m_storage_type = RAS_VA;
        }
-       else
-       {
-               m_storage = m_failsafe_storage = new 
RAS_StorageIM(&m_texco_num, m_texco, &m_attrib_num, m_attrib, m_attrib_layer);
-               m_storage_type = RAS_IMMEDIATE;
+       else {
+               printf("Unknown rasterizer storage type, falling back to vertex 
arrays\n");
+               m_storage = new RAS_StorageVA(&m_texco_num, m_texco, 
&m_attrib_num, m_attrib, m_attrib_layer);
        }
 
        glGetIntegerv(GL_MAX_LIGHTS, (GLint *) &m_numgllights);
@@ -151,8 +145,6 @@ RAS_OpenGLRasterizer::~RAS_OpenGLRasterizer()
 {
        // Restore the previous AF value
        GPU_set_anisotropic(m_prevafvalue);
-       if (m_failsafe_storage && m_failsafe_storage != m_storage)
-               delete m_failsafe_storage;
 
        if (m_storage)
                delete m_storage;
@@ -321,9 +313,6 @@ void RAS_OpenGLRasterizer::SetDrawingMode(int drawingmode)
                glDisable(GL_CULL_FACE);
 
        m_storage->SetDrawingMode(drawingmode);
-       if (m_failsafe_storage && m_failsafe_storage != m_storage) {
-               m_failsafe_storage->SetDrawingMode(drawingmode);
-       }
 }
 
 int RAS_OpenGLRasterizer::GetDrawingMode()
@@ -735,11 +724,99 @@ void RAS_OpenGLRasterizer::SetAttrib(TexCoGen coords, int 
unit, int layer)
 void RAS_OpenGLRasterizer::IndexPrimitives(RAS_MeshSlot& ms)
 {
        if (ms.m_pDerivedMesh)
-               m_failsafe_storage->IndexPrimitives(ms);
+               DrawDerivedMesh(ms);
        else
                m_storage->IndexPrimitives(ms);
 }
 
+// Code for hooking into Blender's mesh drawing for derived meshes.
+// If/when we use more of Blender's drawing code, we may be able to
+// clean this up
+static bool current_wireframe;
+static RAS_MaterialBucket *current_bucket;
+static RAS_IPolyMaterial *current_polymat;
+static RAS_MeshSlot *current_ms;
+static RAS_MeshObject *current_mesh;
+static int current_blmat_nr;
+static GPUVertexAttribs current_gpu_attribs;
+static Image *current_image;
+static int CheckMaterialDM(int matnr, void *attribs)
+{
+       // only draw the current material
+       if (matnr != current_blmat_nr)
+               return 0;
+       GPUVertexAttribs *gattribs = (GPUVertexAttribs *)attribs;
+       if (gattribs)
+               memcpy(gattribs, &current_gpu_attribs, 
sizeof(GPUVertexAttribs));
+       return 1;
+}
+
+static DMDrawOption CheckTexDM(MTexPoly *mtexpoly, const bool has_mcol, int 
matnr)
+{
+
+       // index is the original face index, retrieve the polygon
+       if (matnr == current_blmat

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to