diff --git a/cogl/Makefile.am b/cogl/Makefile.am index 6c4ae1d7a..2c8938d90 100644 --- a/cogl/Makefile.am +++ b/cogl/Makefile.am @@ -160,6 +160,8 @@ cogl_sources_c = \ $(srcdir)/cogl-profile.c \ $(srcdir)/cogl-bitmask.h \ $(srcdir)/cogl-bitmask.c \ + $(srcdir)/cogl-shader-private.h \ + $(srcdir)/cogl-shader.c \ $(NULL) # glib-mkenums rules diff --git a/cogl/driver/gles/cogl-shader-private.h b/cogl/cogl-shader-private.h similarity index 100% rename from cogl/driver/gles/cogl-shader-private.h rename to cogl/cogl-shader-private.h diff --git a/cogl/driver/gles/cogl-shader.c b/cogl/cogl-shader.c similarity index 84% rename from cogl/driver/gles/cogl-shader.c rename to cogl/cogl-shader.c index 8410130f0..a34e47670 100644 --- a/cogl/driver/gles/cogl-shader.c +++ b/cogl/cogl-shader.c @@ -3,7 +3,7 @@ * * An object oriented GL/GLES Abstraction/Utility Layer * - * Copyright (C) 2008,2009 Intel Corporation. + * Copyright (C) 2007,2008,2009,2010 Intel Corporation. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,13 +26,26 @@ #endif #include "cogl.h" - #include "cogl-shader-private.h" #include "cogl-internal.h" #include "cogl-context.h" #include "cogl-handle.h" -#ifdef HAVE_COGL_GLES2 +#include + +#ifdef HAVE_COGL_GL +#define glCreateShader ctx->drv.pf_glCreateShader +#define glGetShaderiv ctx->drv.pf_glGetShaderiv +#define glGetShaderInfoLog ctx->drv.pf_glGetShaderInfoLog +#define glCompileShader ctx->drv.pf_glCompileShader +#define glShaderSource ctx->drv.pf_glShaderSource +#define glDeleteShader ctx->drv.pf_glDeleteShader +#define GET_CONTEXT _COGL_GET_CONTEXT +#else +#define GET_CONTEXT(CTXVAR,RETVAL) G_STMT_START { } G_STMT_END +#endif + +#ifndef HAVE_COGL_GLES static void _cogl_shader_free (CoglShader *shader); @@ -56,6 +69,8 @@ cogl_create_shader (CoglShaderType type) CoglShader *shader; GLenum gl_type; + GET_CONTEXT (ctx, COGL_INVALID_HANDLE); + if (type == COGL_SHADER_TYPE_VERTEX) gl_type = GL_VERTEX_SHADER; else if (type == COGL_SHADER_TYPE_FRAGMENT) @@ -109,7 +124,8 @@ cogl_shader_get_info_log (CoglHandle handle) CoglShader *shader; char buffer[512]; int len = 0; - _COGL_GET_CONTEXT (ctx, NULL); + + GET_CONTEXT (ctx, NULL); if (!cogl_is_shader (handle)) return NULL; @@ -127,6 +143,8 @@ cogl_shader_get_type (CoglHandle handle) { CoglShader *shader; + GET_CONTEXT (ctx, COGL_SHADER_TYPE_VERTEX); + if (!cogl_is_shader (handle)) { g_warning ("Non shader handle type passed to cogl_shader_get_type"); @@ -143,6 +161,8 @@ cogl_shader_is_compiled (CoglHandle handle) GLint status; CoglShader *shader; + GET_CONTEXT (ctx, FALSE); + if (!cogl_is_shader (handle)) return FALSE; @@ -155,7 +175,7 @@ cogl_shader_is_compiled (CoglHandle handle) return FALSE; } -#else /* HAVE_COGL_GLES2 */ +#else /* HAVE_COGL_GLES */ /* No support on regular OpenGL 1.1 */ @@ -211,4 +231,5 @@ cogl_shader_is_compiled (CoglHandle handle) return FALSE; } -#endif /* HAVE_COGL_GLES2 */ +#endif /* HAVE_COGL_GLES */ + diff --git a/cogl/driver/gl/Makefile.am b/cogl/driver/gl/Makefile.am index 72e5bf5d0..80c28929f 100644 --- a/cogl/driver/gl/Makefile.am +++ b/cogl/driver/gl/Makefile.am @@ -23,8 +23,6 @@ libclutter_cogl_driver_la_CPPFLAGS = \ libclutter_cogl_driver_la_SOURCES = \ cogl.c \ cogl-texture-driver.c \ - cogl-shader-private.h \ - cogl-shader.c \ cogl-program.h \ cogl-program.c \ cogl-context-driver.h \ diff --git a/cogl/driver/gl/cogl-shader-private.h b/cogl/driver/gl/cogl-shader-private.h deleted file mode 100644 index 52faa2306..000000000 --- a/cogl/driver/gl/cogl-shader-private.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Cogl - * - * An object oriented GL/GLES Abstraction/Utility Layer - * - * Copyright (C) 2008,2009 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 . - * - * - */ - -#ifndef __COGL_SHADER_H -#define __COGL_SHADER_H - -#include "cogl-handle.h" - -typedef struct _CoglShader CoglShader; - -struct _CoglShader -{ - CoglHandleObject _parent; - GLhandleARB gl_handle; - CoglShaderType type; -}; - -CoglShader *_cogl_shader_pointer_from_handle (CoglHandle handle); - -#endif /* __COGL_SHADER_H */ diff --git a/cogl/driver/gl/cogl-shader.c b/cogl/driver/gl/cogl-shader.c deleted file mode 100644 index ae18a5450..000000000 --- a/cogl/driver/gl/cogl-shader.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Cogl - * - * An object oriented GL/GLES Abstraction/Utility Layer - * - * Copyright (C) 2007,2008,2009,2010 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 . - * - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "cogl.h" -#include "cogl-shader-private.h" -#include "cogl-internal.h" -#include "cogl-context.h" -#include "cogl-handle.h" - -#include - -#define glCreateShader ctx->drv.pf_glCreateShader -#define glGetShaderiv ctx->drv.pf_glGetShaderiv -#define glGetShaderInfoLog ctx->drv.pf_glGetShaderInfoLog -#define glCompileShader ctx->drv.pf_glCompileShader -#define glShaderSource ctx->drv.pf_glShaderSource -#define glDeleteShader ctx->drv.pf_glDeleteShader - -static void _cogl_shader_free (CoglShader *shader); - -COGL_HANDLE_DEFINE (Shader, shader); -COGL_OBJECT_DEFINE_DEPRECATED_REF_COUNTING (shader); - -static void -_cogl_shader_free (CoglShader *shader) -{ - /* Frees shader resources but its handle is not - released! Do that separately before this! */ - _COGL_GET_CONTEXT (ctx, NO_RETVAL); - glDeleteShader (shader->gl_handle); - - g_slice_free (CoglShader, shader); -} - -CoglHandle -cogl_create_shader (CoglShaderType type) -{ - CoglShader *shader; - GLenum gl_type; - - _COGL_GET_CONTEXT (ctx, COGL_INVALID_HANDLE); - - if (type == COGL_SHADER_TYPE_VERTEX) - gl_type = GL_VERTEX_SHADER; - else if (type == COGL_SHADER_TYPE_FRAGMENT) - gl_type = GL_FRAGMENT_SHADER; - else - { - g_warning ("Unexpected shader type (0x%08lX) given to " - "cogl_create_shader", (unsigned long) type); - return COGL_INVALID_HANDLE; - } - - shader = g_slice_new (CoglShader); - shader->gl_handle = glCreateShader (gl_type); - shader->type = type; - - return _cogl_shader_handle_new (shader); -} - -void -cogl_shader_source (CoglHandle handle, - const char *source) -{ - CoglShader *shader; - _COGL_GET_CONTEXT (ctx, NO_RETVAL); - - if (!cogl_is_shader (handle)) - return; - - shader = _cogl_shader_pointer_from_handle (handle); - - glShaderSource (shader->gl_handle, 1, &source, NULL); -} - -void -cogl_shader_compile (CoglHandle handle) -{ - CoglShader *shader; - _COGL_GET_CONTEXT (ctx, NO_RETVAL); - - if (!cogl_is_shader (handle)) - return; - - shader = _cogl_shader_pointer_from_handle (handle); - - glCompileShader (shader->gl_handle); -} - -char * -cogl_shader_get_info_log (CoglHandle handle) -{ - CoglShader *shader; - char buffer[512]; - GLsizei len; - _COGL_GET_CONTEXT (ctx, NULL); - - if (!cogl_is_shader (handle)) - return NULL; - - shader = _cogl_shader_pointer_from_handle (handle); - - glGetShaderInfoLog (shader->gl_handle, 511, &len, buffer); - buffer[len]='\0'; - - return g_strdup (buffer); -} - -CoglShaderType -cogl_shader_get_type (CoglHandle handle) -{ - CoglShader *shader; - - _COGL_GET_CONTEXT (ctx, COGL_SHADER_TYPE_VERTEX); - - if (!cogl_is_shader (handle)) - { - g_warning ("Non shader handle type passed to cogl_shader_get_type"); - return COGL_SHADER_TYPE_VERTEX; - } - - shader = _cogl_shader_pointer_from_handle (handle); - return shader->type; -} - -gboolean -cogl_shader_is_compiled (CoglHandle handle) -{ - GLint status; - CoglShader *shader; - - _COGL_GET_CONTEXT (ctx, FALSE); - - if (!cogl_is_shader (handle)) - return FALSE; - - shader = _cogl_shader_pointer_from_handle (handle); - - GE (glGetShaderiv (shader->gl_handle, GL_COMPILE_STATUS, &status)); - if (status == GL_TRUE) - return TRUE; - else - return FALSE; -} - diff --git a/cogl/driver/gles/Makefile.am b/cogl/driver/gles/Makefile.am index 932a37df3..ad22cc7c5 100644 --- a/cogl/driver/gles/Makefile.am +++ b/cogl/driver/gles/Makefile.am @@ -28,8 +28,6 @@ libclutter_cogl_driver_la_SOURCES = \ cogl-gles2-wrapper.h \ cogl-program.h \ cogl-program.c \ - cogl-shader-private.h \ - cogl-shader.c \ cogl-feature-functions.h if USE_GLES2_WRAPPER