virgl: fix format conversion for recent gallium changes.
authorDave Airlie <airlied@redhat.com>
Thu, 22 Aug 2019 06:30:11 +0000 (16:30 +1000)
committerGert Wollny <gw.fossdev@gmail.com>
Mon, 26 Aug 2019 06:35:00 +0000 (06:35 +0000)
The virgl formats are fixed in time snapshots of the gallium ones,
we just need to provide a translation table between them when
we enter the hardware.

This fixes a regression since Eric renumbered the gallium table.

Fixes: c45c33a5a2 (gallium: Remove manual defining of PIPE_FORMAT enum values.)
Bugzilla: https://bugs.freedesktop.org/111454

v1 by Dave Airlie <airlied@redhat.com>
v2: virgl: Add a number of formats to the table that are used, e.g. for vertex
    attributes
v3: cover some more missing formats from a piglit run

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
src/gallium/drivers/virgl/virgl_encode.c
src/gallium/drivers/virgl/virgl_encode.h
src/gallium/drivers/virgl/virgl_hw.h
src/gallium/drivers/virgl/virgl_screen.c
src/gallium/drivers/virgl/virgl_texture.c
src/gallium/drivers/virgl/virgl_winsys.h
src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c

index 0489f0880127504ffab5d5c327198f0b7817b50c..096b7e9b0266a5646fcb4d8cb5beb8b2424fea6b 100644 (file)
 
 #define VIRGL_ENCODE_MAX_DWORDS MIN2(VIRGL_MAX_CMDBUF_DWORDS, VIRGL_CMD0_MAX_DWORDS)
 
+#define CONV_FORMAT(f) [PIPE_FORMAT_##f] = VIRGL_FORMAT_##f,
+
+static const enum virgl_formats virgl_formats_conv_table[PIPE_FORMAT_COUNT] = {
+   CONV_FORMAT(B8G8R8A8_UNORM)
+   CONV_FORMAT(B8G8R8X8_UNORM)
+   CONV_FORMAT(A8R8G8B8_UNORM)
+   CONV_FORMAT(X8R8G8B8_UNORM)
+   CONV_FORMAT(B5G5R5A1_UNORM)
+   CONV_FORMAT(B4G4R4A4_UNORM)
+   CONV_FORMAT(B5G6R5_UNORM)
+   CONV_FORMAT(R10G10B10A2_UNORM)
+   CONV_FORMAT(L8_UNORM)
+   CONV_FORMAT(A8_UNORM)
+   CONV_FORMAT(L8A8_UNORM)
+   CONV_FORMAT(L16_UNORM)
+   CONV_FORMAT(Z16_UNORM)
+   CONV_FORMAT(Z32_UNORM)
+   CONV_FORMAT(Z32_FLOAT)
+   CONV_FORMAT(Z24_UNORM_S8_UINT)
+   CONV_FORMAT(S8_UINT_Z24_UNORM)
+   CONV_FORMAT(Z24X8_UNORM)
+   CONV_FORMAT(X8Z24_UNORM)
+   CONV_FORMAT(S8_UINT)
+   CONV_FORMAT(R64_FLOAT)
+   CONV_FORMAT(R64G64_FLOAT)
+   CONV_FORMAT(R64G64B64_FLOAT)
+   CONV_FORMAT(R64G64B64A64_FLOAT)
+   CONV_FORMAT(R32_FLOAT)
+   CONV_FORMAT(R32G32_FLOAT)
+   CONV_FORMAT(R32G32B32_FLOAT)
+   CONV_FORMAT(R32G32B32A32_FLOAT)
+   CONV_FORMAT(R32_UNORM)
+   CONV_FORMAT(R32G32_UNORM)
+   CONV_FORMAT(R32G32B32_UNORM)
+   CONV_FORMAT(R32G32B32A32_UNORM)
+   CONV_FORMAT(R32_USCALED)
+   CONV_FORMAT(R32G32_USCALED)
+   CONV_FORMAT(R32G32B32_USCALED)
+   CONV_FORMAT(R32G32B32A32_USCALED)
+   CONV_FORMAT(R32_SNORM)
+   CONV_FORMAT(R32G32_SNORM)
+   CONV_FORMAT(R32G32B32_SNORM)
+   CONV_FORMAT(R32G32B32A32_SNORM)
+   CONV_FORMAT(R32_SSCALED)
+   CONV_FORMAT(R32G32_SSCALED)
+   CONV_FORMAT(R32G32B32_SSCALED)
+   CONV_FORMAT(R32G32B32A32_SSCALED)
+   CONV_FORMAT(R16_UNORM)
+   CONV_FORMAT(R16G16_UNORM)
+   CONV_FORMAT(R16G16B16_UNORM)
+   CONV_FORMAT(R16G16B16A16_UNORM)
+   CONV_FORMAT(R16_USCALED)
+   CONV_FORMAT(R16G16_USCALED)
+   CONV_FORMAT(R16G16B16_USCALED)
+   CONV_FORMAT(R16G16B16A16_USCALED)
+   CONV_FORMAT(R16_SNORM)
+   CONV_FORMAT(R16G16_SNORM)
+   CONV_FORMAT(R16G16B16_SNORM)
+   CONV_FORMAT(R16G16B16A16_SNORM)
+   CONV_FORMAT(R16_SSCALED)
+   CONV_FORMAT(R16G16_SSCALED)
+   CONV_FORMAT(R16G16B16_SSCALED)
+   CONV_FORMAT(R16G16B16A16_SSCALED)
+   CONV_FORMAT(R8_UNORM)
+   CONV_FORMAT(R8G8_UNORM)
+   CONV_FORMAT(R8G8B8_UNORM)
+   CONV_FORMAT(R8G8B8A8_UNORM)
+   CONV_FORMAT(R8_USCALED)
+   CONV_FORMAT(R8G8_USCALED)
+   CONV_FORMAT(R8G8B8_USCALED)
+   CONV_FORMAT(R8G8B8A8_USCALED)
+   CONV_FORMAT(R8_SNORM)
+   CONV_FORMAT(R8G8_SNORM)
+   CONV_FORMAT(R8G8B8_SNORM)
+   CONV_FORMAT(R8G8B8A8_SNORM)
+   CONV_FORMAT(R8_SSCALED)
+   CONV_FORMAT(R8G8_SSCALED)
+   CONV_FORMAT(R8G8B8_SSCALED)
+   CONV_FORMAT(R8G8B8A8_SSCALED)
+   CONV_FORMAT(R16_FLOAT)
+   CONV_FORMAT(R16G16_FLOAT)
+   CONV_FORMAT(R16G16B16_FLOAT)
+   CONV_FORMAT(R16G16B16A16_FLOAT)
+   CONV_FORMAT(L8_SRGB)
+   CONV_FORMAT(L8A8_SRGB)
+   CONV_FORMAT(R8G8B8_SRGB)
+   CONV_FORMAT(A8B8G8R8_SRGB)
+   CONV_FORMAT(X8B8G8R8_SRGB)
+   CONV_FORMAT(B8G8R8A8_SRGB)
+   CONV_FORMAT(B8G8R8X8_SRGB)
+   CONV_FORMAT(A8R8G8B8_SRGB)
+   CONV_FORMAT(X8R8G8B8_SRGB)
+   CONV_FORMAT(R8G8B8A8_SRGB)
+   CONV_FORMAT(DXT1_RGB)
+   CONV_FORMAT(DXT1_RGBA)
+   CONV_FORMAT(DXT3_RGBA)
+   CONV_FORMAT(DXT5_RGBA)
+   CONV_FORMAT(DXT1_SRGB)
+   CONV_FORMAT(DXT1_SRGBA)
+   CONV_FORMAT(DXT3_SRGBA)
+   CONV_FORMAT(DXT5_SRGBA)
+   CONV_FORMAT(RGTC1_UNORM)
+   CONV_FORMAT(RGTC1_SNORM)
+   CONV_FORMAT(RGTC2_UNORM)
+   CONV_FORMAT(RGTC2_SNORM)
+   CONV_FORMAT(A8B8G8R8_UNORM)
+   CONV_FORMAT(B5G5R5X1_UNORM)
+   CONV_FORMAT(R10G10B10A2_USCALED)
+   CONV_FORMAT(R11G11B10_FLOAT)
+   CONV_FORMAT(R9G9B9E5_FLOAT)
+   CONV_FORMAT(Z32_FLOAT_S8X24_UINT)
+   CONV_FORMAT(B10G10R10A2_UNORM)
+   CONV_FORMAT(R8G8B8X8_UNORM)
+   CONV_FORMAT(B4G4R4X4_UNORM)
+   CONV_FORMAT(X24S8_UINT)
+   CONV_FORMAT(S8X24_UINT)
+   CONV_FORMAT(X32_S8X24_UINT)
+   CONV_FORMAT(B2G3R3_UNORM)
+   CONV_FORMAT(L16A16_UNORM)
+   CONV_FORMAT(A16_UNORM)
+   CONV_FORMAT(I16_UNORM)
+   CONV_FORMAT(LATC1_UNORM)
+   CONV_FORMAT(LATC1_SNORM)
+   CONV_FORMAT(LATC2_UNORM)
+   CONV_FORMAT(LATC2_SNORM)
+   CONV_FORMAT(A8_SNORM)
+   CONV_FORMAT(L8_SNORM)
+   CONV_FORMAT(L8A8_SNORM)
+   CONV_FORMAT(A16_SNORM)
+   CONV_FORMAT(L16_SNORM)
+   CONV_FORMAT(L16A16_SNORM)
+   CONV_FORMAT(A16_FLOAT)
+   CONV_FORMAT(L16_FLOAT)
+   CONV_FORMAT(L16A16_FLOAT)
+   CONV_FORMAT(A32_FLOAT)
+   CONV_FORMAT(L32_FLOAT)
+   CONV_FORMAT(L32A32_FLOAT)
+   CONV_FORMAT(YV12)
+   CONV_FORMAT(YV16)
+   CONV_FORMAT(IYUV)
+   CONV_FORMAT(NV12)
+   CONV_FORMAT(NV21)
+   CONV_FORMAT(R8_UINT)
+   CONV_FORMAT(R8G8_UINT)
+   CONV_FORMAT(R8G8B8_UINT)
+   CONV_FORMAT(R8G8B8A8_UINT)
+   CONV_FORMAT(R8_SINT)
+   CONV_FORMAT(R8G8_SINT)
+   CONV_FORMAT(R8G8B8_SINT)
+   CONV_FORMAT(R8G8B8A8_SINT)
+   CONV_FORMAT(R16_UINT)
+   CONV_FORMAT(R16G16_UINT)
+   CONV_FORMAT(R16G16B16_UINT)
+   CONV_FORMAT(R16G16B16A16_UINT)
+   CONV_FORMAT(R16_SINT)
+   CONV_FORMAT(R16G16_SINT)
+   CONV_FORMAT(R16G16B16_SINT)
+   CONV_FORMAT(R16G16B16A16_SINT)
+   CONV_FORMAT(R32_UINT)
+   CONV_FORMAT(R32G32_UINT)
+   CONV_FORMAT(R32G32B32_UINT)
+   CONV_FORMAT(R32G32B32A32_UINT)
+   CONV_FORMAT(R32_SINT)
+   CONV_FORMAT(R32G32_SINT)
+   CONV_FORMAT(R32G32B32_SINT)
+   CONV_FORMAT(R32G32B32A32_SINT)
+   CONV_FORMAT(A8_UINT)
+   CONV_FORMAT(L8_UINT)
+   CONV_FORMAT(L8A8_UINT)
+   CONV_FORMAT(A8_SINT)
+   CONV_FORMAT(L8_SINT)
+   CONV_FORMAT(L8A8_SINT)
+   CONV_FORMAT(A16_UINT)
+   CONV_FORMAT(L16_UINT)
+   CONV_FORMAT(L16A16_UINT)
+   CONV_FORMAT(A16_SINT)
+   CONV_FORMAT(L16_SINT)
+   CONV_FORMAT(L16A16_SINT)
+   CONV_FORMAT(A32_UINT)
+   CONV_FORMAT(L32_UINT)
+   CONV_FORMAT(L32A32_UINT)
+   CONV_FORMAT(A32_SINT)
+   CONV_FORMAT(L32_SINT)
+   CONV_FORMAT(L32A32_SINT)
+   CONV_FORMAT(R10G10B10A2_SSCALED)
+   CONV_FORMAT(R10G10B10A2_SNORM)
+   CONV_FORMAT(B10G10R10A2_SNORM)
+   CONV_FORMAT(B10G10R10A2_UINT)
+   CONV_FORMAT(R8G8B8X8_SNORM)
+   CONV_FORMAT(R8G8B8X8_SRGB)
+   CONV_FORMAT(R8G8B8X8_UINT)
+   CONV_FORMAT(R8G8B8X8_SINT)
+   CONV_FORMAT(B10G10R10X2_UNORM)
+   CONV_FORMAT(R16G16B16X16_UNORM)
+   CONV_FORMAT(R16G16B16X16_SNORM)
+   CONV_FORMAT(R16G16B16X16_FLOAT)
+   CONV_FORMAT(R16G16B16X16_UINT)
+   CONV_FORMAT(R16G16B16X16_SINT)
+   CONV_FORMAT(R32G32B32X32_FLOAT)
+   CONV_FORMAT(R32G32B32X32_UINT)
+   CONV_FORMAT(R32G32B32X32_SINT)
+   CONV_FORMAT(R10G10B10A2_UINT)
+   CONV_FORMAT(BPTC_RGBA_UNORM)
+   CONV_FORMAT(BPTC_SRGBA)
+   CONV_FORMAT(BPTC_RGB_FLOAT)
+   CONV_FORMAT(BPTC_RGB_UFLOAT)
+   CONV_FORMAT(R10G10B10X2_UNORM)
+   CONV_FORMAT(A4B4G4R4_UNORM)
+   CONV_FORMAT(R8_SRGB)
+};
+
+enum virgl_formats pipe_to_virgl_format(enum pipe_format format)
+{
+   enum virgl_formats vformat = virgl_formats_conv_table[format];
+   if (format != PIPE_FORMAT_NONE && !vformat)
+      debug_printf("VIRGL: pipe format %s not in the format table\n", util_format_name(format));
+   return vformat;
+}
+
 static int virgl_encoder_write_cmd_dword(struct virgl_context *ctx,
                                         uint32_t dword)
 {
@@ -401,7 +620,7 @@ int virgl_encoder_create_vertex_elements(struct virgl_context *ctx,
       virgl_encoder_write_dword(ctx->cbuf, element[i].src_offset);
       virgl_encoder_write_dword(ctx->cbuf, element[i].instance_divisor);
       virgl_encoder_write_dword(ctx->cbuf, element[i].vertex_buffer_index);
-      virgl_encoder_write_dword(ctx->cbuf, element[i].src_format);
+      virgl_encoder_write_dword(ctx->cbuf, pipe_to_virgl_format(element[i].src_format));
    }
    return 0;
 }
@@ -488,7 +707,7 @@ int virgl_encoder_create_surface(struct virgl_context *ctx,
    virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_CREATE_OBJECT, VIRGL_OBJECT_SURFACE, VIRGL_OBJ_SURFACE_SIZE));
    virgl_encoder_write_dword(ctx->cbuf, handle);
    virgl_encoder_write_res(ctx, res);
-   virgl_encoder_write_dword(ctx->cbuf, templat->format);
+   virgl_encoder_write_dword(ctx->cbuf, pipe_to_virgl_format(templat->format));
 
    assert(templat->texture->target != PIPE_BUFFER);
    virgl_encoder_write_dword(ctx->cbuf, templat->u.tex.level);
@@ -649,7 +868,7 @@ int virgl_encode_sampler_view(struct virgl_context *ctx,
    unsigned elem_size = util_format_get_blocksize(state->format);
    struct virgl_screen *rs = virgl_screen(ctx->base.screen);
    uint32_t tmp;
-   uint32_t dword_fmt_target = state->format;
+   uint32_t dword_fmt_target = pipe_to_virgl_format(state->format);
    virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_CREATE_OBJECT, VIRGL_OBJECT_SAMPLER_VIEW, VIRGL_OBJ_SAMPLER_VIEW_SIZE));
    virgl_encoder_write_dword(ctx->cbuf, handle);
    virgl_encoder_write_res(ctx, res);
@@ -846,7 +1065,7 @@ int virgl_encode_blit(struct virgl_context *ctx,
 
    virgl_encoder_write_res(ctx, dst_res);
    virgl_encoder_write_dword(ctx->cbuf, blit->dst.level);
-   virgl_encoder_write_dword(ctx->cbuf, blit->dst.format);
+   virgl_encoder_write_dword(ctx->cbuf, pipe_to_virgl_format(blit->dst.format));
    virgl_encoder_write_dword(ctx->cbuf, blit->dst.box.x);
    virgl_encoder_write_dword(ctx->cbuf, blit->dst.box.y);
    virgl_encoder_write_dword(ctx->cbuf, blit->dst.box.z);
@@ -856,7 +1075,7 @@ int virgl_encode_blit(struct virgl_context *ctx,
 
    virgl_encoder_write_res(ctx, src_res);
    virgl_encoder_write_dword(ctx->cbuf, blit->src.level);
-   virgl_encoder_write_dword(ctx->cbuf, blit->src.format);
+   virgl_encoder_write_dword(ctx->cbuf, pipe_to_virgl_format(blit->src.format));
    virgl_encoder_write_dword(ctx->cbuf, blit->src.box.x);
    virgl_encoder_write_dword(ctx->cbuf, blit->src.box.y);
    virgl_encoder_write_dword(ctx->cbuf, blit->src.box.z);
@@ -1046,7 +1265,7 @@ int virgl_encode_set_shader_images(struct virgl_context *ctx,
    for (i = 0; i < count; i++) {
       if (images && images[i].resource) {
          struct virgl_resource *res = virgl_resource(images[i].resource);
-         virgl_encoder_write_dword(ctx->cbuf, images[i].format);
+         virgl_encoder_write_dword(ctx->cbuf, pipe_to_virgl_format(images[i].format));
          virgl_encoder_write_dword(ctx->cbuf, images[i].access);
          virgl_encoder_write_dword(ctx->cbuf, images[i].u.buf.offset);
          virgl_encoder_write_dword(ctx->cbuf, images[i].u.buf.size);
index a46ee2169176a2d115b067ea4ff9a4a429707b2b..3a12f9e935c73645d2d1a8f33a669657bcebc910 100644 (file)
@@ -300,4 +300,5 @@ void virgl_encode_end_transfers(struct virgl_cmd_buf *buf);
 
 int virgl_encode_tweak(struct virgl_context *ctx, enum vrend_tweak_type tweak, uint32_t value);
 
+enum virgl_formats pipe_to_virgl_format(enum pipe_format format);
 #endif
index e23a6194a9dccea07ff66797a842db5ff0f10001..cfa89e2e2aa3de6d2d1c4ec9e797b6a6716baa32 100644 (file)
@@ -51,32 +51,74 @@ enum virgl_formats {
    VIRGL_FORMAT_Z24_UNORM_S8_UINT       = 19,
    VIRGL_FORMAT_S8_UINT_Z24_UNORM       = 20,
    VIRGL_FORMAT_Z24X8_UNORM             = 21,
+   VIRGL_FORMAT_X8Z24_UNORM             = 22,
    VIRGL_FORMAT_S8_UINT                 = 23,   /**< ubyte stencil */
-
+   VIRGL_FORMAT_R64_FLOAT               = 24,
+   VIRGL_FORMAT_R64G64_FLOAT            = 25,
+   VIRGL_FORMAT_R64G64B64_FLOAT         = 26,
+   VIRGL_FORMAT_R64G64B64A64_FLOAT      = 27,
    VIRGL_FORMAT_R32_FLOAT               = 28,
    VIRGL_FORMAT_R32G32_FLOAT            = 29,
    VIRGL_FORMAT_R32G32B32_FLOAT         = 30,
    VIRGL_FORMAT_R32G32B32A32_FLOAT      = 31,
 
+   VIRGL_FORMAT_R32_UNORM               = 32,
+   VIRGL_FORMAT_R32G32_UNORM            = 33,
+   VIRGL_FORMAT_R32G32B32_UNORM         = 34,
+   VIRGL_FORMAT_R32G32B32A32_UNORM      = 35,
+   VIRGL_FORMAT_R32_USCALED             = 36,
+   VIRGL_FORMAT_R32G32_USCALED          = 37,
+   VIRGL_FORMAT_R32G32B32_USCALED       = 38,
+   VIRGL_FORMAT_R32G32B32A32_USCALED    = 39,
+   VIRGL_FORMAT_R32_SNORM               = 40,
+   VIRGL_FORMAT_R32G32_SNORM            = 41,
+   VIRGL_FORMAT_R32G32B32_SNORM         = 42,
+   VIRGL_FORMAT_R32G32B32A32_SNORM      = 43,
+   VIRGL_FORMAT_R32_SSCALED             = 44,
+   VIRGL_FORMAT_R32G32_SSCALED          = 45,
+   VIRGL_FORMAT_R32G32B32_SSCALED       = 46,
+   VIRGL_FORMAT_R32G32B32A32_SSCALED    = 47,
+
    VIRGL_FORMAT_R16_UNORM               = 48,
    VIRGL_FORMAT_R16G16_UNORM            = 49,
-
+   VIRGL_FORMAT_R16G16B16_UNORM         = 50,
    VIRGL_FORMAT_R16G16B16A16_UNORM      = 51,
 
+   VIRGL_FORMAT_R16_USCALED             = 52,
+   VIRGL_FORMAT_R16G16_USCALED          = 53,
+   VIRGL_FORMAT_R16G16B16_USCALED       = 54,
+   VIRGL_FORMAT_R16G16B16A16_USCALED    = 55,
+
    VIRGL_FORMAT_R16_SNORM               = 56,
    VIRGL_FORMAT_R16G16_SNORM            = 57,
+   VIRGL_FORMAT_R16G16B16_SNORM         = 58,
    VIRGL_FORMAT_R16G16B16A16_SNORM      = 59,
 
+   VIRGL_FORMAT_R16_SSCALED             = 60,
+   VIRGL_FORMAT_R16G16_SSCALED          = 61,
+   VIRGL_FORMAT_R16G16B16_SSCALED       = 62,
+   VIRGL_FORMAT_R16G16B16A16_SSCALED    = 63,
+
    VIRGL_FORMAT_R8_UNORM                = 64,
    VIRGL_FORMAT_R8G8_UNORM              = 65,
-
+   VIRGL_FORMAT_R8G8B8_UNORM            = 66,
    VIRGL_FORMAT_R8G8B8A8_UNORM          = 67,
 
+   VIRGL_FORMAT_R8_USCALED              = 69,
+   VIRGL_FORMAT_R8G8_USCALED            = 70,
+   VIRGL_FORMAT_R8G8B8_USCALED          = 71,
+   VIRGL_FORMAT_R8G8B8A8_USCALED        = 72,
+
    VIRGL_FORMAT_R8_SNORM                = 74,
    VIRGL_FORMAT_R8G8_SNORM              = 75,
    VIRGL_FORMAT_R8G8B8_SNORM            = 76,
    VIRGL_FORMAT_R8G8B8A8_SNORM          = 77,
 
+   VIRGL_FORMAT_R8_SSCALED              = 82,
+   VIRGL_FORMAT_R8G8_SSCALED            = 83,
+   VIRGL_FORMAT_R8G8B8_SSCALED          = 84,
+   VIRGL_FORMAT_R8G8B8A8_SSCALED        = 85,
+
    VIRGL_FORMAT_R16_FLOAT               = 91,
    VIRGL_FORMAT_R16G16_FLOAT            = 92,
    VIRGL_FORMAT_R16G16B16_FLOAT         = 93,
@@ -84,8 +126,13 @@ enum virgl_formats {
 
    VIRGL_FORMAT_L8_SRGB                 = 95,
    VIRGL_FORMAT_L8A8_SRGB               = 96,
+   VIRGL_FORMAT_R8G8B8_SRGB             = 97,
+   VIRGL_FORMAT_A8B8G8R8_SRGB           = 98,
+   VIRGL_FORMAT_X8B8G8R8_SRGB           = 99,
    VIRGL_FORMAT_B8G8R8A8_SRGB           = 100,
    VIRGL_FORMAT_B8G8R8X8_SRGB           = 101,
+   VIRGL_FORMAT_A8R8G8B8_SRGB           = 102,
+   VIRGL_FORMAT_X8R8G8B8_SRGB           = 103,
    VIRGL_FORMAT_R8G8B8A8_SRGB           = 104,
 
    /* compressed formats */
@@ -108,6 +155,7 @@ enum virgl_formats {
 
    VIRGL_FORMAT_A8B8G8R8_UNORM          = 121,
    VIRGL_FORMAT_B5G5R5X1_UNORM          = 122,
+   VIRGL_FORMAT_R10G10B10A2_USCALED     = 123,
    VIRGL_FORMAT_R11G11B10_FLOAT         = 124,
    VIRGL_FORMAT_R9G9B9E5_FLOAT          = 125,
    VIRGL_FORMAT_Z32_FLOAT_S8X24_UINT    = 126,
@@ -117,10 +165,17 @@ enum virgl_formats {
    VIRGL_FORMAT_B4G4R4X4_UNORM          = 135,
    VIRGL_FORMAT_X24S8_UINT              = 136,
    VIRGL_FORMAT_S8X24_UINT              = 137,
+   VIRGL_FORMAT_X32_S8X24_UINT          = 138,
    VIRGL_FORMAT_B2G3R3_UNORM            = 139,
 
    VIRGL_FORMAT_L16A16_UNORM            = 140,
    VIRGL_FORMAT_A16_UNORM               = 141,
+   VIRGL_FORMAT_I16_UNORM               = 142,
+
+   VIRGL_FORMAT_LATC1_UNORM             = 143,
+   VIRGL_FORMAT_LATC1_SNORM             = 144,
+   VIRGL_FORMAT_LATC2_UNORM             = 145,
+   VIRGL_FORMAT_LATC2_SNORM             = 146,
 
    VIRGL_FORMAT_A8_SNORM                = 147,
    VIRGL_FORMAT_L8_SNORM                = 148,
@@ -144,6 +199,10 @@ enum virgl_formats {
    VIRGL_FORMAT_NV12                    = 166,
    VIRGL_FORMAT_NV21                    = 167,
 
+   VIRGL_FORMAT_R10G10B10A2_SSCALED     = 172,
+   VIRGL_FORMAT_R10G10B10A2_SNORM       = 173,
+   VIRGL_FORMAT_B10G10R10A2_SNORM       = 176,
+
    VIRGL_FORMAT_R8_UINT                 = 177,
    VIRGL_FORMAT_R8G8_UINT               = 178,
    VIRGL_FORMAT_R8G8B8_UINT             = 179,
@@ -210,6 +269,9 @@ enum virgl_formats {
    VIRGL_FORMAT_R16G16B16X16_FLOAT      = 236,
    VIRGL_FORMAT_R16G16B16X16_UINT       = 237,
    VIRGL_FORMAT_R16G16B16X16_SINT       = 238,
+   VIRGL_FORMAT_R32G32B32X32_FLOAT      = 239,
+   VIRGL_FORMAT_R32G32B32X32_UINT       = 240,
+   VIRGL_FORMAT_R32G32B32X32_SINT       = 241,
 
    VIRGL_FORMAT_R10G10B10A2_UINT        = 253,
 
index f4b7a66003bdb33ce52276614fe17225495a7557..fc898ff46256084a2b3c9ea009f4d3e995379848 100644 (file)
@@ -610,8 +610,9 @@ virgl_format_check_bitmask(enum pipe_format format,
                            uint32_t bitmask[16],
                            bool may_emulate_bgra)
 {
-   int big = format / 32;
-   int small = format % 32;
+   enum virgl_formats vformat = pipe_to_virgl_format(format);
+   int big = vformat / 32;
+   int small = vformat % 32;
    if ((bitmask[big] & (1 << small)))
       return true;
 
@@ -626,8 +627,9 @@ virgl_format_check_bitmask(enum pipe_format format,
          return false;
       }
 
-      big = format / 32;
-      small = format % 32;
+      vformat = pipe_to_virgl_format(format);
+      big = vformat / 32;
+      small = vformat % 32;
       if (bitmask[big] & (1 << small))
          return true;
    }
index 792ddc50ff9705ac734d510bc13fb2bd05e0a193..570f96fb14ca90fb6cdc19fc42449eee19addbbb 100644 (file)
@@ -130,7 +130,7 @@ static void *texture_transfer_map_resolve(struct pipe_context *ctx,
       return NULL;
 
    enum pipe_format fmt = resource->format;
-   if (!virgl_has_readback_format(ctx->screen, fmt)) {
+   if (!virgl_has_readback_format(ctx->screen, pipe_to_virgl_format(fmt))) {
       if (util_format_fits_8unorm(util_format_description(fmt)))
          fmt = PIPE_FORMAT_R8G8B8A8_UNORM;
       else if (util_format_is_pure_sint(fmt))
@@ -139,7 +139,7 @@ static void *texture_transfer_map_resolve(struct pipe_context *ctx,
          fmt = PIPE_FORMAT_R32G32B32A32_UINT;
       else
          fmt = PIPE_FORMAT_R32G32B32A32_FLOAT;
-      assert(virgl_has_readback_format(ctx->screen, fmt));
+      assert(virgl_has_readback_format(ctx->screen, pipe_to_virgl_format(fmt)));
    }
 
    struct pipe_box dst_box = *box;
@@ -222,7 +222,7 @@ static bool needs_resolve(struct pipe_screen *screen,
 
    if (usage & PIPE_TRANSFER_READ)
       return !util_format_is_depth_or_stencil(resource->format) &&
-             !virgl_has_readback_format(screen, resource->format);
+             !virgl_has_readback_format(screen, pipe_to_virgl_format(resource->format));
 
    return false;
 }
index d880648d59d36356848bdd1180bd405e1975e739..9abfec6898bc97451a00a62169c37671bb88344d 100644 (file)
@@ -156,4 +156,7 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps)
    caps->caps.v2.max_compute_shared_memory_size = 0;
    caps->caps.v2.host_feature_check_version = 0;
 }
+
+extern enum virgl_formats pipe_to_virgl_format(enum pipe_format format);
+
 #endif
index 725d1f7cbf3f62cfa9d933d48a832c8c2dab064f..c3509aef49cad1c0d21f682a279bbbee36d72dda 100644 (file)
@@ -168,7 +168,7 @@ virgl_drm_winsys_resource_create(struct virgl_winsys *qws,
 
    memset(&createcmd, 0, sizeof(createcmd));
    createcmd.target = target;
-   createcmd.format = format;
+   createcmd.format = pipe_to_virgl_format(format);
    createcmd.bind = bind;
    createcmd.width = width;
    createcmd.height = height;
index b6f5a8324e798956b7c3f088517be80fb4b99deb..528692ffcb77618b32e44c7a5c40e07bfaa046cf 100644 (file)
@@ -261,7 +261,7 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
    res->height = height;
    res->width = width;
    res->size = size;
-   virgl_vtest_send_resource_create(vtws, handle, target, format, bind,
+   virgl_vtest_send_resource_create(vtws, handle, target, pipe_to_virgl_format(format), bind,
                                     width, height, depth, array_size,
                                     last_level, nr_samples, size, &fd);