Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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_BC4_UNORM,
  528.       SVGA3D_DEVCAP_SURFACEFMT_BC4_UNORM,
  529.       0
  530.    },
  531.    {
  532.       SVGA3D_BC5_UNORM,
  533.       SVGA3D_DEVCAP_SURFACEFMT_BC5_UNORM,
  534.       0
  535.    },
  536.    {
  537.       SVGA3D_Z_DF16,
  538.       SVGA3D_DEVCAP_SURFACEFMT_Z_DF16,
  539.       0
  540.    },
  541.    {
  542.       SVGA3D_Z_DF24,
  543.       SVGA3D_DEVCAP_SURFACEFMT_Z_DF24,
  544.       0
  545.    },
  546.    {
  547.       SVGA3D_Z_D24S8_INT,
  548.       SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT,
  549.       0
  550.    },
  551. };
  552.  
  553.  
  554. /*
  555.  * Get format capabilities from the host.  It takes in consideration
  556.  * deprecated/unsupported formats, and formats which are implicitely assumed to
  557.  * be supported when the host does not provide an explicit capability entry.
  558.  */
  559. void
  560. svga_get_format_cap(struct svga_screen *ss,
  561.                     SVGA3dSurfaceFormat format,
  562.                     SVGA3dSurfaceFormatCaps *caps)
  563. {
  564.    const struct format_cap *entry;
  565.  
  566.    for (entry = format_cap_table; entry < format_cap_table + Elements(format_cap_table); ++entry) {
  567.       if (entry->format == format) {
  568.          struct svga_winsys_screen *sws = ss->sws;
  569.          SVGA3dDevCapResult result;
  570.  
  571.          if (sws->get_cap(sws, entry->index, &result)) {
  572.             /* Explicitly advertised format */
  573.             caps->value = result.u;
  574.          } else {
  575.             /* Implicitly advertised format -- use default caps */
  576.             caps->value = entry->defaultOperations;
  577.          }
  578.  
  579.          return;
  580.       }
  581.    }
  582.  
  583.    /* Unsupported format */
  584.    caps->value = 0;
  585. }
  586.  
  587.  
  588. /**
  589.  * Return block size and bytes per block for the given SVGA3D format.
  590.  * block_width and block_height are one for uncompressed formats and
  591.  * greater than one for compressed formats.
  592.  * Note: we don't handle formats that are unsupported, according to
  593.  * the format_cap_table above.
  594.  */
  595. void
  596. svga_format_size(SVGA3dSurfaceFormat format,
  597.                  unsigned *block_width,
  598.                  unsigned *block_height,
  599.                  unsigned *bytes_per_block)
  600. {
  601.    *block_width = *block_height = 1;
  602.  
  603.    switch (format) {
  604.    case SVGA3D_X8R8G8B8:
  605.    case SVGA3D_A8R8G8B8:
  606.       *bytes_per_block = 4;
  607.       return;
  608.  
  609.    case SVGA3D_R5G6B5:
  610.    case SVGA3D_X1R5G5B5:
  611.    case SVGA3D_A1R5G5B5:
  612.    case SVGA3D_A4R4G4B4:
  613.       *bytes_per_block = 2;
  614.       return;
  615.  
  616.    case SVGA3D_Z_D32:
  617.       *bytes_per_block = 4;
  618.       return;
  619.  
  620.    case SVGA3D_Z_D16:
  621.       *bytes_per_block = 2;
  622.       return;
  623.  
  624.    case SVGA3D_Z_D24S8:
  625.       *bytes_per_block = 4;
  626.       return;
  627.  
  628.    case SVGA3D_Z_D15S1:
  629.       *bytes_per_block = 2;
  630.       return;
  631.  
  632.    case SVGA3D_LUMINANCE8:
  633.    case SVGA3D_LUMINANCE4_ALPHA4:
  634.       *bytes_per_block = 1;
  635.       return;
  636.  
  637.    case SVGA3D_LUMINANCE16:
  638.    case SVGA3D_LUMINANCE8_ALPHA8:
  639.       *bytes_per_block = 2;
  640.       return;
  641.  
  642.    case SVGA3D_DXT1:
  643.    case SVGA3D_DXT2:
  644.       *block_width = *block_height = 4;
  645.       *bytes_per_block = 8;
  646.       return;
  647.  
  648.    case SVGA3D_DXT3:
  649.    case SVGA3D_DXT4:
  650.    case SVGA3D_DXT5:
  651.       *block_width = *block_height = 4;
  652.       *bytes_per_block = 16;
  653.       return;
  654.  
  655.    case SVGA3D_BUMPU8V8:
  656.    case SVGA3D_BUMPL6V5U5:
  657.       *bytes_per_block = 2;
  658.       return;
  659.  
  660.    case SVGA3D_BUMPX8L8V8U8:
  661.       *bytes_per_block = 4;
  662.       return;
  663.  
  664.    case SVGA3D_ARGB_S10E5:
  665.       *bytes_per_block = 8;
  666.       return;
  667.  
  668.    case SVGA3D_ARGB_S23E8:
  669.       *bytes_per_block = 16;
  670.       return;
  671.  
  672.    case SVGA3D_A2R10G10B10:
  673.       *bytes_per_block = 4;
  674.       return;
  675.  
  676.    case SVGA3D_Q8W8V8U8:
  677.       *bytes_per_block = 4;
  678.       return;
  679.  
  680.    case SVGA3D_CxV8U8:
  681.       *bytes_per_block = 2;
  682.       return;
  683.  
  684.    case SVGA3D_X8L8V8U8:
  685.    case SVGA3D_A2W10V10U10:
  686.       *bytes_per_block = 4;
  687.       return;
  688.  
  689.    case SVGA3D_ALPHA8:
  690.       *bytes_per_block = 1;
  691.       return;
  692.  
  693.    case SVGA3D_R_S10E5:
  694.       *bytes_per_block = 2;
  695.       return;
  696.    case SVGA3D_R_S23E8:
  697.       *bytes_per_block = 4;
  698.       return;
  699.    case SVGA3D_RG_S10E5:
  700.       *bytes_per_block = 4;
  701.       return;
  702.    case SVGA3D_RG_S23E8:
  703.       *bytes_per_block = 8;
  704.       return;
  705.  
  706.    case SVGA3D_BUFFER:
  707.       *bytes_per_block = 1;
  708.       return;
  709.  
  710.    case SVGA3D_Z_D24X8:
  711.       *bytes_per_block = 4;
  712.       return;
  713.  
  714.    case SVGA3D_V16U16:
  715.       *bytes_per_block = 4;
  716.       return;
  717.  
  718.    case SVGA3D_G16R16:
  719.       *bytes_per_block = 4;
  720.       return;
  721.  
  722.    case SVGA3D_A16B16G16R16:
  723.       *bytes_per_block = 8;
  724.       return;
  725.  
  726.    case SVGA3D_Z_DF16:
  727.       *bytes_per_block = 2;
  728.       return;
  729.    case SVGA3D_Z_DF24:
  730.       *bytes_per_block = 4;
  731.       return;
  732.    case SVGA3D_Z_D24S8_INT:
  733.       *bytes_per_block = 4;
  734.       return;
  735.  
  736.    default:
  737.       debug_printf("format %u\n", (unsigned) format);
  738.       assert(!"unexpected format in svga_format_size()");
  739.       *bytes_per_block = 4;
  740.    }
  741. }
  742.