mutter/cogl
Neil Roberts e007bc5358 cogl-material: Add support for setting the wrap mode for a layer
Previously, Cogl's texture coordinate system was effectively always
GL_REPEAT so that if an application specifies coordinates outside the
range 0→1 it would get repeated copies of the texture. It would
however change the mode to GL_CLAMP_TO_EDGE if all of the coordinates
are in the range 0→1 so that in the common case that the whole texture
is being drawn with linear filtering it will not blend in edge pixels
from the opposite sides.

This patch adds the option for applications to change the wrap mode
per layer. There are now three wrap modes: 'repeat', 'clamp-to-edge'
and 'automatic'. The automatic map mode is the default and it
implements the previous behaviour. The wrap mode can be changed for
the s and t coordinates independently. I've tried to make the
internals support setting the r coordinate but as we don't support 3D
textures yet I haven't exposed any public API for it.

The texture backends still have a set_wrap_mode virtual but this value
is intended to be transitory and it will be changed whenever the
material is flushed (although the backends are expected to cache it so
that it won't use too many GL calls). In my understanding this value
was always meant to be transitory and all primitives were meant to set
the value before drawing. However there were comments suggesting that
this is not the expected behaviour. In particular the vertex buffer
drawing code never set a wrap mode so it would end up with whatever
the texture was previously used for. These issues are now fixed
because the material will always set the wrap modes.

There is code to manually implement clamp-to-edge for textures that
can't be hardware repeated. However this doesn't fully work because it
relies on being able to draw the stretched parts using quads with the
same values for tx1 and tx2. The texture iteration code doesn't
support this so it breaks. This is a separate bug and it isn't
trivially solved.

When flushing a material there are now extra options to set wrap mode
overrides. The overrides are an array of values for each layer that
specifies an override for the s, t or r coordinates. The primitives
use this to implement the automatic wrap mode. cogl_polygon also uses
it to set GL_CLAMP_TO_BORDER mode for its trick to render sliced
textures. Although this code has been added it looks like the sliced
trick has been broken for a while and I haven't attempted to fix it
here.

I've added a constant to represent the maximum number of layers that a
material supports so that I can size the overrides array. I've set it
to 32 because as far as I can tell we have that limit imposed anyway
because the other flush options use a guint32 to store a flag about
each layer. The overrides array ends up adding 32 bytes to each flush
options struct which may be a concern.

http://bugzilla.openedhand.com/show_bug.cgi?id=2063
2010-04-12 15:44:23 +01:00
..
driver Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
winsys Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-atlas-texture-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-atlas-texture.c Split the wrap mode of _cogl_texture_set_wrap_mode into three 2010-04-12 15:44:23 +01:00
cogl-atlas.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-atlas.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-bitmap-fallback.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-bitmap-pixbuf.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-bitmap-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-bitmap.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-bitmap.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-blend-string.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-blend-string.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-buffer-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-buffer.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-buffer.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-clip-stack.c cogl: Support retained paths 2010-04-08 19:53:38 +01:00
cogl-clip-stack.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-color.c cogl: move cogl_set_source* funcs into cogl.c 2010-04-06 09:26:05 +01:00
cogl-color.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-context.c cogl: Support retained paths 2010-04-08 19:53:38 +01:00
cogl-context.h cogl: Support retained paths 2010-04-08 19:53:38 +01:00
cogl-debug.c cogl debug: Adds missing guards around debug cogl_args[] 2010-03-02 16:15:39 +00:00
cogl-debug.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-deprecated.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-enum-types.c.in Intial Re-layout of the Cogl source code and introduction of a Cogl Winsys 2009-10-16 18:58:50 +01:00
cogl-enum-types.h.in Intial Re-layout of the Cogl source code and introduction of a Cogl Winsys 2009-10-16 18:58:50 +01:00
cogl-feature-private.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-feature-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-fixed.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-fixed.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-framebuffer-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-framebuffer.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-handle.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-internal.h cogl: Support retained paths 2010-04-08 19:53:38 +01:00
cogl-journal-private.h cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-journal.c cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-material-private.h cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-material.c cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-material.h cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-matrix-mesa.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-matrix-mesa.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-matrix-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-matrix-stack.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-matrix-stack.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-matrix.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-matrix.h cogl: Make private members really hard to accidentally use 2010-04-12 15:38:58 +01:00
cogl-offscreen.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-path-private.h cogl: Support retained paths 2010-04-08 19:53:38 +01:00
cogl-path.c cogl: Support retained paths 2010-04-08 19:53:38 +01:00
cogl-path.h cogl: Support retained paths 2010-04-08 19:53:38 +01:00
cogl-pixel-buffer-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-pixel-buffer.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-pixel-buffer.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-primitives.c cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-primitives.h Use begin/end macros in cogl-primitives.h 2010-03-25 09:33:26 +00:00
cogl-profile.c profiling: Adds initial UProf accounting to Cogl 2010-01-08 20:19:50 +00:00
cogl-profile.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-shader.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-spans.c Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-spans.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-sub-texture-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-sub-texture.c Split the wrap mode of _cogl_texture_set_wrap_mode into three 2010-04-12 15:44:23 +01:00
cogl-texture-2d-private.h Split the wrap mode of _cogl_texture_set_wrap_mode into three 2010-04-12 15:44:23 +01:00
cogl-texture-2d-sliced-private.h Split the wrap mode of _cogl_texture_set_wrap_mode into three 2010-04-12 15:44:23 +01:00
cogl-texture-2d-sliced.c cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-texture-2d.c cogl-material: Add support for setting the wrap mode for a layer 2010-04-12 15:44:23 +01:00
cogl-texture-driver.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-texture-private.h Split the wrap mode of _cogl_texture_set_wrap_mode into three 2010-04-12 15:44:23 +01:00
cogl-texture.c Split the wrap mode of _cogl_texture_set_wrap_mode into three 2010-04-12 15:44:23 +01:00
cogl-texture.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-types.h cogl: Make private members really hard to accidentally use 2010-04-12 15:38:58 +01:00
cogl-util.c Return and warn if a handle's refcount is <= 0 2010-03-15 16:22:20 +00:00
cogl-util.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-vertex-buffer-private.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl-vertex-buffer.c cogl: rename cogl_enable to _cogl_enable 2010-04-01 12:34:42 +01:00
cogl-vertex-buffer.h Remove mentions of the FSF address 2010-03-01 12:56:10 +00:00
cogl.c cogl: renames cogl_multiply_matrix to cogl_transform 2010-04-08 14:37:01 +01:00
cogl.h cogl: renames cogl_multiply_matrix to cogl_transform 2010-04-08 14:37:01 +01:00
cogl.pc.in Intial Re-layout of the Cogl source code and introduction of a Cogl Winsys 2009-10-16 18:58:50 +01:00
Makefile.am cogl: Support retained paths 2010-04-08 19:53:38 +01:00
stb_image.c Update stb_image.c 2010-03-03 17:02:51 +00:00