Age | Commit message (Collapse) | Author |
|
To enable it, set SMI501_CLI_DEBUG to 1 in smi.h, and use
Option "AcellMethod "EXA"
in the Device section of /etc/X11/xorg.conf
This code is enabled mainly for debug purposes. To make if have an
actual performance gain (like when using a sm50x with a "low profile"
"main" processor") it should be required to actually do busy loops
in kernel mode (and hope the costs of context switch will pay it).
In kernel mode it is possible to wait for an interrupt being triggered
when the command list is processed, or when the 2d engine is idle.
This commit should be functional, but, mainly due to debug messages,
should be significantly slower then a build with MI501_CLI_DEBUG
defined to 0.
|
|
The LEAVE() macro, when debug is disabled, now is defined as:
<hash>define LEAVE(...) return __VA_ARGS__
This avoids the requirement of a return statement after the LEAVE()
macro call, what can be confusing.
|
|
The smi 501/502 cannot rotate-blt more than 32 bytes at a time.
Patch based on smi's sample smi_shadow.c.
XAA + randr + rotated mode currently not supported.
|
|
|
|
* Implementation of the PictOpSrc render operation with a
source coordinate transformation through 2D engine rotate-BITBLTs.
* Fix EXA Copy and Solid in 24 bpp packed color mode.
|
|
Moved most of the Lynx-specific code out of the main
functions at smi_driver.c to some new files: smilynx_hw.c
(With CRTC-independent code like global hardware initialization and
mode saving/restoring), smilynx_crtc.c (With the CRTC-local
procedures) and smilynx_output.c (Output power management, DDC and
monitor detection, currently).
Done something similar with the SMI501 code: split
SMI501_ModeInit in three separate functions: SMI501_HWInit that does
the global initialization, and the CRTC mode_set callbacks
SMI501_ModeSet_crt and SMI501_ModeSet_lcd at smi501_crtc.c.
The SMI501_ModeSet code is divided into SMI501_WriteMode_common,
SMI501_WriteMode_lcd and SMI501_WriteMode_crt, each one updates a
different register set in the hardware.
Inside smi_crtc.c, there is mainly hardware independent
code... Initial CRT controller allocation, shadows, rotation and
framebuffer resizing code.
The shadow code currently relies on EXA... I'm not sure what are the
problems of the EXA implementation in MSOC. Does it work?
I think it would be a good thing to get rid of XAA soon: The next
thing I'll be working on will be EXA Composite... I hope it's possible
to get EXA acceleration working at least as fast as the current
XAA. (Although Teddy Wang confirmed me that the SMI720 DMA engine is
broken...)
So, the patch adds some features like new Lynx dualhead modesetting
code, but it probably breaks some other things:
* Video Overlay: I suppose it does work with EXA activated. It seems
it is also possible to have simultaneous overlays in both CRTCs with the
Lynx hardware (I have some code for this, but still work in progress).
* Hardware Cursor (It needs more integration in the CRTC interfaces).
* The old Shadow FB / rotation code, which we should probably drop.
These are in my TODO list... Along with some more cleaning and other
minor issues in the modesetting code.
About the SMI501 RandR1.2 implementation... I suppose it's specially
lacking per-output DPMS (The DPMS field in the System Control register
only affects the CRT, doesn't it?).
|
|
WaitQueue() did receive an unused parameter, that was removed. The
parameter was unused since version 1.0 in XFree86 CVS, so probably
nobody knows for what it was used.
WaitIdle() now also replaces WaitIdleEmpty(), as an idle engine
should also have an empty fifo.
SMI_SubsequentScreenToScreenCopy() was changed to use WaitIdle()
instead of WaitQueue() before submitting the commands to the engine.
This fixes a nasty lockup when using XaaOffscreenPixmaps (what is
desired/wanted to help improve performance), and the lockup in the
MSOC was clearly due to an engine overrun, when sending commands
faster then the engine could process.
|
|
Instead of cut&paste of the name of the current function everywhere,
just use cpp's __FUNCTION__ predefined macro.
Create two macros to exit a function, named LEAVE() and RETURN().
Functions returning void should call LEAVE() and then explicitly return
for now. "Logged" function calls are indented, so a review was done to
ensure functions with a ENTER() also have the proper exit macro.
The DEBUG macro was changed to have variadic arguments, and this way
it is no longer required to prefix arguments with VERBLEV, but now it
also is not possible to use another "verbosity value", but it wasn't used
in any of the DEBUG macro calls.
|
|
This just allows exa to run, with a minimal ammount of features avaiable.
|
|
Code compiled with:
gcc -Wall -Wbad-function-cast -Wdeclaration-after-statement \
-Wmissing-prototypes -Wmissing-declarations -Wnested-externs \
-fno-strict-aliasing -Wold-style-definition -Wpointer-arith \
-Wstrict-prototypes
This patch also makes most smi_501.c functions static, as they are not
called from anywhere else.
Also removed prototypes for non existent functions in smi_501.h.
|
|
In DTS:
* It uses the screen Bpp inestead of the pixmap Bpp...
this gives some problems when using pixmaps with different depth
to the screen.
In UTS:
* aligned_pitch was computed from src_pitch inestead of the
pixmap width.
* When writing the target coordinates to the DE registers, it does
y*0xFFFF inestead of y & 0xFFFF.
* I renamed source_pitch to src_pixelpitch as it is very confusing
to have src_pitch and source_pitch.
* It isn't necessary to call WaitQueue before copying each scanline,
but it seems it almost doesn't affect performance.
Signed-off-by: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
|
|
* I added the configuration file option "RandRRotation".
* I replaced pSmi->ShadowPitch with pSmi->screenStride, it seems it
makes more sense because the lower word of ShadowPitch may change
independently.
* I moved the SMI_DEDataFormat to smi_accel.c because it seems it is
a piece of code repeated many times in the driver.
* At some places, it is assumed the framebuffer is at FBOffset:
when using a shadow framebuffer, FBOffset is the location of the
on-screen framebuffer (0 should be used). This made e.g. EXA
completly useless with ShadowFB enabled (it crashed).
* In the FBManager initialization, I have replaced xf86InitFBManager
with xf86InitFBManagerRegion to reserve some additional space as
screen fb: it's unlikely to be the case, but a less efficient
alignment in the rotated mode could make the rotated mode need more
memory than the unrotated one.
This is not a problem with EXA as the offscreen memory parameters
can be easily modified when doing the rotation.
* In SMI_RefreshArea it's assumed that some DE registers are already
in some state, this is specially not true when using EXA.
* SMI_ValidMode rejects a rotated mode with different dimensions
than the panel. This seems to work now.
Signed-off-by: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
|
|
|
|
Also remove safety padding on memory manager calculation
|
|
UTS is working, but SW is faster so leave it disabled
|
|
Unforunately, for 32 bpp solid fills the HW ignores alpha.
|
|
|
|
|
|
Rather than writing to the engine command register for every
operation, set quick start mode, and the operation executes
automatically when the width register is written.
|
|
|
|
|
|
|
|
FBBase already take the register offset into account.
|
|
pSmi->FBOffset is the offset from the start of the framebuffer
pScrn->fbOffset is the aperture offset where the framebuffer
starts
|
|
|
|
|
|
Based on Dennis' code from bug 8721 with some minor
changes by me.
|