Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 VMware, Inc.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28. #ifndef LP_TEXTURE_H
  29. #define LP_TEXTURE_H
  30.  
  31.  
  32. #include "pipe/p_state.h"
  33. #include "util/u_debug.h"
  34. #include "lp_limits.h"
  35.  
  36.  
  37. enum lp_texture_usage
  38. {
  39.    LP_TEX_USAGE_READ = 100,
  40.    LP_TEX_USAGE_READ_WRITE,
  41.    LP_TEX_USAGE_WRITE_ALL
  42. };
  43.  
  44.  
  45. struct pipe_context;
  46. struct pipe_screen;
  47. struct llvmpipe_context;
  48.  
  49. struct sw_displaytarget;
  50.  
  51.  
  52. /**
  53.  * llvmpipe subclass of pipe_resource.  A texture, drawing surface,
  54.  * vertex buffer, const buffer, etc.
  55.  * Textures are stored differently than other types of objects such as
  56.  * vertex buffers and const buffers.
  57.  * The latter are simple malloc'd blocks of memory.
  58.  */
  59. struct llvmpipe_resource
  60. {
  61.    struct pipe_resource base;
  62.  
  63.    /** Row stride in bytes */
  64.    unsigned row_stride[LP_MAX_TEXTURE_LEVELS];
  65.    /** Image stride (for cube maps, array or 3D textures) in bytes */
  66.    unsigned img_stride[LP_MAX_TEXTURE_LEVELS];
  67.    /** Offset to start of mipmap level, in bytes */
  68.    unsigned mip_offsets[LP_MAX_TEXTURE_LEVELS];
  69.    /** allocated total size (for non-display target texture resources only) */
  70.    unsigned total_alloc_size;
  71.  
  72.    /**
  73.     * Display target, for textures with the PIPE_BIND_DISPLAY_TARGET
  74.     * usage.
  75.     */
  76.    struct sw_displaytarget *dt;
  77.  
  78.    /**
  79.     * Malloc'ed data for regular textures, or a mapping to dt above.
  80.     */
  81.    void *tex_data;
  82.  
  83.    /**
  84.     * Data for non-texture resources.
  85.     */
  86.    void *data;
  87.  
  88.    boolean userBuffer;  /** Is this a user-space buffer? */
  89.    unsigned timestamp;
  90.  
  91.    unsigned id;  /**< temporary, for debugging */
  92.  
  93. #ifdef DEBUG
  94.    /** for linked list */
  95.    struct llvmpipe_resource *prev, *next;
  96. #endif
  97. };
  98.  
  99.  
  100. struct llvmpipe_transfer
  101. {
  102.    struct pipe_transfer base;
  103.  
  104.    unsigned long offset;
  105. };
  106.  
  107.  
  108. /** cast wrappers */
  109. static INLINE struct llvmpipe_resource *
  110. llvmpipe_resource(struct pipe_resource *pt)
  111. {
  112.    return (struct llvmpipe_resource *) pt;
  113. }
  114.  
  115.  
  116. static INLINE const struct llvmpipe_resource *
  117. llvmpipe_resource_const(const struct pipe_resource *pt)
  118. {
  119.    return (const struct llvmpipe_resource *) pt;
  120. }
  121.  
  122.  
  123. static INLINE struct llvmpipe_transfer *
  124. llvmpipe_transfer(struct pipe_transfer *pt)
  125. {
  126.    return (struct llvmpipe_transfer *) pt;
  127. }
  128.  
  129.  
  130. void llvmpipe_init_screen_resource_funcs(struct pipe_screen *screen);
  131. void llvmpipe_init_context_resource_funcs(struct pipe_context *pipe);
  132.  
  133.  
  134. static INLINE boolean
  135. llvmpipe_resource_is_texture(const struct pipe_resource *resource)
  136. {
  137.    switch (resource->target) {
  138.    case PIPE_BUFFER:
  139.       return FALSE;
  140.    case PIPE_TEXTURE_1D:
  141.    case PIPE_TEXTURE_1D_ARRAY:
  142.    case PIPE_TEXTURE_2D:
  143.    case PIPE_TEXTURE_2D_ARRAY:
  144.    case PIPE_TEXTURE_RECT:
  145.    case PIPE_TEXTURE_3D:
  146.    case PIPE_TEXTURE_CUBE:
  147.    case PIPE_TEXTURE_CUBE_ARRAY:
  148.       return TRUE;
  149.    default:
  150.       assert(0);
  151.       return FALSE;
  152.    }
  153. }
  154.  
  155.  
  156. static INLINE boolean
  157. llvmpipe_resource_is_1d(const struct pipe_resource *resource)
  158. {
  159.    switch (resource->target) {
  160.    case PIPE_BUFFER:
  161.    case PIPE_TEXTURE_1D:
  162.    case PIPE_TEXTURE_1D_ARRAY:
  163.       return TRUE;
  164.    case PIPE_TEXTURE_2D:
  165.    case PIPE_TEXTURE_2D_ARRAY:
  166.    case PIPE_TEXTURE_RECT:
  167.    case PIPE_TEXTURE_3D:
  168.    case PIPE_TEXTURE_CUBE:
  169.    case PIPE_TEXTURE_CUBE_ARRAY:
  170.       return FALSE;
  171.    default:
  172.       assert(0);
  173.       return FALSE;
  174.    }
  175. }
  176.  
  177.  
  178. static INLINE unsigned
  179. llvmpipe_layer_stride(struct pipe_resource *resource,
  180.                       unsigned level)
  181. {
  182.    struct llvmpipe_resource *lpr = llvmpipe_resource(resource);
  183.    assert(level < LP_MAX_TEXTURE_2D_LEVELS);
  184.    return lpr->img_stride[level];
  185. }
  186.  
  187.  
  188. static INLINE unsigned
  189. llvmpipe_resource_stride(struct pipe_resource *resource,
  190.                          unsigned level)
  191. {
  192.    struct llvmpipe_resource *lpr = llvmpipe_resource(resource);
  193.    assert(level < LP_MAX_TEXTURE_2D_LEVELS);
  194.    return lpr->row_stride[level];
  195. }
  196.  
  197.  
  198. void *
  199. llvmpipe_resource_map(struct pipe_resource *resource,
  200.                       unsigned level,
  201.                       unsigned layer,
  202.                       enum lp_texture_usage tex_usage);
  203.  
  204. void
  205. llvmpipe_resource_unmap(struct pipe_resource *resource,
  206.                         unsigned level,
  207.                         unsigned layer);
  208.  
  209.  
  210. void *
  211. llvmpipe_resource_data(struct pipe_resource *resource);
  212.  
  213.  
  214. unsigned
  215. llvmpipe_resource_size(const struct pipe_resource *resource);
  216.  
  217.  
  218. ubyte *
  219. llvmpipe_get_texture_image_address(struct llvmpipe_resource *lpr,
  220.                                    unsigned face_slice, unsigned level);
  221.  
  222.  
  223. extern void
  224. llvmpipe_print_resources(void);
  225.  
  226.  
  227. #define LP_UNREFERENCED         0
  228. #define LP_REFERENCED_FOR_READ  (1 << 0)
  229. #define LP_REFERENCED_FOR_WRITE (1 << 1)
  230.  
  231. unsigned int
  232. llvmpipe_is_resource_referenced( struct pipe_context *pipe,
  233.                                  struct pipe_resource *presource,
  234.                                  unsigned level);
  235.  
  236. unsigned
  237. llvmpipe_get_format_alignment(enum pipe_format format);
  238.  
  239. #endif /* LP_TEXTURE_H */
  240.