[Bf-blender-cvs] [0ea8430] blender2.8: Gawain: legacy Mac VBO workarounds

Mike Erwin noreply at git.blender.org
Sun Aug 7 07:07:22 CEST 2016


Commit: 0ea8430549374efd3092b6f28913a5f60e574296
Author: Mike Erwin
Date:   Sun Aug 7 00:02:09 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB0ea8430549374efd3092b6f28913a5f60e574296

Gawain: legacy Mac VBO workarounds

glMapBufferRange is a wonderful function that doesn’t exist on GL < 3.0.

Use the APPLE_flush_buffer_range extension on Mac. It offers several of
glMapBufferRange’s benefits.

Use older “black arts” method to orphan VBOs when we are done with
them. In modern OpenGL this behavior is more obvious.

Add APPLE_flush_buffer_range to Mac requirements. Every GPU is
supported. T49012

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

M	source/blender/gpu/intern/gpu_extensions.c
M	source/blender/gpu/intern/gpu_immediate.c

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

diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index c2190bc..0a4b111 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -129,7 +129,9 @@ void GPU_get_dfdy_factors(float fac[2])
 void gpu_extensions_init(void)
 {
 	BLI_assert(GLEW_VERSION_3_0 || /* Mesa mininum requirement */
-	           GLEW_VERSION_2_1 && GLEW_EXT_gpu_shader4 && GLEW_ARB_framebuffer_object); /* Mac minimum requirement */
+	           GLEW_VERSION_2_1 && GLEW_EXT_gpu_shader4 /* Mac minimum requirement */
+	                            && GLEW_ARB_framebuffer_object
+	                            && GLEW_APPLE_flush_buffer_range);
 
 	glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &GG.maxtextures);
 
diff --git a/source/blender/gpu/intern/gpu_immediate.c b/source/blender/gpu/intern/gpu_immediate.c
index 3d7250b..80e7877 100644
--- a/source/blender/gpu/intern/gpu_immediate.c
+++ b/source/blender/gpu/intern/gpu_immediate.c
@@ -22,7 +22,9 @@
   #include <stdio.h>
 #endif
 
-#if defined(__APPLE__) && defined(WITH_GL_PROFILE_COMPAT)
+#define APPLE_LEGACY (defined(__APPLE__) && defined(WITH_GL_PROFILE_COMPAT))
+
+#if APPLE_LEGACY
   #undef glGenVertexArrays
   #define glGenVertexArrays glGenVertexArraysAPPLE
 
@@ -210,6 +212,11 @@ void immInit()
 	glBindBuffer(GL_ARRAY_BUFFER, imm.vbo_id);
 	glBufferData(GL_ARRAY_BUFFER, IMM_BUFFER_SIZE, NULL, GL_DYNAMIC_DRAW);
 
+#if APPLE_LEGACY
+	glBufferParameteriAPPLE(GL_ARRAY_BUFFER, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE);
+	glBufferParameteriAPPLE(GL_ARRAY_BUFFER, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE);
+#endif
+
 	imm.primitive = GL_NONE;
 	
 	glBindBuffer(GL_ARRAY_BUFFER, 0);
@@ -285,15 +292,23 @@ void immBegin(GLenum primitive, unsigned vertex_ct)
 	else
 		{
 		// orphan this buffer & start with a fresh one
+#if APPLE_LEGACY
+		glBufferData(GL_ARRAY_BUFFER, IMM_BUFFER_SIZE, NULL, GL_DYNAMIC_DRAW);
+#else
 		glMapBufferRange(GL_ARRAY_BUFFER, 0, IMM_BUFFER_SIZE, GL_MAP_INVALIDATE_BUFFER_BIT);
 		// glInvalidateBufferData(imm.vbo_id); // VERSION >= 4.3 || ARB_invalidate_subdata
+#endif
 
 		imm.buffer_offset = 0;
 		}
 
 //	printf("mapping %u to %u\n", imm.buffer_offset, imm.buffer_offset + bytes_needed - 1);
 
+#if APPLE_LEGACY
+	imm.buffer_data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) + imm.buffer_offset;
+#else
 	imm.buffer_data = glMapBufferRange(GL_ARRAY_BUFFER, imm.buffer_offset, bytes_needed, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+#endif
 
 #if TRUST_NO_ONE
 	assert(imm.buffer_data != NULL);
@@ -310,6 +325,11 @@ void immEnd()
 	assert(imm.vertex_idx == imm.vertex_ct); // with all vertices defined
 #endif
 
+#if APPLE_LEGACY
+	// tell OpenGL what range was modified so it doesn't copy the whole buffer
+	glFlushMappedBufferRangeAPPLE(GL_ARRAY_BUFFER, imm.buffer_offset, imm.buffer_bytes_mapped);
+//	printf("flushing %u to %u\n", imm.buffer_offset, imm.buffer_offset + imm.buffer_bytes_mapped - 1);
+#endif
 	glUnmapBuffer(GL_ARRAY_BUFFER);
 
 	// set up VAO -- can be done during Begin or End really




More information about the Bf-blender-cvs mailing list