Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**********************************************************
  2.  * Copyright 2011 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.  
  27. #include "pipe/p_format.h"
  28. #include "util/u_debug.h"
  29. #include "util/u_memory.h"
  30.  
  31. #include "svga_winsys.h"
  32. #include "svga_screen.h"
  33. #include "svga_format.h"
  34.  
  35.  
  36. /*
  37.  * Translate from gallium format to SVGA3D format.
  38.  */
  39. SVGA3dSurfaceFormat
  40. svga_translate_format(struct svga_screen *ss,
  41.                       enum pipe_format format,
  42.                       unsigned bind)
  43. {
  44.    switch(format) {
  45.  
  46.    case PIPE_FORMAT_B8G8R8A8_UNORM:
  47.       return SVGA3D_A8R8G8B8;
  48.    case PIPE_FORMAT_B8G8R8X8_UNORM:
  49.       return SVGA3D_X8R8G8B8;
  50.  
  51.    /* sRGB required for GL2.1 */
  52.    case PIPE_FORMAT_B8G8R8A8_SRGB:
  53.       return SVGA3D_A8R8G8B8;
  54.    case PIPE_FORMAT_DXT1_SRGB:
  55.    case PIPE_FORMAT_DXT1_SRGBA:
  56.       return SVGA3D_DXT1;
  57.    case PIPE_FORMAT_DXT3_SRGBA:
  58.       return SVGA3D_DXT3;
  59.    case PIPE_FORMAT_DXT5_SRGBA:
  60.       return SVGA3D_DXT5;
  61.  
  62.    case PIPE_FORMAT_B5G6R5_UNORM:
  63.       return SVGA3D_R5G6B5;
  64.    case PIPE_FORMAT_B5G5R5A1_UNORM:
  65.       return SVGA3D_A1R5G5B5;
  66.    case PIPE_FORMAT_B4G4R4A4_UNORM:
  67.       return SVGA3D_A4R4G4B4;
  68.  
  69.    case PIPE_FORMAT_R16G16B16A16_UNORM:
  70.       return SVGA3D_A16B16G16R16;
  71.  
  72.    case PIPE_FORMAT_Z16_UNORM:
  73.       return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.z16 : SVGA3D_Z_D16;
  74.    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
  75.       return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.s8z24 : SVGA3D_Z_D24S8;
  76.    case PIPE_FORMAT_X8Z24_UNORM:
  77.       return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.x8z24 : SVGA3D_Z_D24X8;
  78.  
  79.    case PIPE_FORMAT_A8_UNORM:
  80.       return SVGA3D_ALPHA8;
  81.    case PIPE_FORMAT_L8_UNORM:
  82.       return SVGA3D_LUMINANCE8;
  83.  
  84.    case PIPE_FORMAT_DXT1_RGB:
  85.    case PIPE_FORMAT_DXT1_RGBA:
  86.       return SVGA3D_DXT1;
  87.    case PIPE_FORMAT_DXT3_RGBA:
  88.       return SVGA3D_DXT3;
  89.    case PIPE_FORMAT_DXT5_RGBA:
  90.       return SVGA3D_DXT5;
  91.  
  92.    /* Float formats (only 1, 2 and 4-component formats supported) */
  93.    case PIPE_FORMAT_R32_FLOAT:
  94.       return SVGA3D_R_S23E8;
  95.    case PIPE_FORMAT_R32G32_FLOAT:
  96.       return SVGA3D_RG_S23E8;
  97.    case PIPE_FORMAT_R32G32B32A32_FLOAT:
  98.       return SVGA3D_ARGB_S23E8;
  99.    case PIPE_FORMAT_R16_FLOAT:
  100.       return SVGA3D_R_S10E5;
  101.    case PIPE_FORMAT_R16G16_FLOAT:
  102.       return SVGA3D_RG_S10E5;
  103.    case PIPE_FORMAT_R16G16B16A16_FLOAT:
  104.       return SVGA3D_ARGB_S10E5;
  105.  
  106.    case PIPE_FORMAT_Z32_UNORM:
  107.       /* SVGA3D_Z_D32 is not yet unsupported */
  108.       /* fall-through */
  109.    default:
  110.       return SVGA3D_FORMAT_INVALID;
  111.    }
  112. }
  113.  
  114.  
  115. /*
  116.  * Format capability description entry.
  117.  */
  118. struct format_cap {
  119.    SVGA3dSurfaceFormat format;
  120.  
  121.    /*
  122.     * Capability index corresponding to the format.
  123.     */
  124.    SVGA3dDevCapIndex index;
  125.  
  126.    /*
  127.     * Mask of supported SVGA3dFormatOp operations, to be inferred when the
  128.     * capability is not explicitly present.
  129.     */
  130.    uint32 defaultOperations;
  131. };
  132.  
  133.  
  134. /*
  135.  * Format capability description table.
  136.  *
  137.  * Ordererd by increasing SVGA3dSurfaceFormat value, but with gaps.
  138.  */
  139. static const struct format_cap format_cap_table[] = {
  140.    {
  141.       SVGA3D_X8R8G8B8,
  142.       SVGA3D_DEVCAP_SURFACEFMT_X8R8G8B8,
  143.       SVGA3DFORMAT_OP_TEXTURE |
  144.       SVGA3DFORMAT_OP_CUBETEXTURE |
  145.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  146.       SVGA3DFORMAT_OP_DISPLAYMODE |
  147.       SVGA3DFORMAT_OP_3DACCELERATION |
  148.       SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
  149.       SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
  150.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  151.       SVGA3DFORMAT_OP_SRGBREAD |
  152.       SVGA3DFORMAT_OP_SRGBWRITE |
  153.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  154.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  155.    },
  156.    {
  157.       SVGA3D_A8R8G8B8,
  158.       SVGA3D_DEVCAP_SURFACEFMT_A8R8G8B8,
  159.       SVGA3DFORMAT_OP_TEXTURE |
  160.       SVGA3DFORMAT_OP_CUBETEXTURE |
  161.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  162.       SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
  163.       SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
  164.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  165.       SVGA3DFORMAT_OP_SRGBREAD |
  166.       SVGA3DFORMAT_OP_SRGBWRITE |
  167.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  168.       SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
  169.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  170.    },
  171.    {
  172.       SVGA3D_R5G6B5,
  173.       SVGA3D_DEVCAP_SURFACEFMT_R5G6B5,
  174.       SVGA3DFORMAT_OP_TEXTURE |
  175.       SVGA3DFORMAT_OP_CUBETEXTURE |
  176.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  177.       SVGA3DFORMAT_OP_DISPLAYMODE |
  178.       SVGA3DFORMAT_OP_3DACCELERATION |
  179.       SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
  180.       SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
  181.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  182.       SVGA3DFORMAT_OP_SRGBREAD |
  183.       SVGA3DFORMAT_OP_SRGBWRITE |
  184.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  185.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  186.    },
  187.    {
  188.       SVGA3D_X1R5G5B5,
  189.       SVGA3D_DEVCAP_SURFACEFMT_X1R5G5B5,
  190.       SVGA3DFORMAT_OP_TEXTURE |
  191.       SVGA3DFORMAT_OP_CUBETEXTURE |
  192.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  193.       SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
  194.       SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
  195.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  196.       SVGA3DFORMAT_OP_SRGBREAD |
  197.       SVGA3DFORMAT_OP_SRGBWRITE |
  198.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  199.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  200.    },
  201.    {
  202.       SVGA3D_A1R5G5B5,
  203.       SVGA3D_DEVCAP_SURFACEFMT_A1R5G5B5,
  204.       SVGA3DFORMAT_OP_TEXTURE |
  205.       SVGA3DFORMAT_OP_CUBETEXTURE |
  206.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  207.       SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
  208.       SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
  209.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  210.       SVGA3DFORMAT_OP_SRGBREAD |
  211.       SVGA3DFORMAT_OP_SRGBWRITE |
  212.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  213.       SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
  214.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  215.    },
  216.    {
  217.       SVGA3D_A4R4G4B4,
  218.       SVGA3D_DEVCAP_SURFACEFMT_A4R4G4B4,
  219.       SVGA3DFORMAT_OP_TEXTURE |
  220.       SVGA3DFORMAT_OP_CUBETEXTURE |
  221.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  222.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  223.       SVGA3DFORMAT_OP_SRGBREAD |
  224.       SVGA3DFORMAT_OP_SRGBWRITE |
  225.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  226.       SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
  227.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  228.    },
  229.    /*
  230.     * SVGA3D_Z_D32 is not yet supported, and has no corresponding
  231.     * SVGA3D_DEVCAP_xxx.
  232.     */
  233.    {
  234.       SVGA3D_Z_D16,
  235.       SVGA3D_DEVCAP_SURFACEFMT_Z_D16,
  236.       SVGA3DFORMAT_OP_ZSTENCIL |
  237.       SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
  238.    },
  239.    {
  240.       SVGA3D_Z_D24S8,
  241.       SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8,
  242.       SVGA3DFORMAT_OP_ZSTENCIL |
  243.       SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
  244.    },
  245.    {
  246.       SVGA3D_Z_D15S1,
  247.       SVGA3D_DEVCAP_MAX,
  248.       SVGA3DFORMAT_OP_ZSTENCIL |
  249.       SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
  250.    },
  251.    {
  252.       SVGA3D_LUMINANCE8,
  253.       SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8,
  254.       SVGA3DFORMAT_OP_TEXTURE |
  255.       SVGA3DFORMAT_OP_CUBETEXTURE |
  256.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  257.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  258.    },
  259.    {
  260.       SVGA3D_LUMINANCE8_ALPHA8,
  261.       SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8_ALPHA8,
  262.       SVGA3DFORMAT_OP_TEXTURE |
  263.       SVGA3DFORMAT_OP_CUBETEXTURE |
  264.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  265.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  266.    },
  267.    /*
  268.     * SVGA3D_LUMINANCE4_ALPHA4 is not supported, and has no corresponding
  269.     * SVGA3D_DEVCAP_xxx.
  270.     */
  271.    {
  272.       SVGA3D_LUMINANCE16,
  273.       SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE16,
  274.       SVGA3DFORMAT_OP_TEXTURE |
  275.       SVGA3DFORMAT_OP_CUBETEXTURE |
  276.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  277.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  278.    },
  279.    {
  280.       SVGA3D_DXT1,
  281.       SVGA3D_DEVCAP_SURFACEFMT_DXT1,
  282.       SVGA3DFORMAT_OP_TEXTURE |
  283.       SVGA3DFORMAT_OP_SRGBREAD |
  284.       SVGA3DFORMAT_OP_CUBETEXTURE |
  285.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  286.    },
  287.    {
  288.       SVGA3D_DXT2,
  289.       SVGA3D_DEVCAP_SURFACEFMT_DXT2,
  290.       SVGA3DFORMAT_OP_TEXTURE |
  291.       SVGA3DFORMAT_OP_SRGBREAD |
  292.       SVGA3DFORMAT_OP_CUBETEXTURE |
  293.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  294.    },
  295.    {
  296.       SVGA3D_DXT3,
  297.       SVGA3D_DEVCAP_SURFACEFMT_DXT3,
  298.       SVGA3DFORMAT_OP_TEXTURE |
  299.       SVGA3DFORMAT_OP_SRGBREAD |
  300.       SVGA3DFORMAT_OP_CUBETEXTURE |
  301.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  302.    },
  303.    {
  304.       SVGA3D_DXT4,
  305.       SVGA3D_DEVCAP_SURFACEFMT_DXT4,
  306.       SVGA3DFORMAT_OP_TEXTURE |
  307.       SVGA3DFORMAT_OP_SRGBREAD |
  308.       SVGA3DFORMAT_OP_CUBETEXTURE |
  309.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  310.    },
  311.    {
  312.       SVGA3D_DXT5,
  313.       SVGA3D_DEVCAP_SURFACEFMT_DXT5,
  314.       SVGA3DFORMAT_OP_TEXTURE |
  315.       SVGA3DFORMAT_OP_SRGBREAD |
  316.       SVGA3DFORMAT_OP_CUBETEXTURE |
  317.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  318.    },
  319.    {
  320.       SVGA3D_BUMPU8V8,
  321.       SVGA3D_DEVCAP_SURFACEFMT_BUMPU8V8,
  322.       SVGA3DFORMAT_OP_TEXTURE |
  323.       SVGA3DFORMAT_OP_CUBETEXTURE |
  324.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  325.       SVGA3DFORMAT_OP_BUMPMAP |
  326.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  327.    },
  328.    /*
  329.     * SVGA3D_BUMPL6V5U5 is unsupported; it has no corresponding
  330.     * SVGA3D_DEVCAP_xxx.
  331.     */
  332.    {
  333.       SVGA3D_BUMPX8L8V8U8,
  334.       SVGA3D_DEVCAP_SURFACEFMT_BUMPX8L8V8U8,
  335.       SVGA3DFORMAT_OP_TEXTURE |
  336.       SVGA3DFORMAT_OP_CUBETEXTURE |
  337.       SVGA3DFORMAT_OP_BUMPMAP |
  338.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  339.    },
  340.    /*
  341.     * SVGA3D_BUMPL8V8U8 is unsupported; it has no corresponding
  342.     * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
  343.     */
  344.    {
  345.       SVGA3D_ARGB_S10E5,
  346.       SVGA3D_DEVCAP_SURFACEFMT_ARGB_S10E5,
  347.       SVGA3DFORMAT_OP_TEXTURE |
  348.       SVGA3DFORMAT_OP_CUBETEXTURE |
  349.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  350.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  351.       SVGA3DFORMAT_OP_SRGBREAD |
  352.       SVGA3DFORMAT_OP_SRGBWRITE |
  353.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  354.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  355.    },
  356.    {
  357.       SVGA3D_ARGB_S23E8,
  358.       SVGA3D_DEVCAP_SURFACEFMT_ARGB_S23E8,
  359.       SVGA3DFORMAT_OP_TEXTURE |
  360.       SVGA3DFORMAT_OP_CUBETEXTURE |
  361.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  362.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  363.       SVGA3DFORMAT_OP_SRGBREAD |
  364.       SVGA3DFORMAT_OP_SRGBWRITE |
  365.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  366.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  367.    },
  368.    {
  369.       SVGA3D_A2R10G10B10,
  370.       SVGA3D_DEVCAP_SURFACEFMT_A2R10G10B10,
  371.       SVGA3DFORMAT_OP_TEXTURE |
  372.       SVGA3DFORMAT_OP_CUBETEXTURE |
  373.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  374.       SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
  375.       SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
  376.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  377.       SVGA3DFORMAT_OP_SRGBREAD |
  378.       SVGA3DFORMAT_OP_SRGBWRITE |
  379.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  380.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  381.    },
  382.    /*
  383.     * SVGA3D_V8U8 is unsupported; it has no corresponding
  384.     * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPU8V8 should be used instead.
  385.     */
  386.    {
  387.       SVGA3D_Q8W8V8U8,
  388.       SVGA3D_DEVCAP_SURFACEFMT_Q8W8V8U8,
  389.       SVGA3DFORMAT_OP_TEXTURE |
  390.       SVGA3DFORMAT_OP_CUBETEXTURE |
  391.       SVGA3DFORMAT_OP_BUMPMAP |
  392.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  393.    },
  394.    {
  395.       SVGA3D_CxV8U8,
  396.       SVGA3D_DEVCAP_SURFACEFMT_CxV8U8,
  397.       SVGA3DFORMAT_OP_TEXTURE |
  398.       SVGA3DFORMAT_OP_BUMPMAP |
  399.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  400.    },
  401.    /*
  402.     * SVGA3D_X8L8V8U8 is unsupported; it has no corresponding
  403.     * SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
  404.     */
  405.    {
  406.       SVGA3D_A2W10V10U10,
  407.       SVGA3D_DEVCAP_SURFACEFMT_A2W10V10U10,
  408.       SVGA3DFORMAT_OP_TEXTURE |
  409.       SVGA3DFORMAT_OP_BUMPMAP |
  410.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  411.    },
  412.    {
  413.       SVGA3D_ALPHA8,
  414.       SVGA3D_DEVCAP_SURFACEFMT_ALPHA8,
  415.       SVGA3DFORMAT_OP_TEXTURE |
  416.       SVGA3DFORMAT_OP_CUBETEXTURE |
  417.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  418.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  419.    },
  420.    {
  421.       SVGA3D_R_S10E5,
  422.       SVGA3D_DEVCAP_SURFACEFMT_R_S10E5,
  423.       SVGA3DFORMAT_OP_TEXTURE |
  424.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  425.       SVGA3DFORMAT_OP_CUBETEXTURE |
  426.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  427.       SVGA3DFORMAT_OP_SRGBREAD |
  428.       SVGA3DFORMAT_OP_SRGBWRITE |
  429.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  430.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  431.    },
  432.    {
  433.       SVGA3D_R_S23E8,
  434.       SVGA3D_DEVCAP_SURFACEFMT_R_S23E8,
  435.       SVGA3DFORMAT_OP_TEXTURE |
  436.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  437.       SVGA3DFORMAT_OP_CUBETEXTURE |
  438.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  439.       SVGA3DFORMAT_OP_SRGBREAD |
  440.       SVGA3DFORMAT_OP_SRGBWRITE |
  441.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  442.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  443.    },
  444.    {
  445.       SVGA3D_RG_S10E5,
  446.       SVGA3D_DEVCAP_SURFACEFMT_RG_S10E5,
  447.       SVGA3DFORMAT_OP_TEXTURE |
  448.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  449.       SVGA3DFORMAT_OP_CUBETEXTURE |
  450.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  451.       SVGA3DFORMAT_OP_SRGBREAD |
  452.       SVGA3DFORMAT_OP_SRGBWRITE |
  453.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  454.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  455.    },
  456.    {
  457.       SVGA3D_RG_S23E8,
  458.       SVGA3D_DEVCAP_SURFACEFMT_RG_S23E8,
  459.       SVGA3DFORMAT_OP_TEXTURE |
  460.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  461.       SVGA3DFORMAT_OP_CUBETEXTURE |
  462.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  463.       SVGA3DFORMAT_OP_SRGBREAD |
  464.       SVGA3DFORMAT_OP_SRGBWRITE |
  465.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  466.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  467.    },
  468.    /*
  469.     * SVGA3D_BUFFER is a placeholder format for index/vertex buffers.
  470.     */
  471.    {
  472.       SVGA3D_Z_D24X8,
  473.       SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8,
  474.       SVGA3DFORMAT_OP_ZSTENCIL |
  475.       SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
  476.    },
  477.    {
  478.       SVGA3D_V16U16,
  479.       SVGA3D_DEVCAP_SURFACEFMT_V16U16,
  480.       SVGA3DFORMAT_OP_TEXTURE |
  481.       SVGA3DFORMAT_OP_CUBETEXTURE |
  482.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  483.       SVGA3DFORMAT_OP_BUMPMAP |
  484.       SVGA3DFORMAT_OP_OFFSCREENPLAIN
  485.    },
  486.    {
  487.       SVGA3D_G16R16,
  488.       SVGA3D_DEVCAP_SURFACEFMT_G16R16,
  489.       SVGA3DFORMAT_OP_TEXTURE |
  490.       SVGA3DFORMAT_OP_CUBETEXTURE |
  491.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  492.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  493.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  494.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  495.    },
  496.    {
  497.       SVGA3D_A16B16G16R16,
  498.       SVGA3D_DEVCAP_SURFACEFMT_A16B16G16R16,
  499.       SVGA3DFORMAT_OP_TEXTURE |
  500.       SVGA3DFORMAT_OP_CUBETEXTURE |
  501.       SVGA3DFORMAT_OP_VOLUMETEXTURE |
  502.       SVGA3DFORMAT_OP_OFFSCREENPLAIN |
  503.       SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
  504.       SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
  505.    },
  506.    {
  507.       SVGA3D_UYVY,
  508.       SVGA3D_DEVCAP_SURFACEFMT_UYVY,
  509.       0
  510.    },
  511.    {
  512.       SVGA3D_YUY2,
  513.       SVGA3D_DEVCAP_SURFACEFMT_YUY2,
  514.       0
  515.    },
  516.    {
  517.       SVGA3D_NV12,
  518.       SVGA3D_DEVCAP_SURFACEFMT_NV12,
  519.       0
  520.    },
  521.    {
  522.       SVGA3D_AYUV,
  523.       SVGA3D_DEVCAP_SURFACEFMT_AYUV,
  524.       0
  525.    },
  526.    {
  527.       SVGA3D_Z_DF16,
  528.       SVGA3D_DEVCAP_SURFACEFMT_Z_DF16,
  529.       0
  530.    },
  531.    {
  532.       SVGA3D_Z_DF24,
  533.       SVGA3D_DEVCAP_SURFACEFMT_Z_DF24,
  534.       0
  535.    },
  536.    {
  537.       SVGA3D_Z_D24S8_INT,
  538.       SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT,
  539.       0
  540.    },
  541. };
  542.  
  543.  
  544. /*
  545.  * Get format capabilities from the host.  It takes in consideration
  546.  * deprecated/unsupported formats, and formats which are implicitely assumed to
  547.  * be supported when the host does not provide an explicit capability entry.
  548.  */
  549. void
  550. svga_get_format_cap(struct svga_screen *ss,
  551.                     SVGA3dSurfaceFormat format,
  552.                     SVGA3dSurfaceFormatCaps *caps)
  553. {
  554.    const struct format_cap *entry;
  555.  
  556.    for (entry = format_cap_table; entry < format_cap_table + Elements(format_cap_table); ++entry) {
  557.       if (entry->format == format) {
  558.          struct svga_winsys_screen *sws = ss->sws;
  559.          SVGA3dDevCapResult result;
  560.  
  561.          if (sws->get_cap(sws, entry->index, &result)) {
  562.             /* Explicitly advertised format */
  563.             caps->value = result.u;
  564.          } else {
  565.             /* Implicitly advertised format -- use default caps */
  566.             caps->value = entry->defaultOperations;
  567.          }
  568.  
  569.          return;
  570.       }
  571.    }
  572.  
  573.    /* Unsupported format */
  574.    caps->value = 0;
  575. }
  576.  
  577.  
  578. /**
  579.  * Return block size and bytes per block for the given SVGA3D format.
  580.  * block_width and block_height are one for uncompressed formats and
  581.  * greater than one for compressed formats.
  582.  * Note: we don't handle formats that are unsupported, according to
  583.  * the format_cap_table above.
  584.  */
  585. void
  586. svga_format_size(SVGA3dSurfaceFormat format,
  587.                  unsigned *block_width,
  588.                  unsigned *block_height,
  589.                  unsigned *bytes_per_block)
  590. {
  591.    *block_width = *block_height = 1;
  592.  
  593.    switch (format) {
  594.    case SVGA3D_X8R8G8B8:
  595.    case SVGA3D_A8R8G8B8:
  596.       *bytes_per_block = 4;
  597.       return;
  598.  
  599.    case SVGA3D_R5G6B5:
  600.    case SVGA3D_X1R5G5B5:
  601.    case SVGA3D_A1R5G5B5:
  602.    case SVGA3D_A4R4G4B4:
  603.       *bytes_per_block = 2;
  604.       return;
  605.  
  606.    case SVGA3D_Z_D32:
  607.       *bytes_per_block = 4;
  608.       return;
  609.  
  610.    case SVGA3D_Z_D16:
  611.       *bytes_per_block = 2;
  612.       return;
  613.  
  614.    case SVGA3D_Z_D24S8:
  615.       *bytes_per_block = 4;
  616.       return;
  617.  
  618.    case SVGA3D_Z_D15S1:
  619.       *bytes_per_block = 2;
  620.       return;
  621.  
  622.    case SVGA3D_LUMINANCE8:
  623.    case SVGA3D_LUMINANCE4_ALPHA4:
  624.       *bytes_per_block = 1;
  625.       return;
  626.  
  627.    case SVGA3D_LUMINANCE16:
  628.    case SVGA3D_LUMINANCE8_ALPHA8:
  629.       *bytes_per_block = 2;
  630.       return;
  631.  
  632.    case SVGA3D_DXT1:
  633.    case SVGA3D_DXT2:
  634.       *block_width = *block_height = 4;
  635.       *bytes_per_block = 8;
  636.       return;
  637.  
  638.    case SVGA3D_DXT3:
  639.    case SVGA3D_DXT4:
  640.    case SVGA3D_DXT5:
  641.       *block_width = *block_height = 4;
  642.       *bytes_per_block = 16;
  643.       return;
  644.  
  645.    case SVGA3D_BUMPU8V8:
  646.    case SVGA3D_BUMPL6V5U5:
  647.       *bytes_per_block = 2;
  648.       return;
  649.  
  650.    case SVGA3D_BUMPX8L8V8U8:
  651.       *bytes_per_block = 4;
  652.       return;
  653.  
  654.    case SVGA3D_ARGB_S10E5:
  655.       *bytes_per_block = 8;
  656.       return;
  657.  
  658.    case SVGA3D_ARGB_S23E8:
  659.       *bytes_per_block = 16;
  660.       return;
  661.  
  662.    case SVGA3D_A2R10G10B10:
  663.       *bytes_per_block = 4;
  664.       return;
  665.  
  666.    case SVGA3D_Q8W8V8U8:
  667.       *bytes_per_block = 4;
  668.       return;
  669.  
  670.    case SVGA3D_CxV8U8:
  671.       *bytes_per_block = 2;
  672.       return;
  673.  
  674.    case SVGA3D_X8L8V8U8:
  675.    case SVGA3D_A2W10V10U10:
  676.       *bytes_per_block = 4;
  677.       return;
  678.  
  679.    case SVGA3D_ALPHA8:
  680.       *bytes_per_block = 1;
  681.       return;
  682.  
  683.    case SVGA3D_R_S10E5:
  684.       *bytes_per_block = 2;
  685.       return;
  686.    case SVGA3D_R_S23E8:
  687.       *bytes_per_block = 4;
  688.       return;
  689.    case SVGA3D_RG_S10E5:
  690.       *bytes_per_block = 4;
  691.       return;
  692.    case SVGA3D_RG_S23E8:
  693.       *bytes_per_block = 8;
  694.       return;
  695.  
  696.    case SVGA3D_BUFFER:
  697.       *bytes_per_block = 1;
  698.       return;
  699.  
  700.    case SVGA3D_Z_D24X8:
  701.       *bytes_per_block = 4;
  702.       return;
  703.  
  704.    case SVGA3D_V16U16:
  705.       *bytes_per_block = 4;
  706.       return;
  707.  
  708.    case SVGA3D_G16R16:
  709.       *bytes_per_block = 4;
  710.       return;
  711.  
  712.    case SVGA3D_A16B16G16R16:
  713.       *bytes_per_block = 8;
  714.       return;
  715.  
  716.    case SVGA3D_Z_DF16:
  717.       *bytes_per_block = 2;
  718.       return;
  719.    case SVGA3D_Z_DF24:
  720.       *bytes_per_block = 4;
  721.       return;
  722.    case SVGA3D_Z_D24S8_INT:
  723.       *bytes_per_block = 4;
  724.       return;
  725.  
  726.    default:
  727.       debug_printf("format %u\n", (unsigned) format);
  728.       assert(!"unexpected format in svga_format_size()");
  729.       *bytes_per_block = 4;
  730.    }
  731. }
  732.