From 4d990a93a8ee0dfcbb16d91d944f7c096f55b9f8 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Tue, 12 Oct 2010 12:36:22 +0100 Subject: [PATCH] cogl: Adds experimental CoglIndexArray type A CoglIndexArray is a subclass of CoglBuffer and will be used to hold vertex indices. A later commit will add a CoglIndices API which will allow describing a range of indices inside a CoglIndexArray. --- cogl/Makefile.am | 3 + cogl/cogl-index-array-private.h | 39 ++++++++++ cogl/cogl-index-array.c | 131 ++++++++++++++++++++++++++++++++ cogl/cogl-index-array.h | 79 +++++++++++++++++++ cogl/cogl.h | 1 + 5 files changed, 253 insertions(+) create mode 100644 cogl/cogl-index-array-private.h create mode 100644 cogl/cogl-index-array.c create mode 100644 cogl/cogl-index-array.h diff --git a/cogl/Makefile.am b/cogl/Makefile.am index 5939d8871..cd7a3cf40 100644 --- a/cogl/Makefile.am +++ b/cogl/Makefile.am @@ -72,6 +72,7 @@ cogl_public_h = \ $(srcdir)/cogl-texture-3d.h \ $(srcdir)/cogl-types.h \ $(srcdir)/cogl-vertex-buffer.h \ + $(srcdir)/cogl-index-array.h \ $(srcdir)/cogl.h \ $(NULL) @@ -205,6 +206,8 @@ cogl_sources_c = \ $(srcdir)/cogl-pixel-array.c \ $(srcdir)/cogl-vertex-buffer-private.h \ $(srcdir)/cogl-vertex-buffer.c \ + $(srcdir)/cogl-index-array-private.h \ + $(srcdir)/cogl-index-array.c \ $(srcdir)/cogl-matrix.c \ $(srcdir)/cogl-vector.c \ $(srcdir)/cogl-matrix-private.h \ diff --git a/cogl/cogl-index-array-private.h b/cogl/cogl-index-array-private.h new file mode 100644 index 000000000..d5c825a62 --- /dev/null +++ b/cogl/cogl-index-array-private.h @@ -0,0 +1,39 @@ +/* + * Cogl + * + * An object oriented GL/GLES Abstraction/Utility Layer + * + * Copyright (C) 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 + * . + * + * + * + * Authors: + * Robert Bragg + */ + +#ifndef __COGL_INDEX_ARRAY_PRIVATE_H +#define __COGL_INDEX_ARRAY_PRIVATE_H + +#include "cogl-buffer-private.h" + +struct _CoglIndexArray +{ + CoglBuffer _parent; +}; + +#endif /* __COGL_INDEX_ARRAY_PRIVATE_H */ + diff --git a/cogl/cogl-index-array.c b/cogl/cogl-index-array.c new file mode 100644 index 000000000..d39a14583 --- /dev/null +++ b/cogl/cogl-index-array.c @@ -0,0 +1,131 @@ +/* + * Cogl + * + * An object oriented GL/GLES Abstraction/Utility Layer + * + * Copyright (C) 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 + * . + * + * + * + * Authors: + * Robert Bragg + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cogl-object-private.h" +#include "cogl-indices.h" +#include "cogl-indices-private.h" + +static void _cogl_index_array_free (CoglIndexArray *indices); + +COGL_BUFFER_DEFINE (IndexArray, index_array); + +/* XXX: Unlike the wiki design this just takes a size. A single + * indices buffer should be able to contain multiple ranges of indices + * which the wiki design doesn't currently consider. */ +CoglIndexArray * +cogl_index_array_new (gsize bytes) +{ + CoglIndexArray *indices = g_slice_new (CoglIndexArray); + gboolean use_malloc; + + if (!cogl_features_available (COGL_FEATURE_VBOS)) + use_malloc = TRUE; + else + use_malloc = FALSE; + + /* parent's constructor */ + _cogl_buffer_initialize (COGL_BUFFER (indices), + bytes, + use_malloc, + COGL_BUFFER_BIND_TARGET_INDEX_ARRAY, + COGL_BUFFER_USAGE_HINT_INDEX_ARRAY, + COGL_BUFFER_UPDATE_HINT_STATIC); + + return _cogl_index_array_object_new (indices); +} + +static void +_cogl_index_array_free (CoglIndexArray *indices) +{ + /* parent's destructor */ + _cogl_buffer_fini (COGL_BUFFER (indices)); + + g_slice_free (CoglIndexArray, indices); +} + +gboolean +cogl_index_array_allocate (CoglIndexArray *indices, + GError *error) +{ + /* TODO */ + return TRUE; +} + +/* XXX: do we want a convenience function like this as an alternative + * to using cogl_buffer_set_data? The advantage of this is that we can + * track meta data such as the indices type and max_index_value for a + * range as part of the indices array. If we just leave people to use + * cogl_buffer_set_data then we either need a way to specify the type + * and max index value at draw time or we'll want a separate way to + * declare the type and max value for a range after uploading the + * data. + * + * XXX: I think in the end it'll be that CoglIndices are to + * CoglIndexArrays as CoglVertexAttributes are to CoglVertices. I.e + * a CoglIndexArray is a lite subclass of CoglBuffer that simply + * implies that the buffer will later be bound as indices but doesn't + * track more detailed meta data. CoglIndices build on a + * CoglIndexArray and define the type and max_index_value for some + * sub-range of a CoglIndexArray. + * + * XXX: The double plurel form that "Indices" "Array" implies could be + * a bit confusing. Also to be a bit more consistent with + * CoglVertexArray vs CoglVertexAttribute it might be best to rename so + * we have CoglIndexArray vs CoglIndices? maybe even + * CoglIndexRange :-/ ? + * + * CoglBuffer + * CoglVertexArray (buffer sub-class) + * CoglPrimitive (defines meta data for sub-region of array) + * CoglPixelArray (buffer sub-class) + * CoglIndexArray (buffer sub-class) + * CoglIndices (defines meta data for sub-region of array) + * + */ +#if 0 +void +cogl_index_array_set_data (CoglIndexArray *indices, + CoglIndicesType type, + int max_index_value, + gsize write_offset, + void *user_indices, + int n_indices) +{ + GList *l; + + for (l = indices->ranges; l; l = l->next) + { + + } + cogl_buffer_set +} +#endif + diff --git a/cogl/cogl-index-array.h b/cogl/cogl-index-array.h new file mode 100644 index 000000000..e85fd2cae --- /dev/null +++ b/cogl/cogl-index-array.h @@ -0,0 +1,79 @@ +/* + * Cogl + * + * An object oriented GL/GLES Abstraction/Utility Layer + * + * Copyright (C) 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 . + * + * + * + * Authors: + * Robert Bragg + */ + +#if !defined(__COGL_H_INSIDE__) && !defined(CLUTTER_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __COGL_INDEX_ARRAY_H__ +#define __COGL_INDEX_ARRAY_H__ + +G_BEGIN_DECLS + +/** + * SECTION:cogl-vertex-indices + * @short_description: Functions for creating and manipulating vertex + * indices. + * + * FIXME + */ + +typedef struct _CoglIndexArray CoglIndexArray; + +/** + * cogl_index_array_new: + * @size: The number of bytes to allocate for vertex attribute data. + * + * Declares a new #CoglIndexArray of @size bytes to contain vertex + * indices. Once declared, data can be set using + * cogl_buffer_set_data() or by mapping it into the application's + * address space using cogl_buffer_map(). + * + * Since: 1.4 + * Stability: Unstable + */ +CoglIndexArray * +cogl_index_array_new (gsize bytes); + +/** + * cogl_is_indices_array: + * @object: A #CoglObject + * + * Gets whether the given object references a #CoglIndexArray. + * + * Returns: %TRUE if the handle references a #CoglIndexArray, + * %FALSE otherwise + * + * Since: 1.4 + * Stability: Unstable + */ +gboolean +cogl_is_indices_array (void *object); + +G_END_DECLS + +#endif /* __COGL_INDEX_ARRAY_H__ */ + diff --git a/cogl/cogl.h b/cogl/cogl.h index 4427aff82..83bacfb10 100644 --- a/cogl/cogl.h +++ b/cogl/cogl.h @@ -54,6 +54,7 @@ #include #include #include +#include #endif G_BEGIN_DECLS