Skip to content
  • Robert Bragg's avatar
    Add a strong CoglTexture type to replace CoglHandle · 4c3dadd3
    Robert Bragg authored
    
    
    As part of the on going, incremental effort to purge the non type safe
    CoglHandle type from the Cogl API this patch tackles most of the
    CoglHandle uses relating to textures.
    
    We'd postponed making this change for quite a while because we wanted to
    have a clearer understanding of how we wanted to evolve the texture APIs
    towards Cogl 2.0 before exposing type safety here which would be
    difficult to change later since it would imply breaking APIs.
    
    The basic idea that we are steering towards now is that CoglTexture
    can be considered to be the most primitive interface we have for any
    object representing a texture. The texture interface would provide
    roughly these methods:
    
      cogl_texture_get_width
      cogl_texture_get_height
      cogl_texture_can_repeat
      cogl_texture_can_mipmap
      cogl_texture_generate_mipmap;
      cogl_texture_get_format
      cogl_texture_set_region
      cogl_texture_get_region
    
    Besides the texture interface we will then start to expose types
    corresponding to specific texture types: CoglTexture2D,
    CoglTexture3D, CoglTexture2DSliced, CoglSubTexture, CoglAtlasTexture and
    CoglTexturePixmapX11.
    
    We will then also expose an interface for the high-level texture types
    we have (such as CoglTexture2DSlice, CoglSubTexture and
    CoglAtlasTexture) called CoglMetaTexture. CoglMetaTexture is an
    additional interface that lets you iterate a virtual region of a meta
    texture and get mappings of primitive textures to sub-regions of that
    virtual region. Internally we already have this kind of abstraction for
    dealing with sliced texture, sub-textures and atlas textures in a
    consistent way, so this will just make that abstraction public. The aim
    here is to clarify that there is a difference between primitive textures
    (CoglTexture2D/3D) and some of the other high-level textures, and also
    enable developers to implement primitives that can support meta textures
    since they can only be used with the cogl_rectangle API currently.
    
    The thing that's not so clean-cut with this are the texture constructors
    we have currently; such as cogl_texture_new_from_file which no longer
    make sense when CoglTexture is considered to be an interface.  These
    will basically just become convenient factory functions and it's just a
    bit unusual that they are within the cogl_texture namespace.  It's worth
    noting here that all the texture type APIs will also have their own type
    specific constructors so these functions will only be used for the
    convenience of being able to create a texture without really wanting to
    know the details of what type of texture you need.  Longer term for 2.0
    we may come up with replacement names for these factory functions or the
    other thing we are considering is designing some asynchronous factory
    functions instead since it's so often detrimental to application
    performance to be blocked waiting for a texture to be uploaded to the
    GPU.
    
    Reviewed-by: default avatarNeil Roberts <neil@linux.intel.com>
    4c3dadd3