diff options
author | Jason Wilkins <Jason.A.Wilkins@gmail.com> | 2014-10-08 00:46:19 +0400 |
---|---|---|
committer | Jason Wilkins <Jason.A.Wilkins@gmail.com> | 2014-10-08 00:47:32 +0400 |
commit | 8d084e8c8f48dd2f07d4a3fbd4a941a7bcc0dcfb (patch) | |
tree | 5bf15f4f74f3e5a307cfa3f734b2cd086dca69bd /source/blender/gpu | |
parent | a8705e99ee8ec9de2f25c3bac1e9895c2f98c224 (diff) |
Ghost Context Refactor
https://developer.blender.org/D643
Separates graphics context creation from window code in Ghost so that they can vary separately.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/CMakeLists.txt | 7 | ||||
-rw-r--r-- | source/blender/gpu/GPU_extensions.h | 2 | ||||
-rw-r--r-- | source/blender/gpu/GPU_glew.h | 37 | ||||
-rw-r--r-- | source/blender/gpu/GPU_init_exit.h | 46 | ||||
-rw-r--r-- | source/blender/gpu/GPU_material.h | 2 | ||||
-rw-r--r-- | source/blender/gpu/SConscript | 6 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.c | 6 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.h | 10 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_draw.c | 37 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_extensions.c | 21 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_extensions_private.h | 32 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_init_exit.c | 68 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_select.c | 5 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_simple_shader.c | 2 |
16 files changed, 245 insertions, 40 deletions
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 13e46bc7de8..63eea9486ed 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -36,6 +36,7 @@ set(INC ../nodes ../nodes/intern + ../../../intern/glew-mx ../../../intern/guardedalloc ../../../intern/smoke/extern ) @@ -49,6 +50,7 @@ set(SRC intern/gpu_codegen.c intern/gpu_draw.c intern/gpu_extensions.c + intern/gpu_init_exit.c intern/gpu_material.c intern/gpu_simple_shader.c intern/gpu_select.c @@ -56,10 +58,13 @@ set(SRC GPU_buffers.h GPU_draw.h GPU_extensions.h + GPU_glew.h + GPU_init_exit.h GPU_material.h GPU_simple_shader.h GPU_select.h intern/gpu_codegen.h + intern/gpu_extensions_private.h ) data_to_c_simple(shaders/gpu_shader_material.glsl SRC) @@ -79,7 +84,7 @@ if(WITH_MOD_SMOKE) add_definitions(-DWITH_SMOKE) endif() -add_definitions(-DGLEW_STATIC) +add_definitions(${GL_DEFINITIONS}) if(WITH_IMAGE_DDS) add_definitions(-DWITH_DDS) diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h index 04c4119df6e..3daf8585539 100644 --- a/source/blender/gpu/GPU_extensions.h +++ b/source/blender/gpu/GPU_extensions.h @@ -55,8 +55,6 @@ typedef struct GPUShader GPUShader; /* GPU extensions support */ void GPU_extensions_disable(void); -void GPU_extensions_init(void); /* call this before running any of the functions below */ -void GPU_extensions_exit(void); int GPU_print_error(const char *str); int GPU_glsl_support(void); diff --git a/source/blender/gpu/GPU_glew.h b/source/blender/gpu/GPU_glew.h new file mode 100644 index 00000000000..94217863fd6 --- /dev/null +++ b/source/blender/gpu/GPU_glew.h @@ -0,0 +1,37 @@ +/* + * ***** 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) 2012 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Jason Wilkins. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file source/blender/gpu/GPU_glew.h + * \ingroup gpu + */ + +#ifndef __GPU_GLEW_H__ +#define __GPU_GLEW_H__ + +#include "glew-mx.h" + +#endif /* __GPU_GLEW_H__ */ diff --git a/source/blender/gpu/GPU_init_exit.h b/source/blender/gpu/GPU_init_exit.h new file mode 100644 index 00000000000..e89c970b7d9 --- /dev/null +++ b/source/blender/gpu/GPU_init_exit.h @@ -0,0 +1,46 @@ +/* + * ***** 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) 2013 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Jason Wilkins. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/gpu/GPU_init_exit.h + * \ingroup gpu + */ + +#ifndef __GPU_INIT_EXIT_H__ +#define __GPU_INIT_EXIT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void GPU_init(void); +void GPU_exit(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __GPU_INIT_EXIT_H__ */ diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index 8d44ad87916..a111401343e 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -34,6 +34,8 @@ #include "DNA_listBase.h" +#include "BLI_sys_types.h" /* for bool */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript index e9320f08eff..f11ecafc986 100644 --- a/source/blender/gpu/SConscript +++ b/source/blender/gpu/SConscript @@ -30,13 +30,14 @@ Import ('env') sources = env.Glob('intern/*.c') sources += env.Glob('shaders/*.c') -defs = [ 'GLEW_STATIC' ] +defs = env['BF_GL_DEFINITIONS'] incs = [ '.', + '#/intern/glew-mx', '#/intern/guardedalloc', + env['BF_GLEW_INC'], '#/intern/smoke/extern', - '#/extern/glew/include', '../blenkernel', '../blenlib', '../bmesh', @@ -46,7 +47,6 @@ incs = [ '../makesrna', '../nodes', '../nodes/intern', - env['BF_OPENGL_INC'], ] if env['WITH_BF_GAMEENGINE']: diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 5d2c9cd3a90..b5a576b509c 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -36,7 +36,7 @@ #include <stddef.h> #include <string.h> -#include "GL/glew.h" +#include "GPU_glew.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 6b46db89a93..322d37055db 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -31,7 +31,7 @@ * Convert material node-trees to GLSL. */ -#include "GL/glew.h" +#include "GPU_glew.h" #include "MEM_guardedalloc.h" @@ -242,12 +242,12 @@ GPUFunction *GPU_lookup_function(const char *name) return (GPUFunction*)BLI_ghash_lookup(FUNCTION_HASH, (void *)name); } -void GPU_codegen_init(void) +void gpu_codegen_init(void) { GPU_code_generate_glsl_lib(); } -void GPU_codegen_exit(void) +void gpu_codegen_exit(void) { extern Material defmaterial; // render module abuse... diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h index b6db923e5c2..69213925931 100644 --- a/source/blender/gpu/intern/gpu_codegen.h +++ b/source/blender/gpu/intern/gpu_codegen.h @@ -35,7 +35,7 @@ #include "DNA_listBase.h" #include "GPU_material.h" -#include "GL/glew.h" +#include "GPU_glew.h" struct ListBase; struct GPUShader; @@ -106,7 +106,7 @@ struct GPUNodeLink { int type; int users; - GPUTexture *dynamictex; + struct GPUTexture *dynamictex; GPUBuiltin builtin; GPUOpenGLBuiltin oglbuiltin; @@ -146,7 +146,7 @@ typedef struct GPUInput { float *dynamicvec; /* vector data in case it is dynamic */ int dynamictype; /* origin of the dynamic uniform (GPUDynamicType) */ void *dynamicdata; /* data source of the dynamic uniform */ - GPUTexture *tex; /* input texture, only set at runtime */ + struct GPUTexture *tex; /* input texture, only set at runtime */ int shaderloc; /* id from opengl */ char shadername[32]; /* name in shader */ @@ -185,8 +185,8 @@ void GPU_pass_unbind(GPUPass *pass); void GPU_pass_free(GPUPass *pass); -void GPU_codegen_init(void); -void GPU_codegen_exit(void); +void gpu_codegen_init(void); +void gpu_codegen_exit(void); /* Material calls */ diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 7295f0259c5..a4435a7d276 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -38,7 +38,7 @@ #include <string.h> -#include "GL/glew.h" +#include "GPU_glew.h" #include "BLI_blenlib.h" #include "BLI_linklist.h" @@ -1878,6 +1878,37 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[4][ return count; } +static void gpu_multisample(bool enable) +{ + if (GLEW_VERSION_1_3 || GLEW_ARB_multisample) { +#ifdef __linux__ + /* changing multisample enablement from the default (enabled) causes problems on some + * systems (NVIDIA/Linux) when the pixel format doesn't have a multisample buffer */ + bool toggle_ok = true; + + if (GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_UNIX, GPU_DRIVER_ANY)) { + int samples = 0; + glGetIntegerv(GL_SAMPLES, &samples); + + if (samples == 0) + toggle_ok = false; + } + + if (toggle_ok) { + if (enable) + glEnable(GL_MULTISAMPLE); + else + glDisable(GL_MULTISAMPLE); + } +#else + if (enable) + glEnable(GL_MULTISAMPLE); + else + glDisable(GL_MULTISAMPLE); +#endif + } +} + /* Default OpenGL State */ void GPU_state_init(void) @@ -1950,9 +1981,7 @@ void GPU_state_init(void) glCullFace(GL_BACK); glDisable(GL_CULL_FACE); - /* calling this makes drawing very slow when AA is not set up in ghost - * on Linux/NVIDIA. */ - // glDisable(GL_MULTISAMPLE); + gpu_multisample(false); } #ifdef DEBUG diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 7fabb2feb51..04f8e68431a 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -33,7 +33,7 @@ */ -#include "GL/glew.h" +#include "GPU_glew.h" #include "DNA_image_types.h" @@ -48,7 +48,9 @@ #include "GPU_draw.h" #include "GPU_extensions.h" #include "GPU_simple_shader.h" -#include "gpu_codegen.h" + +#include "intern/gpu_codegen.h" +#include "intern/gpu_extensions_private.h" #include <stdlib.h> #include <stdio.h> @@ -110,8 +112,6 @@ int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver) /* GPU Extensions */ -static int gpu_extensions_init = 0; - void GPU_extensions_disable(void) { GG.extdisabled = 1; @@ -122,18 +122,11 @@ int GPU_max_texture_size(void) return GG.maxtexsize; } -void GPU_extensions_init(void) +void gpu_extensions_init(void) { GLint r, g, b; const char *vendor, *renderer; - /* can't avoid calling this multiple times, see wm_window_add_ghostwindow */ - if (gpu_extensions_init) return; - gpu_extensions_init= 1; - - glewInit(); - GPU_codegen_init(); - /* glewIsSupported("GL_VERSION_2_0") */ if (GLEW_ARB_multitexture) @@ -233,10 +226,8 @@ void GPU_extensions_init(void) GPU_simple_shaders_init(); } -void GPU_extensions_exit(void) +void gpu_extensions_exit(void) { - gpu_extensions_init = 0; - GPU_codegen_exit(); GPU_simple_shaders_exit(); GPU_invalid_tex_free(); } diff --git a/source/blender/gpu/intern/gpu_extensions_private.h b/source/blender/gpu/intern/gpu_extensions_private.h new file mode 100644 index 00000000000..a4124b8fa3d --- /dev/null +++ b/source/blender/gpu/intern/gpu_extensions_private.h @@ -0,0 +1,32 @@ +/* + * ***** 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. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file gpu_extensions_private.h + * \ingroup gpu + */ + +#ifndef __GPU_EXTENSIONS_PRIVATE_H__ +#define __GPU_EXTENSIONS_PRIVATE_H__ + +/* call this before running any of the functions below */ +void gpu_extensions_init(void); +void gpu_extensions_exit(void); + +#endif /* __GPU_EXTENSIONS_PRIVATE_H__ */ diff --git a/source/blender/gpu/intern/gpu_init_exit.c b/source/blender/gpu/intern/gpu_init_exit.c new file mode 100644 index 00000000000..912774cd345 --- /dev/null +++ b/source/blender/gpu/intern/gpu_init_exit.c @@ -0,0 +1,68 @@ +/* + * ***** 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) 2013 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Jason Wilkins + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file source/blender/gpu/intern/gpu_init_exit.c + * \ingroup gpu + */ + +#include "BLI_sys_types.h" +#include "GPU_init_exit.h" /* interface */ +#include "GPU_extensions.h" /* library */ + +#include "intern/gpu_codegen.h" +#include "intern/gpu_extensions_private.h" + +/** + * although the order of initialization and shutdown should not matter + * (except for the extensions), I chose alphabetical and reverse alphabetical order + */ + +static bool initialized = false; + +void GPU_init(void) +{ + /* can't avoid calling this multiple times, see wm_window_add_ghostwindow */ + if (initialized) + return; + + initialized = true; + + gpu_extensions_init(); /* must come first */ + + gpu_codegen_init(); +} + + + +void GPU_exit(void) +{ + gpu_codegen_exit(); + + gpu_extensions_exit(); /* must come last */ + + initialized = false; +} diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 75fed46f62a..f91fd7a8c1e 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -35,8 +35,6 @@ #include <math.h> #include <string.h> -#include "GL/glew.h" - #include "MEM_guardedalloc.h" #include "DNA_lamp_types.h" diff --git a/source/blender/gpu/intern/gpu_select.c b/source/blender/gpu/intern/gpu_select.c index 1d448231dda..afd6af9efae 100644 --- a/source/blender/gpu/intern/gpu_select.c +++ b/source/blender/gpu/intern/gpu_select.c @@ -31,15 +31,14 @@ */ #include "GPU_select.h" #include "GPU_extensions.h" - +#include "GPU_glew.h" + #include "BLI_utildefines.h" #include "MEM_guardedalloc.h" #include "DNA_userdef_types.h" -#include <GL/glew.h> - /* Ad hoc number of queries to allocate to skip doing many glGenQueries */ #define ALLOC_QUERIES 200 diff --git a/source/blender/gpu/intern/gpu_simple_shader.c b/source/blender/gpu/intern/gpu_simple_shader.c index 0cb712d220f..c0d7ebd4abb 100644 --- a/source/blender/gpu/intern/gpu_simple_shader.c +++ b/source/blender/gpu/intern/gpu_simple_shader.c @@ -42,7 +42,7 @@ * - Optimize for case where no texture matrix is used. */ -#include "GL/glew.h" +#include "GPU_glew.h" #include "BLI_math.h" #include "BLI_utildefines.h" |