diff options
Diffstat (limited to 'recipes-graphics/xorg-xserver/xserver-xorg/0003-glamor-add-support-for-NV12-in-Xv.patch')
-rw-r--r-- | recipes-graphics/xorg-xserver/xserver-xorg/0003-glamor-add-support-for-NV12-in-Xv.patch | 322 |
1 files changed, 0 insertions, 322 deletions
diff --git a/recipes-graphics/xorg-xserver/xserver-xorg/0003-glamor-add-support-for-NV12-in-Xv.patch b/recipes-graphics/xorg-xserver/xserver-xorg/0003-glamor-add-support-for-NV12-in-Xv.patch deleted file mode 100644 index 855d1938..00000000 --- a/recipes-graphics/xorg-xserver/xserver-xorg/0003-glamor-add-support-for-NV12-in-Xv.patch +++ /dev/null @@ -1,322 +0,0 @@ -From 17a3528162304f1586329aabd606d3498bfe48a5 Mon Sep 17 00:00:00 2001 -From: Julien Isorce <julien.isorce@gmail.com> -Date: Tue, 11 Sep 2018 10:28:33 -0700 -Subject: [PATCH 3/8] glamor: add support for NV12 in Xv - -Useful when video decoders only output NV12. Currently -glamor Xv only supports I420 and YV12. - -Note that Intel's sna supports I420, YV12, YUY2, UYVY, NV12. - -Test: xvinfo | grep NV12 -Test: gst-launch-1.0 videotestsrc ! video/x-raw, format=NV12 ! xvimagesink - -v2: Combine the two texture2Ds on u_sampler. - -Upstream-Status: Backport -Signed-off-by: Julien Isorce <jisorce@oblong.com> -Tested-by: Olivier Fourdan <ofourdan@redhat.com> -Reviewed-by: Alex Deucher <alexander.deucher@amd.com> ---- - glamor/glamor_xv.c | 180 ++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 155 insertions(+), 25 deletions(-) - -diff --git a/glamor/glamor_xv.c b/glamor/glamor_xv.c -index 62fc4fff5..6fef6ed0d 100644 ---- a/glamor/glamor_xv.c -+++ b/glamor/glamor_xv.c -@@ -59,8 +59,40 @@ typedef struct tagREF_TRANSFORM { - #define RTFContrast(a) (1.0 + ((a)*1.0)/1000.0) - #define RTFHue(a) (((a)*3.1416)/1000.0) - --static const glamor_facet glamor_facet_xv_planar = { -- .name = "xv_planar", -+static const glamor_facet glamor_facet_xv_planar_2 = { -+ .name = "xv_planar_2", -+ -+ .version = 120, -+ -+ .source_name = "v_texcoord0", -+ .vs_vars = ("attribute vec2 position;\n" -+ "attribute vec2 v_texcoord0;\n" -+ "varying vec2 tcs;\n"), -+ .vs_exec = (GLAMOR_POS(gl_Position, position) -+ " tcs = v_texcoord0;\n"), -+ -+ .fs_vars = ("uniform sampler2D y_sampler;\n" -+ "uniform sampler2D u_sampler;\n" -+ "uniform vec4 offsetyco;\n" -+ "uniform vec4 ucogamma;\n" -+ "uniform vec4 vco;\n" -+ "varying vec2 tcs;\n"), -+ .fs_exec = ( -+ " float sample;\n" -+ " vec2 sample_uv;\n" -+ " vec4 temp1;\n" -+ " sample = texture2D(y_sampler, tcs).w;\n" -+ " temp1.xyz = offsetyco.www * vec3(sample) + offsetyco.xyz;\n" -+ " sample_uv = texture2D(u_sampler, tcs).xy;\n" -+ " temp1.xyz = ucogamma.xyz * vec3(sample_uv.x) + temp1.xyz;\n" -+ " temp1.xyz = clamp(vco.xyz * vec3(sample_uv.y) + temp1.xyz, 0.0, 1.0);\n" -+ " temp1.w = 1.0;\n" -+ " gl_FragColor = temp1;\n" -+ ), -+}; -+ -+static const glamor_facet glamor_facet_xv_planar_3 = { -+ .name = "xv_planar_3", - - .version = 120, - -@@ -110,26 +142,50 @@ Atom glamorBrightness, glamorContrast, glamorSaturation, glamorHue, - XvImageRec glamor_xv_images[] = { - XVIMAGE_YV12, - XVIMAGE_I420, -+ XVIMAGE_NV12 - }; - int glamor_xv_num_images = ARRAY_SIZE(glamor_xv_images); - - static void --glamor_init_xv_shader(ScreenPtr screen) -+glamor_init_xv_shader(ScreenPtr screen, int id) - { - glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - GLint sampler_loc; -+ const glamor_facet *glamor_facet_xv_planar = NULL; -+ -+ switch (id) { -+ case FOURCC_YV12: -+ case FOURCC_I420: -+ glamor_facet_xv_planar = &glamor_facet_xv_planar_3; -+ break; -+ case FOURCC_NV12: -+ glamor_facet_xv_planar = &glamor_facet_xv_planar_2; -+ break; -+ default: -+ break; -+ } - - glamor_build_program(screen, - &glamor_priv->xv_prog, -- &glamor_facet_xv_planar, NULL, NULL, NULL); -+ glamor_facet_xv_planar, NULL, NULL, NULL); - - glUseProgram(glamor_priv->xv_prog.prog); - sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "y_sampler"); - glUniform1i(sampler_loc, 0); - sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "u_sampler"); - glUniform1i(sampler_loc, 1); -- sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "v_sampler"); -- glUniform1i(sampler_loc, 2); -+ -+ switch (id) { -+ case FOURCC_YV12: -+ case FOURCC_I420: -+ sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "v_sampler"); -+ glUniform1i(sampler_loc, 2); -+ break; -+ case FOURCC_NV12: -+ break; -+ default: -+ break; -+ } - - } - -@@ -227,6 +283,21 @@ glamor_xv_query_image_attributes(int id, - offsets[2] = size; - size += tmp; - break; -+ case FOURCC_NV12: -+ *w = ALIGN(*w, 2); -+ *h = ALIGN(*h, 2); -+ size = ALIGN(*w, 4); -+ if (pitches) -+ pitches[0] = size; -+ size *= *h; -+ if (offsets) -+ offsets[1] = offsets[2] = size; -+ tmp = ALIGN(*w, 4); -+ if (pitches) -+ pitches[1] = pitches[2] = tmp; -+ tmp *= (*h >> 1); -+ size += tmp; -+ break; - } - return size; - } -@@ -240,7 +311,7 @@ static REF_TRANSFORM trans[2] = { - }; - - void --glamor_xv_render(glamor_port_private *port_priv) -+glamor_xv_render(glamor_port_private *port_priv, int id) - { - ScreenPtr screen = port_priv->pPixmap->drawable.pScreen; - glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); -@@ -264,7 +335,7 @@ glamor_xv_render(glamor_port_private *port_priv) - int dst_box_index; - - if (!glamor_priv->xv_prog.prog) -- glamor_init_xv_shader(screen); -+ glamor_init_xv_shader(screen, id); - - cont = RTFContrast(port_priv->contrast); - bright = RTFBrightness(port_priv->brightness); -@@ -293,6 +364,8 @@ glamor_xv_render(glamor_port_private *port_priv) - glamor_get_pixmap_private(port_priv->src_pix[i]); - pixmap_priv_get_scale(src_pixmap_priv[i], &src_xscale[i], - &src_yscale[i]); -+ } else { -+ src_pixmap_priv[i] = NULL; - } - } - glamor_make_current(glamor_priv); -@@ -319,12 +392,21 @@ glamor_xv_render(glamor_port_private *port_priv) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - -- glActiveTexture(GL_TEXTURE2); -- glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->fbo->tex); -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ switch (id) { -+ case FOURCC_YV12: -+ case FOURCC_I420: -+ glActiveTexture(GL_TEXTURE2); -+ glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->fbo->tex); -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ break; -+ case FOURCC_NV12: -+ break; -+ default: -+ break; -+ } - - glEnableVertexAttribArray(GLAMOR_VERTEX_POS); - glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE); -@@ -336,7 +418,7 @@ glamor_xv_render(glamor_port_private *port_priv) - /* Set up a single primitive covering the area being drawn. We'll - * clip it to port_priv->clip using GL scissors instead of just - * emitting a GL_QUAD per box, because this way we hopefully avoid -- * diagonal tearing between the two trangles used to rasterize a -+ * diagonal tearing between the two triangles used to rasterize a - * GL_QUAD. - */ - i = 0; -@@ -417,6 +499,7 @@ glamor_xv_put_image(glamor_port_private *port_priv, - RegionPtr clipBoxes) - { - ScreenPtr pScreen = pDrawable->pScreen; -+ glamor_screen_private *glamor_priv = glamor_get_screen_private(pScreen); - int srcPitch, srcPitch2; - int top, nlines; - int s2offset, s3offset, tmp; -@@ -425,9 +508,16 @@ glamor_xv_put_image(glamor_port_private *port_priv, - s2offset = s3offset = srcPitch2 = 0; - - if (!port_priv->src_pix[0] || -- (width != port_priv->src_pix_w || height != port_priv->src_pix_h)) { -+ (width != port_priv->src_pix_w || height != port_priv->src_pix_h) || -+ (port_priv->src_pix[2] && id == FOURCC_NV12) || -+ (!port_priv->src_pix[2] && id != FOURCC_NV12)) { - int i; - -+ if (glamor_priv->xv_prog.prog) { -+ glDeleteProgram(glamor_priv->xv_prog.prog); -+ glamor_priv->xv_prog.prog = 0; -+ } -+ - for (i = 0; i < 3; i++) - if (port_priv->src_pix[i]) - glamor_destroy_pixmap(port_priv->src_pix[i]); -@@ -435,17 +525,34 @@ glamor_xv_put_image(glamor_port_private *port_priv, - port_priv->src_pix[0] = - glamor_create_pixmap(pScreen, width, height, 8, - GLAMOR_CREATE_FBO_NO_FBO); -- port_priv->src_pix[1] = -- glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, -- GLAMOR_CREATE_FBO_NO_FBO); -- port_priv->src_pix[2] = -- glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, -- GLAMOR_CREATE_FBO_NO_FBO); -+ -+ switch (id) { -+ case FOURCC_YV12: -+ case FOURCC_I420: -+ port_priv->src_pix[1] = -+ glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, -+ GLAMOR_CREATE_FBO_NO_FBO); -+ port_priv->src_pix[2] = -+ glamor_create_pixmap(pScreen, width >> 1, height >> 1, 8, -+ GLAMOR_CREATE_FBO_NO_FBO); -+ if (!port_priv->src_pix[2]) -+ return BadAlloc; -+ break; -+ case FOURCC_NV12: -+ port_priv->src_pix[1] = -+ glamor_create_pixmap(pScreen, width >> 1, height >> 1, 16, -+ GLAMOR_CREATE_FBO_NO_FBO | -+ GLAMOR_CREATE_FORMAT_CBCR); -+ port_priv->src_pix[2] = NULL; -+ break; -+ default: -+ return BadMatch; -+ } -+ - port_priv->src_pix_w = width; - port_priv->src_pix_h = height; - -- if (!port_priv->src_pix[0] || !port_priv->src_pix[1] || -- !port_priv->src_pix[2]) -+ if (!port_priv->src_pix[0] || !port_priv->src_pix[1]) - return BadAlloc; - } - -@@ -489,6 +596,29 @@ glamor_xv_put_image(glamor_port_private *port_priv, - 0, 0, 0, 0, - buf + s3offset, srcPitch2); - break; -+ case FOURCC_NV12: -+ srcPitch = ALIGN(width, 4); -+ s2offset = srcPitch * height; -+ s2offset += ((top >> 1) * srcPitch); -+ -+ full_box.x1 = 0; -+ full_box.y1 = 0; -+ full_box.x2 = width; -+ full_box.y2 = nlines; -+ -+ half_box.x1 = 0; -+ half_box.y1 = 0; -+ half_box.x2 = width; -+ half_box.y2 = (nlines + 1) >> 1; -+ -+ glamor_upload_boxes(port_priv->src_pix[0], &full_box, 1, -+ 0, 0, 0, 0, -+ buf + (top * srcPitch), srcPitch); -+ -+ glamor_upload_boxes(port_priv->src_pix[1], &half_box, 1, -+ 0, 0, 0, 0, -+ buf + s2offset, srcPitch); -+ break; - default: - return BadMatch; - } -@@ -511,7 +641,7 @@ glamor_xv_put_image(glamor_port_private *port_priv, - port_priv->w = width; - port_priv->h = height; - port_priv->pDraw = pDrawable; -- glamor_xv_render(port_priv); -+ glamor_xv_render(port_priv, id); - return Success; - } - --- -2.17.1 - |