Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • chengbo7135/xserver
  • wjp/xserver
  • DemiMarie/xserver
  • alanc/xserver
  • uvas/xserver
  • cl91/xserver
  • heymiaoO/xserver
  • oreaus/xserver
  • stapelberg/xserver
  • PaulKocialkowski/xserver
  • CendioOssman/xserver
  • wiz/xserver
  • maos20008/xserver
  • dougvj/xserver
  • mgorse1/xserver
  • gldrk/xserver
  • TMR5454/xserver
  • Kyawswat/xserver
  • hexiaodong/xserver
  • gilvbp/xserver
  • vliaskov/xserver
  • aarondill/xserver
  • zzyiwei/xserver
  • kleinerm/xserver
  • jcherry/xserver
  • jcristau/xserver
  • nathankidd/xserver
  • jexposit/xserver
  • refi_64/xserver
  • kbrenneman/xserver
  • kupper.pa/xserver
  • LickmeDown/xserver
  • zboszor/xserver
  • jadahl/xserver
  • shadeslayer/xserver
  • mherrb/xserver
  • Julia/xserver
  • twaik/xserver
  • fvalasiad/xserver
  • zzxyb/xserver
  • HermannSW/xserver
  • erwinou/xserver
  • ekurzinger/xserver
  • nacho.resa/xserver
  • agoins/xserver
  • NSUTanghaixiang/xserver
  • p12tic/xserver
  • huxd1532/xserver
  • keithp/xserver
  • vinilokorlok/xserver
  • bbeckett/xserver
  • dslater38/xserver
  • zzag/xserver
  • emersion/xserver
  • djlucas/xserver
  • ccullumbine2018/xserver
  • daniels/xserver
  • llandwerlin/xserver
  • matt335672/xserver
  • doraskayo/xserver
  • afett/xserver
  • XDXTHX/xserver
  • xexaxo/xserver
  • ecurtin/xserver
  • rbernon/xserver
  • pekdon/xserver
  • karolherbst/xserver
  • russellcnv/xserver
  • mbiebl/xserver
  • orbea/xserver
  • vsyrjala/xserver
  • lyudess/xserver
  • manu/xserver
  • lucmann/xserver
  • tholin/xserver
  • yarivb/xserver
  • tmlind/xserver
  • chema/xserver
  • J-Bu/xserver
  • chenhuacai/xserver
  • E5ten/xserver
  • haagch/xserver
  • whot/xserver
  • strassek/xserver
  • mntmn/xserver
  • liyi42/xserver
  • YusufKhan-gamedev/xserver
  • iv-m/xserver
  • vanvugt/xserver
  • Rui511/xserver
  • catap/xserver
  • tjbp/xserver
  • webi123/xserver
  • noblock/xserver
  • freemangordon/xserver
  • xdandys/xserver
  • jbeich/xserver
  • zeising/xserver
  • romangg/xserver
  • pq/xserver
  • azhadchenko/xserver
  • Emantor/xserver
  • carlosg/xserver
  • kwg/xserver
  • pichika/xserver
  • klniu/xserver
  • TAAPArthur/xserver
  • sjoerd/xserver
  • Sjecai2/xserver
  • jturney/xserver
  • pkubaj/xserver
  • os369510/xserver
  • Zamundaaa/xserver
  • Gorg/xserver
  • lkundrak/xserver
  • niveditharau/xserver
  • ForTheReallys/xserver
  • jmonteiro/xserver
  • jocelyn/xserver
  • ThatMG393/xserver
  • fweimer/xserver
  • mlankhorst/xserver
  • marv/xserver
  • dbn/xserver
  • mattrope/xserver
  • coypoop/xserver
  • mwyraz/xserver
  • frog/xserver
  • 3v1n0/xserver
  • awilfox/xserver
  • muesli4/xserver
  • rarbab/xserver
  • yshui/xserver
  • jannau/xserver
  • mikeroyal/xserver
  • andrebsguedes/xserver
  • JeffyCN/xserver
  • ipominov/xserver
  • gtrentalancia/xserver
  • josch/xserver
  • lucyllewy/xserver
  • tomty89/xserver
  • qarmin/xserver
  • tagr/xserver
  • zwenna/xserver
  • bkylerussell/xserver
  • mupuf/xserver
  • zubzub/xserver
  • galaxytgtabiday/xserver
  • OlCe/xserver
  • ashafer/xserver
  • dengbo/xserver
  • valpackett/xserver
  • andreyknyazev077/xserver
  • antonovitch/xserver
  • contactshashanksharma/xserver-fork-shashank
  • akihiko.odaki/xserver
  • sknsean/xserver
  • rnpnr/xserver
  • hitong602/xserver
  • halfline/xserver
  • ismailsiege/xserver
  • dongwonk/xserver
  • Fatton1/xserver
  • GermanAizek/xserver
  • daenzer/xserver
  • FeepingCreature/xserver
  • mvlad/xserver
  • puleglot/xserver
  • smelenius/xserver
  • sewn/xserver
  • kaichuan.hsieh/xserver
  • SimonPilkington/xserver
  • adamdruppe/xserver
  • floppym/xserver
  • trevdave/xserver
  • luke-jr/xserver
  • headrush/xserver
  • davidriley/xserver
  • heitbaum/xserver
  • mrisaacb/xserver
  • goosen78/xserver
  • Ma/xserver
  • gmbr3/xserver
  • tsutsui/xserver
  • sherrodejjohnson/xserver
  • hassoon1986/xserver
  • lanodan/xserver
  • ydc-dadada/xserver
  • wengxt/xserver
  • icenowy/xserver
  • denisfa/xserver
  • StarsGreen/xserver
  • adamjrichter/xserver
  • bigon/xserver
  • djacewicz/xserver
  • davidre/xserver
  • kylin0061/xserver
  • arrowd/xserver
  • ernstp/xserver
  • bbrezillon/xserver
  • penguin42/xserver
  • anarsoul/xserver
  • marvinjr35/xserver
  • gerddie/xserver
  • xry111/xserver
  • psyruss85/xserver
  • volkanorhan/xserver
  • luporl/xserver
  • cbur201592/xserver
  • bphaslett/xserver
  • guillem/xserver
  • haihao/xserver
  • peterh/xserver
  • miztake/xserver
  • zaps166/xserver
  • lostgoat/xserver
  • vfjpl/xserver
  • bentiss/xserver
  • rilian-la-te/xserver
  • wujiangGitHub/xserver
  • cubanismo/xserver
  • arichardson/xserver
  • schreibemirhalt/xserver
  • jsg/xserver
  • karlosrangel337/xserver
  • knisht/xserver
  • manuelcrack642/xserver
  • ross/xserver
  • topimiettinen/xserver
  • davidedmundson/xserver
  • DPA/xserver
  • dkorkmazturk/xserver
  • karamjameelmoore/xserver
  • lihongtao/xserver
  • sthibaul/xserver
  • RyzenDew/xserver
  • christian-rauch/xserver
  • Vivek/xserver
  • peigongdsd/xserver
  • peng.jin/xserver
  • alagner/xserver
  • mehdigh419/xserver
  • dixler/xserver
  • BBaoVanC/xserver
  • Drakulix/xserver
  • Acidburn0zzz/xserver
  • bafanahub/xserver
  • benpicco/xserver
  • yangxiaojuan-loongson/xserver
  • kaocher82/xserver
  • pepp/xserver
  • cgzones/xserver
  • luyn/xserver
  • 1740301466jxz/xserver
  • ids1024/xserver
  • svalaskevicius/xserver
  • ZhiJie.Zhang/xserver
  • metux/xserver
  • eschwartz/xserver
  • jayantpranjal0/xserver
  • hmazlan/xserver
  • kerneltoast/xserver
  • Michaelypk/xserver
  • dottedmag/xserver
  • aplattner/xserver
  • sergiomb/xserver
  • looi/xserver
  • robclark/xserver
  • tzimmermann/xserver
  • vitoux.pascal/xserver
  • aditj/xserver
  • kennylevinsen/xserver
  • Kishore409/xserver
  • Daasin/xserver
  • dirbaio/xserver
  • xinbowang/xserver
  • mwei/xserver
  • SpikyCaterpillar1/xserver
  • devin11911191/xserver
  • xorg/xserver
  • alex-tu-cc/xserver
  • kaniini/xserver
  • jcourreges/xserver
  • n3rdopolis/xserver
  • zagursky/xserver
  • thesamesam/xserver
  • anholt/xserver
  • themaister/xserver
  • jrtc27/xserver
  • JoseExposito/xserver
  • Hi-Angel/xserver
  • City-busz/xserver
  • ydirson/xserver
  • dawnhan/xserver
  • avolkov/xserver
  • meMuszr/xserver
  • dk/xserver
  • cooperch/xserver
  • Tuetuopay/xserver
  • gabifalk/xserver
  • jeremyhu/xserver
  • 1480c1/xserver
  • Spintzyk/xserver
  • MisterDA/xserver
  • starnight/xserver
  • abono/xserver
  • ajax/xserver
  • dougg3/xserver
  • chenx_dust/xserver
  • EXtremeExploit/xserver
  • jwrdegoede/xserver
  • road2react/xserver
  • acelan/xserver
  • airlied/xserver
  • gfxstrand/xorg-xserver
  • justazarsky/xserver
  • sri-ka1ki/xserver
  • rgfernandes/xserver
  • lynxeye/xserver
  • tintou/xserver
  • mattst88/xserver
  • rmader/xserver
  • linkmauve/xserver
  • kamarul6401/xserver
  • andy-zetier/xserver
  • gsittyz/xserver
  • bernhardu/xserver
  • causztic/xserver
  • cpmichael/modesetting
  • ryanneph/xserver
  • zhangyaning/xserver
  • olv/xserver
  • hongaoo/xserver
  • LiChenG-P/xserver
  • Ivaniku/x-taylan
  • dkg/xserver
  • ofourdan/xserver
  • mahkoh/xserver
  • AkiSakurai/xserver
  • msizanoen1/xserver
341 results
Show changes
Commits on Source (6)
......@@ -945,6 +945,9 @@ typedef struct {
RegionRec clip;
PixmapPtr src_pix[3]; /* y, u, v for planar */
int src_pix_w, src_pix_h;
/* Port optimization */
int prev_fmt;
glamor_program xv_prog;
} glamor_port_private;
extern XvAttributeRec glamor_xv_attributes[];
......
......@@ -62,8 +62,6 @@ typedef struct tagREF_TRANSFORM {
static const glamor_facet glamor_facet_xv_planar_2 = {
.name = "xv_planar_2",
.version = 120,
.source_name = "v_texcoord0",
.vs_vars = ("in vec2 position;\n"
"in vec2 v_texcoord0;\n"
......@@ -94,8 +92,6 @@ static const glamor_facet glamor_facet_xv_planar_2 = {
static const glamor_facet glamor_facet_xv_planar_3 = {
.name = "xv_planar_3",
.version = 120,
.source_name = "v_texcoord0",
.vs_vars = ("in vec2 position;\n"
"in vec2 v_texcoord0;\n"
......@@ -124,6 +120,64 @@ static const glamor_facet glamor_facet_xv_planar_3 = {
),
};
static const glamor_facet glamor_facet_xv_uyvy = {
.name = "xv_uyvy",
.source_name = "v_texcoord0",
.vs_vars = ("in vec2 position;\n"
"in vec2 v_texcoord0;\n"
"out vec2 tcs;\n"),
.vs_exec = (GLAMOR_POS(gl_Position, position)
" tcs = v_texcoord0;\n"),
.fs_vars = ("#ifdef GL_ES\n"
"precision highp float;\n"
"#endif\n"
"uniform sampler2D sampler;\n"
"uniform vec2 texelSize;\n"
"uniform vec4 offsetyco;\n"
"uniform vec4 ucogamma;\n"
"uniform vec4 vco;\n"
"in vec2 tcs;\n"
),
.fs_exec = (
" vec3 uyv;\n"
" vec4 frameOut = texture2D(sampler, tcs.st);\n"
"\n"
" vec4 prevPixel = texture2D(sampler, vec2(tcs.s - texelSize.x, tcs.t));\n"
" vec4 nextPixel = texture2D(sampler, vec2(tcs.s + texelSize.x, tcs.t));\n"
"\n"
" float delta = 0.50;\n"
"\n"
" int even = int(mod(tcs.x / texelSize.x, 2.0));\n"
"\n"
" uyv.rgb = float(even)*vec3(frameOut.rg, nextPixel.r) + (1.0-float(even))*vec3(prevPixel.r, frameOut.gr);\n"
"\n"
" frameOut.r = uyv.g + 1.403*(uyv.r - delta);\n"
" frameOut.g = uyv.g - 0.714*(uyv.r - delta) - 0.344*(uyv.b - delta);\n"
" frameOut.b = uyv.g + 1.773*(uyv.b - delta);\n"
" frameOut.a = 1.0;\n"
" frag_color = frameOut;\n"
),
};
static const glamor_facet glamor_facet_xv_rgb_raw = {
.name = "xv_rgb",
.source_name = "v_texcoord0",
.vs_vars = ("in vec2 position;\n"
"in vec2 v_texcoord0;\n"
"out vec2 tcs;\n"),
.vs_exec = (GLAMOR_POS(gl_Position, position)
" tcs = v_texcoord0;\n"),
.fs_vars = ("uniform sampler2D sampler;\n"
"in vec2 tcs;\n"),
.fs_exec = (
" frag_color = texture2D(sampler, tcs);\n"
),
};
#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
XvAttributeRec glamor_xv_attributes[] = {
......@@ -142,14 +196,16 @@ Atom glamorBrightness, glamorContrast, glamorSaturation, glamorHue,
XvImageRec glamor_xv_images[] = {
XVIMAGE_YV12,
XVIMAGE_I420,
XVIMAGE_NV12
XVIMAGE_NV12,
XVIMAGE_UYVY,
XVIMAGE_RGB32,
XVIMAGE_RGB565,
};
int glamor_xv_num_images = ARRAY_SIZE(glamor_xv_images);
static void
glamor_init_xv_shader(ScreenPtr screen, int id)
glamor_init_xv_shader(ScreenPtr screen, glamor_port_private *port_priv, int id)
{
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
GLint sampler_loc;
const glamor_facet *glamor_facet_xv_planar = NULL;
......@@ -161,27 +217,44 @@ glamor_init_xv_shader(ScreenPtr screen, int id)
case FOURCC_NV12:
glamor_facet_xv_planar = &glamor_facet_xv_planar_2;
break;
case FOURCC_UYVY:
glamor_facet_xv_planar = &glamor_facet_xv_uyvy;
break;
case FOURCC_RGBA32:
case FOURCC_RGB565:
glamor_facet_xv_planar = &glamor_facet_xv_rgb_raw;
break;
default:
break;
}
glamor_build_program(screen,
&glamor_priv->xv_prog,
&port_priv->xv_prog,
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);
glUseProgram(port_priv->xv_prog.prog);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
sampler_loc = glGetUniformLocation(glamor_priv->xv_prog.prog, "v_sampler");
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "y_sampler");
glUniform1i(sampler_loc, 0);
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "u_sampler");
glUniform1i(sampler_loc, 1);
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "v_sampler");
glUniform1i(sampler_loc, 2);
break;
case FOURCC_NV12:
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "y_sampler");
glUniform1i(sampler_loc, 0);
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "u_sampler");
glUniform1i(sampler_loc, 1);
break;
case FOURCC_UYVY:
case FOURCC_RGBA32:
case FOURCC_RGB565:
sampler_loc = glGetUniformLocation(port_priv->xv_prog.prog, "sampler");
glUniform1i(sampler_loc, 0);
break;
default:
break;
......@@ -298,6 +371,24 @@ glamor_xv_query_image_attributes(int id,
tmp *= (*h >> 1);
size += tmp;
break;
case FOURCC_RGBA32:
size = *w * 4;
if(pitches)
pitches[0] = size;
if(offsets)
offsets[0] = 0;
size *= *h;
break;
case FOURCC_RGB565:
case FOURCC_UYVY:
/* UYVU is single-plane really, all tranformation is processed inside a shader */
size = *w * 2;
if (pitches)
pitches[0] = size;
if (offsets)
offsets[0] = 0;
size *= *h;
break;
}
return size;
}
......@@ -334,8 +425,8 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
char *vbo_offset;
int dst_box_index;
if (!glamor_priv->xv_prog.prog)
glamor_init_xv_shader(screen, id);
if (!port_priv->xv_prog.prog)
glamor_init_xv_shader(screen, port_priv, id);
cont = RTFContrast(port_priv->contrast);
bright = RTFBrightness(port_priv->brightness);
......@@ -369,32 +460,32 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
}
}
glamor_make_current(glamor_priv);
glUseProgram(glamor_priv->xv_prog.prog);
glUseProgram(port_priv->xv_prog.prog);
uloc = glGetUniformLocation(glamor_priv->xv_prog.prog, "offsetyco");
uloc = glGetUniformLocation(port_priv->xv_prog.prog, "offsetyco");
glUniform4f(uloc, off[0], off[1], off[2], yco);
uloc = glGetUniformLocation(glamor_priv->xv_prog.prog, "ucogamma");
uloc = glGetUniformLocation(port_priv->xv_prog.prog, "ucogamma");
glUniform4f(uloc, uco[0], uco[1], uco[2], gamma);
uloc = glGetUniformLocation(glamor_priv->xv_prog.prog, "vco");
uloc = glGetUniformLocation(port_priv->xv_prog.prog, "vco");
glUniform4f(uloc, vco[0], vco[1], vco[2], 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[0]->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);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[1]->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_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[0]->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);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[1]->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);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->fbo->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
......@@ -403,6 +494,39 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
break;
case FOURCC_NV12:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[0]->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);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[1]->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_UYVY:
uloc = glGetUniformLocation(port_priv->xv_prog.prog, "texelSize");
glUniform2f(uloc, 1.0 / port_priv->w, 1.0 / port_priv->h);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[0]->fbo->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
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_RGBA32:
case FOURCC_RGB565:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[0]->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;
default:
break;
......@@ -459,7 +583,7 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
glamor_set_destination_drawable(port_priv->pDraw,
dst_box_index,
FALSE, FALSE,
glamor_priv->xv_prog.matrix_uniform,
port_priv->xv_prog.matrix_uniform,
&dst_off_x, &dst_off_y);
for (i = 0; i < nBox; i++) {
......@@ -480,8 +604,25 @@ glamor_xv_render(glamor_port_private *port_priv, int id)
glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
DamageDamageRegion(port_priv->pDraw, &port_priv->clip);
}
static Bool
glamor_xv_can_reuse_port(glamor_port_private *port_priv, int id, short w, short h)
{
int ret = TRUE;
if (port_priv->prev_fmt != id)
ret = FALSE;
glamor_xv_free_port_data(port_priv);
if (w != port_priv->src_pix_w || h != port_priv->src_pix_h)
ret = FALSE;
if (!port_priv->src_pix[0])
ret = FALSE;
port_priv->prev_fmt = id;
return ret;
}
int
......@@ -499,7 +640,6 @@ 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;
......@@ -507,43 +647,70 @@ 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) ||
(port_priv->src_pix[2] && id == FOURCC_NV12) ||
(!port_priv->src_pix[2] && id != FOURCC_NV12)) {
if (!glamor_xv_can_reuse_port(port_priv, id, width, height)) {
int i;
if (glamor_priv->xv_prog.prog) {
glDeleteProgram(glamor_priv->xv_prog.prog);
glamor_priv->xv_prog.prog = 0;
glamor_xv_free_port_data(port_priv);
if (port_priv->xv_prog.prog) {
glDeleteProgram(port_priv->xv_prog.prog);
port_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]);
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 8,
GLAMOR_CREATE_FBO_NO_FBO);
switch (id) {
case FOURCC_YV12:
case FOURCC_I420:
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);
if (!port_priv->src_pix[2])
if (!port_priv->src_pix[1] || !port_priv->src_pix[2])
return BadAlloc;
break;
case FOURCC_NV12:
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, 16,
GLAMOR_CREATE_FBO_NO_FBO |
GLAMOR_CREATE_FORMAT_CBCR);
port_priv->src_pix[2] = NULL;
if (!port_priv->src_pix[1])
return BadAlloc;
break;
case FOURCC_RGBA32:
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 32,
GLAMOR_CREATE_FBO_NO_FBO);
port_priv->src_pix[1] = NULL;
port_priv->src_pix[2] = NULL;
break;
case FOURCC_RGB565:
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 16,
GLAMOR_CREATE_FBO_NO_FBO);
port_priv->src_pix[1] = NULL;
port_priv->src_pix[2] = NULL;
break;
case FOURCC_UYVY:
port_priv->src_pix[0] =
glamor_create_pixmap(pScreen, width, height, 32,
GLAMOR_CREATE_FBO_NO_FBO |
GLAMOR_CREATE_FORMAT_CBCR);
port_priv->src_pix[1] = NULL;
port_priv->src_pix[2] = NULL;
break;
default:
return BadMatch;
......@@ -552,7 +719,7 @@ glamor_xv_put_image(glamor_port_private *port_priv,
port_priv->src_pix_w = width;
port_priv->src_pix_h = height;
if (!port_priv->src_pix[0] || !port_priv->src_pix[1])
if (!port_priv->src_pix[0])
return BadAlloc;
}
......@@ -619,6 +786,27 @@ glamor_xv_put_image(glamor_port_private *port_priv,
0, 0, 0, 0,
buf + s2offset, srcPitch);
break;
case FOURCC_UYVY:
case FOURCC_RGB565:
srcPitch = width * 2;
full_box.x1 = 0;
full_box.y1 = 0;
full_box.x2 = width;
full_box.y2 = height;
glamor_upload_boxes(&port_priv->src_pix[0]->drawable, &full_box, 1,
0, 0, 0, 0,
buf, srcPitch);
break;
case FOURCC_RGBA32:
srcPitch = width * 4;
full_box.x1 = 0;
full_box.y1 = 0;
full_box.x2 = width;
full_box.y2 = height;
glamor_upload_boxes(&port_priv->src_pix[0]->drawable, &full_box, 1,
0, 0, 0, 0,
buf, srcPitch);
break;
default:
return BadMatch;
}
......
......@@ -176,4 +176,43 @@
XvTopToBottom \
}
#define FOURCC_RGBA32 0x34325241
#define XVIMAGE_RGB32 \
{ \
FOURCC_RGBA32, \
XvRGB, \
LSBFirst, \
{'R','A','2','4', \
0x00, 0x00, 0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71}, \
32, \
XvPacked, \
1, \
32, 0xff0000, 0xff00, 0xff, \
0, 0, 0, \
0, 0, 0, \
0, 0, 0, \
{0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, \
0 \
}
#define FOURCC_RGB565 0x36314752
#define XVIMAGE_RGB565 \
{ \
FOURCC_RGB565, \
XvRGB, \
LSBFirst, \
{'R','G','1','6', \
0x00, 0x00, 0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71}, \
16, \
XvPacked, \
1, \
16, 0xf800, 0x7e0, 0x1f, \
0, 0, 0, \
0, 0, 0, \
0, 0, 0, \
{0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, \
0 \
}
#endif /* _XF86_FOURCC_H_ */