summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cogl/Makefile.am3
-rw-r--r--cogl/cogl-glsl-shader-boilerplate.h (renamed from cogl/cogl-shader-boilerplate.h)0
-rw-r--r--cogl/cogl-glsl-shader-private.h35
-rw-r--r--cogl/cogl-glsl-shader.c154
-rw-r--r--cogl/cogl-shader.c132
-rw-r--r--cogl/driver/gl/cogl-pipeline-fragend-glsl.c12
-rw-r--r--cogl/driver/gl/cogl-pipeline-vertend-glsl.c12
7 files changed, 216 insertions, 132 deletions
diff --git a/cogl/Makefile.am b/cogl/Makefile.am
index abf7fc2c..41760898 100644
--- a/cogl/Makefile.am
+++ b/cogl/Makefile.am
@@ -336,6 +336,9 @@ cogl_sources_c = \
$(srcdir)/cogl-pipeline-layer-state.c \
$(srcdir)/cogl-pipeline-state-private.h \
$(srcdir)/cogl-pipeline-debug.c \
+ $(srcdir)/cogl-glsl-shader.c \
+ $(srcdir)/cogl-glsl-shader-private.h \
+ $(srcdir)/cogl-glsl-shader-boilerplate.h \
$(srcdir)/cogl-pipeline-snippet-private.h \
$(srcdir)/cogl-pipeline-snippet.c \
$(srcdir)/cogl-pipeline-cache.h \
diff --git a/cogl/cogl-shader-boilerplate.h b/cogl/cogl-glsl-shader-boilerplate.h
index e5a86d87..e5a86d87 100644
--- a/cogl/cogl-shader-boilerplate.h
+++ b/cogl/cogl-glsl-shader-boilerplate.h
diff --git a/cogl/cogl-glsl-shader-private.h b/cogl/cogl-glsl-shader-private.h
new file mode 100644
index 00000000..9d506506
--- /dev/null
+++ b/cogl/cogl-glsl-shader-private.h
@@ -0,0 +1,35 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _COGL_GLSL_SHADER_PRIVATE_H_
+#define _COGL_GLSL_SHADER_PRIVATE_H_
+
+void
+_cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
+ GLuint shader_gl_handle,
+ GLenum shader_gl_type,
+ int n_tex_coord_attribs,
+ GLsizei count_in,
+ const char **strings_in,
+ const GLint *lengths_in);
+
+#endif /* _COGL_GLSL_SHADER_PRIVATE_H_ */
diff --git a/cogl/cogl-glsl-shader.c b/cogl/cogl-glsl-shader.c
new file mode 100644
index 00000000..ae979423
--- /dev/null
+++ b/cogl/cogl-glsl-shader.c
@@ -0,0 +1,154 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *
+ *
+ * Authors:
+ * Robert Bragg <robert@linux.intel.com>
+ * Neil Roberts <neil@linux.intel.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "cogl-context-private.h"
+#include "cogl-glsl-shader-private.h"
+#include "cogl-glsl-shader-boilerplate.h"
+#include "cogl-internal.h"
+
+#include <string.h>
+
+#include <glib.h>
+
+void
+_cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
+ GLuint shader_gl_handle,
+ GLenum shader_gl_type,
+ int n_tex_coord_attribs,
+ GLsizei count_in,
+ const char **strings_in,
+ const GLint *lengths_in)
+{
+ const char *vertex_boilerplate;
+ const char *fragment_boilerplate;
+
+ const char **strings = g_alloca (sizeof (char *) * (count_in + 3));
+ GLint *lengths = g_alloca (sizeof (GLint) * (count_in + 3));
+ int count = 0;
+ char *tex_coord_declarations = NULL;
+
+ if (ctx->driver == COGL_DRIVER_GLES2)
+ {
+ vertex_boilerplate = _COGL_VERTEX_SHADER_BOILERPLATE_GLES2;
+ fragment_boilerplate = _COGL_FRAGMENT_SHADER_BOILERPLATE_GLES2;
+ }
+ else
+ {
+ vertex_boilerplate = _COGL_VERTEX_SHADER_BOILERPLATE_GL;
+ fragment_boilerplate = _COGL_FRAGMENT_SHADER_BOILERPLATE_GL;
+ }
+
+ if (ctx->driver == COGL_DRIVER_GLES2 &&
+ cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_3D))
+ {
+ static const char texture_3d_extension[] =
+ "#extension GL_OES_texture_3D : enable\n";
+ strings[count] = texture_3d_extension;
+ lengths[count++] = sizeof (texture_3d_extension) - 1;
+ }
+
+ if (shader_gl_type == GL_VERTEX_SHADER)
+ {
+ strings[count] = vertex_boilerplate;
+ lengths[count++] = strlen (vertex_boilerplate);
+ }
+ else if (shader_gl_type == GL_FRAGMENT_SHADER)
+ {
+ strings[count] = fragment_boilerplate;
+ lengths[count++] = strlen (fragment_boilerplate);
+ }
+
+ if (ctx->driver == COGL_DRIVER_GLES2 &&
+ n_tex_coord_attribs)
+ {
+ GString *declarations = g_string_new (NULL);
+
+ g_string_append_printf (declarations,
+ "varying vec4 _cogl_tex_coord[%d];\n",
+ n_tex_coord_attribs);
+
+ if (shader_gl_type == GL_VERTEX_SHADER)
+ {
+ int i;
+
+ g_string_append_printf (declarations,
+ "uniform mat4 cogl_texture_matrix[%d];\n",
+ n_tex_coord_attribs);
+
+ for (i = 0; i < n_tex_coord_attribs; i++)
+ g_string_append_printf (declarations,
+ "attribute vec4 cogl_tex_coord%d_in;\n",
+ i);
+ }
+
+ tex_coord_declarations = g_string_free (declarations, FALSE);
+ strings[count] = tex_coord_declarations;
+ lengths[count++] = -1; /* null terminated */
+ }
+
+ memcpy (strings + count, strings_in, sizeof (char *) * count_in);
+ if (lengths_in)
+ memcpy (lengths + count, lengths_in, sizeof (GLint) * count_in);
+ else
+ {
+ int i;
+
+ for (i = 0; i < count_in; i++)
+ lengths[count + i] = -1; /* null terminated */
+ }
+ count += count_in;
+
+ if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_SHOW_SOURCE)))
+ {
+ GString *buf = g_string_new (NULL);
+ int i;
+
+ g_string_append_printf (buf,
+ "%s shader:\n",
+ shader_gl_type == GL_VERTEX_SHADER ?
+ "vertex" : "fragment");
+ for (i = 0; i < count; i++)
+ if (lengths[i] != -1)
+ g_string_append_len (buf, strings[i], lengths[i]);
+ else
+ g_string_append (buf, strings[i]);
+
+ g_message ("%s", buf->str);
+
+ g_string_free (buf, TRUE);
+ }
+
+ GE( ctx, glShaderSource (shader_gl_handle, count,
+ (const char **) strings, lengths) );
+
+ g_free (tex_coord_declarations);
+}
diff --git a/cogl/cogl-shader.c b/cogl/cogl-shader.c
index d82c773a..aa4995ec 100644
--- a/cogl/cogl-shader.c
+++ b/cogl/cogl-shader.c
@@ -26,10 +26,11 @@
#endif
#include "cogl-shader-private.h"
-#include "cogl-shader-boilerplate.h"
#include "cogl-internal.h"
#include "cogl-context-private.h"
#include "cogl-object-private.h"
+#include "cogl-glsl-shader-private.h"
+#include "cogl-glsl-shader-boilerplate.h"
#include <glib.h>
@@ -173,121 +174,6 @@ cogl_shader_compile (CoglHandle handle)
}
void
-_cogl_shader_set_source_with_boilerplate (GLuint shader_gl_handle,
- GLenum shader_gl_type,
- int n_tex_coord_attribs,
- GLsizei count_in,
- const char **strings_in,
- const GLint *lengths_in)
-{
- const char *vertex_boilerplate;
- const char *fragment_boilerplate;
-
- const char **strings = g_alloca (sizeof (char *) * (count_in + 3));
- GLint *lengths = g_alloca (sizeof (GLint) * (count_in + 3));
- int count = 0;
- char *tex_coord_declarations = NULL;
-
- _COGL_GET_CONTEXT (ctx, NO_RETVAL);
-
- if (ctx->driver == COGL_DRIVER_GLES2)
- {
- vertex_boilerplate = _COGL_VERTEX_SHADER_BOILERPLATE_GLES2;
- fragment_boilerplate = _COGL_FRAGMENT_SHADER_BOILERPLATE_GLES2;
- }
- else
- {
- vertex_boilerplate = _COGL_VERTEX_SHADER_BOILERPLATE_GL;
- fragment_boilerplate = _COGL_FRAGMENT_SHADER_BOILERPLATE_GL;
- }
-
- if (ctx->driver == COGL_DRIVER_GLES2 &&
- cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_3D))
- {
- static const char texture_3d_extension[] =
- "#extension GL_OES_texture_3D : enable\n";
- strings[count] = texture_3d_extension;
- lengths[count++] = sizeof (texture_3d_extension) - 1;
- }
-
- if (shader_gl_type == GL_VERTEX_SHADER)
- {
- strings[count] = vertex_boilerplate;
- lengths[count++] = strlen (vertex_boilerplate);
- }
- else if (shader_gl_type == GL_FRAGMENT_SHADER)
- {
- strings[count] = fragment_boilerplate;
- lengths[count++] = strlen (fragment_boilerplate);
- }
-
- if (ctx->driver == COGL_DRIVER_GLES2 &&
- n_tex_coord_attribs)
- {
- GString *declarations = g_string_new (NULL);
-
- g_string_append_printf (declarations,
- "varying vec4 _cogl_tex_coord[%d];\n",
- n_tex_coord_attribs);
-
- if (shader_gl_type == GL_VERTEX_SHADER)
- {
- int i;
-
- g_string_append_printf (declarations,
- "uniform mat4 cogl_texture_matrix[%d];\n",
- n_tex_coord_attribs);
-
- for (i = 0; i < n_tex_coord_attribs; i++)
- g_string_append_printf (declarations,
- "attribute vec4 cogl_tex_coord%d_in;\n",
- i);
- }
-
- tex_coord_declarations = g_string_free (declarations, FALSE);
- strings[count] = tex_coord_declarations;
- lengths[count++] = -1; /* null terminated */
- }
-
- memcpy (strings + count, strings_in, sizeof (char *) * count_in);
- if (lengths_in)
- memcpy (lengths + count, lengths_in, sizeof (GLint) * count_in);
- else
- {
- int i;
-
- for (i = 0; i < count_in; i++)
- lengths[count + i] = -1; /* null terminated */
- }
- count += count_in;
-
- if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_SHOW_SOURCE)))
- {
- GString *buf = g_string_new (NULL);
- int i;
-
- g_string_append_printf (buf,
- "%s shader:\n",
- shader_gl_type == GL_VERTEX_SHADER ?
- "vertex" : "fragment");
- for (i = 0; i < count; i++)
- if (lengths[i] != -1)
- g_string_append_len (buf, strings[i], lengths[i]);
- else
- g_string_append (buf, strings[i]);
-
- g_message ("%s", buf->str);
-
- g_string_free (buf, TRUE);
- }
-
- GE( ctx, glShaderSource (shader_gl_handle, count,
- (const char **) strings, lengths) );
-
- g_free (tex_coord_declarations);
-}
-
-void
_cogl_shader_compile_real (CoglHandle handle,
int n_tex_coord_attribs)
{
@@ -364,12 +250,14 @@ _cogl_shader_compile_real (CoglHandle handle,
shader->gl_handle = ctx->glCreateShader (gl_type);
- _cogl_shader_set_source_with_boilerplate (shader->gl_handle,
- gl_type,
- n_tex_coord_attribs,
- 1,
- (const char **) &shader->source,
- NULL);
+ _cogl_glsl_shader_set_source_with_boilerplate (ctx,
+ shader->gl_handle,
+ gl_type,
+ n_tex_coord_attribs,
+ 1,
+ (const char **)
+ &shader->source,
+ NULL);
GE (ctx, glCompileShader (shader->gl_handle));
diff --git a/cogl/driver/gl/cogl-pipeline-fragend-glsl.c b/cogl/driver/gl/cogl-pipeline-fragend-glsl.c
index e66bf471..0eeb93a2 100644
--- a/cogl/driver/gl/cogl-pipeline-fragend-glsl.c
+++ b/cogl/driver/gl/cogl-pipeline-fragend-glsl.c
@@ -47,6 +47,7 @@
#include "cogl-program-private.h"
#include "cogl-pipeline-cache.h"
#include "cogl-pipeline-fragend-glsl-private.h"
+#include "cogl-glsl-shader-private.h"
#include <glib.h>
@@ -1074,11 +1075,12 @@ _cogl_pipeline_fragend_glsl_end (CoglPipeline *pipeline,
lengths[1] = shader_state->source->len;
source_strings[1] = shader_state->source->str;
- _cogl_shader_set_source_with_boilerplate (shader, GL_FRAGMENT_SHADER,
- shader_state
- ->n_tex_coord_attribs,
- 2, /* count */
- source_strings, lengths);
+ _cogl_glsl_shader_set_source_with_boilerplate (ctx,
+ shader, GL_FRAGMENT_SHADER,
+ shader_state
+ ->n_tex_coord_attribs,
+ 2, /* count */
+ source_strings, lengths);
GE( ctx, glCompileShader (shader) );
GE( ctx, glGetShaderiv (shader, GL_COMPILE_STATUS, &compile_status) );
diff --git a/cogl/driver/gl/cogl-pipeline-vertend-glsl.c b/cogl/driver/gl/cogl-pipeline-vertend-glsl.c
index 16f037cb..202b8083 100644
--- a/cogl/driver/gl/cogl-pipeline-vertend-glsl.c
+++ b/cogl/driver/gl/cogl-pipeline-vertend-glsl.c
@@ -43,6 +43,7 @@
#include "cogl-program-private.h"
#include "cogl-pipeline-vertend-glsl-private.h"
#include "cogl-pipeline-state-private.h"
+#include "cogl-glsl-shader-private.h"
const CoglPipelineVertend _cogl_pipeline_glsl_vertend;
@@ -462,11 +463,12 @@ _cogl_pipeline_vertend_glsl_end (CoglPipeline *pipeline,
lengths[1] = shader_state->source->len;
source_strings[1] = shader_state->source->str;
- _cogl_shader_set_source_with_boilerplate (shader, GL_VERTEX_SHADER,
- shader_state
- ->n_tex_coord_attribs,
- 2, /* count */
- source_strings, lengths);
+ _cogl_glsl_shader_set_source_with_boilerplate (ctx,
+ shader, GL_VERTEX_SHADER,
+ shader_state
+ ->n_tex_coord_attribs,
+ 2, /* count */
+ source_strings, lengths);
GE( ctx, glCompileShader (shader) );
GE( ctx, glGetShaderiv (shader, GL_COMPILE_STATUS, &compile_status) );