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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to