#!/usr/bin/perl -w # Copyright 2012 Kevin Ryde # This file is part of X11-Protocol-Other. # # X11-Protocol-Other is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as published # by the Free Software Foundation; either version 3, or (at your option) any # later version. # # X11-Protocol-Other is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with X11-Protocol-Other. If not, see . BEGIN { require 5 } use strict; use X11::Protocol; use Test; use lib 't'; use MyTestHelpers; BEGIN { MyTestHelpers::nowarnings() } END { MyTestHelpers::diag ("END"); } # uncomment this to run the ### lines #use Smart::Comments; my $test_count = (tests => 21)[1]; plan tests => $test_count; require X11::Protocol; MyTestHelpers::diag ("X11::Protocol version ", X11::Protocol->VERSION); my $have_extension = 0; my $display = $ENV{'DISPLAY'}; if (! defined $display) { foreach (1 .. $test_count) { skip ('No DISPLAY set', 1, 1); } exit 0; } # pass display arg so as not to get a "guess" warning my $X; if (! eval { $X = X11::Protocol->new ($display); }) { MyTestHelpers::diag ('Cannot connect to X server -- ',$@); foreach (1 .. $test_count) { skip ('Cannot connect to X server', 1, 1); } exit 0; } $X->QueryPointer($X->{'root'}); # sync my ($major_opcode, $first_event, $first_error) = $X->QueryExtension('XFree86-DGA'); { if (! defined $major_opcode) { foreach (1 .. $test_count) { skip ('QueryExtension() no XFree86-DGA on the server', 1, 1); } exit 0; } MyTestHelpers::diag ("XFree86-DGA extension opcode=$major_opcode event=$first_event error=$first_error"); } if (! $X->init_extension ('XFree86-DGA')) { die "QueryExtension says XFree86-DGA avaiable, but init_extension() failed"; } $X->QueryPointer($X->root); # sync { my $want_major = 2; my $want_minor = 0; my ($server_major, $server_minor) = $X->XF86DGAQueryVersion(); MyTestHelpers::diag ("XF86DGAQueryVersion() got server version $server_major.$server_minor"); if ((($want_major <=> $server_major) || ($want_minor <=> $server_minor)) < 0) { foreach (1 .. $test_count) { skip ("QueryVersion() no XFree86-DGA $want_major.$want_minor on the server", 1, 1); } exit 0; } } END { if ($have_extension) { MyTestHelpers::diag ("cleanup, XF86DGADirectVideo disable"); local $X->{'error_handler'} = sub { my ($X, $data) = @_; my ($type, $seq, $info, $minor_op, $major_op) = unpack 'xCSLSC', $data; MyTestHelpers::diag (" ignore error in cleanup: ",$type); }; $X->XF86DGADirectVideo (0, 0); # disable $X->QueryPointer($X->root); # sync MyTestHelpers::diag (" done XF86DGADirectVideo disable"); } } $have_extension = 1; #------------------------------------------------------------------------------ # _hilo_to_card64() ok (X11::Protocol::Ext::XFree86_DGA::_hilo_to_card64(0,1), 1); ok (X11::Protocol::Ext::XFree86_DGA::_hilo_to_card64(0,0x8000_0000), 2147483648); ok (X11::Protocol::Ext::XFree86_DGA::_hilo_to_card64(0,0xFFFF_FFFF), 4294967295); ok (X11::Protocol::Ext::XFree86_DGA::_hilo_to_card64(0x8000_0000,3) . '', '9223372036854775811'); ok (X11::Protocol::Ext::XFree86_DGA::_hilo_to_card64(0x1234_5678, 0x8765_4321) . '', '1311768467139281697'); ok (X11::Protocol::Ext::XFree86_DGA::_hilo_to_card64(0xFFFF_FFFF, 0xFFFF_FFFF) . '', '18446744073709551615'); #------------------------------------------------------------------------------ my $screen_num = MyTestHelpers::X11_chosen_screen_number($X); my $direct_video_available; { my $flags = $X->XF86DGAQueryDirectVideo(0); MyTestHelpers::diag ("XF86DGAQueryDirectVideo flags=$flags in hex ", sprintf('%X',$flags)); ok ($flags =~ /^\d+$/, 1); $direct_video_available = $flags & 1; } $X->QueryPointer($X->root); # sync my $skip_if_no_direct_video; if (! $direct_video_available) { $skip_if_no_direct_video = 'no direct video available'; } #------------------------------------------------------------------------------ # XDGASetClientVersion() $X->XDGASetClientVersion(2,0); $X->QueryPointer($X->root); # sync #------------------------------------------------------------------------------ # XDGAQueryModes() my $first_mode; { my @ret; if ($direct_video_available) { @ret = $X->XDGAQueryModes($screen_num); } skip ($skip_if_no_direct_video, scalar(@ret) & 1, 0); $first_mode = $ret[0]; } #------------------------------------------------------------------------------ # XF86DGADirectVideo() enable my $enabled = 1; { my $orig_error_handler = $X->{'error_handler'}; local $X->{'error_handler'} = sub { my ($X, $data) = @_; ### error handler ### $data my ($type, $seq, $info, $minor_op, $major_op) = unpack 'xCSLSC', $data; my $typename = $X->interp('Error',$type); if ($typename =~ /^XF86DGA/) { MyTestHelpers::diag ("XF86DGADirectVideo error $typename"); $enabled = 0; } else { goto $orig_error_handler; } }; MyTestHelpers::diag ("XF86DGADirectVideo attempt ..."); $X->XF86DGADirectVideo($screen_num, 0x02); $X->QueryPointer($X->root); # sync MyTestHelpers::diag ("XF86DGADirectVideo done"); } my $skip_if_not_enabled; if ($enabled) { MyTestHelpers::diag ('DirectVideo enabled'); } else { MyTestHelpers::diag ('DirectVideo not enabled'); $skip_if_not_enabled = 'skip due to DirectVideo not enabled'; } #------------------------------------------------------------------------------ # XDGAQueryModes() #------------------------------------------------------------------------------ # XDGASetMode() #------------------------------------------------------------------------------ # XDGASetViewport() if ($enabled) { # Must activate first. $X->XDGASetViewport($screen_num, 0,0, 0); $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGAInstallColormap() if ($enabled) { # Must activate first. my $colormap = $X->default_colormap; $X->XDGAInstallColormap($screen_num, $colormap); $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGASelectInput() if ($enabled) { # Must activate first. $X->XDGASelectInput($screen_num,0); $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGAFillRectangle() if ($enabled) { # Must activate first. $X->XDGAFillRectangle($screen_num, 0,0, 16,16, 0); $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGACopyArea() if ($enabled) { # Must activate first. $X->XDGACopyArea($screen_num, 16,0, # src 16,16, # w,h 0,0); # dst $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGACopyTransparentArea() # FIXME: what is the key? # Only if DGA_BLIT_RECT_TRANS ? # # if ($enabled) { # Must activate first. # $X->XDGACopyTransparentArea($screen_num, # 32,0, # src # 16,16, # w,h # 32,16, # dst # 0); # key # $X->QueryPointer($X->root); # sync # } #------------------------------------------------------------------------------ # XDGAGetViewportStatus() { my @ret; if ($direct_video_available) { @ret = $X->XDGAGetViewportStatus($screen_num); MyTestHelpers::diag ("XDGAGetViewportStatus ", join(', ',@ret)); } skip ($skip_if_no_direct_video, scalar(@ret), 1); # my ($device_name, $addr, $size, $offset, $extra) = @ret; $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGASync() if ($enabled) { # Must activate first. $X->XDGASync($screen_num); $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGAOpenFramebuffer() { my @ret; if ($direct_video_available) { @ret = $X->XDGAOpenFramebuffer($screen_num); MyTestHelpers::diag ("XDGAOpenFramebuffer ", join(', ',@ret)); } skip ($skip_if_no_direct_video, scalar(@ret), 5); # my ($device_name, $addr, $size, $offset, $extra) = @ret; $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGACloseFramebuffer() if ($direct_video_available) { $X->XDGACloseFramebuffer($screen_num); $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGAChangePixmapMode() { my @ret; if ($direct_video_available) { @ret = $X->XDGAChangePixmapMode($screen_num,0,0); $X->QueryPointer($X->root); # sync } skip ($skip_if_no_direct_video, scalar(@ret), 2); } #------------------------------------------------------------------------------ # XDGACreateColormap() if ($enabled) { my $colormap = $X->new_rsrc; my $alloc = 0; $X->XDGACreateColormap ($screen_num, $colormap, $first_mode, $alloc); $X->QueryPointer($X->root); # sync $X->FreeColormap($colormap); $X->QueryPointer($X->root); # sync } #------------------------------------------------------------------------------ # XDGASetClientVersion() #------------------------------------------------------------------------------ # XDGASetClientVersion() #------------------------------------------------------------------------------ # XDGASetClientVersion() #------------------------------------------------------------------------------ # XDGASetClientVersion() #------------------------------------------------------------------------------ exit 0; __END__ # XF86DGAGetVidPage { my $page = ''; if ($direct_video_available) { $page = $X->XF86DGAGetVidPage(0); MyTestHelpers::diag ("XF86DGAGetVidPage ", $page); } skip ($skip_if_no_direct_video, $page =~ /^\d+$/, 1); } $X->QueryPointer($X->root); # sync #------------------------------------------------------------------------------ # XF86DGADirectVideo my $enabled = 1; { my $orig_error_handler = $X->{'error_handler'}; local $X->{'error_handler'} = sub { my ($X, $data) = @_; ### error handler ### $data my ($type, $seq, $info, $minor_op, $major_op) = unpack 'xCSLSC', $data; my $typename = $X->interp('Error',$type); if ($typename =~ /^XF86DGA/) { MyTestHelpers::diag ("XF86DGADirectVideo error $typename"); $enabled = 0; } else { goto $orig_error_handler; } }; MyTestHelpers::diag ("XF86DGADirectVideo attempt ..."); $X->XF86DGADirectVideo(0, 0x02); $X->QueryPointer($X->root); # sync MyTestHelpers::diag ("XF86DGADirectVideo done"); } my $skip_if_not_enabled; if ($enabled) { MyTestHelpers::diag ('DirectVideo enabled'); } else { MyTestHelpers::diag ('DirectVideo not enabled'); $skip_if_not_enabled = 'skip due to DirectVideo not enabled'; } #------------------------------------------------------------------------------ # XF86DGAGetVidPage / XF86DGASetVidPage { my $old_page = $X->XF86DGAGetVidPage(0); my $new_page = 0; my $got_page; if ($enabled) { $X->XF86DGASetVidPage (0, 0); $got_page = $X->XF86DGAGetVidPage(0); } skip ($skip_if_not_enabled, $got_page, $new_page, 'XF86DGASetVidPage page'); } $X->QueryPointer($X->root); # sync #------------------------------------------------------------------------------ # XF86DGASetViewPort { if ($enabled) { $X->XF86DGASetViewPort(0, 0,0); $X->QueryPointer($X->root); # sync } skip ($skip_if_not_enabled, 1,1, 'XF86DGAInstallColormap'); } #------------------------------------------------------------------------------ # XF86DGAInstallColormap { my $colormap = $X->default_colormap; if ($enabled) { $X->XF86DGAInstallColormap(0, $colormap); } skip ($skip_if_not_enabled, 1,1, 'XF86DGAInstallColormap'); } $X->QueryPointer($X->root); # sync #------------------------------------------------------------------------------ # XF86DGAViewPortChanged { my $bool = 'x'; if ($enabled) { $bool = $X->XF86DGAViewPortChanged(0); MyTestHelpers::diag ("XF86DGAViewPortChanged ", $bool); } skip ($skip_if_not_enabled, $bool =~ /^\d+$/, 1, 'XF86DGAViewPortChanged return'); } $X->QueryPointer($X->root); # sync #------------------------------------------------------------------------------ exit 0;