cogl-shader: unifies the driver/{gl,gles} shader files

The per driver implementations of cogl-shader.c had become almost
identical we now have a single cogl/cogl-shader.c instead.
This commit is contained in:
Robert Bragg 2010-08-02 21:40:55 +01:00
parent 6e176f94fa
commit 7705469d2b
7 changed files with 29 additions and 219 deletions

View File

@ -160,6 +160,8 @@ cogl_sources_c = \
$(srcdir)/cogl-profile.c \ $(srcdir)/cogl-profile.c \
$(srcdir)/cogl-bitmask.h \ $(srcdir)/cogl-bitmask.h \
$(srcdir)/cogl-bitmask.c \ $(srcdir)/cogl-bitmask.c \
$(srcdir)/cogl-shader-private.h \
$(srcdir)/cogl-shader.c \
$(NULL) $(NULL)
# glib-mkenums rules # glib-mkenums rules

View File

@ -3,7 +3,7 @@
* *
* An object oriented GL/GLES Abstraction/Utility Layer * 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -26,13 +26,26 @@
#endif #endif
#include "cogl.h" #include "cogl.h"
#include "cogl-shader-private.h" #include "cogl-shader-private.h"
#include "cogl-internal.h" #include "cogl-internal.h"
#include "cogl-context.h" #include "cogl-context.h"
#include "cogl-handle.h" #include "cogl-handle.h"
#ifdef HAVE_COGL_GLES2 #include <glib.h>
#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); static void _cogl_shader_free (CoglShader *shader);
@ -56,6 +69,8 @@ cogl_create_shader (CoglShaderType type)
CoglShader *shader; CoglShader *shader;
GLenum gl_type; GLenum gl_type;
GET_CONTEXT (ctx, COGL_INVALID_HANDLE);
if (type == COGL_SHADER_TYPE_VERTEX) if (type == COGL_SHADER_TYPE_VERTEX)
gl_type = GL_VERTEX_SHADER; gl_type = GL_VERTEX_SHADER;
else if (type == COGL_SHADER_TYPE_FRAGMENT) else if (type == COGL_SHADER_TYPE_FRAGMENT)
@ -109,7 +124,8 @@ cogl_shader_get_info_log (CoglHandle handle)
CoglShader *shader; CoglShader *shader;
char buffer[512]; char buffer[512];
int len = 0; int len = 0;
_COGL_GET_CONTEXT (ctx, NULL);
GET_CONTEXT (ctx, NULL);
if (!cogl_is_shader (handle)) if (!cogl_is_shader (handle))
return NULL; return NULL;
@ -127,6 +143,8 @@ cogl_shader_get_type (CoglHandle handle)
{ {
CoglShader *shader; CoglShader *shader;
GET_CONTEXT (ctx, COGL_SHADER_TYPE_VERTEX);
if (!cogl_is_shader (handle)) if (!cogl_is_shader (handle))
{ {
g_warning ("Non shader handle type passed to cogl_shader_get_type"); g_warning ("Non shader handle type passed to cogl_shader_get_type");
@ -143,6 +161,8 @@ cogl_shader_is_compiled (CoglHandle handle)
GLint status; GLint status;
CoglShader *shader; CoglShader *shader;
GET_CONTEXT (ctx, FALSE);
if (!cogl_is_shader (handle)) if (!cogl_is_shader (handle))
return FALSE; return FALSE;
@ -155,7 +175,7 @@ cogl_shader_is_compiled (CoglHandle handle)
return FALSE; return FALSE;
} }
#else /* HAVE_COGL_GLES2 */ #else /* HAVE_COGL_GLES */
/* No support on regular OpenGL 1.1 */ /* No support on regular OpenGL 1.1 */
@ -211,4 +231,5 @@ cogl_shader_is_compiled (CoglHandle handle)
return FALSE; return FALSE;
} }
#endif /* HAVE_COGL_GLES2 */ #endif /* HAVE_COGL_GLES */

View File

@ -23,8 +23,6 @@ libclutter_cogl_driver_la_CPPFLAGS = \
libclutter_cogl_driver_la_SOURCES = \ libclutter_cogl_driver_la_SOURCES = \
cogl.c \ cogl.c \
cogl-texture-driver.c \ cogl-texture-driver.c \
cogl-shader-private.h \
cogl-shader.c \
cogl-program.h \ cogl-program.h \
cogl-program.c \ cogl-program.c \
cogl-context-driver.h \ cogl-context-driver.h \

View File

@ -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 <http://www.gnu.org/licenses/>.
*
*
*/
#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 */

View File

@ -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 <http://www.gnu.org/licenses/>.
*
*
*/
#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 <glib.h>
#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;
}

View File

@ -28,8 +28,6 @@ libclutter_cogl_driver_la_SOURCES = \
cogl-gles2-wrapper.h \ cogl-gles2-wrapper.h \
cogl-program.h \ cogl-program.h \
cogl-program.c \ cogl-program.c \
cogl-shader-private.h \
cogl-shader.c \
cogl-feature-functions.h cogl-feature-functions.h
if USE_GLES2_WRAPPER if USE_GLES2_WRAPPER