[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