" return saturate(yuv);\n" \
"}\n"
+#define HLSL_PS_OUTPUT_ONE_PLANE_BODY \
+ " float4 Plane_0: SV_TARGET0;"
+
+#define HLSL_PS_OUTPUT_TWO_PLANES_BODY \
+ " float4 Plane_0: SV_TARGET0;\n" \
+ " float4 Plane_1: SV_TARGET1;"
+
static const PixelShaderTemplate templ_REORDER =
{ NULL, NULL };
"\n"
"struct PS_OUTPUT\n"
"{\n"
- " float4 Plane_0: SV_TARGET0;\n"
- " float4 Plane_1: SV_TARGET1;\n"
+ " %s\n"
"};\n"
"\n"
/* rgb <-> yuv function */
{
const PixelShaderTemplate *templ;
gchar *ps_body[CONVERTER_MAX_QUADS];
+ const gchar *ps_output[CONVERTER_MAX_QUADS];
PixelShaderColorTransform transform;
} ConvertInfo;
convert_info->templ = &templ_REORDER;
convert_info->ps_body[0] = g_strdup_printf (templ_REORDER_BODY, self->alpha);
+ convert_info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
return TRUE;
}
ConvertInfo *info = &self->convert_info;
info->templ = &templ_YUV_to_RGB;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
switch (GST_VIDEO_INFO_FORMAT (in_info)) {
case GST_VIDEO_FORMAT_VUYA:
ConvertInfo *info = &self->convert_info;
info->templ = &templ_RGB_to_YUV;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
switch (GST_VIDEO_INFO_FORMAT (out_info)) {
case GST_VIDEO_FORMAT_VUYA:
case GST_VIDEO_FORMAT_P016_LE:
info->ps_body[0] = g_strdup_printf (templ_RGB_to_LUMA_BODY, 1);
info->ps_body[1] = g_strdup_printf (templ_RGB_to_SEMI_PLANAR_CHROMA_BODY);
+ info->ps_output[1] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
break;
case GST_VIDEO_FORMAT_I420:
info->ps_body[0] = g_strdup_printf (templ_RGB_to_LUMA_BODY, 1);
info->ps_body[1] =
g_strdup_printf (templ_RGB_to_PLANAR_CHROMA_BODY, 1, 1);
+ info->ps_output[1] = HLSL_PS_OUTPUT_TWO_PLANES_BODY;
break;
case GST_VIDEO_FORMAT_I420_10LE:
info->ps_body[0] = g_strdup_printf (templ_RGB_to_LUMA_BODY, 64);
info->ps_body[1] =
g_strdup_printf (templ_RGB_to_PLANAR_CHROMA_BODY, 64, 64);
+ info->ps_output[1] = HLSL_PS_OUTPUT_TWO_PLANES_BODY;
break;
default:
GST_FIXME_OBJECT (self,
gint div = 1;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_TWO_PLANES_BODY;
if (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_I420_10LE)
mul = 64;
gint div = 1;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
if (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_I420_10LE)
mul = 64;
gint div = 1;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_TWO_PLANES_BODY;
if (GST_VIDEO_INFO_FORMAT (out_info) == GST_VIDEO_FORMAT_I420_10LE)
div = 64;
gint div = 1;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
info->ps_body[0] = g_strdup_printf (templ_LUMA_to_LUMA_BODY, mul, div);
info->ps_body[1] =
ConvertInfo *info = &self->convert_info;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
info->ps_body[0] = g_strdup_printf (templ_REORDER_BODY, self->alpha);
gint div = 1;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_TWO_PLANES_BODY;
if (GST_VIDEO_INFO_FORMAT (out_info) == GST_VIDEO_FORMAT_I420_10LE)
div = 64;
gint div = 1;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
info->ps_body[0] = g_strdup_printf (templ_VUYA_to_LUMA_BODY, div);
info->ps_body[1] = g_strdup_printf (templ_VUYA_TO_SEMI_PLANAR_CHROMA_BODY);
gint mul = 1;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
if (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_FORMAT_I420_10LE)
mul = 64;
gchar y, u, v;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
if (!get_packed_yuv_components (self, GST_VIDEO_INFO_FORMAT (in_info),
&y, &u, &v)) {
ConvertInfo *info = &self->convert_info;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
info->ps_body[0] = g_strdup_printf (templ_SEMI_PLANAR_to_VUYA_BODY);
gchar y, u, v;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_TWO_PLANES_BODY;
if (GST_VIDEO_INFO_FORMAT (out_info) == GST_VIDEO_FORMAT_I420_10LE)
div = 64;
gchar y, u, v;
info->templ = &templ_REORDER;
+ info->ps_output[0] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
+ info->ps_output[1] = HLSL_PS_OUTPUT_ONE_PLANE_BODY;
if (!get_packed_yuv_components (self, GST_VIDEO_INFO_FORMAT (in_info),
&y, &u, &v)) {
gchar *shader_code = NULL;
if (convert_info->ps_body[i]) {
+ g_assert (convert_info->ps_output[i] != NULL);
+
shader_code = g_strdup_printf (templ_pixel_shader,
convert_info->templ->constant_buffer ?
convert_info->templ->constant_buffer : "",
+ convert_info->ps_output[i],
convert_info->templ->func ? convert_info->templ->func : "",
convert_info->ps_body[i]);