Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**********************************************************
  2.  * Copyright 2008-2009 VMware, Inc.  All rights reserved.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person
  5.  * obtaining a copy of this software and associated documentation
  6.  * files (the "Software"), to deal in the Software without
  7.  * restriction, including without limitation the rights to use, copy,
  8.  * modify, merge, publish, distribute, sublicense, and/or sell copies
  9.  * of the Software, and to permit persons to whom the Software is
  10.  * furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice shall be
  13.  * included in all copies or substantial portions of the Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  18.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  19.  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  20.  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  *
  24.  **********************************************************/
  25.  
  26. #ifndef SVGA_TEXTURE_H
  27. #define SVGA_TEXTURE_H
  28.  
  29.  
  30. #include "pipe/p_compiler.h"
  31. #include "pipe/p_state.h"
  32. #include "util/u_inlines.h"
  33. #include "util/u_memory.h"
  34. #include "util/u_transfer.h"
  35. #include "svga_screen_cache.h"
  36.  
  37. struct pipe_context;
  38. struct pipe_screen;
  39. struct svga_context;
  40. struct svga_winsys_surface;
  41. enum SVGA3dSurfaceFormat;
  42.  
  43.  
  44. #define SVGA_MAX_TEXTURE_LEVELS 16
  45.  
  46.  
  47. extern struct u_resource_vtbl svga_texture_vtbl;
  48.  
  49.  
  50. struct svga_texture
  51. {
  52.    struct u_resource b;
  53.  
  54.    boolean defined[6][SVGA_MAX_TEXTURE_LEVELS];
  55.    
  56.    struct svga_sampler_view *cached_view;
  57.  
  58.    unsigned view_age[SVGA_MAX_TEXTURE_LEVELS];
  59.    unsigned age;
  60.  
  61.    boolean views_modified;
  62.  
  63.    /**
  64.     * Creation key for the host surface handle.
  65.     *
  66.     * This structure describes all the host surface characteristics so that it
  67.     * can be looked up in cache, since creating a host surface is often a slow
  68.     * operation.
  69.     */
  70.    struct svga_host_surface_cache_key key;
  71.  
  72.    /**
  73.     * Handle for the host side surface.
  74.     *
  75.     * This handle is owned by this texture. Views should hold on to a reference
  76.     * to this texture and never destroy this handle directly.
  77.     */
  78.    struct svga_winsys_surface *handle;
  79.  
  80.    unsigned size;  /**< Approximate size in bytes */
  81. };
  82.  
  83.  
  84.  
  85. /* Note this is only used for texture (not buffer) transfers:
  86.  */
  87. struct svga_transfer
  88. {
  89.    struct pipe_transfer base;
  90.  
  91.    unsigned face;
  92.  
  93.    struct svga_winsys_buffer *hwbuf;
  94.  
  95.    /* Height of the hardware buffer in pixel blocks */
  96.    unsigned hw_nblocksy;
  97.  
  98.    /* Temporary malloc buffer when we can't allocate a hardware buffer
  99.     * big enough */
  100.    void *swbuf;
  101. };
  102.  
  103.  
  104. static INLINE struct svga_texture *svga_texture( struct pipe_resource *resource )
  105. {
  106.    struct svga_texture *tex = (struct svga_texture *)resource;
  107.    assert(tex == NULL || tex->b.vtbl == &svga_texture_vtbl);
  108.    return tex;
  109. }
  110.  
  111.  
  112. static INLINE struct svga_transfer *
  113. svga_transfer(struct pipe_transfer *transfer)
  114. {
  115.    assert(transfer);
  116.    return (struct svga_transfer *)transfer;
  117. }
  118.  
  119.  
  120. /**
  121.  * Increment the age of a view into a texture
  122.  * This is used to track updates to textures when we draw into
  123.  * them via a surface.
  124.  */
  125. static INLINE void
  126. svga_age_texture_view(struct svga_texture *tex, unsigned level)
  127. {
  128.    assert(level < Elements(tex->view_age));
  129.    tex->view_age[level] = ++(tex->age);
  130. }
  131.  
  132.  
  133. /**
  134.  * Mark the given texture face/level as being defined.
  135.  */
  136. static INLINE void
  137. svga_define_texture_level(struct svga_texture *tex,
  138.                           unsigned face,unsigned level)
  139. {
  140.    assert(face < Elements(tex->defined));
  141.    assert(level < Elements(tex->defined[0]));
  142.    tex->defined[face][level] = TRUE;
  143. }
  144.  
  145.  
  146. struct pipe_resource *
  147. svga_texture_create(struct pipe_screen *screen,
  148.                     const struct pipe_resource *template);
  149.  
  150. struct pipe_resource *
  151. svga_texture_from_handle(struct pipe_screen * screen,
  152.                         const struct pipe_resource *template,
  153.                         struct winsys_handle *whandle);
  154.  
  155.  
  156.  
  157.  
  158. #endif /* SVGA_TEXTURE_H */
  159.