Signed-off-by: Nikolay Sivov nsivov@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 };