Merge branch 'master' into 28
[blender.git] / source / blender / gpu / intern / gpu_basic_shader.c
index 8505bd847a0c53a4d81280abe8637fabfb004c48..ff385683a1e6ae0e57918f74c6d8dbd9138a9ce5 100644 (file)
@@ -140,114 +140,6 @@ const GLubyte stipple_checker_8px[128] = {
        0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255,
        0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255};
 
-const GLubyte stipple_interlace_row[128] = {
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-       0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00};
-
-const GLubyte stipple_interlace_row_swap[128] = {
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-       0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff};
-
-const GLubyte stipple_interlace_column[128] = {
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
-
-const GLubyte stipple_interlace_column_swap[128] = {
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-       0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa};
-
-const GLubyte stipple_interlace_checker[128] = {
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa,
-       0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa};
-
-const GLubyte stipple_interlace_checker_swap[128] = {
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
-       0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55};
-
 const GLubyte stipple_hexagon[128] = {
        0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
        0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
@@ -267,24 +159,6 @@ const GLubyte stipple_hexagon[128] = {
        0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22};
 /* ********************************************* */
 
-/* GLSL State */
-
-static bool USE_GLSL = false;
-
-/**
- * \note this isn't part of the basic shader API,
- * only set from the command line once on startup.
- */
-void GPU_basic_shader_use_glsl_set(bool enabled)
-{
-       USE_GLSL = enabled;
-}
-
-bool GPU_basic_shader_use_glsl_get(void)
-{
-       return USE_GLSL;
-}
-
 /* Init / exit */
 
 void GPU_basic_shaders_init(void)
@@ -388,7 +262,7 @@ static GPUShader *gpu_basic_shader(int options)
                        datatoc_gpu_shader_basic_frag_glsl,
                        geom_glsl,
                        NULL,
-                       defines, 0, 0, 0);
+                       defines);
                
                if (shader) {
                        /* set texture map to first texture unit */
@@ -420,102 +294,16 @@ static void gpu_basic_shader_uniform_autoset(GPUShader *shader, int options)
 
 void GPU_basic_shader_bind(int options)
 {
-       if (USE_GLSL) {
-               if (options) {
-                       const int bound_options = GPU_MATERIAL_STATE.bound_options;
-
-                       /* texture options need to be set for basic shader too */
-                       if (options & GPU_SHADER_TEXTURE_2D) {
-                               glEnable(GL_TEXTURE_2D);
-                       }
-                       else if (bound_options & GPU_SHADER_TEXTURE_2D) {
-                               glDisable(GL_TEXTURE_2D);
-                       }
-
-                       if (options & GPU_SHADER_TEXTURE_RECT) {
-                               glEnable(GL_TEXTURE_RECTANGLE);
-                       }
-                       else if (bound_options & GPU_SHADER_TEXTURE_RECT) {
-                               glDisable(GL_TEXTURE_RECTANGLE);
-                       }
+       if (options) {
+               GPUShader *shader = gpu_basic_shader(options);
 
-                       GPUShader *shader = gpu_basic_shader(options);
-
-                       if (shader) {
-                               GPU_shader_bind(shader);
-                               gpu_basic_shader_uniform_autoset(shader, options);
-                       }
-               }
-               else {
-                       GPU_shader_unbind();
+               if (shader) {
+                       GPU_shader_bind(shader);
+                       gpu_basic_shader_uniform_autoset(shader, options);
                }
        }
        else {
-               const int bound_options = GPU_MATERIAL_STATE.bound_options;
-
-               if (options & GPU_SHADER_LIGHTING) {
-                       glEnable(GL_LIGHTING);
-
-                       if (options & GPU_SHADER_USE_COLOR)
-                               glEnable(GL_COLOR_MATERIAL);
-                       else
-                               glDisable(GL_COLOR_MATERIAL);
-
-                       if (options & GPU_SHADER_TWO_SIDED)
-                               glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
-                       else
-                               glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
-               }
-               else if (bound_options & GPU_SHADER_LIGHTING) {
-                       glDisable(GL_LIGHTING);
-                       glDisable(GL_COLOR_MATERIAL);
-                       glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
-               }
-
-               if (options & GPU_SHADER_TEXTURE_2D) {
-                       GLint env_mode = (options & (GPU_SHADER_USE_COLOR | GPU_SHADER_LIGHTING)) ? GL_MODULATE : GL_REPLACE;
-                       glEnable(GL_TEXTURE_2D);
-                       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env_mode);
-               }
-               else if (bound_options & GPU_SHADER_TEXTURE_2D) {
-                       if ((options & GPU_SHADER_TEXTURE_RECT) == 0) {
-                               glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-                       }
-                       glDisable(GL_TEXTURE_2D);
-               }
-
-               if (options & GPU_SHADER_TEXTURE_RECT) {
-                       GLint env_mode = (options & (GPU_SHADER_USE_COLOR | GPU_SHADER_LIGHTING)) ? GL_MODULATE : GL_REPLACE;
-                       glEnable(GL_TEXTURE_RECTANGLE);
-                       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env_mode);
-               }
-               else if (bound_options & GPU_SHADER_TEXTURE_RECT) {
-                       if ((options & GPU_SHADER_TEXTURE_2D) == 0) {
-                               glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-                       }
-                       glDisable(GL_TEXTURE_RECTANGLE);
-               }
-
-               if ((options & GPU_SHADER_LINE) && (options & GPU_SHADER_STIPPLE)) {
-                       glEnable(GL_LINE_STIPPLE);
-               }
-               else if ((bound_options & GPU_SHADER_LINE) && (bound_options & GPU_SHADER_STIPPLE)) {
-                       glDisable(GL_LINE_STIPPLE);
-               }
-
-               if (((options & GPU_SHADER_LINE) == 0) && (options & GPU_SHADER_STIPPLE)) {
-                       glEnable(GL_POLYGON_STIPPLE);
-               }
-               else if (((bound_options & GPU_SHADER_LINE) == 0) && (bound_options & GPU_SHADER_STIPPLE)) {
-                       glDisable(GL_POLYGON_STIPPLE);
-               }
-
-               if (options & GPU_SHADER_FLAT_NORMAL) {
-                       glShadeModel(GL_FLAT);
-               }
-               else if (bound_options & GPU_SHADER_FLAT_NORMAL) {
-                       glShadeModel(GL_SMOOTH);
-               }
+               GPU_shader_unbind();
        }
 
        GPU_MATERIAL_STATE.bound_options = options;
@@ -625,14 +413,12 @@ void GPU_basic_shader_light_set(int light_num, GPULightData *light)
        }
        else {
                /* TODO(sergey): Needs revisit. */
-               if (USE_GLSL || true) {
-                       /* glsl shader needs these zero to skip them */
-                       const float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+               /* glsl shader needs these zero to skip them */
+               const float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
 
-                       glLightfv(GL_LIGHT0 + light_num, GL_POSITION, zero);
-                       glLightfv(GL_LIGHT0 + light_num, GL_DIFFUSE, zero);
-                       glLightfv(GL_LIGHT0 + light_num, GL_SPECULAR, zero);
-               }
+               glLightfv(GL_LIGHT0 + light_num, GL_POSITION, zero);
+               glLightfv(GL_LIGHT0 + light_num, GL_DIFFUSE, zero);
+               glLightfv(GL_LIGHT0 + light_num, GL_SPECULAR, zero);
 
                glDisable(GL_LIGHT0 + light_num);
        }
@@ -645,74 +431,19 @@ void GPU_basic_shader_light_set_viewer(bool local)
 
 void GPU_basic_shader_stipple(GPUBasicShaderStipple stipple_id)
 {
-       if (USE_GLSL) {
-               glUniform1i(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "stipple_id"), stipple_id);
-       }
-       else {
-               switch (stipple_id) {
-                       case GPU_SHADER_STIPPLE_HALFTONE:
-                               glPolygonStipple(stipple_halftone);
-                               return;
-                       case GPU_SHADER_STIPPLE_QUARTTONE:
-                               glPolygonStipple(stipple_quarttone);
-                               return;
-                       case GPU_SHADER_STIPPLE_CHECKER_8PX:
-                               glPolygonStipple(stipple_checker_8px);
-                               return;
-                       case GPU_SHADER_STIPPLE_HEXAGON:
-                               glPolygonStipple(stipple_hexagon);
-                               return;
-                       case GPU_SHADER_STIPPLE_DIAG_STRIPES_SWAP:
-                               glPolygonStipple(stipple_diag_stripes_neg);
-                               return;
-                       case GPU_SHADER_STIPPLE_DIAG_STRIPES:
-                               glPolygonStipple(stipple_diag_stripes_pos);
-                               return;
-                       case GPU_SHADER_STIPPLE_S3D_INTERLACE_ROW:
-                               glPolygonStipple(stipple_interlace_row);
-                               return;
-                       case GPU_SHADER_STIPPLE_S3D_INTERLACE_ROW_SWAP:
-                               glPolygonStipple(stipple_interlace_row_swap);
-                               return;
-                       case GPU_SHADER_STIPPLE_S3D_INTERLACE_COLUMN:
-                               glPolygonStipple(stipple_interlace_column);
-                               return;
-                       case GPU_SHADER_STIPPLE_S3D_INTERLACE_COLUMN_SWAP:
-                               glPolygonStipple(stipple_interlace_column_swap);
-                               return;
-                       case GPU_SHADER_STIPPLE_S3D_INTERLACE_CHECKER:
-                               glPolygonStipple(stipple_interlace_checker);
-                               return;
-                       case GPU_SHADER_STIPPLE_S3D_INTERLACE_CHECKER_SWAP:
-                               glPolygonStipple(stipple_interlace_checker_swap);
-                               return;
-                       default:
-                               glPolygonStipple(stipple_hexagon);
-                               return;
-               }
-       }
+       glUniform1i(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "stipple_id"), stipple_id);
 }
 
 void GPU_basic_shader_line_width(float line_width)
 {
-       if (USE_GLSL) {
-               GPU_MATERIAL_STATE.line_width = line_width;
-               if (GPU_MATERIAL_STATE.bound_options & GPU_SHADER_LINE) {
-                       glUniform1f(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "line_width"), line_width);
-               }
-       }
-       else {
-               glLineWidth(line_width);
+       GPU_MATERIAL_STATE.line_width = line_width;
+       if (GPU_MATERIAL_STATE.bound_options & GPU_SHADER_LINE) {
+               glUniform1f(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "line_width"), line_width);
        }
 }
 
 void GPU_basic_shader_line_stipple(GLint stipple_factor, GLushort stipple_pattern)
 {
-       if (USE_GLSL) {
-               glUniform1i(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "stipple_factor"), stipple_factor);
-               glUniform1i(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "stipple_pattern"), stipple_pattern);
-       }
-       else {
-               glLineStipple(stipple_factor, stipple_pattern);
-       }
+       glUniform1i(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "stipple_factor"), stipple_factor);
+       glUniform1i(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "stipple_pattern"), stipple_pattern);
 }