[cogl] snippet: Add some more documentation



commit 5f0a57ffdb98c5c07b40b7468e5a865cf7db6d5c
Author: Neil Roberts <neil linux intel com>
Date:   Tue Dec 6 19:17:03 2011 +0000

    snippet: Add some more documentation
    
    This adds a documentation section for CoglSnippet which gives an
    overview of how to use them. It also fixes some syntax errors in the
    existing documentation and adds the missing pipeline functions for
    adding snippets to the documentation sections file.
    
    Reviewed-by: Robert Bragg <robert linux intel com>

 cogl/cogl-pipeline-state.h                         |    9 +-
 cogl/cogl-shader.h                                 |    7 +-
 cogl/cogl-snippet.h                                |  279 +++++++++++++++++++-
 doc/reference/cogl-2.0-experimental/Makefile.am    |    1 +
 .../cogl-2.0-experimental-docs.xml.in              |    1 +
 .../cogl-2.0-experimental-sections.txt             |   21 ++
 6 files changed, 306 insertions(+), 12 deletions(-)
---
diff --git a/cogl/cogl-pipeline-state.h b/cogl/cogl-pipeline-state.h
index b3500bf..e4356b5 100644
--- a/cogl/cogl-pipeline-state.h
+++ b/cogl/cogl-pipeline-state.h
@@ -943,11 +943,10 @@ cogl_pipeline_set_uniform_matrix (CoglPipeline *pipeline,
  * @pipeline: A #CoglPipeline
  * @snippet: The #CoglSnippet to add to the vertex processing hook
  *
- * Adds a shader snippet that to @pipeline. The snippet will wrap
- * around or replace some part of the pipeline as defined by the hook
- * point in @snippet. Note that some hook points are specific to a
- * layer and must be added with cogl_pipeline_add_layer_snippet()
- * instead.
+ * Adds a shader snippet to @pipeline. The snippet will wrap around or
+ * replace some part of the pipeline as defined by the hook point in
+ * @snippet. Note that some hook points are specific to a layer and
+ * must be added with cogl_pipeline_add_layer_snippet() instead.
  *
  * Since: 1.10
  * Stability: Unstable
diff --git a/cogl/cogl-shader.h b/cogl/cogl-shader.h
index bdef11c..c9aad74 100644
--- a/cogl/cogl-shader.h
+++ b/cogl/cogl-shader.h
@@ -213,11 +213,8 @@ G_BEGIN_DECLS
  * </tip>
  *
  * It's worth nothing that this API isn't what Cogl would like to have
- * and at some point it may become deprecated. In future Cogl would
- * like to have an API where parts of the pipeline in a #CoglMaterial
- * can be replaced with snippets of shader code. This API only allows
- * the entire fragment or vertex pipeline to be replaced with shader
- * code.
+ * in the long term and it may be removed in Cogl 2.0. The
+ * experimental #CoglShader API is the proposed replacement.
  */
 
 /**
diff --git a/cogl/cogl-snippet.h b/cogl/cogl-snippet.h
index fea689e..79ce5a6 100644
--- a/cogl/cogl-snippet.h
+++ b/cogl/cogl-snippet.h
@@ -40,7 +40,271 @@ G_BEGIN_DECLS
  * SECTION:cogl-snippet
  * @short_description: Functions for creating and manipulating shader snippets
  *
- * ...
+ * #CoglSnippet<!-- -->s are used to modify or replace parts of a
+ * #CoglPipeline using GLSL. GLSL is a programming language supported
+ * by OpenGL on programmable hardware to provide a more flexible
+ * description of what should be rendered. A description of GLSL
+ * itself is outside the scope of this documentation but any good
+ * OpenGL book should help to describe it.
+ *
+ * Unlike in OpenGL, when using GLSL with Cogl it is possible to write
+ * short snippets to replace small sections of the pipeline instead of
+ * having to replace the whole of either the vertex or fragment
+ * pipelines. Of course it is also possible to replace the whole of
+ * the pipeline if needed.
+ *
+ * Each snippet is a standalone chunk of code which would attach to
+ * the pipeline at a particular point. The code is split into four
+ * separate strings (all of which are optional):
+ *
+ * <glosslist>
+ *  <glossentry>
+ *   <glossterm>declarations</glossterm>
+ *   <glossdef><para>
+ * The code in this string will be inserted outside of any function in
+ * the global scope of the shader. This can be used to declare
+ * uniforms, attributes, varyings and functions to be used by the
+ * snippet.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>pre</glossterm>
+ *   <glossdef><para>
+ * The code in this string will be inserted before the hook point.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>post</glossterm>
+ *   <glossdef><para>
+ * The code in this string will be inserted after the hook point. This
+ * can be used to modify the results of the builtin generated code for
+ * that hook point.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>replace</glossterm>
+ *   <glossdef><para>
+ * If present the code in this string will replace the generated code
+ * for the hook point.
+ *   </para></glossdef>
+ *  </glossentry>
+ * </glosslist>
+ *
+ * All of the strings apart from the declarations string of a pipeline
+ * are generated in a single function so they can share variables
+ * declared from one string in another. The scope of the code is
+ * limited to each snippet so local variables declared in the snippet
+ * will not collide with variables declared in another
+ * snippet. However, code in the 'declarations' string is global to
+ * the shader so it is the application's responsibility to ensure that
+ * variables declared here will not collide with those from other
+ * snippets.
+ *
+ * The snippets can be added to a pipeline with
+ * cogl_pipeline_add_snippet() or
+ * cogl_pipeline_add_layer_snippet(). Which function to use depends on
+ * which hook the snippet is targetting. The snippets are all
+ * generated in the order they are added to the pipeline. That is, the
+ * post strings are executed in the order they are added to the
+ * pipeline and the pre strings are executed in reverse order. If any
+ * replace strings are given for a snippet then any other snippets
+ * with the same hook added before that snippet will be ignored. The
+ * different hooks are documented under #CoglSnippetHook.
+ *
+ * For portability with GLES2, it is recommended not to use the GLSL
+ * builtin names such as gl_FragColor. Instead there are replacement
+ * names under the cogl_* namespace which can be used instead. These
+ * are:
+ *
+ * <glosslist>
+ *  <glossentry>
+ *   <glossterm>uniform mat4
+ *         <emphasis>cogl_modelview_matrix</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The current modelview matrix. This is equivalent to
+ *    #gl_ModelViewMatrix.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>uniform mat4
+ *         <emphasis>cogl_projection_matrix</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The current projection matrix. This is equivalent to
+ *    #gl_ProjectionMatrix.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>uniform mat4
+ *         <emphasis>cogl_modelview_projection_matrix</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The combined modelview and projection matrix. A vertex shader
+ *    would typically use this to transform the incoming vertex
+ *    position. The separate modelview and projection matrices are
+ *    usually only needed for lighting calculations. This is
+ *    equivalent to #gl_ModelViewProjectionMatrix.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>uniform mat4
+ *         <emphasis>cogl_texture_matrix</emphasis>[]</glossterm>
+ *   <glossdef><para>
+ *    An array of matrices for transforming the texture
+ *    coordinates. This is equivalent to #gl_TextureMatrix.
+ *   </para></glossdef>
+ *  </glossentry>
+ * </glosslist>
+ *
+ * In a vertex shader, the following are also available:
+ *
+ * <glosslist>
+ *  <glossentry>
+ *   <glossterm>attribute vec4
+ *         <emphasis>cogl_position_in</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The incoming vertex position. This is equivalent to #gl_Vertex.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>attribute vec4
+ *         <emphasis>cogl_color_in</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The incoming vertex color. This is equivalent to #gl_Color.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>attribute vec4
+ *         <emphasis>cogl_tex_coord_in</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The texture coordinate for the first texture unit. This is
+ *    equivalent to #gl_MultiTexCoord0.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>attribute vec4
+ *         <emphasis>cogl_tex_coord0_in</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The texture coordinate for the first texture unit. This is
+ *    equivalent to #gl_MultiTexCoord0. There is also
+ *    #cogl_tex_coord1_in and so on.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>attribute vec3
+ *         <emphasis>cogl_normal_in</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The normal of the vertex. This is equivalent to #gl_Normal.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>vec4
+ *         <emphasis>cogl_position_out</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The calculated position of the vertex. This must be written to
+ *    in all vertex shaders. This is equivalent to #gl_Position.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>float
+ *         <emphasis>cogl_point_size_out</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The calculated size of a point. This is equivalent to #gl_PointSize.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>varying vec4
+ *         <emphasis>cogl_color_out</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The calculated color of a vertex. This is equivalent to #gl_FrontColor.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>varying vec4
+ *         <emphasis>cogl_tex_coord_out</emphasis>[]</glossterm>
+ *   <glossdef><para>
+ *    An array of calculated texture coordinates for a vertex. This is
+ *    equivalent to #gl_TexCoord.
+ *   </para></glossdef>
+ *  </glossentry>
+ * </glosslist>
+ *
+ * In a fragment shader, the following are also available:
+ *
+ * <glosslist>
+ *  <glossentry>
+ *   <glossterm>varying vec4 <emphasis>cogl_color_in</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The calculated color of a vertex. This is equivalent to #gl_FrontColor.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>varying vec4
+ *              <emphasis>cogl_tex_coord_in</emphasis>[]</glossterm>
+ *   <glossdef><para>
+ *    An array of calculated texture coordinates for a vertex. This is
+ *    equivalent to #gl_TexCoord.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>vec4 <emphasis>cogl_color_out</emphasis></glossterm>
+ *   <glossdef><para>
+ *    The final calculated color of the fragment. All fragment shaders
+ *    must write to this variable. This is equivalent to
+ *    #gl_FrontColor.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>float <emphasis>cogl_depth_out</emphasis></glossterm>
+ *   <glossdef><para>
+ *    An optional output variable specifying the depth value to use
+ *    for this fragment. This is equivalent to #gl_FragDepth.
+ *   </para></glossdef>
+ *  </glossentry>
+ *  <glossentry>
+ *   <glossterm>bool <emphasis>cogl_front_facing</emphasis></glossterm>
+ *   <glossdef><para>
+ *    A readonly variable that will be true if the current primitive
+ *    is front facing. This can be used to implement two-sided
+ *    coloring algorithms. This is equivalent to #gl_FrontFacing.
+ *   </para></glossdef>
+ *  </glossentry>
+ * </glosslist>
+ *
+ * Here is an example of using a snippet to add a desaturate effect to the
+ * generated color on a pipeline.
+ *
+ * <programlisting>
+ *   CoglPipeline *pipeline = cogl_pipeline_new ();
+ *
+ *   /<!-- -->* Set up the pipeline here, ie by adding a texture or other
+ *      layers *<!-- -->/
+ *
+ *   /<!-- -->* Create the snippet. The first string is the declarations which
+ *      we will use to add a uniform. The second is the 'post' string which
+ *      will contain the code to perform the desaturation. *<!-- -->/
+ *   CoglSnippet *snippet =
+ *     cogl_snippet_new (COGL_SNIPPET_HOOK_FRAGMENT,
+ *                       "uniform float factor;",
+ *                       "float gray = dot (vec3 (0.299, 0.587, 0.114), "
+ *                       "                  cogl_color_out.rgb);"
+ *                       "cogl_color_out.rgb = mix (vec3 (gray),"
+ *                       "                          cogl_color_out.rgb,"
+ *                       "                          factor);");
+ *
+ *   /<!-- -->* Add it to the pipeline *<!-- -->/
+ *   cogl_pipeline_add_snippet (pipeline, snippet);
+ *   /<!-- -->* The pipeline keeps a reference to the snippet
+ *      so we don't need to *<!-- -->/
+ *   cogl_object_unref (snippet);
+ *
+ *   /<!-- -->* Update the custom uniform on the pipeline *<!-- -->/
+ *   int location = cogl_pipeline_get_uniform_location (pipeline, "factor");
+ *   cogl_pipeline_set_uniform_1f (pipeline, location, 0.5f);
+ *
+ *   /<!-- -->* Now we can render with the snippet as usual *<!-- -->/
+ *   cogl_push_source (pipeline);
+ *   cogl_rectangle (0, 0, 10, 10);
+ *   cogl_pop_source ();
+ * </programlisting>
  */
 typedef struct _CoglSnippet CoglSnippet;
 
@@ -164,6 +428,8 @@ typedef struct _CoglSnippet CoglSnippet;
  *  </glossentry>
  *  <glossentry>
  *   <glossterm>%COGL_SNIPPET_HOOK_TEXTURE_COORD_TRANSFORM</glossterm>
+ *    <glossdef>
+ * <para>
  * Adds a shader snippet that will hook on to the texture coordinate
  * transformation of a particular layer. This can be used to replace
  * the processing for a layer or to modify the results.
@@ -201,9 +467,12 @@ typedef struct _CoglSnippet CoglSnippet;
  * results of the transformation but it can be further modified by the
  * snippet.
  * </para>
+ *   </glossdef>
  *  </glossentry>
  *  <glossentry>
  *   <glossterm>%COGL_SNIPPET_HOOK_LAYER_FRAGMENT</glossterm>
+ *    <glossdef>
+ * <para>
  * Adds a shader snippet that will hook on to the fragment processing
  * of a particular layer. This can be used to replace the processing
  * for a layer or to modify the results.
@@ -234,9 +503,12 @@ typedef struct _CoglSnippet CoglSnippet;
  * fragment processing for the layer. The results can be modified by changing
  * the value of the âcogl_layerâ variable.
  * </para>
+ *   </glossdef>
  *  </glossentry>
  *  <glossentry>
  *   <glossterm>%COGL_SNIPPET_HOOK_TEXTURE_LOOKUP</glossterm>
+ *   <glossdef>
+ * <para>
  * Adds a shader snippet that will hook on to the texture lookup part
  * of a given layer. This gives a chance for the application to modify
  * the coordinates that will be used for the texture lookup or to
@@ -269,6 +541,7 @@ typedef struct _CoglSnippet CoglSnippet;
  * has been preformed. Here the snippet can modify the cogl_texel
  * variable to alter the returned texel.
  * </para>
+ *   </glossdef>
  *  </glossentry>
  * </glosslist>
  *
@@ -319,7 +592,9 @@ cogl_snippet_new (CoglSnippetHook hook,
  * @snippet: A #CoglSnippet
  *
  * Return value: the hook that was set when cogl_snippet_new() was
- * called.
+ *   called.
+ * Since: 1.10
+ * Stability: Unstable
  */
 CoglSnippetHook
 cogl_snippet_get_hook (CoglSnippet *snippet);
diff --git a/doc/reference/cogl-2.0-experimental/Makefile.am b/doc/reference/cogl-2.0-experimental/Makefile.am
index 3e8bc1e..df29aaf 100644
--- a/doc/reference/cogl-2.0-experimental/Makefile.am
+++ b/doc/reference/cogl-2.0-experimental/Makefile.am
@@ -89,6 +89,7 @@ IGNORE_HFILES=\
 	cogl-program.h				\
 	cogl-shader-private.h			\
 	cogl-shader.h				\
+	cogl-snippet-private.h			\
 	cogl-sub-texture-private.h		\
 	cogl-texture-2d-private.h		\
 	cogl-texture-2d-sliced-private.h	\
diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
index 6c4d533..378e531 100644
--- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
+++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
@@ -67,6 +67,7 @@
       <title>Setting Up A GPU Pipeline</title>
       <xi:include href="blend-strings.xml"/>
       <xi:include href="xml/cogl-pipeline.xml"/>
+      <xi:include href="xml/cogl-snippet.xml"/>
     </section>
 
     <section id="cogl-buffer-apis">
diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
index 0a9a655..6381a4c 100644
--- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
+++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
@@ -238,6 +238,24 @@ cogl_rectangle_with_multitexture_coords
 </SECTION>
 
 <SECTION>
+<FILE>cogl-snippet</FILE>
+<TITLE>Shader snippets</TITLE>
+CoglSnippet
+CoglSnippetHook
+cogl_snippet_new
+cogl_snippet_get_hook
+cogl_is_snippet
+cogl_snippet_set_declarations
+cogl_snippet_get_declarations
+cogl_snippet_set_pre
+cogl_snippet_get_pre
+cogl_snippet_set_replace
+cogl_snippet_get_replace
+cogl_snippet_set_post
+cogl_snippet_get_post
+</SECTION>
+
+<SECTION>
 <FILE>cogl-primitives-deprecated</FILE>
 <TITLE>Primitives (Deprecated)</TITLE>
 cogl_polygon
@@ -609,6 +627,9 @@ cogl_pipeline_set_uniform_float
 cogl_pipeline_set_uniform_int
 cogl_pipeline_set_uniform_matrix
 
+cogl_pipeline_add_snippet
+cogl_pipeline_add_layer_snippet
+
 <SUBSECTION Private>
 cogl_blend_string_error_get_type
 cogl_blend_string_error_quark



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]