PS3 GPU Driver: Difference between revisions
Jump to navigation
Jump to search
m (Reverted edits by 198.45.221.59 (talk) to last revision by Euss) |
|||
(68 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:OtherOS]] | |||
=Introduction= | =Introduction= | ||
Line 5: | Line 6: | ||
=Features= | =Features= | ||
* Upto 3 GPU contexts simultaneously. | * Upto 3 GPU contexts simultaneously (LV1 limit is 3 contexts per LPAR). | ||
* Direct control of GPU FIFO from user-space. | * Direct control of GPU FIFO from user-space. | ||
* Support | * Support of hardware cursors. | ||
* Dynamic allocation of GART memory. | |||
* Mapping of GART memory into GPU address space is done by the driver. That means user-space applications do not have to worry about it. | * Mapping of GART memory into GPU address space is done by the driver. That means user-space applications do not have to worry about it. | ||
* Access to GART and VRAM memory through mmap syscall. | |||
* Heap management for GART and VRAM memory. | * Heap management for GART and VRAM memory. | ||
* Support | * Support of display buffers. | ||
=Kernel Driver= | =Kernel Driver= | ||
* http://gitorious.ps3dev.net/ps3freebsd/ps3gpu | * http://gitorious.ps3dev.net/ps3freebsd/ps3gpu | ||
* http://gitorious.ps3dev.net/ | |||
==Requirements== | |||
* You have to patch your LV1 and enable 4KB GPU IO page size support else ps3gpu won't work. | |||
* You can either patch your LV1 permanently (e.g. with my ps3mfw task for LV1) or do it at run-time with my '''gpu_4kb_iopage.sh''' script. | |||
* By default, LV1 supports 1MB and 64KB GPU IO page sizes but we need 4KB page size. The reason for this is that it's very hard to allocate 1MB or 64KB continuous memory chunk in FreeBSD kernel (same applies for Linux). | |||
* gpu_4kb_iopage.sh should work with my petitboot and my Linux kernels and even on FreeBSD if you load ps3physmem driver before using the script. | |||
* http://gitorious.ps3dev.net/ps3otheros/scripts | |||
==Building== | ==Building== | ||
* You can cross-compile the kernel module or build it natively on PS3 FreeBSD. | * You can cross-compile the kernel module or build it natively on PS3 FreeBSD. | ||
* The kernel module and the kernel should | * The kernel module and the kernel should match. That means the kernel module should be build against the same kernel source else the kernel module cannot be loaded (The same applies on Linux). | ||
<pre> | <pre> | ||
cd /usr/devel | cd /usr/devel | ||
env MAKEOBJDIRPREFIX=/usr/obj/PS3 make TARGET=powerpc TARGET_ARCH=powerpc64 buildenv | env MAKEOBJDIRPREFIX=/usr/obj/PS3 SYSDIR=/usr/devel/sys make TARGET=powerpc TARGET_ARCH=powerpc64 buildenv | ||
cd /home/glevand/ps3gpu | cd /home/glevand/ps3gpu | ||
make | make | ||
Line 33: | Line 43: | ||
* ps3gpu_test is a user-space application for testing ps3gpu kernel driver. | * ps3gpu_test is a user-space application for testing ps3gpu kernel driver. | ||
* The application demonstrates how to allocate GART and VRAM memory, how to load, set and move cursor and how to flip. | |||
* It shows you how to use RSX FIFO and send commands. | |||
* It shows you how to use RSX DMA engine for memory copying (used e.g. in X11 driver all the time). | |||
* It shows how to load vertex and fragment programs, draw vertices and flip displlay buffers. | |||
* It shows how to use textures. | |||
* http://gitorious.ps3dev.net/ps3freebsd/ps3gpu_test | |||
<pre> | <pre> | ||
kldload ./ps3gpu.ko | |||
cd ps3gpu_test | cd ps3gpu_test | ||
make | make | ||
sudo ./vram_dma | |||
context id 0 | |||
control handle 0x10000000000 size 4096 | |||
fifo handle 0x40000000000 gpu addr 0x08d000000 | |||
FIFO put 0x0d000000 get 0x0d000000 ref 0xdeadbabe | |||
reset GPU state handle 0x50000000000 gpu addr 0x0d010000 | |||
FIFO put 0x0d00000c get 0x0d00000c ref 0xcafef00d | |||
VRAM handle 0x60000000000 gpu addr 0x00000000 | |||
cursor handle 0x70000000000 gpu addr 0x00900000 | |||
</pre> | |||
To restore your console: | |||
<pre> | |||
vidcontrol < /dev/ttyv0 80x25 | |||
</pre> | </pre> | ||
==Tiling== | |||
* We have to use a different video pitch. | |||
* Use e.g. ps3dm VUART driver and ps3vuart-tools to set video pitch allowed for tiling. | |||
==Screenshots== | |||
* The square in the middle of the screen is the source. | |||
* The square on the left was copied from the source by RSX DMA using positive pitches, from top to bottom. | |||
* The square on the right was copied from the source by RSX DMA using negative pitches, from bottom to top. | |||
* Unfortunately it's not possible to make a screenshot of hardware cursor by dumping video ram content because hardware cursor is overlayed. | |||
vram_dma Example: | |||
[[Image:Freebsd_ps3gpu_test.jpg|300px|Image: 300 pixels]] | |||
triangle Example: | |||
[[Image:Freebsd_ps3gpu_test_triangle.jpg|300px|Image: 300 pixels]] | |||
quad Example: | |||
[[Image:Freebsd_ps3gpu_test_quad.jpg|300px|Image: 300 pixels]] | |||
texture Example: | |||
[[Image:Freebsd_ps3gpu_test_texture.jpg|300px|Image: 300 pixels]] | |||
=X11 Driver= | =X11 Driver= | ||
* X11 driver | * You need this driver to run X11 server on PS3. | ||
* The driver supports hardware acceleration through X11 EXA interface. | |||
* Currently the driver uses only RSX DMA engine to copy memory. | |||
* http://gitorious.ps3dev.net/ps3freebsd/xf86-video-ps3gpu | * http://gitorious.ps3dev.net/ps3freebsd/xf86-video-ps3gpu | ||
* The driver is still work in progress but is usable. Expect to see some artefacts :) | |||
* Please report any problems and bugs to my. | |||
==Building== | ==Building== | ||
First install xorg port on your PS3. It will take a long time: | |||
<pre> | <pre> | ||
cd /usr/ports/x11/xorg | |||
make BATCH=yes install clean | |||
# And install some window manager, e.g. blackbox | |||
cd /usr/ports/x11-wm/blackbox | |||
make BATCH=yes install clean | |||
# Also install scrot to make screenshots | |||
cd /usr/ports/graphics/scrot | |||
make BATCH=yes install clean | |||
</pre> | |||
Now compile the X11 driver: | |||
<pre> | |||
cd xf86-video-ps3gpu | |||
./autogen.sh | |||
./configure | |||
make | |||
make install # as root | |||
</pre> | |||
==xorg_accel.conf== | |||
* Acceleration enabled. | |||
<pre> | |||
Section "ServerFlags" | |||
Option "AllowEmptyInput" "False" | |||
EndSection | |||
Section "ServerLayout" | |||
Identifier "X.org Configured" | |||
Screen 0 "Screen0" 0 0 | |||
InputDevice "Mouse0" "CorePointer" | |||
InputDevice "Keyboard0" "CoreKeyboard" | |||
EndSection | |||
Section "Files" | |||
ModulePath "/usr/local/lib/xorg/modules" | |||
FontPath "/usr/local/lib/X11/fonts/misc/" | |||
FontPath "/usr/local/lib/X11/fonts/TTF/" | |||
FontPath "/usr/local/lib/X11/fonts/OTF" | |||
FontPath "/usr/local/lib/X11/fonts/Type1/" | |||
FontPath "/usr/local/lib/X11/fonts/100dpi/" | |||
FontPath "/usr/local/lib/X11/fonts/75dpi/" | |||
EndSection | |||
Section "Module" | |||
Load "GLcore" | |||
Load "dbe" | |||
Load "dri" | |||
Load "extmod" | |||
Load "glx" | |||
Load "record" | |||
Load "shadow" | |||
Load "freetype" | |||
Load "type1" | |||
EndSection | |||
Section "InputDevice" | |||
Identifier "Keyboard0" | |||
Driver "kbd" | |||
EndSection | |||
Section "InputDevice" | |||
Identifier "Mouse0" | |||
Driver "mouse" | |||
Option "Protocol" "auto" | |||
Option "Device" "/dev/sysmouse" | |||
Option "ZAxisMapping" "4 5 6 7" | |||
EndSection | |||
Section "Monitor" | |||
Identifier "Monitor0" | |||
VendorName "Monitor Vendor" | |||
ModelName "Monitor Model" | |||
HorizSync 30-75 | |||
VertRefresh 60-90 | |||
EndSection | |||
Section "Device" | |||
Identifier "Card0" | |||
Driver "ps3gpu" | |||
Option "ShadowFB" "False" | |||
Option "SWcursor" "False" | |||
Option "NoAccel" "False" | |||
EndSection | |||
Section "Screen" | |||
Identifier "Screen0" | |||
Device "Card0" | |||
Monitor "Monitor0" | |||
DefaultDepth 24 | |||
SubSection "Display" | |||
Modes "1920x1080" | |||
Viewport 0 0 | |||
Depth 24 | |||
EndSubSection | |||
EndSection | |||
</pre> | </pre> | ||
==Test== | ==Test== | ||
<pre> | |||
# Load the ps3gpu driver | |||
kldload ./ps3gpu.ko # as root | |||
# Copy xorg.conf | |||
cp xorg_accel.conf /etc/X11/xorg.conf # as root | |||
echo "exec blackbox" > ~/.xinitrc | |||
startx | |||
# Now you should see the blackbox desktop !!! | |||
</pre> | |||
==Screenshots== | |||
* X11 and ps3gpu on FreeBSD 9.1 in action. | |||
[[Image:Freebsd_91_x11_ps3gpu.png|300px|Image: 300 pixels]] | |||
=Future Work= | |||
* Create a cool application which demonstrates some 3D stuff using ps3gpu | |||
* Use ps3gpu driver for syscons. | |||
=Links= | |||
* http://www.freebsd.org/cgi/cvsweb.cgi | |||
* http://www.virtuousgeek.org/exa-driver.txt | |||
{{BSD}}<noinclude>[[Category:Main]]</noinclude> |
Latest revision as of 11:43, 4 December 2015
Introduction[edit | edit source]
- FreeBSD character device which gives you direct access to PS3 GPU from user-space.
Features[edit | edit source]
- Upto 3 GPU contexts simultaneously (LV1 limit is 3 contexts per LPAR).
- Direct control of GPU FIFO from user-space.
- Support of hardware cursors.
- Dynamic allocation of GART memory.
- Mapping of GART memory into GPU address space is done by the driver. That means user-space applications do not have to worry about it.
- Access to GART and VRAM memory through mmap syscall.
- Heap management for GART and VRAM memory.
- Support of display buffers.
Kernel Driver[edit | edit source]
Requirements[edit | edit source]
- You have to patch your LV1 and enable 4KB GPU IO page size support else ps3gpu won't work.
- You can either patch your LV1 permanently (e.g. with my ps3mfw task for LV1) or do it at run-time with my gpu_4kb_iopage.sh script.
- By default, LV1 supports 1MB and 64KB GPU IO page sizes but we need 4KB page size. The reason for this is that it's very hard to allocate 1MB or 64KB continuous memory chunk in FreeBSD kernel (same applies for Linux).
- gpu_4kb_iopage.sh should work with my petitboot and my Linux kernels and even on FreeBSD if you load ps3physmem driver before using the script.
- http://gitorious.ps3dev.net/ps3otheros/scripts
Building[edit | edit source]
- You can cross-compile the kernel module or build it natively on PS3 FreeBSD.
- The kernel module and the kernel should match. That means the kernel module should be build against the same kernel source else the kernel module cannot be loaded (The same applies on Linux).
cd /usr/devel env MAKEOBJDIRPREFIX=/usr/obj/PS3 SYSDIR=/usr/devel/sys make TARGET=powerpc TARGET_ARCH=powerpc64 buildenv cd /home/glevand/ps3gpu make ls -l ps3gpu.ko
Test[edit | edit source]
- ps3gpu_test is a user-space application for testing ps3gpu kernel driver.
- The application demonstrates how to allocate GART and VRAM memory, how to load, set and move cursor and how to flip.
- It shows you how to use RSX FIFO and send commands.
- It shows you how to use RSX DMA engine for memory copying (used e.g. in X11 driver all the time).
- It shows how to load vertex and fragment programs, draw vertices and flip displlay buffers.
- It shows how to use textures.
- http://gitorious.ps3dev.net/ps3freebsd/ps3gpu_test
kldload ./ps3gpu.ko cd ps3gpu_test make sudo ./vram_dma context id 0 control handle 0x10000000000 size 4096 fifo handle 0x40000000000 gpu addr 0x08d000000 FIFO put 0x0d000000 get 0x0d000000 ref 0xdeadbabe reset GPU state handle 0x50000000000 gpu addr 0x0d010000 FIFO put 0x0d00000c get 0x0d00000c ref 0xcafef00d VRAM handle 0x60000000000 gpu addr 0x00000000 cursor handle 0x70000000000 gpu addr 0x00900000
To restore your console:
vidcontrol < /dev/ttyv0 80x25
Tiling[edit | edit source]
- We have to use a different video pitch.
- Use e.g. ps3dm VUART driver and ps3vuart-tools to set video pitch allowed for tiling.
Screenshots[edit | edit source]
- The square in the middle of the screen is the source.
- The square on the left was copied from the source by RSX DMA using positive pitches, from top to bottom.
- The square on the right was copied from the source by RSX DMA using negative pitches, from bottom to top.
- Unfortunately it's not possible to make a screenshot of hardware cursor by dumping video ram content because hardware cursor is overlayed.
vram_dma Example:
triangle Example:
quad Example:
texture Example:
X11 Driver[edit | edit source]
- You need this driver to run X11 server on PS3.
- The driver supports hardware acceleration through X11 EXA interface.
- Currently the driver uses only RSX DMA engine to copy memory.
- http://gitorious.ps3dev.net/ps3freebsd/xf86-video-ps3gpu
- The driver is still work in progress but is usable. Expect to see some artefacts :)
- Please report any problems and bugs to my.
Building[edit | edit source]
First install xorg port on your PS3. It will take a long time:
cd /usr/ports/x11/xorg make BATCH=yes install clean # And install some window manager, e.g. blackbox cd /usr/ports/x11-wm/blackbox make BATCH=yes install clean # Also install scrot to make screenshots cd /usr/ports/graphics/scrot make BATCH=yes install clean
Now compile the X11 driver:
cd xf86-video-ps3gpu ./autogen.sh ./configure make make install # as root
xorg_accel.conf[edit | edit source]
- Acceleration enabled.
Section "ServerFlags" Option "AllowEmptyInput" "False" EndSection Section "ServerLayout" Identifier "X.org Configured" Screen 0 "Screen0" 0 0 InputDevice "Mouse0" "CorePointer" InputDevice "Keyboard0" "CoreKeyboard" EndSection Section "Files" ModulePath "/usr/local/lib/xorg/modules" FontPath "/usr/local/lib/X11/fonts/misc/" FontPath "/usr/local/lib/X11/fonts/TTF/" FontPath "/usr/local/lib/X11/fonts/OTF" FontPath "/usr/local/lib/X11/fonts/Type1/" FontPath "/usr/local/lib/X11/fonts/100dpi/" FontPath "/usr/local/lib/X11/fonts/75dpi/" EndSection Section "Module" Load "GLcore" Load "dbe" Load "dri" Load "extmod" Load "glx" Load "record" Load "shadow" Load "freetype" Load "type1" EndSection Section "InputDevice" Identifier "Keyboard0" Driver "kbd" EndSection Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/sysmouse" Option "ZAxisMapping" "4 5 6 7" EndSection Section "Monitor" Identifier "Monitor0" VendorName "Monitor Vendor" ModelName "Monitor Model" HorizSync 30-75 VertRefresh 60-90 EndSection Section "Device" Identifier "Card0" Driver "ps3gpu" Option "ShadowFB" "False" Option "SWcursor" "False" Option "NoAccel" "False" EndSection Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Modes "1920x1080" Viewport 0 0 Depth 24 EndSubSection EndSection
Test[edit | edit source]
# Load the ps3gpu driver kldload ./ps3gpu.ko # as root # Copy xorg.conf cp xorg_accel.conf /etc/X11/xorg.conf # as root echo "exec blackbox" > ~/.xinitrc startx # Now you should see the blackbox desktop !!!
Screenshots[edit | edit source]
- X11 and ps3gpu on FreeBSD 9.1 in action.
Future Work[edit | edit source]
- Create a cool application which demonstrates some 3D stuff using ps3gpu
- Use ps3gpu driver for syscons.
Links[edit | edit source]
|