[Bf-blender-cvs] [fe2f3a1] master: OpenGL/BGE: Remove RAS_StorageIM (glBegin/glEnd rendering of mesh data)
Mitchell Stokes
noreply at git.blender.org
Tue Dec 8 04:06:23 CET 2015
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, ¤t_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. @@
More information about the Bf-blender-cvs
mailing list