mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 15:40:11 +01:00
svga: Cleanup format capability checking.
Accurately describe what operations are supported when a format caps entry is not advertised by the host, and which formats are never supported, instead of making ad-hoc and often incorrect assumptions.
This commit is contained in:
parent
ffeed5da6e
commit
974b6413f4
8 changed files with 680 additions and 189 deletions
|
|
@ -7,6 +7,7 @@ C_SOURCES := \
|
||||||
svga_draw.c \
|
svga_draw.c \
|
||||||
svga_draw_arrays.c \
|
svga_draw_arrays.c \
|
||||||
svga_draw_elements.c \
|
svga_draw_elements.c \
|
||||||
|
svga_format.c \
|
||||||
svga_pipe_blend.c \
|
svga_pipe_blend.c \
|
||||||
svga_pipe_blit.c \
|
svga_pipe_blit.c \
|
||||||
svga_pipe_clear.c \
|
svga_pipe_clear.c \
|
||||||
|
|
|
||||||
562
src/gallium/drivers/svga/svga_format.c
Normal file
562
src/gallium/drivers/svga/svga_format.c
Normal file
|
|
@ -0,0 +1,562 @@
|
||||||
|
/**********************************************************
|
||||||
|
* Copyright 2011 VMware, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use, copy,
|
||||||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
* of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
**********************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "pipe/p_format.h"
|
||||||
|
#include "util/u_debug.h"
|
||||||
|
#include "util/u_memory.h"
|
||||||
|
|
||||||
|
#include "svga_winsys.h"
|
||||||
|
#include "svga_screen.h"
|
||||||
|
#include "svga_format.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translate from gallium format to SVGA3D format.
|
||||||
|
*/
|
||||||
|
SVGA3dSurfaceFormat
|
||||||
|
svga_translate_format(struct svga_screen *ss,
|
||||||
|
enum pipe_format format,
|
||||||
|
unsigned bind)
|
||||||
|
{
|
||||||
|
switch(format) {
|
||||||
|
|
||||||
|
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||||
|
return SVGA3D_A8R8G8B8;
|
||||||
|
case PIPE_FORMAT_B8G8R8X8_UNORM:
|
||||||
|
return SVGA3D_X8R8G8B8;
|
||||||
|
|
||||||
|
/* Required for GL2.1:
|
||||||
|
*/
|
||||||
|
case PIPE_FORMAT_B8G8R8A8_SRGB:
|
||||||
|
return SVGA3D_A8R8G8B8;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_B5G6R5_UNORM:
|
||||||
|
return SVGA3D_R5G6B5;
|
||||||
|
case PIPE_FORMAT_B5G5R5A1_UNORM:
|
||||||
|
return SVGA3D_A1R5G5B5;
|
||||||
|
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
||||||
|
return SVGA3D_A4R4G4B4;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_Z16_UNORM:
|
||||||
|
return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.z16 : SVGA3D_Z_D16;
|
||||||
|
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
|
||||||
|
return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.s8z24 : SVGA3D_Z_D24S8;
|
||||||
|
case PIPE_FORMAT_X8Z24_UNORM:
|
||||||
|
return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.x8z24 : SVGA3D_Z_D24X8;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_A8_UNORM:
|
||||||
|
return SVGA3D_ALPHA8;
|
||||||
|
case PIPE_FORMAT_L8_UNORM:
|
||||||
|
return SVGA3D_LUMINANCE8;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_DXT1_RGB:
|
||||||
|
case PIPE_FORMAT_DXT1_RGBA:
|
||||||
|
return SVGA3D_DXT1;
|
||||||
|
case PIPE_FORMAT_DXT3_RGBA:
|
||||||
|
return SVGA3D_DXT3;
|
||||||
|
case PIPE_FORMAT_DXT5_RGBA:
|
||||||
|
return SVGA3D_DXT5;
|
||||||
|
|
||||||
|
case PIPE_FORMAT_Z32_UNORM:
|
||||||
|
/* SVGA3D_Z_D32 is not yet unsupported */
|
||||||
|
/* fall-through */
|
||||||
|
default:
|
||||||
|
return SVGA3D_FORMAT_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Format capability description entry.
|
||||||
|
*/
|
||||||
|
struct format_cap {
|
||||||
|
SVGA3dSurfaceFormat format;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Capability index corresponding to the format.
|
||||||
|
*/
|
||||||
|
SVGA3dDevCapIndex index;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mask of supported SVGA3dFormatOp operations, to be inferred when the
|
||||||
|
* capability is not explicitly present.
|
||||||
|
*/
|
||||||
|
uint32 defaultOperations;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Format capability description table.
|
||||||
|
*
|
||||||
|
* Ordererd by increasing SVGA3dSurfaceFormat value, but with gaps.
|
||||||
|
*/
|
||||||
|
static const struct format_cap format_cap_table[] = {
|
||||||
|
{
|
||||||
|
SVGA3D_X8R8G8B8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_X8R8G8B8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_DISPLAYMODE |
|
||||||
|
SVGA3DFORMAT_OP_3DACCELERATION |
|
||||||
|
SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_A8R8G8B8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_A8R8G8B8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_R5G6B5,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_R5G6B5,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_DISPLAYMODE |
|
||||||
|
SVGA3DFORMAT_OP_3DACCELERATION |
|
||||||
|
SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_X1R5G5B5,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_X1R5G5B5,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_A1R5G5B5,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_A1R5G5B5,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_A4R4G4B4,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_A4R4G4B4,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* SVGA3D_Z_D32 is not yet supported, and has no corresponding
|
||||||
|
* SVGA3D_DEVCAP_xxx.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
SVGA3D_Z_D16,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_Z_D16,
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL |
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_Z_D24S8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8,
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL |
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_Z_D15S1,
|
||||||
|
SVGA3D_DEVCAP_MAX,
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL |
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_LUMINANCE8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_LUMINANCE8_ALPHA8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8_ALPHA8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* SVGA3D_LUMINANCE4_ALPHA4 is not supported, and has no corresponding
|
||||||
|
* SVGA3D_DEVCAP_xxx.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
SVGA3D_LUMINANCE16,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE16,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_DXT1,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_DXT1,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_DXT2,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_DXT2,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_DXT3,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_DXT3,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_DXT4,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_DXT4,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_DXT5,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_DXT5,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_BUMPU8V8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_BUMPU8V8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_BUMPMAP |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* SVGA3D_BUMPL6V5U5 is unsupported; it has no corresponding
|
||||||
|
* SVGA3D_DEVCAP_xxx.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
SVGA3D_BUMPX8L8V8U8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_BUMPX8L8V8U8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_BUMPMAP |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* SVGA3D_BUMPL8V8U8 is unsupported; it has no corresponding
|
||||||
|
* SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
SVGA3D_ARGB_S10E5,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_ARGB_S10E5,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_ARGB_S23E8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_ARGB_S23E8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_A2R10G10B10,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_A2R10G10B10,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CONVERT_TO_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_MEMBEROFGROUP_ARGB |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* SVGA3D_V8U8 is unsupported; it has no corresponding
|
||||||
|
* SVGA3D_DEVCAP_xxx. SVGA3D_BUMPU8V8 should be used instead.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
SVGA3D_Q8W8V8U8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_Q8W8V8U8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_BUMPMAP |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_CxV8U8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_CxV8U8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_BUMPMAP |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* SVGA3D_X8L8V8U8 is unsupported; it has no corresponding
|
||||||
|
* SVGA3D_DEVCAP_xxx. SVGA3D_BUMPX8L8V8U8 should be used instead.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
SVGA3D_A2W10V10U10,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_A2W10V10U10,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_BUMPMAP |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_ALPHA8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_ALPHA8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_R_S10E5,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_R_S10E5,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_R_S23E8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_R_S23E8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_RG_S10E5,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_RG_S10E5,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_RG_S23E8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_RG_S23E8,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SRGBREAD |
|
||||||
|
SVGA3DFORMAT_OP_SRGBWRITE |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
* SVGA3D_BUFFER is a placeholder format for index/vertex buffers.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
SVGA3D_Z_D24X8,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8,
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL |
|
||||||
|
SVGA3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_V16U16,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_V16U16,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_BUMPMAP |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_G16R16,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_G16R16,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_A16B16G16R16,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_A16B16G16R16,
|
||||||
|
SVGA3DFORMAT_OP_TEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_CUBETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_VOLUMETEXTURE |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREENPLAIN |
|
||||||
|
SVGA3DFORMAT_OP_SAME_FORMAT_RENDERTARGET |
|
||||||
|
SVGA3DFORMAT_OP_OFFSCREEN_RENDERTARGET
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_UYVY,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_UYVY,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_YUY2,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_YUY2,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_NV12,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_NV12,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_AYUV,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_AYUV,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_BC4_UNORM,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_BC4_UNORM,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_BC5_UNORM,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_BC5_UNORM,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_Z_DF16,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_Z_DF16,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_Z_DF24,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_Z_DF24,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SVGA3D_Z_D24S8_INT,
|
||||||
|
SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get format capabilities from the host. It takes in consideration
|
||||||
|
* deprecated/unsupported formats, and formats which are implicitely assumed to
|
||||||
|
* be supported when the host does not provide an explicit capability entry.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
svga_get_format_cap(struct svga_screen *ss,
|
||||||
|
SVGA3dSurfaceFormat format,
|
||||||
|
SVGA3dSurfaceFormatCaps *caps)
|
||||||
|
{
|
||||||
|
const struct format_cap *entry;
|
||||||
|
|
||||||
|
for (entry = format_cap_table; entry < format_cap_table + Elements(format_cap_table); ++entry) {
|
||||||
|
if (entry->format == format) {
|
||||||
|
struct svga_winsys_screen *sws = ss->sws;
|
||||||
|
SVGA3dDevCapResult result;
|
||||||
|
|
||||||
|
if (sws->get_cap(sws, entry->index, &result)) {
|
||||||
|
/* Explicitly advertised format */
|
||||||
|
caps->value = result.u;
|
||||||
|
} else {
|
||||||
|
/* Implicitly advertised format -- use default caps */
|
||||||
|
caps->value = entry->defaultOperations;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unsupported format */
|
||||||
|
caps->value = 0;
|
||||||
|
}
|
||||||
49
src/gallium/drivers/svga/svga_format.h
Normal file
49
src/gallium/drivers/svga/svga_format.h
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
/**********************************************************
|
||||||
|
* Copyright 2011 VMware, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use, copy,
|
||||||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
* of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
**********************************************************/
|
||||||
|
|
||||||
|
#ifndef SVGA_FORMAT_H_
|
||||||
|
#define SVGA_FORMAT_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "svga_types.h"
|
||||||
|
#include "svga_reg.h"
|
||||||
|
#include "svga3d_reg.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct svga_screen;
|
||||||
|
|
||||||
|
|
||||||
|
enum SVGA3dSurfaceFormat
|
||||||
|
svga_translate_format(struct svga_screen *ss,
|
||||||
|
enum pipe_format format,
|
||||||
|
unsigned bind);
|
||||||
|
|
||||||
|
void
|
||||||
|
svga_get_format_cap(struct svga_screen *ss,
|
||||||
|
SVGA3dSurfaceFormat format,
|
||||||
|
SVGA3dSurfaceFormatCaps *caps);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SVGA_FORMAT_H_ */
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
|
||||||
|
#include "svga_format.h"
|
||||||
#include "svga_screen.h"
|
#include "svga_screen.h"
|
||||||
#include "svga_context.h"
|
#include "svga_context.h"
|
||||||
#include "svga_resource_texture.h"
|
#include "svga_resource_texture.h"
|
||||||
|
|
@ -48,89 +49,6 @@
|
||||||
#define SVGA3D_SURFACE_HINT_SCANOUT (1 << 9)
|
#define SVGA3D_SURFACE_HINT_SCANOUT (1 << 9)
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Helper function and arrays
|
|
||||||
*/
|
|
||||||
|
|
||||||
SVGA3dSurfaceFormat
|
|
||||||
svga_translate_format(struct svga_screen *ss,
|
|
||||||
enum pipe_format format,
|
|
||||||
unsigned bind)
|
|
||||||
{
|
|
||||||
switch(format) {
|
|
||||||
|
|
||||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
|
||||||
return SVGA3D_A8R8G8B8;
|
|
||||||
case PIPE_FORMAT_B8G8R8X8_UNORM:
|
|
||||||
return SVGA3D_X8R8G8B8;
|
|
||||||
|
|
||||||
/* Required for GL2.1:
|
|
||||||
*/
|
|
||||||
case PIPE_FORMAT_B8G8R8A8_SRGB:
|
|
||||||
return SVGA3D_A8R8G8B8;
|
|
||||||
|
|
||||||
case PIPE_FORMAT_B5G6R5_UNORM:
|
|
||||||
return SVGA3D_R5G6B5;
|
|
||||||
case PIPE_FORMAT_B5G5R5A1_UNORM:
|
|
||||||
return SVGA3D_A1R5G5B5;
|
|
||||||
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
|
||||||
return SVGA3D_A4R4G4B4;
|
|
||||||
|
|
||||||
|
|
||||||
/* XXX: Doesn't seem to work properly.
|
|
||||||
case PIPE_FORMAT_Z32_UNORM:
|
|
||||||
return SVGA3D_Z_D32;
|
|
||||||
*/
|
|
||||||
case PIPE_FORMAT_Z16_UNORM:
|
|
||||||
return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.z16 : SVGA3D_Z_D16;
|
|
||||||
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
|
|
||||||
return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.s8z24 : SVGA3D_Z_D24S8;
|
|
||||||
case PIPE_FORMAT_X8Z24_UNORM:
|
|
||||||
return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.x8z24 : SVGA3D_Z_D24X8;
|
|
||||||
|
|
||||||
case PIPE_FORMAT_A8_UNORM:
|
|
||||||
return SVGA3D_ALPHA8;
|
|
||||||
case PIPE_FORMAT_L8_UNORM:
|
|
||||||
return SVGA3D_LUMINANCE8;
|
|
||||||
|
|
||||||
case PIPE_FORMAT_DXT1_RGB:
|
|
||||||
case PIPE_FORMAT_DXT1_RGBA:
|
|
||||||
return SVGA3D_DXT1;
|
|
||||||
case PIPE_FORMAT_DXT3_RGBA:
|
|
||||||
return SVGA3D_DXT3;
|
|
||||||
case PIPE_FORMAT_DXT5_RGBA:
|
|
||||||
return SVGA3D_DXT5;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return SVGA3D_FORMAT_INVALID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SVGA3dSurfaceFormat
|
|
||||||
svga_translate_format_render(struct svga_screen *ss,
|
|
||||||
enum pipe_format format,
|
|
||||||
unsigned bind)
|
|
||||||
{
|
|
||||||
switch(format) {
|
|
||||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
|
||||||
case PIPE_FORMAT_B8G8R8X8_UNORM:
|
|
||||||
case PIPE_FORMAT_B5G5R5A1_UNORM:
|
|
||||||
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
|
||||||
case PIPE_FORMAT_B5G6R5_UNORM:
|
|
||||||
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
|
|
||||||
case PIPE_FORMAT_X8Z24_UNORM:
|
|
||||||
case PIPE_FORMAT_Z32_UNORM:
|
|
||||||
case PIPE_FORMAT_Z16_UNORM:
|
|
||||||
case PIPE_FORMAT_L8_UNORM:
|
|
||||||
return svga_translate_format(ss, format, bind);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return SVGA3D_FORMAT_INVALID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static INLINE void
|
static INLINE void
|
||||||
svga_transfer_dma_band(struct svga_context *svga,
|
svga_transfer_dma_band(struct svga_context *svga,
|
||||||
struct svga_transfer *st,
|
struct svga_transfer *st,
|
||||||
|
|
|
||||||
|
|
@ -126,15 +126,5 @@ svga_texture_from_handle(struct pipe_screen * screen,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
enum SVGA3dSurfaceFormat
|
|
||||||
svga_translate_format(struct svga_screen *ss,
|
|
||||||
enum pipe_format format,
|
|
||||||
unsigned bind);
|
|
||||||
|
|
||||||
enum SVGA3dSurfaceFormat
|
|
||||||
svga_translate_format_render(struct svga_screen *ss,
|
|
||||||
enum pipe_format format,
|
|
||||||
unsigned bind);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* SVGA_TEXTURE_H */
|
#endif /* SVGA_TEXTURE_H */
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_string.h"
|
#include "util/u_string.h"
|
||||||
|
|
||||||
|
#include "svga_format.h"
|
||||||
#include "svga_screen.h"
|
#include "svga_screen.h"
|
||||||
#include "svga_context.h"
|
#include "svga_context.h"
|
||||||
#include "svga_resource_texture.h"
|
#include "svga_resource_texture.h"
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
#include "svga_winsys.h"
|
#include "svga_winsys.h"
|
||||||
#include "svga_public.h"
|
#include "svga_public.h"
|
||||||
#include "svga_context.h"
|
#include "svga_context.h"
|
||||||
|
#include "svga_format.h"
|
||||||
#include "svga_screen.h"
|
#include "svga_screen.h"
|
||||||
#include "svga_resource_texture.h"
|
#include "svga_resource_texture.h"
|
||||||
#include "svga_resource.h"
|
#include "svga_resource.h"
|
||||||
|
|
@ -309,41 +310,6 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static INLINE SVGA3dDevCapIndex
|
|
||||||
svga_translate_format_cap(enum pipe_format format)
|
|
||||||
{
|
|
||||||
switch(format) {
|
|
||||||
|
|
||||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_A8R8G8B8;
|
|
||||||
case PIPE_FORMAT_B8G8R8X8_UNORM:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_X8R8G8B8;
|
|
||||||
|
|
||||||
case PIPE_FORMAT_B5G6R5_UNORM:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_R5G6B5;
|
|
||||||
case PIPE_FORMAT_B5G5R5A1_UNORM:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_A1R5G5B5;
|
|
||||||
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_A4R4G4B4;
|
|
||||||
|
|
||||||
case PIPE_FORMAT_A8_UNORM:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_ALPHA8;
|
|
||||||
case PIPE_FORMAT_L8_UNORM:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8;
|
|
||||||
|
|
||||||
case PIPE_FORMAT_DXT1_RGB:
|
|
||||||
case PIPE_FORMAT_DXT1_RGBA:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_DXT1;
|
|
||||||
case PIPE_FORMAT_DXT3_RGBA:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_DXT3;
|
|
||||||
case PIPE_FORMAT_DXT5_RGBA:
|
|
||||||
return SVGA3D_DEVCAP_SURFACEFMT_DXT5;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return SVGA3D_DEVCAP_MAX;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
svga_is_format_supported( struct pipe_screen *screen,
|
svga_is_format_supported( struct pipe_screen *screen,
|
||||||
|
|
@ -353,18 +319,32 @@ svga_is_format_supported( struct pipe_screen *screen,
|
||||||
unsigned tex_usage)
|
unsigned tex_usage)
|
||||||
{
|
{
|
||||||
struct svga_screen *ss = svga_screen(screen);
|
struct svga_screen *ss = svga_screen(screen);
|
||||||
struct svga_winsys_screen *sws = ss->sws;
|
SVGA3dSurfaceFormat svga_format;
|
||||||
SVGA3dDevCapIndex index;
|
SVGA3dSurfaceFormatCaps caps;
|
||||||
SVGA3dDevCapResult result;
|
SVGA3dSurfaceFormatCaps mask;
|
||||||
|
|
||||||
assert(tex_usage);
|
assert(tex_usage);
|
||||||
|
|
||||||
if (sample_count > 1)
|
if (sample_count > 1) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Override host capabilities */
|
svga_format = svga_translate_format(ss, format, tex_usage);
|
||||||
if (tex_usage & PIPE_BIND_RENDER_TARGET) {
|
if (svga_format == SVGA3D_FORMAT_INVALID) {
|
||||||
switch(format) {
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Override host capabilities, so that we end up with the same
|
||||||
|
* visuals for all virtual hardware implementations.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (tex_usage & PIPE_BIND_DISPLAY_TARGET) {
|
||||||
|
switch (svga_format) {
|
||||||
|
case SVGA3D_A8R8G8B8:
|
||||||
|
case SVGA3D_X8R8G8B8:
|
||||||
|
case SVGA3D_R5G6B5:
|
||||||
|
break;
|
||||||
|
|
||||||
/* Often unsupported/problematic. This means we end up with the same
|
/* Often unsupported/problematic. This means we end up with the same
|
||||||
* visuals for all virtual hardware implementations.
|
* visuals for all virtual hardware implementations.
|
||||||
|
|
@ -374,39 +354,28 @@ svga_is_format_supported( struct pipe_screen *screen,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to query the host */
|
/*
|
||||||
index = svga_translate_format_cap(format);
|
* Query the host capabilities.
|
||||||
if( index < SVGA3D_DEVCAP_MAX &&
|
*/
|
||||||
sws->get_cap(sws, index, &result) )
|
|
||||||
{
|
|
||||||
SVGA3dSurfaceFormatCaps mask;
|
|
||||||
|
|
||||||
mask.value = 0;
|
|
||||||
if (tex_usage & PIPE_BIND_RENDER_TARGET)
|
|
||||||
mask.offscreenRenderTarget = 1;
|
|
||||||
if (tex_usage & PIPE_BIND_DEPTH_STENCIL)
|
|
||||||
mask.zStencil = 1;
|
|
||||||
if (tex_usage & PIPE_BIND_SAMPLER_VIEW)
|
|
||||||
mask.texture = 1;
|
|
||||||
|
|
||||||
if ((result.u & mask.value) == mask.value)
|
svga_get_format_cap(ss, svga_format, &caps);
|
||||||
return TRUE;
|
|
||||||
else
|
mask.value = 0;
|
||||||
return FALSE;
|
if (tex_usage & PIPE_BIND_RENDER_TARGET) {
|
||||||
|
mask.offscreenRenderTarget = 1;
|
||||||
|
}
|
||||||
|
if (tex_usage & PIPE_BIND_DEPTH_STENCIL) {
|
||||||
|
mask.zStencil = 1;
|
||||||
|
}
|
||||||
|
if (tex_usage & PIPE_BIND_SAMPLER_VIEW) {
|
||||||
|
mask.texture = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use our translate functions directly rather than relying on a
|
return (caps.value & mask.value) == mask.value;
|
||||||
* duplicated list of supported formats which is prone to getting
|
|
||||||
* out of sync:
|
|
||||||
*/
|
|
||||||
if(tex_usage & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_DEPTH_STENCIL))
|
|
||||||
return svga_translate_format_render(ss, format, tex_usage) != SVGA3D_FORMAT_INVALID;
|
|
||||||
else
|
|
||||||
return svga_translate_format(ss, format, tex_usage) != SVGA3D_FORMAT_INVALID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -529,40 +498,41 @@ svga_screen_create(struct svga_winsys_screen *sws)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
{
|
{
|
||||||
|
boolean has_df16, has_df24, has_d24s8_int;
|
||||||
|
SVGA3dSurfaceFormatCaps caps;
|
||||||
SVGA3dSurfaceFormatCaps mask;
|
SVGA3dSurfaceFormatCaps mask;
|
||||||
mask.value = 0;
|
mask.value = 0;
|
||||||
mask.zStencil = 1;
|
mask.zStencil = 1;
|
||||||
mask.texture = 1;
|
mask.texture = 1;
|
||||||
|
|
||||||
svgascreen->depth.z16 =
|
svgascreen->depth.z16 = SVGA3D_Z_D16;
|
||||||
sws->get_cap(sws, SVGA3D_DEVCAP_SURFACEFMT_Z_D16, &result) &&
|
svgascreen->depth.x8z24 = SVGA3D_Z_D24X8;
|
||||||
(result.u & mask.value) == mask.value ?
|
svgascreen->depth.s8z24 = SVGA3D_Z_D24S8;
|
||||||
SVGA3D_Z_D16 : SVGA3D_FORMAT_INVALID;
|
|
||||||
svgascreen->depth.z16 =
|
|
||||||
sws->get_cap(sws, SVGA3D_DEVCAP_SURFACEFMT_Z_DF16, &result) &&
|
|
||||||
(result.u & mask.value) == mask.value ?
|
|
||||||
SVGA3D_Z_DF16 : svgascreen->depth.z16;
|
|
||||||
|
|
||||||
svgascreen->depth.x8z24 =
|
svga_get_format_cap(svgascreen, SVGA3D_Z_DF16, &caps);
|
||||||
sws->get_cap(sws, SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8, &result) &&
|
has_df16 = (caps.value & mask.value) == mask.value;
|
||||||
(result.u & mask.value) == mask.value ?
|
|
||||||
SVGA3D_Z_D24X8 : SVGA3D_FORMAT_INVALID;
|
|
||||||
svgascreen->depth.x8z24 =
|
|
||||||
sws->get_cap(sws, SVGA3D_DEVCAP_SURFACEFMT_Z_DF24, &result) &&
|
|
||||||
(result.u & mask.value) == mask.value ?
|
|
||||||
SVGA3D_Z_DF24 : svgascreen->depth.x8z24;
|
|
||||||
|
|
||||||
svgascreen->depth.s8z24 =
|
svga_get_format_cap(svgascreen, SVGA3D_Z_DF24, &caps);
|
||||||
sws->get_cap(sws, SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8, &result) &&
|
has_df24 = (caps.value & mask.value) == mask.value;
|
||||||
(result.u & mask.value) == mask.value ?
|
|
||||||
SVGA3D_Z_D24S8 : SVGA3D_FORMAT_INVALID;
|
svga_get_format_cap(svgascreen, SVGA3D_Z_D24S8_INT, &caps);
|
||||||
svgascreen->depth.s8z24 =
|
has_d24s8_int = (caps.value & mask.value) == mask.value;
|
||||||
sws->get_cap(sws, SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8_INT, &result) &&
|
|
||||||
(result.u & mask.value) == mask.value ?
|
/* XXX: We might want some other logic here.
|
||||||
SVGA3D_Z_D24S8_INT : svgascreen->depth.s8z24;
|
* Like if we only have d24s8_int we should
|
||||||
|
* emulate the other formats with that.
|
||||||
|
*/
|
||||||
|
if (has_df16) {
|
||||||
|
svgascreen->depth.z16 = SVGA3D_Z_DF16;
|
||||||
|
}
|
||||||
|
if (has_df24) {
|
||||||
|
svgascreen->depth.x8z24 = SVGA3D_Z_DF24;
|
||||||
|
}
|
||||||
|
if (has_d24s8_int) {
|
||||||
|
svgascreen->depth.s8z24 = SVGA3D_Z_D24S8_INT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
/* Shader model 2.0 is unsupported at the moment. */
|
/* Shader model 2.0 is unsupported at the moment. */
|
||||||
if(!svgascreen->use_ps30 || !svgascreen->use_vs30)
|
if(!svgascreen->use_ps30 || !svgascreen->use_vs30)
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@
|
||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
|
||||||
|
#include "svga_format.h"
|
||||||
#include "svga_screen.h"
|
#include "svga_screen.h"
|
||||||
#include "svga_context.h"
|
#include "svga_context.h"
|
||||||
#include "svga_resource_texture.h"
|
#include "svga_resource_texture.h"
|
||||||
|
|
@ -225,7 +226,6 @@ svga_create_surface(struct pipe_context *pipe,
|
||||||
|
|
||||||
if (!render) {
|
if (!render) {
|
||||||
flags = SVGA3D_SURFACE_HINT_TEXTURE;
|
flags = SVGA3D_SURFACE_HINT_TEXTURE;
|
||||||
format = svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage);
|
|
||||||
} else {
|
} else {
|
||||||
if (surf_tmpl->usage & PIPE_BIND_RENDER_TARGET) {
|
if (surf_tmpl->usage & PIPE_BIND_RENDER_TARGET) {
|
||||||
flags = SVGA3D_SURFACE_HINT_RENDERTARGET;
|
flags = SVGA3D_SURFACE_HINT_RENDERTARGET;
|
||||||
|
|
@ -233,9 +233,9 @@ svga_create_surface(struct pipe_context *pipe,
|
||||||
if (surf_tmpl->usage & PIPE_BIND_DEPTH_STENCIL) {
|
if (surf_tmpl->usage & PIPE_BIND_DEPTH_STENCIL) {
|
||||||
flags = SVGA3D_SURFACE_HINT_DEPTHSTENCIL;
|
flags = SVGA3D_SURFACE_HINT_DEPTHSTENCIL;
|
||||||
}
|
}
|
||||||
format = svga_translate_format_render(ss, surf_tmpl->format, surf_tmpl->usage);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
format = svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage);
|
||||||
assert(format != SVGA3D_FORMAT_INVALID);
|
assert(format != SVGA3D_FORMAT_INVALID);
|
||||||
|
|
||||||
if (svga_screen(screen)->debug.force_surface_view)
|
if (svga_screen(screen)->debug.force_surface_view)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue