[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48334] branches/soc-2012-swiss_cheese/ source/blender/gpu: ARB/EXT are very simular to standard functions.
Alexander Kuznetsov
kuzsasha at gmail.com
Wed Jun 27 16:35:59 CEST 2012
Revision: 48334
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48334
Author: alexk
Date: 2012-06-27 14:35:56 +0000 (Wed, 27 Jun 2012)
Log Message:
-----------
ARB/EXT are very simular to standard functions.
OpenGL ES support only standard functions.
Therefore we have gpu** which automaticly chooses between gl** and gl**ARB
We use standard enums and gpu functions automaticly translates to ARB enums to call gl**ARB.
GLSL and some Framebuffer functions are added.
Modified Paths:
--------------
branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt
branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_extensions.h
branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_extensions.c
Added Paths:
-----------
branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h
branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_functions.c
Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt 2012-06-27 14:01:58 UTC (rev 48333)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt 2012-06-27 14:35:56 UTC (rev 48334)
@@ -57,6 +57,10 @@
intern/gpu_material.c
intern/gpu_matrix.c
intern/gpu_primitives.c
+ #intern/gpu_object.c
+ #intern/gpu_object_gles.c
+ #intern/gpu_object_gl11.c
+ intern/gpu_functions.c
shaders/gpu_shader_material.glsl.c
shaders/gpu_shader_vertex.glsl.c
@@ -74,12 +78,16 @@
GPU_matrix.h
GPU_lighting.h
GPU_primitives.h
+ #GPU_object.h
+ GPU_functions.h
intern/gpu_codegen.h
intern/gpu_deprecated.h
intern/gpu_immediate.h
intern/gpu_immediate_inline.h
intern/gpu_immediate_internal.h
+ intern/gpu_object_gles.h
+ intern/gpu_object_gl11.h
intern/gpu_primitives_inline.h
)
Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_extensions.h 2012-06-27 14:01:58 UTC (rev 48333)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_extensions.h 2012-06-27 14:35:56 UTC (rev 48334)
@@ -32,10 +32,36 @@
#ifndef __GPU_EXTENSIONS_H__
#define __GPU_EXTENSIONS_H__
+
+
+extern unsigned int GPU_ext_config ;
+
#ifdef __cplusplus
extern "C" {
#endif
+
+
+
+#define GPU_EXT_GLSL (1<<0)
+#define GPU_EXT_GLSL_ENABLED (GPU_ext_config & GPU_EXT_GLSL)
+#define GPU_EXT_GLSL_VERTEX (1<<1)
+#define GPU_EXT_GLSL_VERTEX_ENABLED (GPU_ext_config & GPU_EXT_GLSL_VERTEX)
+#define GPU_EXT_GLSL_FRAGMENT (1<<2)
+#define GPU_EXT_GLSL_FRAGMENT_ENABLED (GPU_ext_config & GPU_EXT_GLSL_FRAGMENT)
+#define GPU_EXT_FRAMEBUFFERS (1<<3)
+#define GPU_EXT_FRAMEBUFFERS_ENABLED (GPU_ext_config & GPU_EXT_FRAMEBUFFERS)
+
+/* GPUShader */
+
+struct GPUShader {
+ unsigned int object; /* handle for full shader */
+ unsigned int vertex; /* handle for vertex shader */
+ unsigned int fragment; /* handle for fragment shader */
+ unsigned int lib; /* handle for libment shader */
+ int totattrib; /* total number of attributes */
+};
+
struct Image;
struct ImageUser;
Added: branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h (rev 0)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h 2012-06-27 14:35:56 UTC (rev 48334)
@@ -0,0 +1,59 @@
+
+
+#ifdef GPU_INTERN_FUNC
+#define GPUFUNC
+#else
+#define GPUFUNC extern
+#endif
+
+
+GPUFUNC unsigned int (*gpuCreateShader)(unsigned int shaderType);
+GPUFUNC void (*gpuAttachShader)( unsigned int program, unsigned int shader);
+GPUFUNC void (*gpuShaderSource)(unsigned int shader, int count, const char ** string, const int * length);
+GPUFUNC void (*gpuCompileShader)(unsigned int shader);
+GPUFUNC void (*gpuGetShaderiv)(unsigned int shader, unsigned int pname, int *params);
+GPUFUNC void (*gpuGetShaderInfoLog)(unsigned int shader, int maxLength, int *length, char *infoLog);
+
+GPUFUNC unsigned int (*gpuCreateProgram)(void);
+GPUFUNC void (*gpuLinkProgram)(unsigned int program);
+GPUFUNC void (*gpuGetProgramiv)(unsigned int shader, unsigned int pname, int *params);
+GPUFUNC void (*gpuGetProgramInfoLog)(unsigned int shader, int maxLength, int *length, char *infoLog);
+
+
+GPUFUNC void (*gpuUniform1i)(int location, int v0);
+
+GPUFUNC void (*gpuUniform1fv)(int location, int count, const float * value);
+GPUFUNC void (*gpuUniform2fv)(int location, int count, const float * value);
+GPUFUNC void (*gpuUniform3fv)(int location, int count, const float * value);
+GPUFUNC void (*gpuUniform4fv)(int location, int count, const float * value);
+GPUFUNC void (*gpuUniformMatrix3fv)(int location, int count, unsigned char transpose, const float * value);
+GPUFUNC void (*gpuUniformMatrix4fv)(int location, int count, unsigned char transpose, const float * value);
+
+GPUFUNC int (*gpuGetAttribLocation)(unsigned int program, const char *name);
+GPUFUNC int (*gpuGetUniformLocation)(unsigned int program, const char * name);
+
+
+GPUFUNC void (*gpuUseProgram)(unsigned int program);
+GPUFUNC void (*gpuDeleteShader)(unsigned int shader);
+GPUFUNC void (*gpuDeleteProgram)(unsigned int program);
+
+
+
+GPUFUNC void (*gpuGenFramebuffers)(int m, unsigned int * ids);
+GPUFUNC void (*gpuBindFramebuffer)(unsigned int target, unsigned int framebuffer);
+GPUFUNC void (*gpuDeleteFramebuffers)(int n, const unsigned int * framebuffers);
+
+
+
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void GPU_func_comp_init(void);
+
+#ifdef __cplusplus
+}
+#endif
Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_extensions.c 2012-06-27 14:01:58 UTC (rev 48333)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_extensions.c 2012-06-27 14:35:56 UTC (rev 48334)
@@ -29,6 +29,9 @@
* \ingroup gpu
*/
+#ifdef GLES
+#include <GLES2/gl2.h>
+#endif
#include <GL/glew.h>
@@ -38,6 +41,7 @@
#include "BKE_global.h"
+#include <sys/time.h>
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
@@ -47,6 +51,7 @@
#include "GPU_extensions.h"
#include "gpu_codegen.h"
#include "GPU_compatibility.h"
+#include <GPU_functions.h>
#include <stdlib.h>
#include <stdio.h>
@@ -73,6 +78,7 @@
extern char datatoc_gpu_shader_vsm_store_frag_glsl[];
extern char datatoc_gpu_shader_sep_gaussian_blur_vert_glsl[];
extern char datatoc_gpu_shader_sep_gaussian_blur_frag_glsl[];
+unsigned int GPU_ext_config ;
typedef struct GPUShaders {
GPUShader *vsm_store;
@@ -112,24 +118,38 @@
{
GLint r, g, b;
const char *vendor, *renderer;
+ int bdepth = -1;
+
/* can't avoid calling this multiple times, see wm_window_add_ghostwindow */
if (gpu_extensions_init) return;
gpu_extensions_init= 1;
glewInit();
+ GPU_func_comp_init();
GPU_codegen_init();
/* glewIsSupported("GL_VERSION_2_0") */
-
+#include REAL_GL_MODE
if (GLEW_ARB_multitexture)
- glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &GG.maxtextures);
-
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &GG.maxtextures);
+ /* GL_MAX_TEXTURE_IMAGE_UNITS == GL_MAX_TEXTURE_IMAGE_UNITS_ARB */
+
GG.glslsupport = 1;
+#ifndef GLES
if (!GLEW_ARB_multitexture) GG.glslsupport = 0;
if (!GLEW_ARB_vertex_shader) GG.glslsupport = 0;
if (!GLEW_ARB_fragment_shader) GG.glslsupport = 0;
+ if (GLEW_VERSION_2_0) GG.glslsupport = 1;
+ if (GLEW_EXT_framebuffer_object || GLEW_VERSION_3_0) GPU_ext_config |= GPU_EXT_FRAMEBUFFERS;
+#else
+ GPU_ext_config |= GPU_EXT_FRAMEBUFFERS;
+#endif
+
+ if(GG.glslsupport)
+ GPU_ext_config |= GPU_EXT_GLSL | GPU_EXT_GLSL_FRAGMENT | GPU_EXT_GLSL_VERTEX;
+
glGetIntegerv(GL_RED_BITS, &r);
glGetIntegerv(GL_GREEN_BITS, &g);
glGetIntegerv(GL_BLUE_BITS, &b);
@@ -137,6 +157,7 @@
vendor = (const char*)glGetString(GL_VENDOR);
renderer = (const char*)glGetString(GL_RENDERER);
+#include FAKE_GL_MODE
if (strstr(vendor, "ATI")) {
GG.device = GPU_DEVICE_ATI;
@@ -236,14 +257,14 @@
int GPU_print_error(const char *str)
{
GLenum errCode;
-
+#include REAL_GL_MODE
if (G.debug & G_DEBUG) {
if ((errCode = glGetError()) != GL_NO_ERROR) {
fprintf(stderr, "%s opengl error: %s\n", str, gpuErrorString(errCode));
return 1;
}
}
-
+#include FAKE_GL_MODE
return 0;
}
@@ -527,7 +548,7 @@
{
GPUTexture *tex;
GLint w, h, border, lastbindcode, bindcode;
-
+#include REAL_GL_MODE
glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode);
GPU_update_image_time(ima, time);
@@ -558,6 +579,8 @@
}
else {
glBindTexture(GL_TEXTURE_2D, tex->bindcode);
+
+ #include FAKE_GL_MODE
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_BORDER, &border);
@@ -565,9 +588,9 @@
tex->w = w - border;
tex->h = h - border;
}
-
+#include REAL_GL_MODE
glBindTexture(GL_TEXTURE_2D, lastbindcode);
-
+#include FAKE_GL_MODE
return tex;
}
@@ -724,16 +747,16 @@
GPUTexture *colortex;
GPUTexture *depthtex;
};
-
+#include REAL_GL_MODE
GPUFrameBuffer *GPU_framebuffer_create(void)
{
GPUFrameBuffer *fb;
- if (!GLEW_EXT_framebuffer_object)
+ if (!GPU_EXT_FRAMEBUFFERS)
return NULL;
fb= MEM_callocN(sizeof(GPUFrameBuffer), "GPUFrameBuffer");
- glGenFramebuffersEXT(1, &fb->object);
+ gpuGenFramebuffers(1, &fb->object);
if (!fb->object) {
fprintf(stderr, "GPUFFrameBuffer: framebuffer gen failed. %s\n",
@@ -744,7 +767,7 @@
return fb;
}
-
+#include FAKE_GL_MODE
int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char err_out[256])
{
GLenum status;
@@ -850,7 +873,7 @@
glPopAttrib();
glEnable(GL_SCISSOR_TEST);
}
-
+#include REAL_GL_MODE
void GPU_framebuffer_free(GPUFrameBuffer *fb)
{
if (fb->depthtex)
@@ -859,17 +882,17 @@
GPU_framebuffer_texture_detach(fb, fb->colortex);
if (fb->object) {
- glDeleteFramebuffersEXT(1, &fb->object);
+ gpuDeleteFramebuffers(1, &fb->object);
if (GG.currentfb == fb->object) {
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ gpuBindFramebuffer(GL_FRAMEBUFFER, 0);
GG.currentfb = 0;
}
}
MEM_freeN(fb);
}
-
+#include FAKE_GL_MODE
void GPU_framebuffer_restore(void)
{
if (GG.currentfb != 0) {
@@ -1026,16 +1049,6 @@
glReadPixels(0, 0, ofs->w, ofs->h, GL_RGBA, type, pixels);
}
-/* GPUShader */
-
-struct GPUShader {
- GLhandleARB object; /* handle for full shader */
- GLhandleARB vertex; /* handle for vertex shader */
- GLhandleARB fragment; /* handle for fragment shader */
- GLhandleARB lib; /* handle for libment shader */
- int totattrib; /* total number of attributes */
-};
-
static void shader_print_errors(const char *task, char *log, const char *code)
{
const char *c, *pos, *end = code + strlen(code);
@@ -1057,26 +1070,27 @@
fprintf(stderr, "%s\n", log);
}
-
GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, /*GPUShader *lib,*/ const char *libcode)
{
GLint status;
- GLcharARB log[5000];
+ char log[5000];
const char *fragsource[2];
GLsizei length = 0;
GLint count;
GPUShader *shader;
+#ifndef GLES
if (!GLEW_ARB_vertex_shader || !GLEW_ARB_fragment_shader)
return NULL;
+#endif
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list