Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Mesa 3-D graphics library
  3.  * Version:  7.7
  4.  *
  5.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  6.  * Copyright (c) 2008-2009 VMware, Inc.
  7.  *
  8.  * Permission is hereby granted, free of charge, to any person obtaining a
  9.  * copy of this software and associated documentation files (the "Software"),
  10.  * to deal in the Software without restriction, including without limitation
  11.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  12.  * and/or sell copies of the Software, and to permit persons to whom the
  13.  * Software is furnished to do so, subject to the following conditions:
  14.  *
  15.  * The above copyright notice and this permission notice shall be included
  16.  * in all copies or substantial portions 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 MERCHANTABILITY,
  20.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  21.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  22.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  23.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26.  
  27. /**
  28.  * \file texformat.c
  29.  * Texture formats.
  30.  *
  31.  * \author Gareth Hughes
  32.  * \author Brian Paul
  33.  */
  34.  
  35.  
  36. #include "context.h"
  37. #include "texcompress.h"
  38. #include "texformat.h"
  39.  
  40.  
  41. /**
  42.  * Choose an appropriate texture format given the format, type and
  43.  * internalFormat parameters passed to glTexImage().
  44.  *
  45.  * \param ctx  the GL context.
  46.  * \param internalFormat  user's prefered internal texture format.
  47.  * \param format  incoming image pixel format.
  48.  * \param type  incoming image data type.
  49.  *
  50.  * \return a pointer to a gl_texture_format object which describes the
  51.  * choosen texture format, or NULL on failure.
  52.  *
  53.  * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
  54.  * will typically override this function with a specialized version.
  55.  */
  56. gl_format
  57. _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
  58.                          GLenum format, GLenum type )
  59. {
  60.    (void) format;
  61.    (void) type;
  62.  
  63.    switch (internalFormat) {
  64.       /* shallow RGBA formats */
  65.       case 4:
  66.       case GL_RGBA:
  67.       case GL_RGBA8:
  68.          return MESA_FORMAT_RGBA8888;
  69.       case GL_RGB5_A1:
  70.          return MESA_FORMAT_ARGB1555;
  71.       case GL_RGBA2:
  72.          return MESA_FORMAT_ARGB4444_REV; /* just to test another format*/
  73.       case GL_RGBA4:
  74.          return MESA_FORMAT_ARGB4444;
  75.  
  76.       /* deep RGBA formats */
  77.       case GL_RGB10_A2:
  78.       case GL_RGBA12:
  79.       case GL_RGBA16:
  80.          return MESA_FORMAT_RGBA_16;
  81.  
  82.       /* shallow RGB formats */
  83.       case 3:
  84.       case GL_RGB:
  85.       case GL_RGB8:
  86.          return MESA_FORMAT_RGB888;
  87.       case GL_R3_G3_B2:
  88.          return MESA_FORMAT_RGB332;
  89.       case GL_RGB4:
  90.          return MESA_FORMAT_RGB565_REV; /* just to test another format */
  91.       case GL_RGB5:
  92.          return MESA_FORMAT_RGB565;
  93.  
  94.       /* deep RGB formats */
  95.       case GL_RGB10:
  96.       case GL_RGB12:
  97.       case GL_RGB16:
  98.          return MESA_FORMAT_RGBA_16;
  99.  
  100.       /* Alpha formats */
  101.       case GL_ALPHA:
  102.       case GL_ALPHA4:
  103.       case GL_ALPHA12:
  104.       case GL_ALPHA16:
  105.       case GL_ALPHA8:
  106.          return MESA_FORMAT_A8;
  107.  
  108.       /* Luminance formats */
  109.       case 1:
  110.       case GL_LUMINANCE:
  111.       case GL_LUMINANCE4:
  112.       case GL_LUMINANCE12:
  113.       case GL_LUMINANCE16:
  114.       case GL_LUMINANCE8:
  115.          return MESA_FORMAT_L8;
  116.  
  117.       /* Luminance/Alpha formats */
  118.       case 2:
  119.       case GL_LUMINANCE_ALPHA:
  120.       case GL_LUMINANCE4_ALPHA4:
  121.       case GL_LUMINANCE6_ALPHA2:
  122.       case GL_LUMINANCE8_ALPHA8:
  123.          return MESA_FORMAT_AL88;
  124.  
  125.       case GL_LUMINANCE12_ALPHA4:
  126.       case GL_LUMINANCE12_ALPHA12:
  127.       case GL_LUMINANCE16_ALPHA16:
  128.          return MESA_FORMAT_AL1616;
  129.  
  130.       case GL_INTENSITY:
  131.       case GL_INTENSITY4:
  132.       case GL_INTENSITY12:
  133.       case GL_INTENSITY16:
  134.       case GL_INTENSITY8:
  135.          return MESA_FORMAT_I8;
  136.  
  137.       case GL_COLOR_INDEX:
  138.       case GL_COLOR_INDEX1_EXT:
  139.       case GL_COLOR_INDEX2_EXT:
  140.       case GL_COLOR_INDEX4_EXT:
  141.       case GL_COLOR_INDEX12_EXT:
  142.       case GL_COLOR_INDEX16_EXT:
  143.       case GL_COLOR_INDEX8_EXT:
  144.          return MESA_FORMAT_CI8;
  145.  
  146.       default:
  147.          ; /* fallthrough */
  148.    }
  149.  
  150.    if (ctx->Extensions.ARB_depth_texture) {
  151.       switch (internalFormat) {
  152.          case GL_DEPTH_COMPONENT:
  153.          case GL_DEPTH_COMPONENT24:
  154.          case GL_DEPTH_COMPONENT32:
  155.             return MESA_FORMAT_Z32;
  156.          case GL_DEPTH_COMPONENT16:
  157.             return MESA_FORMAT_Z16;
  158.          default:
  159.             ; /* fallthrough */
  160.       }
  161.    }
  162.  
  163.    switch (internalFormat) {
  164.       case GL_COMPRESSED_ALPHA_ARB:
  165.          return MESA_FORMAT_A8;
  166.       case GL_COMPRESSED_LUMINANCE_ARB:
  167.          return MESA_FORMAT_L8;
  168.       case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
  169.          return MESA_FORMAT_AL88;
  170.       case GL_COMPRESSED_INTENSITY_ARB:
  171.          return MESA_FORMAT_I8;
  172.       case GL_COMPRESSED_RGB_ARB:
  173.          if (ctx->Extensions.EXT_texture_compression_s3tc ||
  174.              ctx->Extensions.S3_s3tc)
  175.             return MESA_FORMAT_RGB_DXT1;
  176.          if (ctx->Extensions.TDFX_texture_compression_FXT1)
  177.             return MESA_FORMAT_RGB_FXT1;
  178.          return MESA_FORMAT_RGB888;
  179.       case GL_COMPRESSED_RGBA_ARB:
  180.          if (ctx->Extensions.EXT_texture_compression_s3tc ||
  181.              ctx->Extensions.S3_s3tc)
  182.             return MESA_FORMAT_RGBA_DXT3; /* Not rgba_dxt1, see spec */
  183.          if (ctx->Extensions.TDFX_texture_compression_FXT1)
  184.             return MESA_FORMAT_RGBA_FXT1;
  185.          return MESA_FORMAT_RGBA8888;
  186.       default:
  187.          ; /* fallthrough */
  188.    }
  189.  
  190.    if (ctx->Extensions.MESA_ycbcr_texture) {
  191.       if (internalFormat == GL_YCBCR_MESA) {
  192.          if (type == GL_UNSIGNED_SHORT_8_8_MESA)
  193.             return MESA_FORMAT_YCBCR;
  194.          else
  195.             return MESA_FORMAT_YCBCR_REV;
  196.       }
  197.    }
  198.  
  199. #if FEATURE_texture_fxt1
  200.    if (ctx->Extensions.TDFX_texture_compression_FXT1) {
  201.       switch (internalFormat) {
  202.          case GL_COMPRESSED_RGB_FXT1_3DFX:
  203.             return MESA_FORMAT_RGB_FXT1;
  204.          case GL_COMPRESSED_RGBA_FXT1_3DFX:
  205.             return MESA_FORMAT_RGBA_FXT1;
  206.          default:
  207.             ; /* fallthrough */
  208.       }
  209.    }
  210. #endif
  211.  
  212. #if FEATURE_texture_s3tc
  213.    if (ctx->Extensions.EXT_texture_compression_s3tc) {
  214.       switch (internalFormat) {
  215.          case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  216.             return MESA_FORMAT_RGB_DXT1;
  217.          case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  218.             return MESA_FORMAT_RGBA_DXT1;
  219.          case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  220.             return MESA_FORMAT_RGBA_DXT3;
  221.          case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  222.             return MESA_FORMAT_RGBA_DXT5;
  223.          default:
  224.             ; /* fallthrough */
  225.       }
  226.    }
  227.  
  228.    if (ctx->Extensions.S3_s3tc) {
  229.       switch (internalFormat) {
  230.          case GL_RGB_S3TC:
  231.          case GL_RGB4_S3TC:
  232.             return MESA_FORMAT_RGB_DXT1;
  233.          case GL_RGBA_S3TC:
  234.          case GL_RGBA4_S3TC:
  235.             return MESA_FORMAT_RGBA_DXT3;
  236.          default:
  237.             ; /* fallthrough */
  238.       }
  239.    }
  240. #endif
  241.  
  242.    if (ctx->Extensions.ARB_texture_float) {
  243.       switch (internalFormat) {
  244.          case GL_ALPHA16F_ARB:
  245.             return MESA_FORMAT_ALPHA_FLOAT16;
  246.          case GL_ALPHA32F_ARB:
  247.             return MESA_FORMAT_ALPHA_FLOAT32;
  248.          case GL_LUMINANCE16F_ARB:
  249.             return MESA_FORMAT_LUMINANCE_FLOAT16;
  250.          case GL_LUMINANCE32F_ARB:
  251.             return MESA_FORMAT_LUMINANCE_FLOAT32;
  252.          case GL_LUMINANCE_ALPHA16F_ARB:
  253.             return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
  254.          case GL_LUMINANCE_ALPHA32F_ARB:
  255.             return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
  256.          case GL_INTENSITY16F_ARB:
  257.             return MESA_FORMAT_INTENSITY_FLOAT16;
  258.          case GL_INTENSITY32F_ARB:
  259.             return MESA_FORMAT_INTENSITY_FLOAT32;
  260.          case GL_RGB16F_ARB:
  261.             return MESA_FORMAT_RGB_FLOAT16;
  262.          case GL_RGB32F_ARB:
  263.             return MESA_FORMAT_RGB_FLOAT32;
  264.          case GL_RGBA16F_ARB:
  265.             return MESA_FORMAT_RGBA_FLOAT16;
  266.          case GL_RGBA32F_ARB:
  267.             return MESA_FORMAT_RGBA_FLOAT32;
  268.          default:
  269.             ; /* fallthrough */
  270.       }
  271.    }
  272.  
  273.    if (ctx->Extensions.EXT_packed_depth_stencil) {
  274.       switch (internalFormat) {
  275.          case GL_DEPTH_STENCIL_EXT:
  276.          case GL_DEPTH24_STENCIL8_EXT:
  277.             return MESA_FORMAT_Z24_S8;
  278.          default:
  279.             ; /* fallthrough */
  280.       }
  281.    }
  282.  
  283.    if (ctx->Extensions.ATI_envmap_bumpmap) {
  284.       switch (internalFormat) {
  285.          case GL_DUDV_ATI:
  286.          case GL_DU8DV8_ATI:
  287.             return MESA_FORMAT_DUDV8;
  288.          default:
  289.             ; /* fallthrough */
  290.       }
  291.    }
  292.  
  293.    if (ctx->Extensions.MESA_texture_signed_rgba) {
  294.       switch (internalFormat) {
  295.          case GL_RGBA_SNORM:
  296.          case GL_RGBA8_SNORM:
  297.             return MESA_FORMAT_SIGNED_RGBA8888;
  298.          default:
  299.             ; /* fallthrough */
  300.       }
  301.    }
  302.  
  303.    if (ctx->VersionMajor * 10 + ctx->VersionMinor >= 31) {
  304.       switch (internalFormat) {
  305.          case GL_RED_SNORM:
  306.          case GL_R8_SNORM:
  307.             return MESA_FORMAT_SIGNED_R8;
  308.          case GL_RG_SNORM:
  309.          case GL_RG8_SNORM:
  310.             return MESA_FORMAT_SIGNED_RG88;
  311.          case GL_RGB_SNORM:
  312.          case GL_RGB8_SNORM:
  313.             return MESA_FORMAT_SIGNED_RGBX8888;
  314.          case GL_RGBA_SNORM:
  315.          case GL_RGBA8_SNORM:
  316.             return MESA_FORMAT_SIGNED_RGBA8888;
  317.          case GL_R16_SNORM:
  318.             return MESA_FORMAT_SIGNED_R_16;
  319.          case GL_RG16_SNORM:
  320.             return MESA_FORMAT_SIGNED_RG_16;
  321.          case GL_RGB16_SNORM:
  322.             return MESA_FORMAT_SIGNED_RGB_16;
  323.          case GL_RGBA16_SNORM:
  324.             return MESA_FORMAT_SIGNED_RGBA_16;
  325.          default:
  326.             ; /* fall-through */
  327.       }
  328.    }
  329.  
  330. #if FEATURE_EXT_texture_sRGB
  331.    if (ctx->Extensions.EXT_texture_sRGB) {
  332.       switch (internalFormat) {
  333.          case GL_SRGB_EXT:
  334.          case GL_SRGB8_EXT:
  335.             return MESA_FORMAT_SRGB8;
  336.          case GL_SRGB_ALPHA_EXT:
  337.          case GL_SRGB8_ALPHA8_EXT:
  338.             return MESA_FORMAT_SRGBA8;
  339.          case GL_SLUMINANCE_EXT:
  340.          case GL_SLUMINANCE8_EXT:
  341.             return MESA_FORMAT_SL8;
  342.          case GL_SLUMINANCE_ALPHA_EXT:
  343.          case GL_SLUMINANCE8_ALPHA8_EXT:
  344.             return MESA_FORMAT_SLA8;
  345.          case GL_COMPRESSED_SLUMINANCE_EXT:
  346.             return MESA_FORMAT_SL8;
  347.          case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
  348.             return MESA_FORMAT_SLA8;
  349.          case GL_COMPRESSED_SRGB_EXT:
  350. #if FEATURE_texture_s3tc
  351.             if (ctx->Extensions.EXT_texture_compression_s3tc)
  352.                return MESA_FORMAT_SRGB_DXT1;
  353. #endif
  354.             return MESA_FORMAT_SRGB8;
  355.          case GL_COMPRESSED_SRGB_ALPHA_EXT:
  356. #if FEATURE_texture_s3tc
  357.             if (ctx->Extensions.EXT_texture_compression_s3tc)
  358.                return MESA_FORMAT_SRGBA_DXT3; /* Not srgba_dxt1, see spec */
  359. #endif
  360.             return MESA_FORMAT_SRGBA8;
  361. #if FEATURE_texture_s3tc
  362.          case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  363.             if (ctx->Extensions.EXT_texture_compression_s3tc)
  364.                return MESA_FORMAT_SRGB_DXT1;
  365.             break;
  366.          case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  367.             if (ctx->Extensions.EXT_texture_compression_s3tc)
  368.                return MESA_FORMAT_SRGBA_DXT1;
  369.             break;
  370.          case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  371.             if (ctx->Extensions.EXT_texture_compression_s3tc)
  372.                return MESA_FORMAT_SRGBA_DXT3;
  373.             break;
  374.          case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  375.             if (ctx->Extensions.EXT_texture_compression_s3tc)
  376.                return MESA_FORMAT_SRGBA_DXT5;
  377.             break;
  378. #endif
  379.          default:
  380.             ; /* fallthrough */
  381.       }
  382.    }
  383. #endif /* FEATURE_EXT_texture_sRGB */
  384.  
  385.    if (ctx->Extensions.EXT_texture_integer) {
  386.       switch (internalFormat) {
  387.       case GL_RGBA32UI_EXT:
  388.       case GL_RGB32UI_EXT:
  389.       case GL_ALPHA32UI_EXT:
  390.       case GL_INTENSITY32UI_EXT:
  391.       case GL_LUMINANCE32UI_EXT:
  392.       case GL_LUMINANCE_ALPHA32UI_EXT:
  393.          return MESA_FORMAT_RGBA_UINT32;
  394.       case GL_RGBA16UI_EXT:
  395.       case GL_RGB16UI_EXT:
  396.       case GL_ALPHA16UI_EXT:
  397.       case GL_INTENSITY16UI_EXT:
  398.       case GL_LUMINANCE16UI_EXT:
  399.       case GL_LUMINANCE_ALPHA16UI_EXT:
  400.          return MESA_FORMAT_RGBA_UINT16;
  401.       case GL_RGBA8UI_EXT:
  402.       case GL_RGB8UI_EXT:
  403.       case GL_ALPHA8UI_EXT:
  404.       case GL_INTENSITY8UI_EXT:
  405.       case GL_LUMINANCE8UI_EXT:
  406.       case GL_LUMINANCE_ALPHA8UI_EXT:
  407.          return MESA_FORMAT_RGBA_UINT8;
  408.       case GL_RGBA32I_EXT:
  409.       case GL_RGB32I_EXT:
  410.       case GL_ALPHA32I_EXT:
  411.       case GL_INTENSITY32I_EXT:
  412.       case GL_LUMINANCE32I_EXT:
  413.       case GL_LUMINANCE_ALPHA32I_EXT:
  414.          return MESA_FORMAT_RGBA_INT32;
  415.       case GL_RGBA16I_EXT:
  416.       case GL_RGB16I_EXT:
  417.       case GL_ALPHA16I_EXT:
  418.       case GL_INTENSITY16I_EXT:
  419.       case GL_LUMINANCE16I_EXT:
  420.       case GL_LUMINANCE_ALPHA16I_EXT:
  421.          return MESA_FORMAT_RGBA_INT16;
  422.       case GL_RGBA8I_EXT:
  423.       case GL_RGB8I_EXT:
  424.       case GL_ALPHA8I_EXT:
  425.       case GL_INTENSITY8I_EXT:
  426.       case GL_LUMINANCE8I_EXT:
  427.       case GL_LUMINANCE_ALPHA8I_EXT:
  428.          return MESA_FORMAT_RGBA_INT8;
  429.       }
  430.    }
  431.  
  432.    if (ctx->Extensions.ARB_texture_rg) {
  433.       switch (internalFormat) {
  434.       case GL_R8:
  435.       case GL_RED:
  436.       case GL_COMPRESSED_RED:
  437.          return MESA_FORMAT_R8;
  438.  
  439.       case GL_R16:
  440.          return MESA_FORMAT_R16;
  441.  
  442.       case GL_RG:
  443.       case GL_RG8:
  444.       case GL_COMPRESSED_RG:
  445.          return MESA_FORMAT_RG88;
  446.  
  447.       case GL_RG16:
  448.          return MESA_FORMAT_RG1616;
  449.  
  450.       default:
  451.          ; /* fallthrough */
  452.       }
  453.    }
  454.  
  455.    _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
  456.    return MESA_FORMAT_NONE;
  457. }
  458.  
  459.