Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**
  2.  * \file texobj.h
  3.  * Texture object management.
  4.  */
  5.  
  6. /*
  7.  * Mesa 3-D graphics library
  8.  *
  9.  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  10.  *
  11.  * Permission is hereby granted, free of charge, to any person obtaining a
  12.  * copy of this software and associated documentation files (the "Software"),
  13.  * to deal in the Software without restriction, including without limitation
  14.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  15.  * and/or sell copies of the Software, and to permit persons to whom the
  16.  * Software is furnished to do so, subject to the following conditions:
  17.  *
  18.  * The above copyright notice and this permission notice shall be included
  19.  * in all copies or substantial portions of the Software.
  20.  *
  21.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  22.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  23.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  24.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  25.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  26.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  27.  * OTHER DEALINGS IN THE SOFTWARE.
  28.  */
  29.  
  30.  
  31. #ifndef TEXTOBJ_H
  32. #define TEXTOBJ_H
  33.  
  34.  
  35. #include "compiler.h"
  36. #include "glheader.h"
  37. #include "mtypes.h"
  38. #include "samplerobj.h"
  39.  
  40.  
  41. #ifdef __cplusplus
  42. extern "C" {
  43. #endif
  44.  
  45.  
  46. /**
  47.  * \name Internal functions
  48.  */
  49. /*@{*/
  50.  
  51. extern struct gl_texture_object *
  52. _mesa_lookup_texture(struct gl_context *ctx, GLuint id);
  53.  
  54. extern struct gl_texture_object *
  55. _mesa_lookup_texture_err(struct gl_context *ctx, GLuint id, const char* func);
  56.  
  57. extern void
  58. _mesa_begin_texture_lookups(struct gl_context *ctx);
  59.  
  60. extern void
  61. _mesa_end_texture_lookups(struct gl_context *ctx);
  62.  
  63. extern struct gl_texture_object *
  64. _mesa_lookup_texture_locked(struct gl_context *ctx, GLuint id);
  65.  
  66. extern struct gl_texture_object *
  67. _mesa_get_current_tex_object(struct gl_context *ctx, GLenum target);
  68.  
  69. extern struct gl_texture_object *
  70. _mesa_new_texture_object( struct gl_context *ctx, GLuint name, GLenum target );
  71.  
  72. extern void
  73. _mesa_initialize_texture_object( struct gl_context *ctx,
  74.                                  struct gl_texture_object *obj,
  75.                                  GLuint name, GLenum target );
  76.  
  77. extern int
  78. _mesa_tex_target_to_index(const struct gl_context *ctx, GLenum target);
  79.  
  80. extern void
  81. _mesa_delete_texture_object( struct gl_context *ctx,
  82.                              struct gl_texture_object *obj );
  83.  
  84. extern void
  85. _mesa_copy_texture_object( struct gl_texture_object *dest,
  86.                            const struct gl_texture_object *src );
  87.  
  88. extern void
  89. _mesa_clear_texture_object(struct gl_context *ctx,
  90.                            struct gl_texture_object *obj);
  91.  
  92. extern void
  93. _mesa_reference_texobj_(struct gl_texture_object **ptr,
  94.                         struct gl_texture_object *tex);
  95.  
  96. static inline void
  97. _mesa_reference_texobj(struct gl_texture_object **ptr,
  98.                        struct gl_texture_object *tex)
  99. {
  100.    if (*ptr != tex)
  101.       _mesa_reference_texobj_(ptr, tex);
  102. }
  103.  
  104. /**
  105.  * Lock a texture for updating.  See also _mesa_lock_context_textures().
  106.  */
  107. static inline void
  108. _mesa_lock_texture(struct gl_context *ctx, struct gl_texture_object *texObj)
  109. {
  110.    mtx_lock(&ctx->Shared->TexMutex);
  111.    ctx->Shared->TextureStateStamp++;
  112.    (void) texObj;
  113. }
  114.  
  115. static inline void
  116. _mesa_unlock_texture(struct gl_context *ctx, struct gl_texture_object *texObj)
  117. {
  118.    (void) texObj;
  119.    mtx_unlock(&ctx->Shared->TexMutex);
  120. }
  121.  
  122.  
  123. /**
  124.  * Return number of faces for a texture target.  This will be 6 for
  125.  * cube maps (and cube map arrays) and 1 otherwise.
  126.  * NOTE: this function is not used for cube map arrays which operate
  127.  * more like 2D arrays than cube maps.
  128.  */
  129. static inline GLuint
  130. _mesa_num_tex_faces(GLenum target)
  131. {
  132.    switch (target) {
  133.    case GL_TEXTURE_CUBE_MAP:
  134.    case GL_PROXY_TEXTURE_CUBE_MAP:
  135.       return 6;
  136.    default:
  137.       return 1;
  138.    }
  139. }
  140.  
  141.  
  142. /** Is the texture "complete" with respect to the given sampler state? */
  143. static inline GLboolean
  144. _mesa_is_texture_complete(const struct gl_texture_object *texObj,
  145.                           const struct gl_sampler_object *sampler)
  146. {
  147.    if (texObj->_IsIntegerFormat &&
  148.        (sampler->MagFilter != GL_NEAREST ||
  149.         (sampler->MinFilter != GL_NEAREST &&
  150.          sampler->MinFilter != GL_NEAREST_MIPMAP_NEAREST))) {
  151.       /* If the format is integer, only nearest filtering is allowed */
  152.       return GL_FALSE;
  153.    }
  154.  
  155.    /* From the ARB_stencil_texturing specification:
  156.     * "Add a new bullet point for the conditions that cause the texture
  157.     *  to not be complete:
  158.     *
  159.     *  * The internal format of the texture is DEPTH_STENCIL, the
  160.     *    DEPTH_STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX and either
  161.     *    the magnification filter or the minification filter is not NEAREST."
  162.     */
  163.    if (texObj->StencilSampling &&
  164.        texObj->Image[0][texObj->BaseLevel]->_BaseFormat == GL_DEPTH_STENCIL &&
  165.        (sampler->MagFilter != GL_NEAREST || sampler->MinFilter != GL_NEAREST)) {
  166.       return GL_FALSE;
  167.    }
  168.  
  169.    if (_mesa_is_mipmap_filter(sampler))
  170.       return texObj->_MipmapComplete;
  171.    else
  172.       return texObj->_BaseComplete;
  173. }
  174.  
  175.  
  176. extern void
  177. _mesa_test_texobj_completeness( const struct gl_context *ctx,
  178.                                 struct gl_texture_object *obj );
  179.  
  180. extern GLboolean
  181. _mesa_cube_level_complete(const struct gl_texture_object *texObj,
  182.                           const GLint level);
  183.  
  184. extern GLboolean
  185. _mesa_cube_complete(const struct gl_texture_object *texObj);
  186.  
  187. extern void
  188. _mesa_dirty_texobj(struct gl_context *ctx, struct gl_texture_object *texObj);
  189.  
  190. extern struct gl_texture_object *
  191. _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex);
  192.  
  193. extern GLuint
  194. _mesa_total_texture_memory(struct gl_context *ctx);
  195.  
  196. extern GLenum
  197. _mesa_texture_base_format(const struct gl_texture_object *texObj);
  198.  
  199. extern void
  200. _mesa_unlock_context_textures( struct gl_context *ctx );
  201.  
  202. extern void
  203. _mesa_lock_context_textures( struct gl_context *ctx );
  204.  
  205. extern struct gl_texture_object *
  206. _mesa_create_nameless_texture(struct gl_context *ctx, GLenum target);
  207.  
  208. extern void
  209. _mesa_delete_nameless_texture(struct gl_context *ctx,
  210.                               struct gl_texture_object *texObj);
  211.  
  212. extern void
  213. _mesa_bind_texture_unit(struct gl_context *ctx,
  214.                         GLuint unit,
  215.                         struct gl_texture_object *texObj);
  216.  
  217. /*@}*/
  218.  
  219. /**
  220.  * \name API functions
  221.  */
  222. /*@{*/
  223.  
  224. extern void GLAPIENTRY
  225. _mesa_GenTextures(GLsizei n, GLuint *textures);
  226.  
  227. extern void GLAPIENTRY
  228. _mesa_CreateTextures(GLenum target, GLsizei n, GLuint *textures);
  229.  
  230. extern void GLAPIENTRY
  231. _mesa_DeleteTextures( GLsizei n, const GLuint *textures );
  232.  
  233.  
  234. extern void GLAPIENTRY
  235. _mesa_BindTexture( GLenum target, GLuint texture );
  236.  
  237. extern void GLAPIENTRY
  238. _mesa_BindTextureUnit(GLuint unit, GLuint texture);
  239.  
  240. extern void GLAPIENTRY
  241. _mesa_BindTextures( GLuint first, GLsizei count, const GLuint *textures );
  242.  
  243.  
  244. extern void GLAPIENTRY
  245. _mesa_PrioritizeTextures( GLsizei n, const GLuint *textures,
  246.                           const GLclampf *priorities );
  247.  
  248.  
  249. extern GLboolean GLAPIENTRY
  250. _mesa_AreTexturesResident( GLsizei n, const GLuint *textures,
  251.                            GLboolean *residences );
  252.  
  253. extern GLboolean GLAPIENTRY
  254. _mesa_IsTexture( GLuint texture );
  255.  
  256. extern void GLAPIENTRY
  257. _mesa_InvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset,
  258.                             GLint yoffset, GLint zoffset, GLsizei width,
  259.                             GLsizei height, GLsizei depth);
  260.  
  261. extern void GLAPIENTRY
  262. _mesa_InvalidateTexImage(GLuint texture, GLint level);
  263.  
  264. /*@}*/
  265.  
  266.  
  267. #ifdef __cplusplus
  268. }
  269. #endif
  270.  
  271.  
  272. #endif
  273.