[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48689] branches/soc-2012-swiss_cheese/ source/gameengine/Ketsji: Convert almost all python GLSL to gpu functions
Alexander Kuznetsov
kuzsasha at gmail.com
Fri Jul 6 20:11:17 CEST 2012
Revision: 48689
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48689
Author: alexk
Date: 2012-07-06 18:11:17 +0000 (Fri, 06 Jul 2012)
Log Message:
-----------
Convert almost all python GLSL to gpu functions
Modified Paths:
--------------
branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Shader.cpp
branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Shader.h
Modified: branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Shader.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Shader.cpp 2012-07-06 17:51:27 UTC (rev 48688)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Ketsji/BL_Shader.cpp 2012-07-06 18:11:17 UTC (rev 48689)
@@ -2,12 +2,20 @@
* \ingroup ketsji
*/
-#include <GL/glew.h>
+#ifdef GLES
+#include <GLES2/gl2.h>
+#endif
+
+
+#include "GPU_functions.h"
+
#include <iostream>
#include "BL_Shader.h"
#include "BL_Material.h"
+#include <GL/glew.h>
+
#include "MT_assert.h"
#include "MT_Matrix4x4.h"
#include "MT_Matrix3x3.h"
@@ -18,6 +26,8 @@
#include "RAS_MeshObject.h"
#include "RAS_IRasterizer.h"
+#include "GPU_extensions.h"
+
#define spit(x) std::cout << x << std::endl;
#define SORT_UNIFORMS 1
@@ -59,43 +69,43 @@
{
case UNI_FLOAT: {
float *f = (float*)mData;
- glUniform1fARB(mLoc,(GLfloat)*f);
+ gpuUniform1f(mLoc,(GLfloat)*f);
}break;
case UNI_INT: {
int *f = (int*)mData;
- glUniform1iARB(mLoc, (GLint)*f);
+ gpuUniform1i(mLoc, (GLint)*f);
}break;
case UNI_FLOAT2: {
float *f = (float*)mData;
- glUniform2fvARB(mLoc,1, (GLfloat*)f);
+ gpuUniform2fv(mLoc,1, (GLfloat*)f);
}break;
case UNI_FLOAT3: {
float *f = (float*)mData;
- glUniform3fvARB(mLoc,1,(GLfloat*)f);
+ gpuUniform3fv(mLoc,1,(GLfloat*)f);
}break;
case UNI_FLOAT4: {
float *f = (float*)mData;
- glUniform4fvARB(mLoc,1,(GLfloat*)f);
+ gpuUniform4fv(mLoc,1,(GLfloat*)f);
}break;
case UNI_INT2: {
int *f = (int*)mData;
- glUniform2ivARB(mLoc,1,(GLint*)f);
+ gpuUniform2iv(mLoc,1,(GLint*)f);
}break;
case UNI_INT3: {
int *f = (int*)mData;
- glUniform3ivARB(mLoc,1,(GLint*)f);
+ gpuUniform3iv(mLoc,1,(GLint*)f);
}break;
case UNI_INT4: {
int *f = (int*)mData;
- glUniform4ivARB(mLoc,1,(GLint*)f);
+ gpuUniform4iv(mLoc,1,(GLint*)f);
}break;
case UNI_MAT4: {
float *f = (float*)mData;
- glUniformMatrix4fvARB(mLoc, 1, mTranspose?GL_TRUE:GL_FALSE,(GLfloat*)f);
+ gpuUniformMatrix4fv(mLoc, 1, mTranspose?GL_TRUE:GL_FALSE,(GLfloat*)f);
}break;
case UNI_MAT3: {
float *f = (float*)mData;
- glUniformMatrix3fvARB(mLoc, 1, mTranspose?GL_TRUE:GL_FALSE,(GLfloat*)f);
+ gpuUniformMatrix3fv(mLoc, 1, mTranspose?GL_TRUE:GL_FALSE,(GLfloat*)f);
}break;
}
mDirty = false;
@@ -145,13 +155,13 @@
ClearUniforms();
if ( mShader ) {
- glDeleteObjectARB(mShader);
+ gpuDeleteProgram(mShader);
mShader = 0;
}
vertProg = 0;
fragProg = 0;
mOk = 0;
- glUseProgramObjectARB(0);
+ gpuUseProgram(0);
}
void BL_Shader::ClearUniforms()
@@ -251,6 +261,7 @@
unsigned int tmpVert=0, tmpFrag=0, tmpProg=0;
int char_len=0;
char *logInf =0;
+ const char *src[2];
if (mError)
goto programError;
@@ -259,25 +270,52 @@
spit("Invalid GLSL sources");
return false;
}
- if ( !GLEW_ARB_fragment_shader) {
+ if ( !GPU_EXT_GLSL_FRAGMENT_ENABLED) {
spit("Fragment shaders not supported");
return false;
}
- if ( !GLEW_ARB_vertex_shader) {
+ if ( !GPU_EXT_GLSL_VERTEX_ENABLED) {
spit("Vertex shaders not supported");
return false;
}
// -- vertex shader ------------------
- tmpVert = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
- glShaderSourceARB(tmpVert, 1, (const char**)&vertProg, 0);
- glCompileShaderARB(tmpVert);
- glGetObjectParameterivARB(tmpVert, GL_OBJECT_INFO_LOG_LENGTH_ARB,(GLint*) &vertlen);
+#ifdef GLES
+ src[0] = ""
+ "#define gl_ModelViewMatrix b_ModelViewMatrix\n"
+ "#define gl_ProjectionMatrix b_ProjectionMatrix\n"
+ "#define gl_NormalMatrix b_NormalMatrix\n"
+ "#define gl_Vertex b_Vertex\n"
+ "#define gl_Normal b_Normal\n"
+
+ "uniform mat4 b_ProjectionMatrix ; \n"
+ "uniform mat4 b_ModelViewMatrix ; \n"
+ "uniform mat3 b_NormalMatrix ; \n"
+
+ "attribute vec4 b_Vertex; \n"
+ "attribute vec3 b_Normal; \n"
+
+ "vec4 ftransform()\n"
+ "{\n"
+ "return gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;"
+ "}\n"
+ ;
+#else
+ src[0] = "";
+#endif
+
+ src[1] = vertProg;
+
+ tmpVert = gpuCreateShader(GL_VERTEX_SHADER);
+ gpuShaderSource(tmpVert, 2, (const char**)src, 0);
+ gpuCompileShader(tmpVert);
+ gpuGetShaderiv(tmpVert, GL_INFO_LOG_LENGTH,(GLint*) &vertlen);
+
// print info if any
if ( vertlen > 0 && vertlen < MAX_LOG_LEN) {
logInf = (char*)MEM_mallocN(vertlen, "vert-log");
- glGetInfoLogARB(tmpVert, vertlen, (GLsizei*)&char_len, logInf);
+ gpuGetShaderInfoLog(tmpVert, vertlen, (GLsizei*)&char_len, logInf);
if (char_len >0) {
spit("---- Vertex Shader Error ----");
spit(logInf);
@@ -286,20 +324,20 @@
logInf=0;
}
// check for compile errors
- glGetObjectParameterivARB(tmpVert, GL_OBJECT_COMPILE_STATUS_ARB,(GLint*)&vertstatus);
+ gpuGetShaderiv(tmpVert, GL_COMPILE_STATUS,(GLint*)&vertstatus);
if (!vertstatus) {
spit("---- Vertex shader failed to compile ----");
goto programError;
}
// -- fragment shader ----------------
- tmpFrag = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
- glShaderSourceARB(tmpFrag, 1,(const char**)&fragProg, 0);
- glCompileShaderARB(tmpFrag);
- glGetObjectParameterivARB(tmpFrag, GL_OBJECT_INFO_LOG_LENGTH_ARB, (GLint*) &fraglen);
+ tmpFrag = gpuCreateShader(GL_FRAGMENT_SHADER);
+ gpuShaderSource(tmpFrag, 1,(const char**)&fragProg, 0);
+ gpuCompileShader(tmpFrag);
+ gpuGetShaderiv(tmpFrag, GL_INFO_LOG_LENGTH, (GLint*) &fraglen);
if (fraglen >0 && fraglen < MAX_LOG_LEN) {
logInf = (char*)MEM_mallocN(fraglen, "frag-log");
- glGetInfoLogARB(tmpFrag, fraglen,(GLsizei*) &char_len, logInf);
+ gpuGetShaderInfoLog(tmpFrag, fraglen,(GLsizei*) &char_len, logInf);
if (char_len >0) {
spit("---- Fragment Shader Error ----");
spit(logInf);
@@ -308,7 +346,7 @@
logInf=0;
}
- glGetObjectParameterivARB(tmpFrag, GL_OBJECT_COMPILE_STATUS_ARB, (GLint*) &fragstatus);
+ gpuGetShaderiv(tmpFrag, GL_COMPILE_STATUS, (GLint*) &fragstatus);
if (!fragstatus) {
spit("---- Fragment shader failed to compile ----");
goto programError;
@@ -317,17 +355,17 @@
// -- program ------------------------
// set compiled vert/frag shader & link
- tmpProg = glCreateProgramObjectARB();
- glAttachObjectARB(tmpProg, tmpVert);
- glAttachObjectARB(tmpProg, tmpFrag);
- glLinkProgramARB(tmpProg);
- glGetObjectParameterivARB(tmpProg, GL_OBJECT_INFO_LOG_LENGTH_ARB, (GLint*) &proglen);
- glGetObjectParameterivARB(tmpProg, GL_OBJECT_LINK_STATUS_ARB, (GLint*) &progstatus);
+ tmpProg = gpuCreateProgram();
+ gpuAttachShader(tmpProg, tmpVert);
+ gpuAttachShader(tmpProg, tmpFrag);
+ gpuLinkProgram(tmpProg);
+ gpuGetProgramiv(tmpProg, GL_INFO_LOG_LENGTH, (GLint*) &proglen);
+ gpuGetProgramiv(tmpProg, GL_LINK_STATUS, (GLint*) &progstatus);
if (proglen > 0 && proglen < MAX_LOG_LEN) {
logInf = (char*)MEM_mallocN(proglen, "prog-log");
- glGetInfoLogARB(tmpProg, proglen, (GLsizei*)&char_len, logInf);
+ gpuGetProgramInfoLog(tmpProg, proglen, (GLsizei*)&char_len, logInf);
if (char_len >0) {
spit("---- GLSL Program ----");
spit(logInf);
@@ -341,26 +379,29 @@
goto programError;
}
+#ifdef GLES
+ gpu_assign_gles_loc(&glslesloc, tmpProg);
+#endif
// set
mShader = tmpProg;
- glDeleteObjectARB(tmpVert);
- glDeleteObjectARB(tmpFrag);
+ gpuDeleteShader(tmpVert);
+ gpuDeleteShader(tmpFrag);
mOk = 1;
mError = 0;
return true;
programError:
if (tmpVert) {
- glDeleteObjectARB(tmpVert);
+ gpuDeleteShader(tmpVert);
tmpVert=0;
}
if (tmpFrag) {
- glDeleteObjectARB(tmpFrag);
+ gpuDeleteShader(tmpFrag);
tmpFrag=0;
}
if (tmpProg) {
- glDeleteObjectARB(tmpProg);
+ gpuDeleteProgram(tmpProg);
tmpProg=0;
}
@@ -403,9 +444,9 @@
void BL_Shader::SetSampler(int loc, int unit)
{
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
glUniform1iARB(loc, unit);
@@ -422,16 +463,22 @@
void BL_Shader::SetProg(bool enable)
{
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
if ( mShader != 0 && mOk && enable) {
- glUseProgramObjectARB(mShader);
+ gpuUseProgram(mShader);
+#ifdef GLES
+ gpu_set_shader_es(&glslesloc, 1);
+#endif
}
else {
- glUseProgramObjectARB(0);
+ gpuUseProgram(0);
+#ifdef GLES
+ gpu_set_shader_es(0, 0);
+#endif
}
}
}
@@ -441,9 +488,9 @@
if (!Ok() || !mPreDef.size())
return;
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
MT_Matrix4x4 model;
@@ -554,9 +601,9 @@
int BL_Shader::GetAttribLocation(const STR_String& name)
{
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
return glGetAttribLocationARB(mShader, name.ReadPtr());
@@ -567,9 +614,9 @@
void BL_Shader::BindAttribute(const STR_String& attr, int loc)
{
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
glBindAttribLocationARB(mShader, loc, attr.ReadPtr());
@@ -578,9 +625,9 @@
int BL_Shader::GetUniformLocation(const STR_String& name)
{
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
MT_assert(mShader!=0);
@@ -595,119 +642,119 @@
void BL_Shader::SetUniform(int uniform, const MT_Tuple2& vec)
{
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
float value[2];
vec.getValue(value);
- glUniform2fvARB(uniform, 1, value);
+ gpuUniform2fv(uniform, 1, value);
}
}
void BL_Shader::SetUniform(int uniform, const MT_Tuple3& vec)
{
- if ( GLEW_ARB_fragment_shader &&
- GLEW_ARB_vertex_shader &&
- GLEW_ARB_shader_objects
+ if ( GPU_EXT_GLSL_FRAGMENT_ENABLED &&
+ GPU_EXT_GLSL_VERTEX_ENABLED &&
+ GPU_EXT_GLSL_ENABLED
)
{
float value[3];
vec.getValue(value);
- glUniform3fvARB(uniform, 1, value);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list