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:
parent
6e176f94fa
commit
7705469d2b
@ -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
|
||||
|
@ -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 <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);
|
||||
|
||||
@ -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 */
|
||||
|
@ -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 \
|
||||
|
@ -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 */
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user