[PATCH] wined3d: Add support for AYUV surfaces.

Nikolay Sivov nsivov at codeweavers.com
Thu Jul 29 09:31:33 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

I was unable to StretchRect() to work with AYUV source on Windows as a proper test,
however it's possible to create such surfaces there. DXVA2 accepts this format as valid source
surface too, I suspect dxva might have some way to make such format combination work.
It's a relatively small change comparing to other YUV formats, and helps for the cases
when video source is using AYUV output.

 dlls/wined3d/glsl_shader.c     |  9 +++++++++
 dlls/wined3d/utils.c           | 11 +++++++++++
 dlls/wined3d/wined3d_private.h |  1 +
 include/wine/wined3d.h         |  1 +
 4 files changed, 22 insertions(+)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 5ae90148dc8..0ac081ceb6d 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -12753,6 +12753,14 @@ static void glsl_blitter_generate_yuv_shader(struct wined3d_string_buffer *buffe
             shader_addline(buffer, "    chroma = yuv.xz;\n");
             break;
 
+        case COMPLEX_FIXUP_AYUV:
+            shader_addline(buffer, "    vec4 ayuv = texture%s(sampler, out_texcoord.xy);\n",
+                    needs_legacy_glsl_syntax(gl_info) ? tex_type : "");
+            shader_addline(buffer, "    chroma = ayuv.wz;\n");
+            shader_addline(buffer, "    luminance = ayuv.y;\n");
+            shader_addline(buffer, "    %s.w = ayuv.x;\n", output);
+            break;
+
         default:
             FIXME("Unsupported fixup %#x.\n", complex_fixup);
             string_buffer_free(buffer);
@@ -12877,6 +12885,7 @@ static GLuint glsl_blitter_generate_program(struct wined3d_glsl_blitter *blitter
         case COMPLEX_FIXUP_YV12:
         case COMPLEX_FIXUP_NV12:
         case COMPLEX_FIXUP_YUV:
+        case COMPLEX_FIXUP_AYUV:
             glsl_blitter_generate_yuv_shader(buffer, gl_info, args, output->buffer, tex_type, swizzle);
             break;
         case COMPLEX_FIXUP_NONE:
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 4019dd4d812..4d30816a8d9 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -66,6 +66,7 @@ format_index_remap[] =
     {WINED3DFMT_AL16,         WINED3D_FORMAT_FOURCC_BASE + 21},
     {WINED3DFMT_NV12,         WINED3D_FORMAT_FOURCC_BASE + 22},
     {WINED3DFMT_ATOC,         WINED3D_FORMAT_FOURCC_BASE + 23},
+    {WINED3DFMT_AYUV,         WINED3D_FORMAT_FOURCC_BASE + 24},
 };
 
 #define WINED3D_FORMAT_COUNT (WINED3D_FORMAT_FOURCC_BASE + ARRAY_SIZE(format_index_remap))
@@ -85,6 +86,7 @@ static const struct wined3d_format_channels formats[] =
      *  format id                           r   g   b   a    r   g   b   a    bpp depth stencil */
     {WINED3DFMT_UNKNOWN,                    0,  0,  0,  0,   0,  0,  0,  0,    0,   0,     0},
     /* FourCC formats */
+    {WINED3DFMT_AYUV,                       0,  0,  0,  0,   0,  0,  0,  0,    4,   0,     0},
     {WINED3DFMT_UYVY,                       0,  0,  0,  0,   0,  0,  0,  0,    2,   0,     0},
     {WINED3DFMT_YUY2,                       0,  0,  0,  0,   0,  0,  0,  0,    2,   0,     0},
     {WINED3DFMT_YV12,                       0,  0,  0,  0,   0,  0,  0,  0,    1,   0,     0},
@@ -1412,6 +1414,10 @@ static const struct wined3d_format_texture_info format_texture_info[] =
             GL_ALPHA,                   GL_UNSIGNED_BYTE,                 0,
             WINED3DFMT_FLAG_FILTERING,
             WINED3D_GL_LEGACY_CONTEXT,  NULL},
+    {WINED3DFMT_AYUV,                   GL_RGBA8,                         GL_RGBA8,                               0,
+            GL_RGBA,                    GL_UNSIGNED_INT_8_8_8_8_REV,      0,
+            WINED3DFMT_FLAG_FILTERING,
+            WINED3D_GL_EXT_NONE,        NULL},
     {WINED3DFMT_DXT1,                   GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0,
             GL_RGBA,                    GL_UNSIGNED_BYTE,                 0,
             WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING
@@ -3662,6 +3668,9 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
         format->internal = 0;
     }
 
+    format = get_format_gl_internal(adapter, WINED3DFMT_AYUV);
+    format->f.color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_AYUV);
+
     if (gl_info->supported[ARB_FRAGMENT_PROGRAM] || gl_info->supported[ARB_FRAGMENT_SHADER])
     {
         format = get_format_gl_internal(adapter, WINED3DFMT_P8_UINT);
@@ -4683,6 +4692,7 @@ const char *debug_d3dformat(enum wined3d_format_id format_id)
         FMT_TO_STR(WINED3DFMT_AL16);
         FMT_TO_STR(WINED3DFMT_NV12);
         FMT_TO_STR(WINED3DFMT_ATOC);
+        FMT_TO_STR(WINED3DFMT_AYUV);
 #undef FMT_TO_STR
         default:
         {
@@ -5464,6 +5474,7 @@ static const char *debug_complex_fixup(enum complex_fixup fixup)
         WINED3D_TO_STR(COMPLEX_FIXUP_NV12);
         WINED3D_TO_STR(COMPLEX_FIXUP_P8);
         WINED3D_TO_STR(COMPLEX_FIXUP_YUV);
+        WINED3D_TO_STR(COMPLEX_FIXUP_AYUV);
 #undef WINED3D_TO_STR
         default:
             FIXME("Unrecognized complex fixup %#x\n", fixup);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a2048fc6ea6..0c302770694 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -166,6 +166,7 @@ enum complex_fixup
     COMPLEX_FIXUP_P8   = 4,
     COMPLEX_FIXUP_NV12 = 5,
     COMPLEX_FIXUP_YUV  = 6,
+    COMPLEX_FIXUP_AYUV = 7,
 };
 
 #include <pshpack2.h>
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 7be893b8f21..b99932059b2 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -271,6 +271,7 @@ enum wined3d_format_id
     WINED3DFMT_DF16                         = WINEMAKEFOURCC('D','F','1','6'),
     WINED3DFMT_DF24                         = WINEMAKEFOURCC('D','F','2','4'),
     WINED3DFMT_ATOC                         = WINEMAKEFOURCC('A','T','O','C'),
+    WINED3DFMT_AYUV                         = WINEMAKEFOURCC('A','Y','U','V'),
 
     WINED3DFMT_FORCE_DWORD = 0xffffffff
 };
-- 
2.30.2




More information about the wine-devel mailing list