diff options
| author | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2010-07-24 14:46:44 +0200 | 
|---|---|---|
| committer | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2010-07-24 14:48:19 +0200 | 
| commit | d7aac107e64e1c4c1af30806817a2888e7a4a96c (patch) | |
| tree | 304bf672761c828b7ca4959e05d4bc53eaf108a8 | |
| parent | f3af1201c578443dd0f72e73470dd1763888a41d (diff) | |
nv50: introduce the big formats table
| -rw-r--r-- | src/gallium/drivers/nv50/Makefile | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/SConscript | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_formats.c | 427 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_miptree.c | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_screen.c | 81 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_screen.h | 9 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_state_validate.c | 75 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_tex.c | 52 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_texture.h | 9 | ||||
| -rw-r--r-- | src/gallium/drivers/nv50/nv50_vbo.c | 100 | 
10 files changed, 486 insertions, 272 deletions
diff --git a/src/gallium/drivers/nv50/Makefile b/src/gallium/drivers/nv50/Makefile index 3943a9e257..bf1e8201a0 100644 --- a/src/gallium/drivers/nv50/Makefile +++ b/src/gallium/drivers/nv50/Makefile @@ -8,6 +8,7 @@ C_SOURCES = \  	nv50_clear.c \  	nv50_context.c \  	nv50_draw.c \ +	nv50_formats.c \  	nv50_miptree.c \  	nv50_query.c \  	nv50_resource.c \ diff --git a/src/gallium/drivers/nv50/SConscript b/src/gallium/drivers/nv50/SConscript index 8625f92622..e4a93c15ce 100644 --- a/src/gallium/drivers/nv50/SConscript +++ b/src/gallium/drivers/nv50/SConscript @@ -9,6 +9,7 @@ nv50 = env.ConvenienceLibrary(          'nv50_clear.c',          'nv50_context.c',          'nv50_draw.c', +        'nv50_formats.c',          'nv50_miptree.c',          'nv50_query.c',          'nv50_program.c', diff --git a/src/gallium/drivers/nv50/nv50_formats.c b/src/gallium/drivers/nv50/nv50_formats.c new file mode 100644 index 0000000000..5b65cdaa02 --- /dev/null +++ b/src/gallium/drivers/nv50/nv50_formats.c @@ -0,0 +1,427 @@ + +#include "nv50_screen.h" +#include "nv50_texture.h" +#include "nouveau/nouveau_class.h" +#include "pipe/p_defines.h" + +#define A_(cr, cg, cb, ca, t0, t1, t2, t3, sz, r)	    \ +   NV50TIC_0_0_MAPR_##cr | NV50TIC_0_0_TYPER_##t0 |         \ +   NV50TIC_0_0_MAPG_##cg | NV50TIC_0_0_TYPEG_##t1 |	    \ +   NV50TIC_0_0_MAPB_##cb | NV50TIC_0_0_TYPEB_##t2 |	    \ +   NV50TIC_0_0_MAPA_##ca | NV50TIC_0_0_TYPEA_##t3 |         \ +   NV50TIC_0_0_FMT_##sz,                                    \ +   NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_##sz |                \ +   NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_##t0 |                  \ +   (NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_##t0 << 3) | (r << 31) + +#define B_(cr, cg, cb, ca, t0, t1, t2, t3, sz, r)   \ +   NV50TIC_0_0_MAPR_##cr | NV50TIC_0_0_TYPER_##t0 | \ +   NV50TIC_0_0_MAPG_##cg | NV50TIC_0_0_TYPEG_##t1 | \ +   NV50TIC_0_0_MAPB_##cb | NV50TIC_0_0_TYPEB_##t2 | \ +   NV50TIC_0_0_MAPA_##ca | NV50TIC_0_0_TYPEA_##t3 | \ +   NV50TIC_0_0_FMT_##sz, 0 + +#define VERTEX_BUFFER PIPE_BIND_VERTEX_BUFFER +#define SAMPLER_VIEW  PIPE_BIND_SAMPLER_VIEW +#define RENDER_TARGET PIPE_BIND_RENDER_TARGET +#define DEPTH_STENCIL PIPE_BIND_DEPTH_STENCIL +#define SCANOUT       PIPE_BIND_SCANOUT + +/* for vertex buffers: */ +#define NV50TIC_0_0_FMT_8_8_8 NV50TIC_0_0_FMT_8_8_8_8 +#define NV50TIC_0_0_FMT_16_16_16 NV50TIC_0_0_FMT_16_16_16_16 +#define NV50TIC_0_0_FMT_32_32_32 NV50TIC_0_0_FMT_32_32_32_32 + +const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] = +{ +   /* COMMON FORMATS */ + +   [PIPE_FORMAT_B8G8R8A8_UNORM] = { NV50TCL_RT_FORMAT_A8R8G8B8_UNORM, +    A_(C2, C1, C0, C3, UNORM, UNORM, UNORM, UNORM, 8_8_8_8, 1), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET | SCANOUT }, + +   [PIPE_FORMAT_B8G8R8X8_UNORM] = { NV50TCL_RT_FORMAT_X8R8G8B8_UNORM, +    A_(C2, C1, C0, ONE, UNORM, UNORM, UNORM, UNORM, 8_8_8_8, 1), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET | SCANOUT }, + +   [PIPE_FORMAT_B8G8R8A8_SRGB] = { NV50TCL_RT_FORMAT_A8R8G8B8_SRGB, +    A_(C2, C1, C0, C3, UNORM, UNORM, UNORM, UNORM, 8_8_8_8, 1), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_B8G8R8X8_SRGB] = { NV50TCL_RT_FORMAT_X8R8G8B8_SRGB, +    A_(C2, C1, C0, ONE, UNORM, UNORM, UNORM, UNORM, 8_8_8_8, 1), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_B5G6R5_UNORM] = { NV50TCL_RT_FORMAT_R5G6B5_UNORM, +    B_(C2, C1, C0, ONE, UNORM, UNORM, UNORM, UNORM, 5_6_5, 1), +    SAMPLER_VIEW | RENDER_TARGET | SCANOUT }, + +   [PIPE_FORMAT_B5G5R5A1_UNORM] = { NV50TCL_RT_FORMAT_A1R5G5B5_UNORM, +    B_(C2, C1, C0, C3, UNORM, UNORM, UNORM, UNORM, 1_5_5_5, 1), +    SAMPLER_VIEW | RENDER_TARGET | SCANOUT }, + +   [PIPE_FORMAT_B4G4R4A4_UNORM] = { 0, +    B_(C2, C1, C0, C3, UNORM, UNORM, UNORM, UNORM, 4_4_4_4, 1), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_R10G10B10A2_UNORM] = { NV50TCL_RT_FORMAT_A2B10G10R10_UNORM, +    A_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, 2_10_10_10, 1), +    SAMPLER_VIEW | RENDER_TARGET | SCANOUT }, + +   [PIPE_FORMAT_B10G10R10A2_UNORM] = { NV50TCL_RT_FORMAT_A2R10G10B10_UNORM, +    A_(C2, C1, C0, C3, UNORM, UNORM, UNORM, UNORM, 2_10_10_10, 1), +    SAMPLER_VIEW | RENDER_TARGET }, + +   /* DEPTH/STENCIL FORMATS */ + +   [PIPE_FORMAT_Z16_UNORM] = { NV50TCL_ZETA_FORMAT_Z16_UNORM, +    B_(C0, C0, C0, ONE, UNORM, UINT, UINT, UINT, 16_DEPTH, 0), +    SAMPLER_VIEW | DEPTH_STENCIL }, + +   [PIPE_FORMAT_Z24_UNORM_S8_USCALED] = { NV50TCL_ZETA_FORMAT_S8Z24_UNORM, +    B_(C0, C0, C0, ONE, UNORM, UINT, UINT, UINT, 8_24, 0), +    SAMPLER_VIEW | DEPTH_STENCIL }, + +   [PIPE_FORMAT_Z24X8_UNORM] = { NV50TCL_ZETA_FORMAT_X8Z24_UNORM, +    B_(C0, C0, C0, ONE, UNORM, UINT, UINT, UINT, 8_24, 0), +    SAMPLER_VIEW | DEPTH_STENCIL }, + +   [PIPE_FORMAT_S8_USCALED_Z24_UNORM] = { NV50TCL_ZETA_FORMAT_S8Z24_UNORM, +    B_(C1, C1, C1, ONE, UINT, UNORM, UINT, UINT, 24_8, 0), +    SAMPLER_VIEW | DEPTH_STENCIL }, + +   [PIPE_FORMAT_Z32_FLOAT] = { NV50TCL_ZETA_FORMAT_Z32_FLOAT, +    B_(C0, C0, C0, ONE, FLOAT, UINT, UINT, UINT, 32_DEPTH, 0), +    SAMPLER_VIEW | DEPTH_STENCIL }, + +   [PIPE_FORMAT_Z32_FLOAT_S8X24_USCALED] = { +    NV50TCL_ZETA_FORMAT_Z32_FLOAT_X24S8_UNORM, +    B_(C0, C0, C0, ONE, FLOAT, UINT, UINT, UINT, 32_8, 0), +    SAMPLER_VIEW | DEPTH_STENCIL }, + +   /* LUMINANCE, ALPHA, INTENSITY */ + +   [PIPE_FORMAT_L8_UNORM] = { 0, +    A_(C0, C0, C0, ONE, UNORM, UNORM, UNORM, UNORM, 8, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_L8_SRGB] = { 0, +    A_(C0, C0, C0, ONE, UNORM, UNORM, UNORM, UNORM, 8, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_I8_UNORM] = { 0, +    A_(C0, C0, C0, C0, UNORM, UNORM, UNORM, UNORM, 8, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_A8_UNORM] = { NV50TCL_RT_FORMAT_A8_UNORM, +    A_(ZERO, ZERO, ZERO, C0, UNORM, UNORM, UNORM, UNORM, 8, 0), +    SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_L8A8_UNORM] = { 0, +    A_(C0, C0, C0, C1, UNORM, UNORM, UNORM, UNORM, 8_8, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_L8A8_SRGB] = { 0, +    A_(C0, C0, C0, C1, UNORM, UNORM, UNORM, UNORM, 8_8, 0), +    SAMPLER_VIEW }, + +   /* DXT, RGTC */ + +   [PIPE_FORMAT_DXT1_RGB] = { 0, +    B_(C0, C1, C2, ONE, UNORM, UNORM, UNORM, UNORM, DXT1, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_DXT1_RGBA] = { 0, +    B_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, DXT1, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_DXT3_RGBA] = { 0, +    B_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, DXT3, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_DXT5_RGBA] = { 0, +    B_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, DXT5, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_RGTC1_UNORM] = { 0, +    B_(C0, ZERO, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, RGTC1, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_RGTC2_UNORM] = { 0, +    B_(C0, C1, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, RGTC2, 0), +    SAMPLER_VIEW }, + +   [PIPE_FORMAT_RGTC2_SNORM] = { 0, +    B_(C0, C1, ZERO, ONE, SNORM, SNORM, SNORM, SNORM, RGTC2, 0), +    SAMPLER_VIEW }, + +   /* FLOAT 16 */ + +   [PIPE_FORMAT_R16G16B16A16_FLOAT] = { NV50TCL_RT_FORMAT_R16G16B16A16_FLOAT, +    A_(C0, C1, C2, C3, FLOAT, FLOAT, FLOAT, FLOAT, 16_16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R16G16B16_FLOAT] = { NV50TCL_RT_FORMAT_R16G16B16X16_FLOAT, +    A_(C0, C1, C2, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R16G16_FLOAT] = { NV50TCL_RT_FORMAT_R16G16_FLOAT, +    A_(C0, C1, ZERO, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R16_FLOAT] = { NV50TCL_RT_FORMAT_R16_FLOAT, +    A_(C0, ZERO, ZERO, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   /* FLOAT 32 */ + +   [PIPE_FORMAT_R32G32B32A32_FLOAT] = { NV50TCL_RT_FORMAT_R32G32B32A32_FLOAT, +    A_(C0, C1, C2, C3, FLOAT, FLOAT, FLOAT, FLOAT, 32_32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R32G32B32_FLOAT] = { NV50TCL_RT_FORMAT_R32G32B32X32_FLOAT, +    A_(C0, C1, C2, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R32G32_FLOAT] = { NV50TCL_RT_FORMAT_R32G32_FLOAT, +    A_(C0, C1, ZERO, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R32_FLOAT] = { NV50TCL_RT_FORMAT_R32_FLOAT, +    A_(C0, ZERO, ZERO, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   /* ODD FORMATS */ + +   [PIPE_FORMAT_R11G11B10_FLOAT] = { NV50TCL_RT_FORMAT_B10G11R11_FLOAT, +    B_(C0, C1, C2, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 10_11_11, 0), +    SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R9G9B9E5_FLOAT] = { 0, +    B_(C0, C1, C2, ONE, FLOAT, FLOAT, FLOAT, FLOAT, 5_9_9_9, 0), +    SAMPLER_VIEW }, + +   /* SNORM 32 */ + +   [PIPE_FORMAT_R32G32B32A32_SNORM] = { 0, +    A_(C0, C1, C2, C3, FLOAT, FLOAT, FLOAT, FLOAT, 32_32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32B32_SNORM] = { 0, +    A_(C0, C1, C2, ONE, SNORM, SNORM, SNORM, SNORM, 32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32_SNORM] = { 0, +    A_(C0, C1, ZERO, ONE, SNORM, SNORM, SNORM, SNORM, 32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32_SNORM] = { 0, +    A_(C0, ZERO, ZERO, ONE, SNORM, SNORM, SNORM, SNORM, 32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* UNORM 32 */ + +   [PIPE_FORMAT_R32G32B32A32_UNORM] = { 0, +    A_(C0, C1, C2, C3, FLOAT, FLOAT, FLOAT, FLOAT, 32_32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32B32_UNORM] = { 0, +    A_(C0, C1, C2, ONE, UNORM, UNORM, UNORM, UNORM, 32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32_UNORM] = { 0, +    A_(C0, C1, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, 32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32_UNORM] = { 0, +    A_(C0, ZERO, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, 32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* SNORM 16 */ + +   [PIPE_FORMAT_R16G16B16A16_SNORM] = { NV50TCL_RT_FORMAT_R16G16B16A16_SNORM, +    A_(C0, C1, C2, C3, SNORM, SNORM, SNORM, SNORM, 16_16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R16G16B16_SNORM] = { 0, +    A_(C0, C1, C2, ONE, SNORM, SNORM, SNORM, SNORM, 16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16G16_SNORM] = { NV50TCL_RT_FORMAT_R16G16_SNORM, +    A_(C0, C1, C2, C3, SNORM, SNORM, SNORM, SNORM, 16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R16_SNORM] = { 0, +    A_(C0, ZERO, ZERO, ONE, SNORM, SNORM, SNORM, SNORM, 16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* UNORM 16 */ + +   [PIPE_FORMAT_R16G16B16A16_UNORM] = { NV50TCL_RT_FORMAT_R16G16B16A16_UNORM, +    A_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, 16_16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R16G16B16_UNORM] = { 0, +    A_(C0, C1, C2, ONE, UNORM, UNORM, UNORM, UNORM, 16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16G16_UNORM] = { NV50TCL_RT_FORMAT_R16G16_UNORM, +    A_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, 16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R16_UNORM] = { 0, +    A_(C0, ZERO, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, 16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* SNORM 8 */ + +   [PIPE_FORMAT_R8G8B8A8_SNORM] = { NV50TCL_RT_FORMAT_A8B8G8R8_SNORM, +    A_(C0, C1, C2, C3, SNORM, SNORM, SNORM, SNORM, 8_8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R8G8B8_SNORM] = { 0, +    A_(C0, C1, C2, ONE, SNORM, SNORM, SNORM, SNORM, 8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R8G8_SNORM] = { NV50TCL_RT_FORMAT_R8G8_SNORM, +    A_(C0, C1, ZERO, ONE, SNORM, SNORM, SNORM, SNORM, 8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R8_SNORM] = { NV50TCL_RT_FORMAT_R8_SNORM, +    A_(C0, ZERO, ZERO, ONE, SNORM, SNORM, SNORM, SNORM, 8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   /* UNORM 8 */ + +   [PIPE_FORMAT_R8G8B8A8_UNORM] = { NV50TCL_RT_FORMAT_A8B8G8R8_UNORM, +    A_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, 8_8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R8G8B8A8_SRGB] = { NV50TCL_RT_FORMAT_A8B8G8R8_SRGB, +    A_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, 8_8_8_8, 0), +    SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R8G8B8_UNORM] = { NV50TCL_RT_FORMAT_X8B8G8R8_UNORM, +    A_(C0, C1, C2, ONE, UNORM, UNORM, UNORM, UNORM, 8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R8G8B8_SRGB] = { NV50TCL_RT_FORMAT_X8B8G8R8_SRGB, +    A_(C0, C1, C2, ONE, UNORM, UNORM, UNORM, UNORM, 8_8_8, 0), +    SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R8G8_UNORM] = { NV50TCL_RT_FORMAT_R8G8_UNORM, +    A_(C0, C1, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, 8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   [PIPE_FORMAT_R8_UNORM] = { NV50TCL_RT_FORMAT_R8_UNORM, +    A_(C0, ZERO, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, 8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET }, + +   /* SSCALED 32 */ + +   [PIPE_FORMAT_R32G32B32A32_SSCALED] = { 0, +    A_(C0, C1, C2, C3, SSCALED, SSCALED, SSCALED, SSCALED, 32_32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32B32_SSCALED] = { 0, +    A_(C0, C1, C2, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32_SSCALED] = { 0, +    A_(C0, C1, ZERO, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32_SSCALED] = { 0, +    A_(C0, ZERO, ZERO, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* USCALED 32 */ + +   [PIPE_FORMAT_R32G32B32A32_USCALED] = { 0, +    A_(C0, C1, C2, C3, USCALED, USCALED, USCALED, USCALED, 32_32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32B32_USCALED] = { 0, +    A_(C0, C1, C2, ONE, USCALED, USCALED, USCALED, USCALED, 32_32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32G32_USCALED] = { 0, +    A_(C0, C1, ZERO, ONE, USCALED, USCALED, USCALED, USCALED, 32_32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R32_USCALED] = { 0, +    A_(C0, ZERO, ZERO, ONE, USCALED, USCALED, USCALED, USCALED, 32, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* SSCALED 16 */ + +   [PIPE_FORMAT_R16G16B16A16_SSCALED] = { 0, +    A_(C0, C1, C2, C3, SSCALED, SSCALED, SSCALED, SSCALED, 16_16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16G16B16_SSCALED] = { 0, +    A_(C0, C1, C2, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16G16_SSCALED] = { 0, +    A_(C0, C1, ZERO, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16_SSCALED] = { 0, +    A_(C0, ZERO, ZERO, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* USCALED 16 */ + +   [PIPE_FORMAT_R16G16B16A16_USCALED] = { 0, +    A_(C0, C1, C2, C3, USCALED, USCALED, USCALED, USCALED, 16_16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16G16B16_USCALED] = { 0, +    A_(C0, C1, C2, ONE, USCALED, USCALED, USCALED, USCALED, 16_16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16G16_USCALED] = { 0, +    A_(C0, C1, ZERO, ONE, USCALED, USCALED, USCALED, USCALED, 16_16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R16_USCALED] = { 0, +    A_(C0, ZERO, ZERO, ONE, USCALED, USCALED, USCALED, USCALED, 16, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* SSCALED 8 */ + +   [PIPE_FORMAT_R8G8B8A8_SSCALED] = { 0, +    A_(C0, C1, C2, C3, SSCALED, SSCALED, SSCALED, SSCALED, 8_8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R8G8B8_SSCALED] = { 0, +    A_(C0, C1, C2, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R8G8_SSCALED] = { 0, +    A_(C0, C1, ZERO, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R8_SSCALED] = { 0, +    A_(C0, ZERO, ZERO, ONE, SSCALED, SSCALED, SSCALED, SSCALED, 8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   /* USCALED 8 */ + +   [PIPE_FORMAT_R8G8B8A8_USCALED] = { 0, +    A_(C0, C1, C2, C3, USCALED, USCALED, USCALED, USCALED, 8_8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R8G8B8_USCALED] = { 0, +    A_(C0, C1, C2, ONE, USCALED, USCALED, USCALED, USCALED, 8_8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R8G8_USCALED] = { 0, +    A_(C0, C1, ZERO, ONE, USCALED, USCALED, USCALED, USCALED, 8_8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, + +   [PIPE_FORMAT_R8_USCALED] = { 0, +    A_(C0, ZERO, ZERO, ONE, USCALED, USCALED, USCALED, USCALED, 8, 0), +    VERTEX_BUFFER | SAMPLER_VIEW }, +}; diff --git a/src/gallium/drivers/nv50/nv50_miptree.c b/src/gallium/drivers/nv50/nv50_miptree.c index b7cd92158f..12b5ad106c 100644 --- a/src/gallium/drivers/nv50/nv50_miptree.c +++ b/src/gallium/drivers/nv50/nv50_miptree.c @@ -159,6 +159,9 @@ nv50_miptree_create(struct pipe_screen *pscreen, const struct pipe_resource *tmp  	case PIPE_FORMAT_Z24_UNORM_S8_USCALED:  		tile_flags = 0x2800;  		break; +	case PIPE_FORMAT_Z32_FLOAT_S8X24_USCALED: +		tile_flags = 0xe000; +		break;  	case PIPE_FORMAT_R32G32B32A32_FLOAT:  	case PIPE_FORMAT_R32G32B32_FLOAT:  		tile_flags = 0x7400; diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c index ca4b01b12b..e0c06c29ba 100644 --- a/src/gallium/drivers/nv50/nv50_screen.c +++ b/src/gallium/drivers/nv50/nv50_screen.c @@ -34,75 +34,38 @@ nv50_screen_is_format_supported(struct pipe_screen *pscreen,  				enum pipe_format format,  				enum pipe_texture_target target,  				unsigned sample_count, -				unsigned tex_usage, unsigned geom_flags) +				unsigned usage, unsigned geom_flags)  {  	if (sample_count > 1)  		return FALSE; -	if (tex_usage & PIPE_BIND_RENDER_TARGET) { +	if (!util_format_s3tc_enabled) {  		switch (format) { -		case PIPE_FORMAT_B8G8R8X8_UNORM: -		case PIPE_FORMAT_B8G8R8A8_UNORM: -		case PIPE_FORMAT_B5G6R5_UNORM: -		case PIPE_FORMAT_R16G16B16A16_SNORM: -		case PIPE_FORMAT_R16G16B16A16_UNORM: -		case PIPE_FORMAT_R32G32B32A32_FLOAT: -		case PIPE_FORMAT_R16G16_SNORM: -		case PIPE_FORMAT_R16G16_UNORM: -			return TRUE; -		default: -			break; -		} -	} else -	if (tex_usage & PIPE_BIND_DEPTH_STENCIL) { -		switch (format) { -		case PIPE_FORMAT_Z32_FLOAT: -		case PIPE_FORMAT_S8_USCALED_Z24_UNORM: -		case PIPE_FORMAT_Z24X8_UNORM: -		case PIPE_FORMAT_Z24_UNORM_S8_USCALED: -			return TRUE; -		default: -			break; -		} -	} else { -		if (tex_usage & PIPE_BIND_SAMPLER_VIEW) { -			switch (format) { -			case PIPE_FORMAT_DXT1_RGB: -			case PIPE_FORMAT_DXT1_RGBA: -			case PIPE_FORMAT_DXT3_RGBA: -			case PIPE_FORMAT_DXT5_RGBA: -				return util_format_s3tc_enabled; -			default: -				break; -			} -		} -		switch (format) { -		case PIPE_FORMAT_B8G8R8A8_UNORM: -		case PIPE_FORMAT_B8G8R8X8_UNORM: -		case PIPE_FORMAT_B8G8R8A8_SRGB: -		case PIPE_FORMAT_B8G8R8X8_SRGB: -		case PIPE_FORMAT_B5G5R5A1_UNORM: -		case PIPE_FORMAT_B4G4R4A4_UNORM: -		case PIPE_FORMAT_B5G6R5_UNORM: -		case PIPE_FORMAT_L8_UNORM: -		case PIPE_FORMAT_A8_UNORM: -		case PIPE_FORMAT_I8_UNORM: -		case PIPE_FORMAT_L8A8_UNORM: -		case PIPE_FORMAT_S8_USCALED_Z24_UNORM: -		case PIPE_FORMAT_Z24_UNORM_S8_USCALED: -		case PIPE_FORMAT_Z32_FLOAT: -		case PIPE_FORMAT_R16G16B16A16_SNORM: -		case PIPE_FORMAT_R16G16B16A16_UNORM: -		case PIPE_FORMAT_R32G32B32A32_FLOAT: -		case PIPE_FORMAT_R16G16_SNORM: -		case PIPE_FORMAT_R16G16_UNORM: -			return TRUE; +		case PIPE_FORMAT_DXT1_RGB: +		case PIPE_FORMAT_DXT1_RGBA: +		case PIPE_FORMAT_DXT3_RGBA: +		case PIPE_FORMAT_DXT5_RGBA: +			return FALSE;  		default:  			break;  		}  	} -	return FALSE; +	switch (format) { +	case PIPE_FORMAT_Z16_UNORM: +		if ((nouveau_screen(pscreen)->device->chipset & 0xf0) != 0xa0) +			return FALSE; +		break; +	default: +		break; +	} + +	/* transfers & shared are always supported */ +	usage &= ~(PIPE_BIND_TRANSFER_READ | +		   PIPE_BIND_TRANSFER_WRITE | +		   PIPE_BIND_SHARED); + +	return (nv50_format_table[format].usage & usage) == usage;  }  static int diff --git a/src/gallium/drivers/nv50/nv50_screen.h b/src/gallium/drivers/nv50/nv50_screen.h index fbf15a7596..a491ba31b2 100644 --- a/src/gallium/drivers/nv50/nv50_screen.h +++ b/src/gallium/drivers/nv50/nv50_screen.h @@ -38,4 +38,13 @@ nv50_screen(struct pipe_screen *screen)  extern void nv50_screen_relocs(struct nv50_screen *); +struct nv50_format { +	uint32_t rt; +	uint32_t tic; +	uint32_t vtx; +	uint32_t usage; +}; + +extern const struct nv50_format nv50_format_table[]; +  #endif diff --git a/src/gallium/drivers/nv50/nv50_state_validate.c b/src/gallium/drivers/nv50/nv50_state_validate.c index 8d662d8f60..f1d8202dff 100644 --- a/src/gallium/drivers/nv50/nv50_state_validate.c +++ b/src/gallium/drivers/nv50/nv50_state_validate.c @@ -56,6 +56,8 @@ validate_fb(struct nv50_context *nv50)  			assert(h == fb->cbufs[i]->height);  		} +		assert(nv50_format_table[fb->cbufs[i]->format].rt); +  		so_method(so, tesla, NV50TCL_RT_HORIZ(i), 2);  		so_data  (so, fb->cbufs[i]->width);  		so_data  (so, fb->cbufs[i]->height); @@ -65,42 +67,9 @@ validate_fb(struct nv50_context *nv50)  			      NOUVEAU_BO_HIGH | NOUVEAU_BO_RDWR, 0, 0);  		so_reloc (so, bo, fb->cbufs[i]->offset, NOUVEAU_BO_VRAM |  			      NOUVEAU_BO_LOW | NOUVEAU_BO_RDWR, 0, 0); -		switch (fb->cbufs[i]->format) { -		case PIPE_FORMAT_B8G8R8A8_UNORM: -			so_data(so, NV50TCL_RT_FORMAT_A8R8G8B8_UNORM); -			break; -		case PIPE_FORMAT_B8G8R8X8_UNORM: -			so_data(so, NV50TCL_RT_FORMAT_X8R8G8B8_UNORM); -			break; -		case PIPE_FORMAT_B5G6R5_UNORM: -			so_data(so, NV50TCL_RT_FORMAT_R5G6B5_UNORM); -			break; -		case PIPE_FORMAT_R16G16B16A16_SNORM: -			so_data(so, NV50TCL_RT_FORMAT_R16G16B16A16_SNORM); -			break; -		case PIPE_FORMAT_R16G16B16A16_UNORM: -			so_data(so, NV50TCL_RT_FORMAT_R16G16B16A16_UNORM); -			break; -		case PIPE_FORMAT_R16G16B16A16_FLOAT: -			so_data(so, NV50TCL_RT_FORMAT_R16G16B16A16_FLOAT); -			break; -		case PIPE_FORMAT_R32G32B32A32_FLOAT: -			so_data(so, NV50TCL_RT_FORMAT_R32G32B32A32_FLOAT); -			break; -		case PIPE_FORMAT_R16G16_SNORM: -			so_data(so, NV50TCL_RT_FORMAT_R16G16_SNORM); -			break; -		case PIPE_FORMAT_R16G16_UNORM: -			so_data(so, NV50TCL_RT_FORMAT_R16G16_UNORM); -			break; -		default: -			NOUVEAU_ERR("AIIII unknown format %s\n", -			            util_format_name(fb->cbufs[i]->format)); -			so_data(so, NV50TCL_RT_FORMAT_X8R8G8B8_UNORM); -			break; -		} -		so_data(so, nv50_miptree(pt)-> -				level[fb->cbufs[i]->level].tile_mode << 4); +		so_data  (so, nv50_format_table[fb->cbufs[i]->format].rt); +		so_data  (so, nv50_miptree(pt)-> +			      level[fb->cbufs[i]->level].tile_mode << 4);  		so_data(so, 0x00000000);  		so_method(so, tesla, NV50TCL_RT_ARRAY_MODE, 1); @@ -120,39 +89,17 @@ validate_fb(struct nv50_context *nv50)  			assert(h == fb->zsbuf->height);  		} +		assert(nv50_format_table[fb->zsbuf->format].rt); +  		so_method(so, tesla, NV50TCL_ZETA_ADDRESS_HIGH, 5);  		so_reloc (so, bo, fb->zsbuf->offset, NOUVEAU_BO_VRAM |  			      NOUVEAU_BO_HIGH | NOUVEAU_BO_RDWR, 0, 0);  		so_reloc (so, bo, fb->zsbuf->offset, NOUVEAU_BO_VRAM |  			      NOUVEAU_BO_LOW | NOUVEAU_BO_RDWR, 0, 0); -		switch (fb->zsbuf->format) { -		case PIPE_FORMAT_Z24_UNORM_S8_USCALED: -			so_data(so, NV50TCL_ZETA_FORMAT_S8Z24_UNORM); -			break; -		case PIPE_FORMAT_Z24X8_UNORM: -			so_data(so, NV50TCL_ZETA_FORMAT_X8Z24_UNORM); -			break; -		case PIPE_FORMAT_S8_USCALED_Z24_UNORM: -			so_data(so, NV50TCL_ZETA_FORMAT_Z24S8_UNORM); -			break; -		case PIPE_FORMAT_Z32_FLOAT: -			so_data(so, NV50TCL_ZETA_FORMAT_Z32_FLOAT); -			break; -		case PIPE_FORMAT_Z32_FLOAT_S8X24_USCALED: -			so_data(so, NV50TCL_ZETA_FORMAT_Z32_FLOAT_X24S8_UNORM); -			break; -		case PIPE_FORMAT_Z16_UNORM: -			so_data(so, NV50TCL_ZETA_FORMAT_Z16_UNORM); -			break; -		default: -			NOUVEAU_ERR("AIIII unknown format %s\n", -			            util_format_name(fb->zsbuf->format)); -			so_data(so, NV50TCL_ZETA_FORMAT_S8Z24_UNORM); -			break; -		} -		so_data(so, nv50_miptree(pt)-> -				level[fb->zsbuf->level].tile_mode << 4); -		so_data(so, 0x00000000); +		so_data  (so, nv50_format_table[fb->zsbuf->format].rt); +		so_data  (so, nv50_miptree(pt)-> +			      level[fb->zsbuf->level].tile_mode << 4); +		so_data  (so, 0x00000000);  		so_method(so, tesla, NV50TCL_ZETA_ENABLE, 1);  		so_data  (so, 1); diff --git a/src/gallium/drivers/nv50/nv50_tex.c b/src/gallium/drivers/nv50/nv50_tex.c index 5ea0c1d726..5535818370 100644 --- a/src/gallium/drivers/nv50/nv50_tex.c +++ b/src/gallium/drivers/nv50/nv50_tex.c @@ -29,56 +29,6 @@  #include "util/u_format.h" -#define _MIXED(pf, t0, t1, t2, t3, cr, cg, cb, ca, f)		\ -[PIPE_FORMAT_##pf] = (						\ -	NV50TIC_0_0_MAPR_##cr | NV50TIC_0_0_TYPER_##t0 |	\ -	NV50TIC_0_0_MAPG_##cg | NV50TIC_0_0_TYPEG_##t1 |	\ -	NV50TIC_0_0_MAPB_##cb | NV50TIC_0_0_TYPEB_##t2 |	\ -	NV50TIC_0_0_MAPA_##ca | NV50TIC_0_0_TYPEA_##t3 |	\ -	NV50TIC_0_0_FMT_##f) - -#define _(pf, t, cr, cg, cb, ca, f) _MIXED(pf, t, t, t, t, cr, cg, cb, ca, f) - -static const uint32_t nv50_texture_formats[PIPE_FORMAT_COUNT] = -{ -	_(B8G8R8A8_UNORM, UNORM, C2, C1, C0, C3,  8_8_8_8), -	_(B8G8R8A8_SRGB,  UNORM, C2, C1, C0, C3,  8_8_8_8), -	_(B8G8R8X8_UNORM, UNORM, C2, C1, C0, ONE, 8_8_8_8), -	_(B8G8R8X8_SRGB,  UNORM, C2, C1, C0, ONE, 8_8_8_8), -	_(B5G5R5A1_UNORM, UNORM, C2, C1, C0, C3,  1_5_5_5), -	_(B4G4R4A4_UNORM, UNORM, C2, C1, C0, C3,  4_4_4_4), - -	_(B5G6R5_UNORM, UNORM, C2, C1, C0, ONE, 5_6_5), - -	_(L8_UNORM, UNORM, C0, C0, C0, ONE, 8), -	_(L8_SRGB,  UNORM, C0, C0, C0, ONE, 8), -	_(A8_UNORM, UNORM, ZERO, ZERO, ZERO, C0, 8), -	_(I8_UNORM, UNORM, C0, C0, C0, C0, 8), - -	_(L8A8_UNORM, UNORM, C0, C0, C0, C1, 8_8), -	_(L8A8_SRGB,  UNORM, C0, C0, C0, C1, 8_8), - -	_(DXT1_RGB, UNORM, C0, C1, C2, ONE, DXT1), -	_(DXT1_RGBA, UNORM, C0, C1, C2, C3, DXT1), -	_(DXT3_RGBA, UNORM, C0, C1, C2, C3, DXT3), -	_(DXT5_RGBA, UNORM, C0, C1, C2, C3, DXT5), - -	_MIXED(S8_USCALED_Z24_UNORM, UINT, UNORM, UINT, UINT, C1, C1, C1, ONE, 24_8), -	_MIXED(Z24_UNORM_S8_USCALED, UNORM, UINT, UINT, UINT, C0, C0, C0, ONE, 8_24), - -	_(R16G16B16A16_SNORM, UNORM, C0, C1, C2, C3, 16_16_16_16), -	_(R16G16B16A16_UNORM, SNORM, C0, C1, C2, C3, 16_16_16_16), -	_(R32G32B32A32_FLOAT, FLOAT, C0, C1, C2, C3, 32_32_32_32), - -	_(R16G16_SNORM, SNORM, C0, C1, ZERO, ONE, 16_16), -	_(R16G16_UNORM, UNORM, C0, C1, ZERO, ONE, 16_16), - -	_MIXED(Z32_FLOAT, FLOAT, UINT, UINT, UINT, C0, C0, C0, ONE, 32_DEPTH) -}; - -#undef _ -#undef _MIXED -  static INLINE uint32_t  nv50_tic_swizzle(uint32_t tc, unsigned swz)  { @@ -106,7 +56,7 @@ nv50_tex_construct(struct nv50_sampler_view *view)  	struct nv50_miptree *mt = nv50_miptree(view->pipe.texture);  	uint32_t swz[4], *tic = view->tic; -	tic[0] = nv50_texture_formats[view->pipe.format]; +	tic[0] = nv50_format_table[view->pipe.format].tic;  	swz[0] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_r);  	swz[1] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_g); diff --git a/src/gallium/drivers/nv50/nv50_texture.h b/src/gallium/drivers/nv50/nv50_texture.h index 3475d3e432..b4939943e8 100644 --- a/src/gallium/drivers/nv50/nv50_texture.h +++ b/src/gallium/drivers/nv50/nv50_texture.h @@ -45,24 +45,32 @@  #define NV50TIC_0_0_TYPEA_SNORM                                   0x00008000  #define NV50TIC_0_0_TYPEA_SINT                                    0x00018000  #define NV50TIC_0_0_TYPEA_UINT                                    0x00020000 +#define NV50TIC_0_0_TYPEA_SSCALED                                 0x00028000 +#define NV50TIC_0_0_TYPEA_USCALED                                 0x00030000  #define NV50TIC_0_0_TYPEA_FLOAT                                   0x00038000  #define NV50TIC_0_0_TYPEB_MASK                                    0x00007000  #define NV50TIC_0_0_TYPEB_UNORM                                   0x00002000  #define NV50TIC_0_0_TYPEB_SNORM                                   0x00001000  #define NV50TIC_0_0_TYPEB_SINT                                    0x00003000  #define NV50TIC_0_0_TYPEB_UINT                                    0x00004000 +#define NV50TIC_0_0_TYPEB_SSCALED                                 0x00005000 +#define NV50TIC_0_0_TYPEB_USCALED                                 0x00006000  #define NV50TIC_0_0_TYPEB_FLOAT                                   0x00007000  #define NV50TIC_0_0_TYPEG_MASK                                    0x00000e00  #define NV50TIC_0_0_TYPEG_UNORM                                   0x00000400  #define NV50TIC_0_0_TYPEG_SNORM                                   0x00000200  #define NV50TIC_0_0_TYPEG_SINT                                    0x00000600  #define NV50TIC_0_0_TYPEG_UINT                                    0x00000800 +#define NV50TIC_0_0_TYPEG_SSCALED                                 0x00000a00 +#define NV50TIC_0_0_TYPEG_USCALED                                 0x00000c00  #define NV50TIC_0_0_TYPEG_FLOAT                                   0x00000e00  #define NV50TIC_0_0_TYPER_MASK                                    0x000001c0  #define NV50TIC_0_0_TYPER_UNORM                                   0x00000080  #define NV50TIC_0_0_TYPER_SNORM                                   0x00000040  #define NV50TIC_0_0_TYPER_SINT                                    0x000000c0  #define NV50TIC_0_0_TYPER_UINT                                    0x00000100 +#define NV50TIC_0_0_TYPER_SSCALED                                 0x00000140 +#define NV50TIC_0_0_TYPER_USCALED                                 0x00000180  #define NV50TIC_0_0_TYPER_FLOAT                                   0x000001c0  #define NV50TIC_0_0_FMT_MASK                                      0x0000003f  #define NV50TIC_0_0_FMT_32_32_32_32                               0x00000001 @@ -90,6 +98,7 @@  #define NV50TIC_0_0_FMT_8_24                                      0x0000002a  #define NV50TIC_0_0_FMT_32_DEPTH                                  0x0000002f  #define NV50TIC_0_0_FMT_32_8                                      0x00000030 +#define NV50TIC_0_0_FMT_16_DEPTH                                  0x0000003a  #define NV50TIC_0_1_OFFSET_LOW_MASK                               0xffffffff  #define NV50TIC_0_1_OFFSET_LOW_SHIFT                                       0 diff --git a/src/gallium/drivers/nv50/nv50_vbo.c b/src/gallium/drivers/nv50/nv50_vbo.c index 996844b18f..4fe0df5683 100644 --- a/src/gallium/drivers/nv50/nv50_vbo.c +++ b/src/gallium/drivers/nv50/nv50_vbo.c @@ -29,99 +29,6 @@  #include "nv50_context.h"  #include "nv50_resource.h" -/* VERTEX_ARRAY_ATTRIB_TYPE is duplicated for unknown reason */ -#define NV50_VAT(x) ((x) | ((x) << 3)) - -static INLINE uint32_t -nv50_vbo_type_to_hw(enum pipe_format format) -{ -	const struct util_format_description *desc; - -	desc = util_format_description(format); -	assert(desc); - -	switch (desc->channel[0].type) { -	case UTIL_FORMAT_TYPE_FLOAT: -		return NV50_VAT(NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_FLOAT); -	case UTIL_FORMAT_TYPE_UNSIGNED: -		if (desc->channel[0].normalized) { -			return NV50_VAT(NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_UNORM); -		} -		return NV50_VAT(NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_USCALED); -	case UTIL_FORMAT_TYPE_SIGNED: -		if (desc->channel[0].normalized) { -			return NV50_VAT(NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_SNORM); -		} -		return NV50_VAT(NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_SSCALED); -	/* -	case PIPE_FORMAT_TYPE_UINT: -		return NV50_VAT(NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_UINT); -	case PIPE_FORMAT_TYPE_SINT: -		return NV50_VAT(NV50TCL_VERTEX_ARRAY_ATTRIB_TYPE_SINT); */ -	default: -		return 0; -	} -} - -static INLINE uint32_t -nv50_vbo_size_to_hw(unsigned size, unsigned nr_c) -{ -	static const uint32_t hw_values[] = { -		0, 0, 0, 0, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_8, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_8_8, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_8_8_8, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_8_8_8_8, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_16, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_16_16, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_16_16_16, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_16_16_16_16, -		0, 0, 0, 0, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_32, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_32_32, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_32_32_32, -		NV50TCL_VERTEX_ARRAY_ATTRIB_FORMAT_32_32_32_32 }; - -	/* we'd also have R11G11B10 and R10G10B10A2 */ - -	assert(nr_c > 0 && nr_c <= 4); - -	if (size > 32) -		return 0; -	size >>= (3 - 2); - -	return hw_values[size + (nr_c - 1)]; -} - -static INLINE uint32_t -nv50_vbo_vtxelt_to_hw(struct pipe_vertex_element *ve) -{ -	uint32_t hw_type, hw_size; -	enum pipe_format pf = ve->src_format; -	const struct util_format_description *desc; -	unsigned size, nr_components; - -	desc = util_format_description(pf); -	assert(desc); - -	size = util_format_get_component_bits(pf, UTIL_FORMAT_COLORSPACE_RGB, 0); -	nr_components = util_format_get_nr_components(pf); - -	hw_type = nv50_vbo_type_to_hw(pf); -	hw_size = nv50_vbo_size_to_hw(size, nr_components); - -	if (!hw_type || !hw_size) { -		NOUVEAU_ERR("unsupported vbo format: %s\n", util_format_name(pf)); -		abort(); -		return 0x24e80000; -	} - -	if (desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_Z) /* BGRA */ -		hw_size |= (1 << 31); /* no real swizzle bits :-( */ - -	return (hw_type | hw_size); -} -  struct instance {  	struct nouveau_bo *bo;  	unsigned delta; @@ -543,11 +450,8 @@ nv50_vtxelt_construct(struct nv50_vtxelt_stateobj *cso)  {  	unsigned i; -	for (i = 0; i < cso->num_elements; ++i) { -		struct pipe_vertex_element *ve = &cso->pipe[i]; - -		cso->hw[i] = nv50_vbo_vtxelt_to_hw(ve); -	} +	for (i = 0; i < cso->num_elements; ++i) +		cso->hw[i] = nv50_format_table[cso->pipe[i].src_format].vtx;  }  struct nouveau_stateobj *  | 
