enum texture_type {
TEXTURE_Y_XUXV_WL,
TEXTURE_Y_UV_WL,
- TEXTURE_Y_U_V_WL
+ TEXTURE_Y_U_V_WL,
+ TEXTURE_XYUV_WL
};
struct yuv_format_descriptor {
#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */
#endif
+#ifndef DRM_FORMAT_XYUV8888
+#define DRM_FORMAT_XYUV8888 fourcc_code('X', 'Y', 'U', 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */
+#endif
+
struct yuv_format_descriptor yuv_formats[] = {
{
.format = DRM_FORMAT_YUYV,
.format = DRM_FORMAT_R8,
.plane_index = 2
}}
+ }, {
+ .format = DRM_FORMAT_XYUV8888,
+ .input_planes = 1,
+ .output_planes = 1,
+ .texture_type = TEXTURE_XYUV_WL,
+ {{
+ .width_divisor = 1,
+ .height_divisor = 1,
+ .format = DRM_FORMAT_XBGR8888,
+ .plane_index = 0
+ }}
}
};
case TEXTURE_Y_U_V_WL:
image->shader = &gr->texture_shader_y_u_v;
break;
+ case TEXTURE_XYUV_WL:
+ image->shader = &gr->texture_shader_xyuv;
+ break;
default:
assert(false);
}
case DRM_FORMAT_UYVY:
case DRM_FORMAT_VYUY:
case DRM_FORMAT_AYUV:
+ case DRM_FORMAT_XYUV8888:
return GL_TEXTURE_EXTERNAL_OES;
default:
return GL_TEXTURE_2D;
DRM_FORMAT_NV12,
DRM_FORMAT_YUV420,
DRM_FORMAT_YUV444,
+ DRM_FORMAT_XYUV8888,
};
bool fallback = false;
EGLint num;
FRAGMENT_CONVERT_YUV
;
+static const char texture_fragment_shader_xyuv[] =
+ "precision mediump float;\n"
+ "uniform sampler2D tex;\n"
+ "varying vec2 v_texcoord;\n"
+ "uniform float alpha;\n"
+ "void main() {\n"
+ " float y = 1.16438356 * (texture2D(tex, v_texcoord).b - 0.0625);\n"
+ " float u = texture2D(tex, v_texcoord).g - 0.5;\n"
+ " float v = texture2D(tex, v_texcoord).r - 0.5;\n"
+ FRAGMENT_CONVERT_YUV
+ ;
+
static const char solid_fragment_shader[] =
"precision mediump float;\n"
"uniform vec4 color;\n"
gr->texture_shader_y_xuxv.fragment_source =
texture_fragment_shader_y_xuxv;
+ gr->texture_shader_xyuv.vertex_source = vertex_shader;
+ gr->texture_shader_xyuv.fragment_source = texture_fragment_shader_xyuv;
+
gr->solid_shader.vertex_source = vertex_shader;
gr->solid_shader.fragment_source = solid_fragment_shader;
shader_release(&gr->texture_shader_y_uv);
shader_release(&gr->texture_shader_y_u_v);
shader_release(&gr->texture_shader_y_xuxv);
+ shader_release(&gr->texture_shader_xyuv);
shader_release(&gr->solid_shader);
/* Force use_shader() to call glUseProgram(), since we need to use