New build option WITH_LEGACY_OPENGL

This introduces a new CMake option - WITH_LEGACY_OPENGL. Without this option
things may not draw perfectly, however, we should soon be able to build with
OpenGL core profile.

The matrix-related api calls are (still) not handled here (glTranslate, ...).

There seems to be no consensus on whether to make this build option the
default. We can talk about this later. For now two things are the
priority:

(1) To get rid of deprecated calls when WITH_LEGACY_OPENGL is ON
(2) To make core profile work for Mesa/Mac when WITH_LEGACY_OPENGL is OFF

Reviewers: merwin, sergey, campbellbarton

Differential Revision: https://developer.blender.org/D2603

Many thanks for Sergey Sharybin for the help.
This commit is contained in:
Dalai Felinto 2017-04-06 18:46:33 +02:00
parent 843922a480
commit 934dfc4200
4 changed files with 257 additions and 0 deletions

@ -244,6 +244,8 @@ option(WITH_OPENCOLORIO "Enable OpenColorIO color management" ${_init_OPENCOLO
option(WITH_CLAY_ENGINE "Enable New Clay engine (Breaks Mac and Intel compatibility)" ON)
option(WITH_LEGACY_OPENGL "Enable build of legacy OpenGL" ON)
# Compositor
option(WITH_COMPOSITOR "Enable the tile based nodal compositor" ON)

@ -107,6 +107,7 @@ set(SRC
GPU_immediate.h
GPU_immediate_util.h
GPU_init_exit.h
GPU_legacy_stubs.h
GPU_material.h
GPU_matrix.h
GPU_select.h
@ -235,5 +236,9 @@ if(WITH_OPENSUBDIV)
add_definitions(-DWITH_OPENSUBDIV)
endif()
if(WITH_LEGACY_OPENGL)
add_definitions(-DWITH_LEGACY_OPENGL)
endif()
blender_add_lib(bf_gpu "${SRC}" "${INC}" "${INC_SYS}")

@ -34,4 +34,8 @@
#include "glew-mx.h"
#ifndef WITH_LEGACY_OPENGL
#include "GPU_legacy_stubs.h"
#endif
#endif /* __GPU_GLEW_H__ */

@ -0,0 +1,246 @@
/*
* ***** 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) 2017 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): Blender Foundation, Dalai Felinto.
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file GPU_legacy_stubs.h
* \ingroup gpu
*
* This is to mark the transition to OpenGL core profile
* The idea is to allow Blender 2.8 to be built with OpenGL 3.3 even if it means breaking things
*
* This file should be removed in the future
*/
#ifndef __GPU_LEGACY_STUBS_H__
#define __GPU_LEGACY_STUBS_H__
#if defined(__GNUC__)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wunused-parameter"
#endif
#include "BLI_utildefines.h"
#define _GL_VOID static inline void
#define _GL_VOID_RET {}
#define _GL_INT static inline GLint
#define _GL_INT_RET { return 0; }
static bool disable_enable_check(GLenum cap)
{
return ELEM(cap,
GL_ALPHA_TEST,
GL_LINE_STIPPLE,
GL_POINT_SPRITE,
GL_TEXTURE_1D,
GL_TEXTURE_2D,
GL_TEXTURE_GEN_S,
GL_TEXTURE_GEN_T,
-1
);
}
static bool tex_env_check(GLenum target, GLenum pname)
{
return (ELEM(target, GL_TEXTURE_ENV) ||
(target == GL_TEXTURE_FILTER_CONTROL && pname == GL_TEXTURE_LOD_BIAS));
}
#define glAlphaFunc oldAlphaFunc
_GL_VOID oldAlphaFunc (GLenum func, GLclampf ref) _GL_VOID_RET
#define glBegin oldBegin
_GL_VOID oldBegin (GLenum mode) _GL_VOID_RET
#define glBitmap oldBitmap
_GL_VOID oldBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) _GL_VOID_RET
#define glClipPlane oldClipPlane
_GL_VOID oldClipPlane (GLenum plane, const GLdouble *equation) _GL_VOID_RET
#define glColor3f oldColor3f
_GL_VOID oldColor3f (GLfloat red, GLfloat green, GLfloat blue) _GL_VOID_RET
#define glColor3fv oldColor3fv
_GL_VOID oldColor3fv (const GLfloat *v) _GL_VOID_RET
#define glColor3ub oldColor3ub
_GL_VOID oldColor3ub (GLubyte red, GLubyte green, GLubyte blue) _GL_VOID_RET
#define glColor3ubv oldColor3ubv
_GL_VOID oldColor3ubv (const GLubyte *v) _GL_VOID_RET
#define glColor4f oldColor4f
_GL_VOID oldColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) _GL_VOID_RET
#define glColor4ub oldColor4ub
_GL_VOID oldColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) _GL_VOID_RET
#define glColor4ubv oldColor4ubv
_GL_VOID oldColor4ubv (const GLubyte *v) _GL_VOID_RET
#define glColorPointer oldColorPointer
_GL_VOID oldColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer) _GL_VOID_RET
_GL_VOID oldDisable (GLenum cap)
{
if (!disable_enable_check(cap)) {
glDisable(cap);
}
}
#define glDisable oldDisable
#define glDisableClientState oldDisableClientState
_GL_VOID oldDisableClientState (GLenum array) _GL_VOID_RET
_GL_VOID oldEnable (GLenum cap)
{
if (!disable_enable_check(cap)) {
glEnable(cap);
}
}
#define glEnable oldEnable
#define glEnableClientState oldEnableClientState
_GL_VOID oldEnableClientState (GLenum array) _GL_VOID_RET
#define glEnd oldEnd
_GL_VOID oldEnd (void) _GL_VOID_RET
#define glInitNames oldInitNames
_GL_VOID oldInitNames (void) _GL_VOID_RET
#define glLightf oldLightf
_GL_VOID oldLightf (GLenum light, GLenum pname, GLfloat param) _GL_VOID_RET
#define glLightfv oldLightfv
_GL_VOID oldLightfv (GLenum light, GLenum pname, const GLfloat *params) _GL_VOID_RET
#define glLineStipple oldLineStipple
_GL_VOID oldLineStipple (GLint factor, GLushort pattern) _GL_VOID_RET
#define glLoadName oldLoadName
_GL_VOID oldLoadName (GLuint name) _GL_VOID_RET
#define glMaterialfv oldMaterialfv
_GL_VOID oldMaterialfv (GLenum face, GLenum pname, const GLfloat *params) _GL_VOID_RET
#define glMateriali oldMateriali
_GL_VOID oldMateriali (GLenum face, GLenum pname, GLint param) _GL_VOID_RET
#define glNormal3fv oldNormal3fv
_GL_VOID oldNormal3fv (const GLfloat *v) _GL_VOID_RET
#define glNormal3sv oldNormal3sv
_GL_VOID oldNormal3sv (const GLshort *v) _GL_VOID_RET
#define glNormalPointer oldNormalPointer
_GL_VOID oldNormalPointer (GLenum type, GLsizei stride, const void *pointer) _GL_VOID_RET
#define glPopName oldPopName
_GL_VOID oldPopName (void) _GL_VOID_RET
#define glPushName oldPushName
_GL_VOID oldPushName (GLuint name) _GL_VOID_RET
#define glRasterPos2f oldRasterPos2f
_GL_VOID oldRasterPos2f (GLfloat x, GLfloat y) _GL_VOID_RET
#define glRenderMode oldRenderMode
_GL_INT oldRenderMode (GLenum mode) _GL_INT_RET
#define glSelectBuffer oldSelectBuffer
_GL_VOID oldSelectBuffer (GLsizei size, GLuint *buffer) _GL_VOID_RET
#define glShadeModel oldShadeModel
_GL_VOID oldShadeModel (GLenum mode) _GL_VOID_RET
#define glTexCoord2fv oldTexCoord2fv
_GL_VOID oldTexCoord2fv (const GLfloat *v) _GL_VOID_RET
_GL_VOID oldTexEnvf(GLenum target, GLenum pname, GLint param)
{
if (!tex_env_check(target, pname)) {
glTexEnvf(target, pname, param);
}
}
#define glTexEnvf oldTexEnvf
_GL_VOID oldTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
{
if (!tex_env_check(target, pname)) {
glTexEnvfv(target, pname, params);
}
}
#define glTexEnvfv oldTexEnvfv
_GL_VOID oldTexEnvi(GLenum target, GLenum pname, GLint param)
{
if (!tex_env_check(target, pname)) {
glTexEnvi(target, pname, param);
}
}
#define glTexEnvi oldTexEnvi
_GL_VOID oldTexGeni(GLenum coord, GLenum pname, GLint param)
{
if (pname != GL_TEXTURE_GEN_MODE) {
glTexGeni(coord, pname, param);
}
}
#define glTexGeni oldTexGeni
#define glVertex2f oldVertex2f
_GL_VOID oldVertex2f (GLfloat x, GLfloat y) _GL_VOID_RET
#define glVertex3f oldVertex3f
_GL_VOID oldVertex3f (GLfloat x, GLfloat y, GLfloat z) _GL_VOID_RET
#define glTexCoord3fv oldTexCoord3fv
_GL_VOID oldTexCoord3fv (const GLfloat *v) _GL_VOID_RET
#define glTexCoordPointer oldTexCoordPointer
_GL_VOID oldTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer) _GL_VOID_RET
#define glVertexPointer oldVertexPointer
_GL_VOID oldVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer) _GL_VOID_RET
#define glVertex3fv oldVertex3fv
_GL_VOID oldVertex3fv (const GLfloat *v) _GL_VOID_RET
#undef _GL_VOID
#undef _GL_VOID_RET
#undef _GL_INT
#undef _GL_INT_RET
#if defined(__GNUC__)
# pragma GCC diagnostic pop
#endif
#endif /* __GPU_LEGACY_STUBS_H__ */