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
  • guillem/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
  • rc_05/xserver
  • Kyawswat/xserver
  • hexiaodong/xserver
  • gilvbp/xserver
  • vliaskov/xserver
  • zzyiwei/xserver
  • aarondill/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
  • alanc/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
  • xorg/xserver
  • Zamundaaa/xserver
  • Gorg/xserver
  • ForTheReallys/xserver
  • lkundrak/xserver
  • niveditharau/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
  • ipominov/xserver
  • JeffyCN/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
  • luke-jr/xserver
  • trevdave/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
  • nicolas-guichard/xserver
  • yangxiaojuan-loongson/xserver
  • luporl/xserver
  • cbur201592/xserver
  • bphaslett/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
  • kaocher82/xserver
  • pepp/xserver
  • cgzones/xserver
  • luyn/xserver
  • 1740301466jxz/xserver
  • ids1024/xserver
  • svalaskevicius/xserver
  • ZhiJie.Zhang/xserver
  • eschwartz/xserver
  • jayantpranjal0/xserver
  • hmazlan/xserver
  • kerneltoast/xserver
  • Michaelypk/xserver
  • dottedmag/xserver
  • aplattner/xserver
  • sergiomb/xserver
  • metux/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
  • 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
343 results
Show changes
Commits on Source (8)
......@@ -223,7 +223,7 @@ glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
pixmap_priv = glamor_get_pixmap_private(pixmap);
pixmap_priv->is_cbcr = (usage == GLAMOR_CREATE_FORMAT_CBCR);
pixmap_priv->is_cbcr = (GLAMOR_CREATE_FORMAT_CBCR & usage) == GLAMOR_CREATE_FORMAT_CBCR;
pitch = (((w * pixmap->drawable.bitsPerPixel + 7) / 8) + 3) & ~3;
screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, pitch, NULL);
......@@ -550,9 +550,10 @@ glamor_setup_formats(ScreenPtr screen)
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
/* Prefer r8 textures since they're required by GLES3 and core,
* only falling back to a8 if we can't do them.
* only falling back to a8 if we can't do them. We cannot do them
* on GLES2 due to lack of texture swizzle.
*/
if (glamor_priv->is_gles || epoxy_has_gl_extension("GL_ARB_texture_rg")) {
if (glamor_priv->has_rg && glamor_priv->has_texture_swizzle) {
glamor_add_format(screen, 1, PICT_a1,
GL_R8, GL_RED, GL_UNSIGNED_BYTE, FALSE);
glamor_add_format(screen, 8, PICT_a8,
......@@ -586,10 +587,10 @@ glamor_setup_formats(ScreenPtr screen)
if (glamor_priv->is_gles) {
assert(X_BYTE_ORDER == X_LITTLE_ENDIAN);
glamor_add_format(screen, 24, PICT_x8b8g8r8,
GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, TRUE);
glamor_add_format(screen, 32, PICT_a8b8g8r8,
GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, TRUE);
glamor_add_format(screen, 24, PICT_x8r8g8b8,
GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE, TRUE);
glamor_add_format(screen, 32, PICT_a8r8g8b8,
GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE, TRUE);
} else {
glamor_add_format(screen, 24, PICT_x8r8g8b8,
GL_RGBA, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, TRUE);
......@@ -606,8 +607,13 @@ glamor_setup_formats(ScreenPtr screen)
}
glamor_priv->cbcr_format.depth = 16;
glamor_priv->cbcr_format.internalformat = GL_RG8;
if (glamor_priv->is_gles && glamor_priv->has_rg) {
glamor_priv->cbcr_format.internalformat = GL_RG;
} else {
glamor_priv->cbcr_format.internalformat = GL_RG8;
}
glamor_priv->cbcr_format.format = GL_RG;
glamor_priv->cbcr_format.render_format = PICT_yuv2;
glamor_priv->cbcr_format.type = GL_UNSIGNED_BYTE;
glamor_priv->cbcr_format.rendering_supported = TRUE;
}
......@@ -782,11 +788,18 @@ glamor_init(ScreenPtr screen, unsigned int flags)
epoxy_gl_version() >= 30 ||
epoxy_has_gl_extension("GL_NV_pack_subimage");
glamor_priv->has_dual_blend =
glamor_glsl_has_ints(glamor_priv) &&
epoxy_has_gl_extension("GL_ARB_blend_func_extended");
(epoxy_has_gl_extension("GL_ARB_blend_func_extended") &&
(glamor_glsl_has_ints(glamor_priv) ||
epoxy_has_gl_extension("GL_ARB_ES2_compatibility"))) ||
epoxy_has_gl_extension("GL_EXT_blend_func_extended");
glamor_priv->has_clear_texture =
epoxy_gl_version() >= 44 ||
epoxy_has_gl_extension("GL_ARB_clear_texture");
/* GL_EXT_texture_rg is part of GLES3 core */
glamor_priv->has_rg =
(glamor_priv->is_gles && epoxy_gl_version() >= 30) ||
epoxy_has_gl_extension("GL_EXT_texture_rg") ||
epoxy_has_gl_extension("GL_ARB_texture_rg");
glamor_priv->can_copyplane = (gl_version >= 30);
......
......@@ -208,6 +208,22 @@ static const glamor_facet glamor_facet_composite_glyphs_120 = {
.locations = glamor_program_location_atlas,
};
static const glamor_facet glamor_facet_composite_glyphs_gles2 = {
.name = "composite_glyphs",
.version = 100,
.fs_extensions = ("#extension GL_EXT_blend_func_extended : enable\n"),
.vs_vars = ("attribute vec2 primitive;\n"
"attribute vec2 source;\n"
"varying vec2 glyph_pos;\n"),
.vs_exec = (" vec2 pos = vec2(0,0);\n"
GLAMOR_POS(gl_Position, primitive.xy)
" glyph_pos = source.xy * ATLAS_DIM_INV;\n"),
.fs_vars = ("varying vec2 glyph_pos;\n"),
.fs_exec = (" vec4 mask = texture2D(atlas, glyph_pos);\n"),
.source_name = "source",
.locations = glamor_program_location_atlas,
};
static Bool
glamor_glyphs_init_facet(ScreenPtr screen)
{
......@@ -442,7 +458,9 @@ glamor_composite_glyphs(CARD8 op,
else
prog = glamor_setup_program_render(op, src, glyph_pict, dst,
glyphs_program,
&glamor_facet_composite_glyphs_120,
glamor_priv->has_dual_blend ?
&glamor_facet_composite_glyphs_gles2 :
&glamor_facet_composite_glyphs_120,
glamor_priv->glyph_defines);
if (!prog)
goto bail_one;
......
......@@ -605,27 +605,35 @@ _glamor_gradient_convert_trans_matrix(PictTransform *from, float to[3][3],
* T_s = | w*t21/h t22 t23/h|
* | w*t31 h*t32 t33 |
* -- --
*
* Because GLES2 cannot do trasposed mat by spec, we did transposing inside this function
* already, and matrix becoming look like this:
* -- --
* | t11 w*t21/h t31*w|
* T_s = | h*t12/w t22 t32*h|
* | t13/w t23/h t33 |
* -- --
*/
to[0][0] = (float) pixman_fixed_to_double(from->matrix[0][0]);
to[0][1] = (float) pixman_fixed_to_double(from->matrix[0][1])
to[1][0] = (float) pixman_fixed_to_double(from->matrix[0][1])
* (normalize ? (((float) height) / ((float) width)) : 1.0);
to[0][2] = (float) pixman_fixed_to_double(from->matrix[0][2])
to[2][0] = (float) pixman_fixed_to_double(from->matrix[0][2])
/ (normalize ? ((float) width) : 1.0);
to[1][0] = (float) pixman_fixed_to_double(from->matrix[1][0])
to[0][1] = (float) pixman_fixed_to_double(from->matrix[1][0])
* (normalize ? (((float) width) / ((float) height)) : 1.0);
to[1][1] = (float) pixman_fixed_to_double(from->matrix[1][1]);
to[1][2] = (float) pixman_fixed_to_double(from->matrix[1][2])
to[2][1] = (float) pixman_fixed_to_double(from->matrix[1][2])
/ (normalize ? ((float) height) : 1.0);
to[2][0] = (float) pixman_fixed_to_double(from->matrix[2][0])
to[0][2] = (float) pixman_fixed_to_double(from->matrix[2][0])
* (normalize ? ((float) width) : 1.0);
to[2][1] = (float) pixman_fixed_to_double(from->matrix[2][1])
to[1][2] = (float) pixman_fixed_to_double(from->matrix[2][1])
* (normalize ? ((float) height) : 1.0);
to[2][2] = (float) pixman_fixed_to_double(from->matrix[2][2]);
DEBUGF("the transform matrix is:\n%f\t%f\t%f\n%f\t%f\t%f\n%f\t%f\t%f\n",
DEBUGF("the transposed transform matrix is:\n%f\t%f\t%f\n%f\t%f\t%f\n%f\t%f\t%f\n",
to[0][0], to[0][1], to[0][2],
to[1][0], to[1][1], to[1][2], to[2][0], to[2][1], to[2][2]);
}
......@@ -950,11 +958,12 @@ glamor_generate_radial_gradient_picture(ScreenPtr screen,
_glamor_gradient_convert_trans_matrix(src_picture->transform,
transform_mat, width, height, 0);
glUniformMatrix3fv(transform_mat_uniform_location,
1, 1, &transform_mat[0][0]);
1, GL_FALSE, &transform_mat[0][0]);
}
else {
/* identity matrix dont need to be transposed */
glUniformMatrix3fv(transform_mat_uniform_location,
1, 1, &identity_mat[0][0]);
1, GL_FALSE, &identity_mat[0][0]);
}
if (!_glamor_gradient_set_pixmap_destination
......@@ -1266,11 +1275,12 @@ glamor_generate_linear_gradient_picture(ScreenPtr screen,
_glamor_gradient_convert_trans_matrix(src_picture->transform,
transform_mat, width, height, 1);
glUniformMatrix3fv(transform_mat_uniform_location,
1, 1, &transform_mat[0][0]);
1, GL_FALSE, &transform_mat[0][0]);
}
else {
/* identity matrix dont need to be transposed */
glUniformMatrix3fv(transform_mat_uniform_location,
1, 1, &identity_mat[0][0]);
1, GL_FALSE, &identity_mat[0][0]);
}
if (!_glamor_gradient_set_pixmap_destination
......
......@@ -94,7 +94,7 @@ glamor_get_tex_format_type_from_pictformat(ScreenPtr pScreen,
*tex_format = GL_BGRA;
*tex_type = GL_UNSIGNED_INT_8_8_8_8;
} else {
*tex_format = GL_RGBA;
*tex_format = GL_BGRA;
*tex_type = GL_UNSIGNED_BYTE;
swizzle[0] = GL_GREEN;
......@@ -113,12 +113,9 @@ glamor_get_tex_format_type_from_pictformat(ScreenPtr pScreen,
*tex_format = GL_BGRA;
*tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
} else {
*tex_format = GL_RGBA;
*tex_format = GL_BGRA;
*tex_type = GL_UNSIGNED_BYTE;
swizzle[0] = GL_BLUE;
swizzle[2] = GL_RED;
if (!is_little_endian)
byte_swap_swizzle(swizzle);
break;
......
......@@ -216,6 +216,7 @@ typedef struct glamor_screen_private {
Bool has_dual_blend;
Bool has_clear_texture;
Bool has_texture_swizzle;
Bool has_rg;
Bool is_core_profile;
Bool can_copyplane;
Bool use_gpu_shader4;
......
......@@ -201,6 +201,8 @@ static const char vs_template[] =
static const char fs_template[] =
"%s" /* version */
"%s" /* exts */
"%s" /* prim fs_extensions */
"%s" /* fill fs_extensions */
GLAMOR_DEFAULT_PRECISION
"%s" /* defines */
"%s" /* prim fs_vars */
......@@ -281,6 +283,11 @@ glamor_build_program(ScreenPtr screen,
gpu_shader4 = TRUE;
}
}
/* For now, fix shader version to GLES as 100. We will fall with 130 shaders
* in previous check due to forcibly set 120 glsl for GLES. But this patch
* makes xv shaders to work */
if(version && glamor_priv->is_gles)
version = 100;
vs_vars = vs_location_vars(locations);
fs_vars = fs_location_vars(locations);
......@@ -312,6 +319,8 @@ glamor_build_program(ScreenPtr screen,
if (asprintf(&fs_prog_string,
fs_template,
str(version_string),
str(prim->fs_extensions),
str(fill->fs_extensions),
gpu_shader4 ? "#extension GL_EXT_gpu_shader4 : require\n#define texelFetch texelFetch2D\n#define uint unsigned int\n" : "",
str(defines),
str(prim->fs_vars),
......@@ -494,7 +503,8 @@ glamor_set_blend(CARD8 op, glamor_program_alpha alpha, PicturePtr dst)
}
/* Set up the source alpha value for blending in component alpha mode. */
if (alpha == glamor_program_alpha_dual_blend) {
if (alpha == glamor_program_alpha_dual_blend ||
alpha == glamor_program_alpha_dual_blend_gles2) {
switch (dst_blend) {
case GL_SRC_ALPHA:
dst_blend = GL_SRC1_COLOR;
......@@ -581,11 +591,13 @@ static const glamor_facet *glamor_facet_source[glamor_program_source_count] = {
};
static const char *glamor_combine[] = {
[glamor_program_alpha_normal] = " gl_FragColor = source * mask.a;\n",
[glamor_program_alpha_ca_first] = " gl_FragColor = source.a * mask;\n",
[glamor_program_alpha_ca_second] = " gl_FragColor = source * mask;\n",
[glamor_program_alpha_dual_blend] = " color0 = source * mask;\n"
" color1 = source.a * mask;\n"
[glamor_program_alpha_normal] = " gl_FragColor = source * mask.a;\n",
[glamor_program_alpha_ca_first] = " gl_FragColor = source.a * mask;\n",
[glamor_program_alpha_ca_second] = " gl_FragColor = source * mask;\n",
[glamor_program_alpha_dual_blend] = " color0 = source * mask;\n"
" color1 = source.a * mask;\n",
[glamor_program_alpha_dual_blend_gles2] = " gl_FragColor = source * mask;\n"
" gl_SecondaryFragColorEXT = source.a * mask;\n"
};
static Bool
......@@ -633,7 +645,9 @@ glamor_setup_program_render(CARD8 op,
if (glamor_is_component_alpha(mask)) {
if (glamor_priv->has_dual_blend) {
alpha = glamor_program_alpha_dual_blend;
alpha = glamor_glsl_has_ints(glamor_priv) ?
glamor_program_alpha_dual_blend :
glamor_program_alpha_dual_blend_gles2;
} else {
/* This only works for PictOpOver */
if (op != PictOpOver)
......
......@@ -44,6 +44,7 @@ typedef enum {
glamor_program_alpha_ca_first,
glamor_program_alpha_ca_second,
glamor_program_alpha_dual_blend,
glamor_program_alpha_dual_blend_gles2,
glamor_program_alpha_count
} glamor_program_alpha;
......@@ -56,8 +57,8 @@ typedef Bool (*glamor_use_render) (CARD8 op, PicturePtr src, PicturePtr dst, gla
typedef struct {
const char *name;
const int version;
char *vs_defines;
char *fs_defines;
char *vs_extensions;
const char *fs_extensions;
const char *vs_vars;
const char *vs_exec;
const char *fs_vars;
......
......@@ -223,6 +223,15 @@ glamor_create_composite_fs(struct shader_key *key)
"}\n";
const char *header_ca_dual_blend =
"#version 130\n";
const char *in_ca_dual_blend_gles2 =
"void main()\n"
"{\n"
" gl_FragColor = dest_swizzle(get_source() * get_mask());\n"
" gl_SecondaryFragColorEXT = dest_swizzle(get_source().a * get_mask());\n"
"}\n";
const char *header_ca_dual_blend_gles2 =
"#version 100\n"
"#extension GL_EXT_blend_func_extended : require\n";
char *source;
const char *source_fetch;
......@@ -294,6 +303,10 @@ glamor_create_composite_fs(struct shader_key *key)
in = in_ca_dual_blend;
header = header_ca_dual_blend;
break;
case glamor_program_alpha_dual_blend_gles2:
in = in_ca_dual_blend_gles2;
header = header_ca_dual_blend_gles2;
break;
default:
FatalError("Bad composite IN type");
}
......@@ -327,6 +340,8 @@ glamor_create_composite_vs(struct shader_key *key)
const char *main_closing = "}\n";
const char *source_coords_setup = "";
const char *mask_coords_setup = "";
const char *version_gles2 = "#version 100\n";
const char *version = "";
char *source;
GLuint prog;
......@@ -336,10 +351,15 @@ glamor_create_composite_vs(struct shader_key *key)
if (key->mask != SHADER_MASK_NONE && key->mask != SHADER_MASK_SOLID)
mask_coords_setup = mask_coords;
if (key->in == glamor_program_alpha_dual_blend_gles2)
version = version_gles2;
XNFasprintf(&source,
"%s"
GLAMOR_DEFAULT_PRECISION
"%s%s%s%s",
main_opening,
source_coords_setup, mask_coords_setup, main_closing);
version, main_opening, source_coords_setup,
mask_coords_setup, main_closing);
prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, source);
free(source);
......@@ -701,6 +721,7 @@ combine_pict_format(PictFormatShort * des, const PictFormatShort src,
mask_type = PICT_FORMAT_TYPE(mask);
break;
case glamor_program_alpha_dual_blend:
case glamor_program_alpha_dual_blend_gles2:
src_type = PICT_FORMAT_TYPE(src);
mask_type = PICT_FORMAT_TYPE(mask);
break;
......@@ -886,8 +907,11 @@ glamor_composite_choose_shader(CARD8 op,
else {
if (op == PictOpClear)
key.mask = SHADER_MASK_NONE;
else if (glamor_priv->has_dual_blend)
key.in = glamor_program_alpha_dual_blend;
else if (glamor_priv->has_dual_blend) {
key.in = glamor_glsl_has_ints(glamor_priv) ?
glamor_program_alpha_dual_blend :
glamor_program_alpha_dual_blend_gles2;
}
else if (op == PictOpSrc || op == PictOpAdd
|| op == PictOpIn || op == PictOpOut
|| op == PictOpOverReverse)
......
......@@ -165,9 +165,6 @@ static int CommonLoseCurrent(ClientPtr client, GlxContextTagInfo *tagInfo)
tagInfo->tag, // No old context tag,
None, None, None, 0);
if (ret == Success) {
GlxFreeContextTag(tagInfo);
}
return ret;
}
......@@ -259,7 +256,6 @@ static int CommonMakeCurrent(ClientPtr client,
if (ret != Success) {
return ret;
}
oldTag = NULL;
}
if (newVendor != NULL) {
......@@ -270,6 +266,9 @@ static int CommonMakeCurrent(ClientPtr client,
} else {
reply.contextTag = 0;
}
GlxFreeContextTag(oldTag);
oldTag = NULL;
}
reply.contextTag = GlxCheckSwap(client, reply.contextTag);
......
......@@ -339,7 +339,7 @@ egl_mirror_configs(ScreenPtr pScreen, struct egl_screen *screen)
/* We walk the EGL configs backwards to make building the
* ->next chain easier.
*/
for (i = nconfigs - 1; i > 0; i--)
for (i = nconfigs - 1; i >= 0; i--)
for (j = 0; j < 3; j++) /* direct_color */
for (k = 0; k < 2; k++) /* double_buffer */ {
if (can_srgb)
......
......@@ -125,7 +125,10 @@ typedef enum _PictFormatShort {
/* 1bpp formats */
PICT_a1 = PIXMAN_a1,
PICT_g1 = PIXMAN_g1
PICT_g1 = PIXMAN_g1,
/* YCbCr formats */
PICT_yuv2 = PIXMAN_yuy2
} PictFormatShort;
/*
......
#include <xcb/xcb.h>
#include <xcb/xcb_aux.h>
#include <xcb/xcb_image.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <ctype.h>
#include <unistd.h>
/*
* This is a test which try to test correct glamor colors when rendered.
* It should be run with fullscreen Xephyr (with glamor) with present and with
* etalon high-level Xserver (can be any, on CI - Xvfb). For testing this test
* creates an image in Xephyr X server, which filled by one of colors defined in
* test_pixels. Then it captures central pixel from both Xephyr and Xserver above.
* If pixels differ - test failed. Sleep is used to ensure than presentation on both
* Xephyr and Xvfb kicks (xcb_aux_sync was not enough) and test results will be actual
*/
#define WIDTH 300
#define HEIGHT 300
int get_display_pixel(xcb_connection_t* c, xcb_drawable_t win);
void draw_display_pixel(xcb_connection_t* c, xcb_drawable_t win, uint32_t pixel_color);
int get_display_pixel(xcb_connection_t* c, xcb_drawable_t win)
{
xcb_image_t *image;
uint32_t pixel;
int format = XCB_IMAGE_FORMAT_XY_PIXMAP;
image = xcb_image_get (c, win,
0, 0, WIDTH, HEIGHT,
UINT32_MAX,
format);
if (!image) {
printf("xcb_image_get failed: exiting\n");
exit(1);
}
pixel = xcb_image_get_pixel(image, WIDTH/2, HEIGHT/2);
return pixel;
}
void draw_display_pixel(xcb_connection_t* c, xcb_drawable_t win, uint32_t pixel_color)
{
xcb_gcontext_t foreground;
uint32_t mask = 0;
xcb_rectangle_t rectangles[] = {
{0, 0, WIDTH, HEIGHT},
};
foreground = xcb_generate_id (c);
mask = XCB_GC_FOREGROUND | XCB_GC_LINE_WIDTH | XCB_GC_SUBWINDOW_MODE;
uint32_t values[] = {
pixel_color,
20,
XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS
};
xcb_create_gc (c, foreground, win, mask, values);
xcb_poly_fill_rectangle (c, win, foreground, 1, rectangles);
xcb_aux_sync ( c );
}
int main(int argc, char* argv[])
{
xcb_connection_t *c, *r;
xcb_screen_t *screen1, *screen2;
xcb_drawable_t win1, win2;
char *name_test = NULL, *name_relevant = NULL;
uint32_t pixel_server1, pixel_server2;
int result = 0;
uint32_t test_pixels[3] = {0xff0000, 0x00ff00, 0x0000ff};
int gv;
while ((gv = getopt (argc, argv, "t:r:")) != -1)
switch (gv)
{
case 't':
name_test = optarg;
break;
case 'r':
name_relevant = optarg;
break;
case '?':
if (optopt == 't' || optopt == 'r')
fprintf (stderr, "Option -%c requires an argument - test screen name.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
}
printf("test=%s, rel=%s\n", name_test, name_relevant);
c = xcb_connect (name_test, NULL);
r = xcb_connect (name_relevant, NULL);
/* get the first screen */
screen1 = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
win1 = xcb_generate_id (c);
xcb_create_window (c, /* Connection */
XCB_COPY_FROM_PARENT, /* depth (same as root)*/
win1, /* window Id */
screen1->root, /* parent window */
0, 0, /* x, y */
WIDTH, HEIGHT, /* width, height */
20, /* border_width */
XCB_WINDOW_CLASS_INPUT_OUTPUT, /* class */
screen1->root_visual, /* visual */
0, NULL ); /* masks, not used yet */
/* Map the window on the screen */
xcb_map_window (c, win1);
xcb_aux_sync(c);
/* get the first screen */
screen2 = xcb_setup_roots_iterator (xcb_get_setup (r)).data;
/* root window */
win2 = screen2->root;
for(int i = 0; i < 3; i++)
{
draw_display_pixel(c, win1, test_pixels[i]);
xcb_aux_sync(r);
pixel_server1 = get_display_pixel(c, win1);
sleep(1);
pixel_server2 = get_display_pixel(r, win2);
xcb_aux_sync(r);
printf("p=0x%x, p2=0x%x\n", pixel_server1, pixel_server2);
result+= pixel_server1 == pixel_server2;
}
return result == 3 ? 0 : 1;
}
xcb_dep = dependency('xcb', required: false)
xcb_image_dep = dependency('xcb-image', required: false)
xcb_util_dep = dependency('xcb-util', required: false)
if get_option('xvfb')
xvfb_args = [
xvfb_server.full_path(),
'-screen',
'scrn',
'1280x1024x24'
]
if xcb_dep.found() and xcb_image_dep.found() and xcb_util_dep.found() and get_option('xvfb') and get_option('xephyr') and build_glamor
bug1354 = executable('bug1354', 'bug1354.c', dependencies: [xcb_dep, xcb_image_dep, xcb_util_dep])
test('bug1354-gl',
simple_xinit,
args: [simple_xinit.full_path(),
bug1354.full_path(),
'-t',':201','-r',':200',
'----',
xephyr_server.full_path(),
'-glamor',
'-schedMax', '2000',
':201',
'--',
xvfb_args,
':200'
],
suite: 'xephyr-glamor',
timeout: 300,
)
test('bug1354-gles',
simple_xinit,
args: [simple_xinit.full_path(),
bug1354.full_path(),
'-t',':199','-r',':198',
'----',
xephyr_server.full_path(),
'-glamor_gles2',
'-schedMax', '2000',
':199',
'--',
xvfb_args,
':198'
],
suite: 'xephyr-glamor-gles2',
timeout: 300,
)
endif
endif
\ No newline at end of file
......@@ -9,13 +9,24 @@ piglit_env.set('XSERVER_DIR', meson.source_root())
piglit_env.set('XSERVER_BUILDDIR', meson.build_root())
some_ops = ' -o clear,src,dst,over,xor,disjointover'
rendercheck_tests = [
gles2_working_formats = ' -f '+ ','.join(['a8',
'a8r8g8b8',
'x8r8g8b8',
'b8g8r8a8',
'b8g8r8x8',
'r8g8b8',
'r5g5b5',
'b5g5r5',
'r5g6b5',
'b5g6r5',
'b8g8r8',
'x8b8g8r8',
'x2r10g10b10',
'x2b10g10r10'])
rendercheck_tests_noblend = [
['blend/All/a8r8g8b8', '-t blend -f a8r8g8b8'],
['blend/All/x8r8g8b8', '-t blend -f a8r8g8b8,x8r8g8b8'],
['blend/All/a2r10g10b10', '-t blend -f a8r8g8b8,a2r10g10b10'],
['blend/Clear', '-t blend -o clear'],
['blend/Src', '-t blend -o src'],
['blend/Over', '-t blend -o over'],
['composite/Some/a8r8g8b8', '-t composite -f a8r8g8b8' + some_ops],
['composite/Some/x8r8g8b8', '-t composite -f a8r8g8b8,x8r8g8b8' + some_ops],
['composite/Some/a2r10g10b10', '-t composite -f a8r8g8b8,a2r10g10b10' + some_ops],
......@@ -34,7 +45,19 @@ rendercheck_tests = [
['LibreOffice xRGB', '-t libreoffice_xrgb'],
['GTK ARGB vs xBGR', '-t gtk_argb_xbgr'],
]
rendercheck_blend = [
['blend/Clear', '-t blend -o clear'],
['blend/Src', '-t blend -o src'],
['blend/Over', '-t blend -o over'],
]
#Exclude 15bpp for now due to GLES limitation (see glamor.c:470)
rendercheck_blend_gles2 = [
['blend/Clear', '-t blend -o clear' + gles2_working_formats],
['blend/Src', '-t blend -o src' + gles2_working_formats],
['blend/Over', '-t blend -o over' + gles2_working_formats],
]
rendercheck_tests = rendercheck_blend + rendercheck_tests_noblend
rendercheck_tests_gles2 = rendercheck_blend_gles2 + rendercheck_tests_noblend
rendercheck = find_program('rendercheck', required:false)
if get_option('xvfb')
......@@ -76,6 +99,12 @@ if get_option('xvfb')
timeout: 1200,
suite: 'xephyr-glamor',
)
test('XTS',
find_program('scripts/xephyr-glamor-gles2-piglit.sh'),
env: piglit_env,
timeout: 1200,
suite: 'xephyr-glamor-gles2',
)
if rendercheck.found()
foreach rctest: rendercheck_tests
......@@ -96,6 +125,24 @@ if get_option('xvfb')
timeout: 300,
)
endforeach
foreach rctest: rendercheck_tests_gles2
test(rctest[0],
simple_xinit,
args: [simple_xinit.full_path(),
rendercheck.path(),
rctest[1].split(' '),
'----',
xephyr_server.full_path(),
'-glamor_gles2',
'-glamor-skip-present',
'-schedMax', '2000',
'--',
xvfb_args,
],
suite: 'xephyr-glamor-gles2',
timeout: 300,
)
endforeach
endif
endif
endif
......@@ -116,6 +163,7 @@ endif
subdir('bigreq')
subdir('damage')
subdir('sync')
subdir('bugs')
if build_xorg
# Tests that require at least some DDX functions in order to fully link
......
#!/bin/sh
# this times out on Travis, because the tests take too long.
if test "x$TRAVIS_BUILD_DIR" != "x"; then
exit 77
fi
# Start a Xephyr server using glamor. Since the test environment is
# headless, we start an Xvfb first to host the Xephyr.
export PIGLIT_RESULTS_DIR=$XSERVER_BUILDDIR/test/piglit-results/xephyr-glamor-gles2
export SERVER_COMMAND="$XSERVER_BUILDDIR/hw/kdrive/ephyr/Xephyr \
-glamor_gles2 \
-glamor-skip-present \
-noreset \
-schedMax 2000 \
-screen 1280x1024"
# Tests that currently fail on llvmpipe on CI
PIGLIT_ARGS="$PIGLIT_ARGS -x xcleararea@6"
PIGLIT_ARGS="$PIGLIT_ARGS -x xcleararea@7"
PIGLIT_ARGS="$PIGLIT_ARGS -x xclearwindow@4"
PIGLIT_ARGS="$PIGLIT_ARGS -x xclearwindow@5"
PIGLIT_ARGS="$PIGLIT_ARGS -x xcopyarea@1"
PIGLIT_ARGS="$PIGLIT_ARGS -x xsetfontpath@1"
PIGLIT_ARGS="$PIGLIT_ARGS -x xsetfontpath@2"
export PIGLIT_ARGS
$XSERVER_BUILDDIR/test/simple-xinit \
$XSERVER_DIR/test/scripts/run-piglit.sh \
-- \
$XSERVER_BUILDDIR/hw/vfb/Xvfb \
-screen scrn 1280x1024x24