Compare commits
328 Commits
submit/mes
...
mesa-7.9.1
Author | SHA1 | Date | |
---|---|---|---|
|
42a9472dc6 | ||
|
234144b48d | ||
|
3d90628138 | ||
|
d0f0a6920b | ||
|
110c49fddd | ||
|
c438a09b4c | ||
|
0ab166d556 | ||
|
b50658c804 | ||
|
3c8dd6a8de | ||
|
801e26a02a | ||
|
247774085c | ||
|
d5d573b592 | ||
|
54c2846f23 | ||
|
8941450010 | ||
|
0ff45dd5d7 | ||
|
4e7cdca57a | ||
|
69cc356832 | ||
|
0d98ceb4bf | ||
|
40390b80e9 | ||
|
7ffeced927 | ||
|
b8c16ee7b1 | ||
|
f5435ec3a9 | ||
|
a3740ba31e | ||
|
166da97889 | ||
|
2fb170c90f | ||
|
4f2f3440d0 | ||
|
760288bec1 | ||
|
84e7dd0114 | ||
|
9d1c6dd79b | ||
|
47552b2c66 | ||
|
edfe057f94 | ||
|
a4cda571f0 | ||
|
ecb68d51aa | ||
|
be1f4cfd96 | ||
|
7b6b66d617 | ||
|
2b4277dcf3 | ||
|
585fa612c9 | ||
|
b8e73354d9 | ||
|
154d0a3e7e | ||
|
7c0ff4a5df | ||
|
d192179605 | ||
|
b2cd388b79 | ||
|
bb2cd98e51 | ||
|
d9d4f22e65 | ||
|
d347b90b94 | ||
|
23a868930c | ||
|
1e88b3461a | ||
|
573c78803d | ||
|
5650cc462d | ||
|
54a596e34a | ||
|
2127692542 | ||
|
0795cb71fc | ||
|
cefccebd89 | ||
|
927c752dd6 | ||
|
0b4287a687 | ||
|
69d19cb84b | ||
|
0ab2bb8270 | ||
|
1e2e387a15 | ||
|
dcc7a8a80a | ||
|
0a8ad737e7 | ||
|
4b19941399 | ||
|
1cfd517b15 | ||
|
a0d5da96b5 | ||
|
50ec3c74e3 | ||
|
d595657e5a | ||
|
c055239bae | ||
|
6b96b002c8 | ||
|
ce8f4f266e | ||
|
e0dbd44a00 | ||
|
67b7a3844a | ||
|
69cc62b907 | ||
|
8c8c1b2c99 | ||
|
9b8e56a502 | ||
|
5a8d1d5b72 | ||
|
029252a448 | ||
|
4b30da86a7 | ||
|
da5d6c42c0 | ||
|
0c56721cfc | ||
|
6333f1d224 | ||
|
639e65e054 | ||
|
8454f931d6 | ||
|
0da1c7b90f | ||
|
6e5907c390 | ||
|
4c1db8c7a4 | ||
|
edd9b9350e | ||
|
5c71690096 | ||
|
44df2b0844 | ||
|
5b28db24ff | ||
|
2f4af9e37b | ||
|
34e0da8e73 | ||
|
1ee289960f | ||
|
22ba37aae2 | ||
|
3b200dd3c5 | ||
|
5f05ade503 | ||
|
9ef05d27a6 | ||
|
1d63a77177 | ||
|
554dbaa8a0 | ||
|
1c089271fd | ||
|
2c57c020a3 | ||
|
2f398485f2 | ||
|
e5ad6c3366 | ||
|
1c15fb4414 | ||
|
a138a59966 | ||
|
6fc544dd50 | ||
|
42e9750975 | ||
|
72a3bddb24 | ||
|
e8bc8d6a5c | ||
|
dc4956922d | ||
|
b486197013 | ||
|
2cb8522523 | ||
|
564a6a15fe | ||
|
7d280a3bbe | ||
|
988a35c7f7 | ||
|
4e7548aafc | ||
|
277655d7fa | ||
|
d42db5b738 | ||
|
62f2b7e759 | ||
|
44ba61c518 | ||
|
1c746ba9d4 | ||
|
c9661d695b | ||
|
aa7bf2d88e | ||
|
9d644e7b95 | ||
|
54047fcd8d | ||
|
bcdd93e3a7 | ||
|
75065b0b55 | ||
|
8ae23176d6 | ||
|
7d0c0d32b5 | ||
|
e5c78c2003 | ||
|
930c168df6 | ||
|
5551faf649 | ||
|
80ff25b628 | ||
|
7c8715ef0a | ||
|
06fa5d81da | ||
|
b86bf31b05 | ||
|
68afe8f685 | ||
|
0d060d9933 | ||
|
aa5574e78f | ||
|
5105e3d415 | ||
|
feacfc4a93 | ||
|
b6ae3d7b23 | ||
|
3db8f85446 | ||
|
3e4ed38791 | ||
|
acee46d9a1 | ||
|
97805cfedd | ||
|
9b1ac4d127 | ||
|
78ccca5a69 | ||
|
2fe82c281d | ||
|
773e8fadc8 | ||
|
7f2d1280e7 | ||
|
075640e37e | ||
|
fb7a095785 | ||
|
f245bb4c9c | ||
|
cc71f76be2 | ||
|
47887b1efe | ||
|
764f9974e5 | ||
|
aa2b751abb | ||
|
6f5c6e5cc5 | ||
|
e5b2a8d350 | ||
|
da580c734f | ||
|
db7de707a3 | ||
|
bce3917192 | ||
|
2eac388bfe | ||
|
6730630804 | ||
|
d5618c55ec | ||
|
ee6417f97f | ||
|
14bae5cdf2 | ||
|
799e6d4d15 | ||
|
6936fbc039 | ||
|
0a060c8fb0 | ||
|
34c518be52 | ||
|
2b4a05e74a | ||
|
7afce798ee | ||
|
ab502d0d6b | ||
|
548a50caae | ||
|
11e290daa4 | ||
|
889cb2539b | ||
|
242facde45 | ||
|
73be0dfe03 | ||
|
0b300a4e3d | ||
|
586797d7a8 | ||
|
9b646b1fd3 | ||
|
dc8e22e4f0 | ||
|
21078eef10 | ||
|
968a9ec76e | ||
|
2cdfda8851 | ||
|
09d89dc95b | ||
|
15ad34f012 | ||
|
094fe2aa23 | ||
|
ba889a2b3e | ||
|
71cc467f4c | ||
|
d6e2b707ba | ||
|
0ab9d8d94b | ||
|
759e9fb737 | ||
|
4af00f1a5e | ||
|
1c8795075f | ||
|
5d43c78d03 | ||
|
9f076a0848 | ||
|
9bab8ca4f8 | ||
|
f6eb5d991c | ||
|
f282d72678 | ||
|
e1918fd5d5 | ||
|
fcf5819945 | ||
|
c584318a21 | ||
|
b24238c49a | ||
|
5d3a4317e8 | ||
|
836b44b2c8 | ||
|
83854a9c84 | ||
|
b4824096b0 | ||
|
71bdc82c19 | ||
|
aaf7f78dfa | ||
|
5c7a7d0b09 | ||
|
f736d85a5a | ||
|
40dc275431 | ||
|
3dd52d51ce | ||
|
e00bb8732c | ||
|
11215cd535 | ||
|
6831cf67d1 | ||
|
ece465219f | ||
|
0dc83cc437 | ||
|
922d7e1025 | ||
|
4afb1c8451 | ||
|
ad52c2b773 | ||
|
364b6e0709 | ||
|
32c1dc76af | ||
|
f9ad343cf7 | ||
|
76469d710c | ||
|
6eec2dbfc8 | ||
|
a4f126beaf | ||
|
0d5400519e | ||
|
36722d7673 | ||
|
3c26f3883a | ||
|
1975d851e8 | ||
|
f4f1e0d108 | ||
|
cda661fd1c | ||
|
1ab0d45c9f | ||
|
269dd51162 | ||
|
f60c28e083 | ||
|
aebd78f607 | ||
|
0391eaf088 | ||
|
7436872dce | ||
|
7a297bd926 | ||
|
6c3a8aeb27 | ||
|
5c3be43cd2 | ||
|
5906b9ac51 | ||
|
89ed679a9e | ||
|
7d154de048 | ||
|
2a7ed4ba96 | ||
|
8ad0396108 | ||
|
61653b488d | ||
|
7e62335f35 | ||
|
b8a60c84aa | ||
|
9f221e738d | ||
|
5c78e931c2 | ||
|
361084ac4b | ||
|
9409b544cc | ||
|
7261c3973d | ||
|
bb4c9e0969 | ||
|
aa05753059 | ||
|
09085ada5d | ||
|
77cc2a4e17 | ||
|
96085dc41a | ||
|
a128b62a35 | ||
|
b756100892 | ||
|
3ad0279344 | ||
|
97cfa1240c | ||
|
6b0c280660 | ||
|
b437c9102f | ||
|
4ec818ea4a | ||
|
80a6cbfea3 | ||
|
ec2031563a | ||
|
b7d4f08f4e | ||
|
2fc2b89680 | ||
|
b29289a61c | ||
|
728829ab63 | ||
|
9753ee3f3e | ||
|
2db5398449 | ||
|
ee8a96707a | ||
|
22dcee8da2 | ||
|
1b622bfbee | ||
|
2bb2efd7b2 | ||
|
a19f0fb50b | ||
|
8df8bb43c7 | ||
|
d2b6502c93 | ||
|
e68ec2212f | ||
|
c0f82e619c | ||
|
7f95c59509 | ||
|
6f310f379b | ||
|
f279480df2 | ||
|
d382c51a23 | ||
|
cdb3f23d8a | ||
|
8f4c99a9af | ||
|
5285100502 | ||
|
56dc7ca916 | ||
|
902dfdaa86 | ||
|
c98ce41de3 | ||
|
3cdfc62523 | ||
|
2606105cc5 | ||
|
141dbbfc78 | ||
|
e678c3f4e1 | ||
|
1b90889eb4 | ||
|
a9fceb6979 | ||
|
febd353bcd | ||
|
0f1faa9c7b | ||
|
b247620854 | ||
|
d36344f900 | ||
|
202c1279c6 | ||
|
f6e811a7d0 | ||
|
bd009df1cc | ||
|
d6df0cdcca | ||
|
52f6be0688 | ||
|
b73cfde5ce | ||
|
d7500ac4df | ||
|
83917660f1 | ||
|
69f67f5ded | ||
|
a42527be33 | ||
|
d169a67ad1 | ||
|
be16a35438 | ||
|
d46b7c9f6f | ||
|
5d02503467 | ||
|
e3b89388ff | ||
|
d6538baa3b | ||
|
16a023ad7d | ||
|
029eb8e764 | ||
|
71b4054a6c | ||
|
8e8a42ffc5 | ||
|
fd4c6bd135 | ||
|
5d4409e0e5 | ||
|
26e63a431d |
11
Makefile
11
Makefile
@@ -180,7 +180,7 @@ ultrix-gcc:
|
||||
|
||||
# Rules for making release tarballs
|
||||
|
||||
VERSION=7.9-devel
|
||||
VERSION=7.9.1
|
||||
DIRECTORY = Mesa-$(VERSION)
|
||||
LIB_NAME = MesaLib-$(VERSION)
|
||||
GLUT_NAME = MesaGLUT-$(VERSION)
|
||||
@@ -329,6 +329,8 @@ GALLIUM_FILES = \
|
||||
$(DIRECTORY)/src/gallium/Makefile.template \
|
||||
$(DIRECTORY)/src/gallium/SConscript \
|
||||
$(DIRECTORY)/src/gallium/targets/Makefile.dri \
|
||||
$(DIRECTORY)/src/gallium/targets/Makefile.xorg \
|
||||
$(DIRECTORY)/src/gallium/targets/SConscript.dri \
|
||||
$(DIRECTORY)/src/gallium/*/Makefile \
|
||||
$(DIRECTORY)/src/gallium/*/SConscript \
|
||||
$(DIRECTORY)/src/gallium/*/*/Makefile \
|
||||
@@ -345,22 +347,19 @@ GALLIUM_FILES = \
|
||||
|
||||
DRI_FILES = \
|
||||
$(DIRECTORY)/include/GL/internal/dri_interface.h \
|
||||
$(DIRECTORY)/include/GL/internal/glcore.h \
|
||||
$(DIRECTORY)/include/GL/internal/sarea.h \
|
||||
$(DIRECTORY)/src/glx/Makefile \
|
||||
$(DIRECTORY)/src/glx/Makefile \
|
||||
$(DIRECTORY)/src/glx/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/Makefile.template \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/dri.pc.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.po \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*.cpp \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/server/*.[ch]
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile
|
||||
|
||||
SGI_GLU_FILES = \
|
||||
$(DIRECTORY)/src/glu/Makefile \
|
||||
|
@@ -53,7 +53,7 @@ MKDEP_OPTIONS = @MKDEP_OPTIONS@
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
# Python and flags (generally only needed by the developers)
|
||||
PYTHON2 = python
|
||||
PYTHON2 = @PYTHON2@
|
||||
PYTHON_FLAGS = -t -O -O
|
||||
|
||||
# Library names (base name)
|
||||
|
48
configure.ac
48
configure.ac
@@ -30,6 +30,7 @@ AC_PROG_CPP
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_CHECK_PROGS([MAKE], [gmake make])
|
||||
AC_CHECK_PROGS([PYTHON2], [python2 python])
|
||||
AC_PATH_PROG([MKDEP], [makedepend])
|
||||
AC_PATH_PROG([SED], [sed])
|
||||
|
||||
@@ -692,6 +693,11 @@ AC_SUBST([GLESv2_PC_LIB_PRIV])
|
||||
|
||||
AC_SUBST([HAVE_XF86VIDMODE])
|
||||
|
||||
PKG_CHECK_MODULES([LIBDRM_RADEON],
|
||||
[libdrm_radeon libdrm >= $LIBDRM_RADEON_REQUIRED],
|
||||
HAVE_LIBDRM_RADEON=yes,
|
||||
HAVE_LIBDRM_RADEON=no)
|
||||
|
||||
dnl
|
||||
dnl More X11 setup
|
||||
dnl
|
||||
@@ -910,12 +916,7 @@ esac
|
||||
|
||||
case $DRI_DIRS in
|
||||
*radeon*|*r200*|*r300*|*r600*)
|
||||
PKG_CHECK_MODULES([LIBDRM_RADEON],
|
||||
[libdrm_radeon libdrm >= $LIBDRM_RADEON_REQUIRED],
|
||||
HAVE_LIBDRM_RADEON=yes,
|
||||
HAVE_LIBDRM_RADEON=no)
|
||||
|
||||
if test "$HAVE_LIBDRM_RADEON" = yes; then
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
RADEON_CFLAGS="-DHAVE_LIBDRM_RADEON=1 $LIBDRM_RADEON_CFLAGS"
|
||||
RADEON_LDFLAGS=$LIBDRM_RADEON_LIBS
|
||||
fi
|
||||
@@ -1363,7 +1364,7 @@ fi
|
||||
AC_ARG_WITH([egl-platforms],
|
||||
[AS_HELP_STRING([--with-egl-platforms@<:@=DIRS...@:>@],
|
||||
[comma delimited native platforms libEGL supports, e.g.
|
||||
"x11,kms" @<:@default=auto@:>@])],
|
||||
"x11,drm" @<:@default=auto@:>@])],
|
||||
[with_egl_platforms="$withval"],
|
||||
[with_egl_platforms=yes])
|
||||
AC_ARG_WITH([egl-displays],
|
||||
@@ -1376,6 +1377,9 @@ case "$with_egl_platforms" in
|
||||
yes)
|
||||
if test "x$enable_egl" = xyes && test "x$mesa_driver" != xosmesa; then
|
||||
EGL_PLATFORMS="x11"
|
||||
if test "$mesa_driver" = dri; then
|
||||
EGL_PLATFORMS="$EGL_PLATFORMS drm"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -1518,18 +1522,28 @@ elif test "x$enable_gallium_i965" = xauto; then
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Gallium Radeon configuration
|
||||
dnl Gallium Radeon r300g configuration
|
||||
dnl
|
||||
AC_ARG_ENABLE([gallium-radeon],
|
||||
[AS_HELP_STRING([--enable-gallium-radeon],
|
||||
[build gallium radeon @<:@default=disabled@:>@])],
|
||||
[enable_gallium_radeon="$enableval"],
|
||||
[enable_gallium_radeon=auto])
|
||||
if test "x$enable_gallium_radeon" = xauto; then
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
gallium_check_st "radeon/drm" "dri-r300"
|
||||
else
|
||||
AC_MSG_WARN([libdrm_radeon is missing, not building gallium-radeon (r300)])
|
||||
fi
|
||||
fi
|
||||
if test "x$enable_gallium_radeon" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
gallium_check_st "radeon/drm" "dri-r300" "xorg-radeon"
|
||||
elif test "x$enable_gallium_radeon" = xauto; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
gallium_check_st "radeon/drm" "dri-r300" "xorg-radeon"
|
||||
else
|
||||
AC_MSG_ERROR([libdrm_radeon is missing, cannot build gallium-radeon (r300)])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl
|
||||
@@ -1541,8 +1555,12 @@ AC_ARG_ENABLE([gallium-r600],
|
||||
[enable_gallium_r600="$enableval"],
|
||||
[enable_gallium_r600=auto])
|
||||
if test "x$enable_gallium_r600" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r600"
|
||||
gallium_check_st "r600/drm" "dri-r600"
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r600"
|
||||
gallium_check_st "r600/drm" "dri-r600"
|
||||
else
|
||||
AC_MSG_ERROR([libdrm_radeon is missing, cannot build gallium-r600])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl
|
||||
@@ -1670,6 +1688,8 @@ echo ""
|
||||
echo " CFLAGS: $cflags"
|
||||
echo " CXXFLAGS: $cxxflags"
|
||||
echo " Macros: $defines"
|
||||
echo ""
|
||||
echo " PYTHON2: $PYTHON2"
|
||||
|
||||
echo ""
|
||||
echo " Run '${MAKE-make}' to build Mesa"
|
||||
|
@@ -145,7 +145,7 @@ Make sure the values in src/mesa/main/version.h are correct.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Update the docs/news.html file and docs/download.html files.
|
||||
Update docs/news.html.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -208,10 +208,11 @@ sftp USERNAME,mesa3d@web.sourceforge.net
|
||||
|
||||
<p>
|
||||
Make an announcement on the mailing lists:
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>,
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
|
||||
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>,
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
|
||||
and
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
|
||||
</p>
|
||||
|
||||
|
||||
|
@@ -72,13 +72,13 @@ drivers will be installed to <code>${libdir}/egl</code>.</p>
|
||||
<li><code>--with-egl-platforms</code>
|
||||
|
||||
<p>List the platforms (window systems) to support. Its argument is a comma
|
||||
seprated string such as <code>--with-egl-platforms=x11,kms</code>. It decides
|
||||
seprated string such as <code>--with-egl-platforms=x11,drm</code>. It decides
|
||||
the platforms a driver may support. The first listed platform is also used by
|
||||
the main library to decide the native platform: the platform the EGL native
|
||||
types such as <code>EGLNativeDisplayType</code> or
|
||||
<code>EGLNativeWindowType</code> defined for.</p>
|
||||
|
||||
<p>The available platforms are <code>x11</code>, <code>kms</code>,
|
||||
<p>The available platforms are <code>x11</code>, <code>drm</code>,
|
||||
<code>fbdev</code>, and <code>gdi</code>. The <code>gdi</code> platform can
|
||||
only be built with SCons.</p>
|
||||
|
||||
|
@@ -9,6 +9,9 @@
|
||||
<center><h1>Mesa fbdev/DRI Drivers</h1></center>
|
||||
<br>
|
||||
|
||||
<h1><center>NOTE: this information is obsolete and will be removed at
|
||||
a future date</center></h1>
|
||||
|
||||
<h1>1. Introduction</h1>
|
||||
|
||||
<p>
|
||||
@@ -22,7 +25,7 @@ Contributors to this project include Jon Smirl, Keith Whitwell and Dave Airlie.
|
||||
|
||||
<p>
|
||||
Applications in the fbdev/DRI environment use
|
||||
the <a href="http://www.nabble.com/file/p15480666/MiniGXL.html"> MiniGLX</a> interface to choose pixel
|
||||
the MiniGLX interface to choose pixel
|
||||
formats, create rendering contexts, etc. It's a subset of the GLX and
|
||||
Xlib interfaces allowing some degree of application portability between
|
||||
the X and X-less environments.
|
||||
@@ -315,8 +318,7 @@ It means that the sample_server process is not running.
|
||||
<h1>5.0 Programming Information</h1>
|
||||
|
||||
<p>
|
||||
OpenGL/Mesa is interfaced to fbdev via the <a href="http://www.nabble.com/file/p15480666/MiniGLX.html">MiniGLX</a>
|
||||
interface.
|
||||
OpenGL/Mesa is interfaced to fbdev via the MiniGLX interface.
|
||||
MiniGLX is a subset of Xlib and GLX API functions which provides just
|
||||
enough functionality to setup OpenGL rendering and respond to simple
|
||||
input events.
|
||||
@@ -332,7 +334,7 @@ This allows some degree of flexibility for software development and testing.
|
||||
However, the MiniGLX API is not binary-compatible with full Xlib/GLX.
|
||||
Some of the structures are different and some macros/functions work
|
||||
differently.
|
||||
See the <code>GL/miniglx.h</code> header file for details.
|
||||
See the GL/miniglx.h header file for details.
|
||||
</p>
|
||||
|
||||
|
||||
|
@@ -11,6 +11,22 @@
|
||||
<H1>News</H1>
|
||||
|
||||
|
||||
<h2>October 4, 2010</h2>
|
||||
|
||||
<p>
|
||||
<a href="relnotes-7.9.html">Mesa 7.9</a> (final) is released. This is a new
|
||||
development release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>September 27, 2010</h2>
|
||||
|
||||
<p>
|
||||
<a href="relnotes-7.9.html">Mesa 7.9.0-rc1</a> is released. This is a
|
||||
release candidate for the 7.9 development release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>June 16, 2010</h2>
|
||||
|
||||
<p>
|
||||
@@ -1277,7 +1293,6 @@ grateful.
|
||||
<p>
|
||||
</p><h2>March 18, 1999</h2>
|
||||
<p>The new webpages are now online. Enjoy, and let me know if you find any errors.
|
||||
For an eye-candy free version you can use <a href="http://www.mesa3d.org/txt/">http://www.mesa3d.org/txt/</a>.</p>
|
||||
<p>
|
||||
</p><h2>February 16, 1999</h2>
|
||||
<p><a href="http://www.sgi.com/">SGI</a> releases its <a href="http://www.sgi.com/software/opensource/glx/">GLX
|
||||
|
@@ -26,7 +26,15 @@ for DRI hardware acceleration.
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
tbd
|
||||
c89b63d253605ed40e8ac370d25a833c MesaLib-7.8.2.tar.gz
|
||||
6be2d343a0089bfd395ce02aaf8adb57 MesaLib-7.8.2.tar.bz2
|
||||
a04ad3b06ac5ff3969a003fa7bbf7d5b MesaLib-7.8.2.zip
|
||||
7c213f92efeb471f0331670d5079d4c0 MesaDemos-7.8.2.tar.gz
|
||||
757d9e2e06f48b1a52848be9b0307ced MesaDemos-7.8.2.tar.bz2
|
||||
8d0e5cfe68b8ebf90265d350ae2c48b1 MesaDemos-7.8.2.zip
|
||||
b74482e3f44f35ed395c4aada4fd8240 MesaGLUT-7.8.2.tar.gz
|
||||
a471807b65e49c325808ba4551be93ed MesaGLUT-7.8.2.tar.bz2
|
||||
9f190268c42be582ef66e47365ee61e3 MesaGLUT-7.8.2.zip
|
||||
</pre>
|
||||
|
||||
|
||||
@@ -44,10 +52,95 @@ tbd
|
||||
<ul>
|
||||
<li>Fixed Gallium glDrawPixels(GL_DEPTH_COMPONENT).
|
||||
<li>Fixed Gallium Cell driver to buildable, runable state
|
||||
<li>Fixed bad error checking for glFramebufferRenderbuffer(attachment=GL_DEPTH_STENCIL_ATTACHMENT).
|
||||
<li>Fixed incorrect Z coordinate handling in "meta" glDraw/CopyPixels.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">Bug
|
||||
#23670</a>.</li>
|
||||
|
||||
<li>Assorted i965 driver fixes.
|
||||
Including but not limited to:
|
||||
<ul>
|
||||
<li>Fix scissoring when width or height is
|
||||
0. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27643">Bug
|
||||
#27643</a>.
|
||||
<li>Fix bit allocation for number of color regions for
|
||||
ARB_draw_buffers.</li>
|
||||
<li>Set the correct provoking vertex for clipped first-mode
|
||||
trifans. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24470">Bug
|
||||
#24470</a>.</li>
|
||||
<li>Use <code>R16G16B16A16_FLOAT</code> for 3-component half-float.</li>
|
||||
<li>Fix assertion for surface tile offset usage on Ironlake.</li>
|
||||
<li>Fix cube map layouts on Ironlake.</li>
|
||||
<li>When an RB gets a new region, clear the old from the state
|
||||
cache. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24119">Bug
|
||||
#24119</a>.</li>
|
||||
<li>Reject shaders with uninlined function calls instead of hanging.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Assorted i915 driver fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Fixed texture LOD clamping in i915 driver.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=24846">Bug
|
||||
#24846</a>.</li>
|
||||
<li>Fix off-by-one for drawing rectangle.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27408">Bug
|
||||
#27408</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Fixed hangs in etracer on 830 and 845
|
||||
chipsets. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=26557">Bug
|
||||
#26557</a>.</li>
|
||||
<li>Fixed tiling of small textures on all Intel drivers.</li>
|
||||
<li>Fixed crash in Savage driver when using <code>_mesa_CopyTexImage2D</code>.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27652">Bug
|
||||
#27652</a>.</li>
|
||||
|
||||
<li>Assorted GLX fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Fixed <code>__glXInitializeVisualConfigFromTags</code>'s handling of
|
||||
unrecognized fbconfig tags.</li>
|
||||
<li>Fixed regression with <code>GLX_USE_GL</code>.
|
||||
<li>Fixed config chooser logic for 'mask' matching.</li>
|
||||
<li>Report swap events correctly in direct rendered case (DRI2)</li>
|
||||
<li>Fixed build with dri2proto which doesn't define
|
||||
<code>X_DRI2SwapInterval</code>.</li>
|
||||
<li>Get <code>GLX_SCREEN</code> first in <code>__glXQueryContextInfo</code>.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=14245">Bug
|
||||
#14245</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Assorted GLSL fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Change variable declared assertion into conditional in GLSL
|
||||
compiler. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27921">Bug
|
||||
#27921</a>.</li>
|
||||
<li>Fix instruction indexing
|
||||
bugs. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27566">Bug
|
||||
#27566</a>.</li>
|
||||
<li>Updated uniform location / offset encoding to be more like
|
||||
other implementations.</li>
|
||||
<li>Don't overwrite a driver's shader infolog with generic failure
|
||||
message.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Fixed OSMesa build for 16 and 32-bit color channel depth.
|
||||
<li>Fixed OSMesa build with hidden symbol visibility. libOSMesa no longer links to libGL.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28305">Bug
|
||||
#28305</a>.
|
||||
<li>Fixed handling of multiple render targets in fixed-function
|
||||
texture envrionmnent programs.</li>
|
||||
<li>Fixed conversion errors in <code>signed_rgba8888[rev]</code> texel
|
||||
fetch.</li>
|
||||
<li>Don't set srcLevel on <code>GL_TEXTURE_RECTANGLE_ARB</code> targets.</li>
|
||||
<li>Various build fixes for OpenBSD.</li>
|
||||
<li>Various build fixes for OS X.</li>
|
||||
<li>Various build fixes for GCC 3.3.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<p>None.</p>
|
||||
</body>
|
||||
</html>
|
||||
|
89
docs/relnotes-7.8.3.html
Normal file
89
docs/relnotes-7.8.3.html
Normal file
@@ -0,0 +1,89 @@
|
||||
<HTML>
|
||||
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.8.3 Release Notes / (date tbd)</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.8.3 is a bug fix release which fixes bugs found since the 7.8.2 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.8.3 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
See the <a href="install.html">Compiling/Installing page</a> for prerequisites
|
||||
for DRI hardware acceleration.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
x MesaLib-7.8.3.tar.gz
|
||||
x MesaLib-7.8.3.tar.bz2
|
||||
x MesaLib-7.8.3.zip
|
||||
x MesaDemos-7.8.3.tar.gz
|
||||
x MesaDemos-7.8.3.tar.bz2
|
||||
x MesaDemos-7.8.3.zip
|
||||
x MesaGLUT-7.8.3.tar.gz
|
||||
x MesaGLUT-7.8.3.tar.bz2
|
||||
x MesaGLUT-7.8.3.zip
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None.</p>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<ul>
|
||||
<li>The radeon driver should use less memory when searching for a valid mip
|
||||
image.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<ul>
|
||||
<li>Fix unsupported FB with D24S8 (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">29116</a>)</li>
|
||||
<li>Fix ReadPixels crash when reading depth/stencil from an FBO</li>
|
||||
<li>Fixed a bug rendering to 16-bit buffers using swrast.</li>
|
||||
<li>Fixed a state tracker/TGSI bug that caused crashes when using Windows'
|
||||
memory debugging features.</li>
|
||||
<li>Fixed an issue rendering to 32-bit channels with swrast (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=29487">29487</a>)</li>
|
||||
<li>GLSL: fix indirect <TT>gl_TextureMatrix</TT> addressing (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28967">28967</a>)</li>
|
||||
<li>GLSL: fix for bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27216">27216</a></li>
|
||||
<li>GLSL: fix zw fragcoord entries in some cases (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=29183">29183</a>)</li>
|
||||
<li>Fix texture env generation in some cases (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28169">28169</a>)</li>
|
||||
<li>osmesa: a fix for calling <TT>OSMesaMakeCurrent</TT> twice was applied (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=10966">10966</a></li>
|
||||
<li>A bug was fixed which could cause Mesa to ignore the
|
||||
<TT>MESA_EXTENSION_OVERRIDE</TT> environment variable.</li>
|
||||
<li>A bug related to specular highlights on backfaces was fixed.</li>
|
||||
<li>A radeon-specific issue with <TT>glCopyTex(Sub)Image</TT> was
|
||||
corrected.</li>
|
||||
<li>radeon/wine: flush command stream in more cases, fixing wine d3d9
|
||||
tests.</li>
|
||||
<li>r600: fix sin+cos normalization.</li>
|
||||
<li>r600: (properly) ignore <TT>GL_COORD_REPLACE</TT> when point sprites are
|
||||
disabled.</li>
|
||||
<li>radeon: avoid flushing when the context is not current.</li>
|
||||
<li>r300c: a bug affecting unaligned BOs was fixed.</li>
|
||||
<li>r300c: a hardlock caused by ARB_half_float_vertex incorrectly advertised on some chipsets.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
399
docs/relnotes-7.9.1.html
Normal file
399
docs/relnotes-7.9.1.html
Normal file
@@ -0,0 +1,399 @@
|
||||
<HTML>
|
||||
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.9.1 Release Notes / January 7, 2011</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.9.1 is a bug fix release which fixes bugs found since the 7.9 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.9.1 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
See the <a href="install.html">Compiling/Installing page</a> for prerequisites
|
||||
for DRI hardware acceleration.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
TBD.
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None.</p>
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<p>This list is likely incomplete.</p>
|
||||
<ul>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28800">Bug 28800</a> - [r300c, r300g] Texture corruption with World of Warcraft</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29420">Bug 29420</a> - Amnesia / HPL2 RendererFeatTest - not rendering correctly</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29946">Bug 29946</a> - [swrast] piglit valgrind glsl-array-bounds-04 fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30261">Bug 30261</a> - [GLSL 1.20] allowing inconsistent invariant declaration between two vertex shaders</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30632">Bug 30632</a> - [softpipe] state_tracker/st_manager.c:489: st_context_notify_invalid_framebuffer: Assertion `stfb && stfb->iface == stfbi' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30694">Bug 30694</a> - wincopy will crash on Gallium drivers when going to front buffer</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30787">Bug 30787</a> - Invalid asm shader does not generate draw-time error when used with GLSL shader</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30993">Bug 30993</a> - getFramebufferAttachmentParameteriv wrongly generates error</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31101">Bug 31101</a> - [glsl2] abort() in ir_validate::visit_enter(ir_assignment *ir)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31193">Bug 31193</a> - [regression] aa43176e break water reflections</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31194">Bug 31194</a> - The mesa meta save/restore code doesn't ref the current GLSL program</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31371">Bug 31371</a> - glslparsertest: ir.cpp:358: ir_constant::ir_constant(const glsl_type*, const ir_constant_data*): Assertion `(type->base_type >= 0) && (type->base_type <= 3)' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31439">Bug 31439</a> - Crash in glBufferSubData() with size == 0</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31495">Bug 31495</a> - [i965 gles2c bisected] OpenGL ES 2.0 conformance GL2Tests_GetBIFD_input.run regressed</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31514">Bug 31514</a> - isBuffer returns true for unbound buffers</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31560">Bug 31560</a> - [tdfx] tdfx_tex.c:702: error: ‘const struct gl_color_table’ has no member named ‘Format’</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31617">Bug 31617</a> - Radeon/Compiz: 'failed to attach dri2 front buffer', error case not handled</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31648">Bug 31648</a> - [GLSL] array-struct-array gets assertion: `(size >= 1) && (size <= 4)' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31650">Bug 31650</a> - [GLSL] varying gl_TexCoord fails to be re-declared to different size in the second shader</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31673">Bug 31673</a> - GL_FRAGMENT_PRECISION_HIGH preprocessor macro undefined in GLSL ES</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31690">Bug 31690</a> - i915 shader compiler fails to flatten if in Aquarium webgl demo.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31832">Bug 31832</a> - [i915] Bad renderbuffer format: 21</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31841">Bug 31841</a> - [drm:radeon_cs_ioctl] *ERROR* Invalid command stream !</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31894">Bug 31894</a> - Writing to gl_PointSize with GLES2 corrupts other varyings</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31909">Bug 31909</a> - [i965] brw_fs.cpp:1461: void fs_visitor::emit_bool_to_cond_code(ir_rvalue*): Assertion `expr->operands[i]->type->is_scalar()' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31934">Bug 31934</a> - [gallium] Mapping empty buffer object causes SIGSEGV</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31983">Bug 31983</a> - [i915 gles2] "if (expression with builtin/varying variables) discard" breaks linkage</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31985">Bug 31985</a> - [GLSL 1.20] initialized uniform array considered as "unsized"</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31987">Bug 31987</a> - [gles2] if input a wrong pname(GL_NONE) to glGetBoolean, it will not case GL_INVALID_ENUM</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32035">Bug 32035</a> - [GLSL bisected] comparing unsized array gets segfault</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32070">Bug 32070</a> - llvmpipe renders stencil demo incorrectly</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32273">Bug 32273</a> - assertion fails when starting vdrift 2010 release with shaders enabled</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32287">Bug 32287</a> - [bisected GLSL] float-int failure</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32311">Bug 32311</a> - [965 bisected] Array look-ups broken on GM45</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32520">Bug 32520</a> - [gles2] glBlendFunc(GL_ZERO, GL_DST_COLOR) will result in GL_INVALID_ENUM</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32825">Bug 32825</a> - egl_glx driver completely broken in 7.9 branch [fix in master]</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<p>The full set of changes can be viewed by using the following GIT command:</p>
|
||||
|
||||
<pre>
|
||||
git log mesa-7.9..mesa-7.9.1
|
||||
</pre>
|
||||
|
||||
<p>Alex Deucher (5):
|
||||
<ul>
|
||||
<li>r100: revalidate after radeon_update_renderbuffers</li>
|
||||
<li>r600c: add missing radeon_prepare_render() call on evergreen</li>
|
||||
<li>r600c: properly align mipmaps to group size</li>
|
||||
<li>gallium/egl: fix r300 vs r600 loading</li>
|
||||
<li>r600c: fix some opcodes on evergreen</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Aras Pranckevicius (2):
|
||||
<ul>
|
||||
<li>glsl: fix crash in loop analysis when some controls can't be determined</li>
|
||||
<li>glsl: fix matrix type check in ir_algebraic</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Brian Paul (27):
|
||||
<ul>
|
||||
<li>swrast: fix choose_depth_texture_level() to respect mipmap filtering state</li>
|
||||
<li>st/mesa: replace assertion w/ conditional in framebuffer invalidation</li>
|
||||
<li>egl/i965: include inline_wrapper_sw_helper.h</li>
|
||||
<li>mesa: Add missing else in do_row_3D</li>
|
||||
<li>mesa: add missing formats in _mesa_format_to_type_and_comps()</li>
|
||||
<li>mesa: handle more pixel types in mipmap generation code</li>
|
||||
<li>mesa: make glIsBuffer() return false for never bound buffers</li>
|
||||
<li>mesa: fix glDeleteBuffers() regression</li>
|
||||
<li>swrast: init alpha value to 1.0 in opt_sample_rgb_2d()</li>
|
||||
<li>meta: Mask Stencil.Clear against stencilMax in _mesa_meta_Clear</li>
|
||||
<li>st/mesa: fix mapping of zero-sized buffer objects</li>
|
||||
<li>mesa: check for posix_memalign() errors</li>
|
||||
<li>llvmpipe: fix broken stencil writemask</li>
|
||||
<li>mesa: fix GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME query</li>
|
||||
<li>mesa: return GL_FRAMEBUFFER_DEFAULT as FBO attachment type</li>
|
||||
<li>mesa: make glGet*(GL_NONE) generate GL_INVALID_ENUM</li>
|
||||
<li>mesa: test for cube map completeness in glGenerateMipmap()</li>
|
||||
<li>tnl: Initialize gl_program_machine memory in run_vp.</li>
|
||||
<li>tnl: a better way to initialize the gl_program_machine memory</li>
|
||||
<li>mesa, st/mesa: disable GL_ARB_geometry_shader4</li>
|
||||
<li>glsl: fix off by one in register index assertion</li>
|
||||
<li>st/mesa: fix mipmap generation bug</li>
|
||||
<li>glsl: new glsl_strtod() wrapper to fix decimal point interpretation</li>
|
||||
<li>mesa: no-op glBufferSubData() on size==0</li>
|
||||
<li>tdfx: s/Format/_BaseFormat/</li>
|
||||
<li>st/mesa: fix renderbuffer pointer check in st_Clear()</li>
|
||||
<li>mesa: Bump the number of bits in the register index.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Chad Versace (5):
|
||||
<ul>
|
||||
<li>glsl: Fix lexer rule for ^=</li>
|
||||
<li>glsl: Fix ast-to-hir for ARB_fragment_coord_conventions</li>
|
||||
<li>glsl: Fix ir_expression::constant_expression_value()</li>
|
||||
<li>glsl: Fix erroneous cast in ast_jump_statement::hir()</li>
|
||||
<li>glsl: Fix linker bug in cross_validate_globals()</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Chia-I Wu (10):
|
||||
<ul>
|
||||
<li>targets/egl: Fix linking with libdrm.</li>
|
||||
<li>st/vega: Fix version check in context creation.</li>
|
||||
<li>st/egl: Do not finish a fence that is NULL.</li>
|
||||
<li>egl: Fix a false negative check in _eglCheckMakeCurrent.</li>
|
||||
<li>st/mesa: Unreference the sampler view in st_bind_surface.</li>
|
||||
<li>egl_dri2: Fix __DRI_DRI2 version 1 support.</li>
|
||||
<li>st/vega: Do not wait NULL fences.</li>
|
||||
<li>mesa: Do not advertise GL_OES_texture_3D.</li>
|
||||
<li>egl_glx: Fix borken driver.</li>
|
||||
<li>egl: Check extensions.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Daniel Lichtenberger (1):
|
||||
<ul>
|
||||
<li>radeon: fix potential segfault in renderbuffer update</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Daniel Vetter (1):
|
||||
<ul>
|
||||
<li>r200: revalidate after radeon_update_renderbuffers</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Dave Airlie (1):
|
||||
<ul>
|
||||
<li>r300g: fixup rs690 tiling stride alignment calculations.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Eric Anholt (13):
|
||||
<ul>
|
||||
<li>intel: Allow CopyTexSubImage to InternalFormat 3/4 textures, like RGB/RGBA.</li>
|
||||
<li>glsl: Free the loop state context when we free the loop state.</li>
|
||||
<li>i965: Allow OPCODE_SWZ to put immediates in the first arg.</li>
|
||||
<li>i965: Add support for rendering to SARGB8 FBOs.</li>
|
||||
<li>glsl: Add a helper constructor for expressions that works out result type.</li>
|
||||
<li>glsl: Fix structure and array comparisions.</li>
|
||||
<li>glsl: Quiet unreachable no-return-from-function warning.</li>
|
||||
<li>glsl: Mark the array access for whole-array comparisons.</li>
|
||||
<li>glsl: Fix flipped return of has_value() for array constants.</li>
|
||||
<li>mesa: Add getters for the rest of the supported draw buffers.</li>
|
||||
<li>mesa: Add getters for ARB_copy_buffer's attachment points.</li>
|
||||
<li>i965: Correct the dp_read message descriptor setup on g4x.</li>
|
||||
<li>glsl: Correct the marking of InputsRead/OutputsWritten on in/out matrices.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Fabian Bieler (1):
|
||||
<ul>
|
||||
<li>glsl: fix lowering conditional returns in subroutines</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Francisco Jerez (3):
|
||||
<ul>
|
||||
<li>meta: Don't leak alpha function/reference value changes.</li>
|
||||
<li>meta: Fix incorrect rendering of the bitmap alpha component.</li>
|
||||
<li>meta: Don't try to disable cube maps if the driver doesn't expose the extension.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Henri Verbeet (2):
|
||||
<ul>
|
||||
<li>r600: Evergreen has two extra frac_bits for the sampler LOD state.</li>
|
||||
<li>st/mesa: Handle wrapped depth buffers in st_copy_texsubimage().</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Ian Romanick (33):
|
||||
<ul>
|
||||
<li>Add 7.9 md5sums</li>
|
||||
<li>docs: Import 7.8.x release notes from 7.8 branch.</li>
|
||||
<li>docs: download.html does not need to be updated for each release</li>
|
||||
<li>docs: Update mailing lines from sf.net to freedesktop.org</li>
|
||||
<li>docs: added news item for 7.9 release</li>
|
||||
<li>mesa: Validate assembly shaders when GLSL shaders are used</li>
|
||||
<li>linker: Reject shaders that have unresolved function calls</li>
|
||||
<li>mesa: Refactor validation of shader targets</li>
|
||||
<li>glsl: Slightly change the semantic of _LinkedShaders</li>
|
||||
<li>linker: Improve handling of unread/unwritten shader inputs/outputs</li>
|
||||
<li>glsl: Commit lexer files changed by previous cherry picking</li>
|
||||
<li>mesa: Make metaops use program refcounts instead of names.</li>
|
||||
<li>glsl: Fix incorrect gl_type of sampler2DArray and sampler1DArrayShadow</li>
|
||||
<li>mesa: Allow query of MAX_SAMPLES with EXT_framebuffer_multisample</li>
|
||||
<li>glsl: better handling of linker failures</li>
|
||||
<li>mesa: Fix glGet of ES2's GL_MAX_*_VECTORS properties.</li>
|
||||
<li>i915: Disallow alpha, red, RG, and sRGB as render targets</li>
|
||||
<li>glsl/linker: Free any IR discarded by optimization passes.</li>
|
||||
<li>glsl: Add an optimization pass to simplify discards.</li>
|
||||
<li>glsl: Add a lowering pass to move discards out of if-statements.</li>
|
||||
<li>i915: Correctly generate unconditional KIL instructions</li>
|
||||
<li>glsl: Add unary ir_expression constructor</li>
|
||||
<li>glsl: Ensure that equality comparisons don't return a NULL IR tree</li>
|
||||
<li>glcpp: Commit changes in generated files cause by previous commit</li>
|
||||
<li>glsl: Inherrit type of declared variable from initializer</li>
|
||||
<li>glsl: Inherrit type of declared variable from initializer after processing assignment</li>
|
||||
<li>linker: Ensure that unsized arrays have a size after linking</li>
|
||||
<li>linker: Fix regressions caused by previous commit</li>
|
||||
<li>linker: Allow built-in arrays to have different sizes between shader stages</li>
|
||||
<li>ir_to_mesa: Don't generate swizzles for record derefs of non-scalar/vectors</li>
|
||||
<li>Refresh autogenerated file builtin_function.cpp.</li>
|
||||
<li>docs: Initial set of release notes for 7.9.1</li>
|
||||
<li>mesa: set version string to 7.9.1</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Julien Cristau (1):
|
||||
<ul>
|
||||
<li>Makefile: don't include the same files twice in the tarball</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Kenneth Graunke (19):
|
||||
<ul>
|
||||
<li>glcpp: Return NEWLINE token for newlines inside multi-line comments.</li>
|
||||
<li>generate_builtins.py: Output large strings as arrays of characters.</li>
|
||||
<li>glsl: Fix constant component count in vector constructor emitting.</li>
|
||||
<li>ir_dead_functions: Actually free dead functions and signatures.</li>
|
||||
<li>glcpp: Define GL_FRAGMENT_PRECISION_HIGH if GLSL version >= 1.30.</li>
|
||||
<li>glsl: Unconditionally define GL_FRAGMENT_PRECISION_HIGH in ES2 shaders.</li>
|
||||
<li>glsl: Fix constant expression handling for <, >, <=, >= on vectors.</li>
|
||||
<li>glsl: Use do_common_optimization in the standalone compiler.</li>
|
||||
<li>glsl: Don't inline function prototypes.</li>
|
||||
<li>glsl: Add a virtual as_discard() method.</li>
|
||||
<li>glsl: Remove "discard" support from lower_jumps.</li>
|
||||
<li>glsl: Refactor get_num_operands.</li>
|
||||
<li>glcpp: Don't emit SPACE tokens in conditional_tokens production.</li>
|
||||
<li>glsl: Clean up code by adding a new is_break() function.</li>
|
||||
<li>glsl: Consider the "else" branch when looking for loop breaks.</li>
|
||||
<li>Remove OES_compressed_paletted_texture from the ES2 extension list.</li>
|
||||
<li>glsl/builtins: Compute the correct value for smoothstep(vec, vec, vec).</li>
|
||||
<li>Fix build on systems where "python" is python 3.</li>
|
||||
<li>i965: Internally enable GL_NV_blend_square on ES2.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Kristian Høgsberg (1):
|
||||
<ul>
|
||||
<li>i965: Don't write mrf assignment for pointsize output</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Luca Barbieri (1):
|
||||
<ul>
|
||||
<li>glsl: Unroll loops with conditional breaks anywhere (not just the end)</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Marek Olšák (17):
|
||||
<ul>
|
||||
<li>r300g: fix microtiling for 16-bits-per-channel formats</li>
|
||||
<li>r300g: fix texture border for 16-bits-per-channel formats</li>
|
||||
<li>r300g: add a default channel ordering of texture border for unhandled formats</li>
|
||||
<li>r300g: fix texture border color for all texture formats</li>
|
||||
<li>r300g: fix rendering with no vertex elements</li>
|
||||
<li>r300/compiler: fix rc_rewrite_depth_out for it to work with any instruction</li>
|
||||
<li>r300g: fix texture border color once again</li>
|
||||
<li>r300g: fix texture swizzling with compressed textures on r400-r500</li>
|
||||
<li>r300g: disable ARB_texture_swizzle if S3TC is enabled on r3xx-only</li>
|
||||
<li>mesa, st/mesa: fix gl_FragCoord with FBOs in Gallium</li>
|
||||
<li>st/mesa: initialize key in st_vp_varient</li>
|
||||
<li>r300/compiler: fix swizzle lowering with a presubtract source operand</li>
|
||||
<li>r300g: fix rendering with a vertex attrib having a zero stride</li>
|
||||
<li>ir_to_mesa: Add support for conditional discards.</li>
|
||||
<li>r300g: finally fix the texture corruption on r3xx-r4xx</li>
|
||||
<li>mesa: fix texel store functions for some float formats</li>
|
||||
<li>r300/compiler: disable the rename_regs pass for loops</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Mario Kleiner (1):
|
||||
<ul>
|
||||
<li>mesa/r300classic: Fix dri2Invalidate/radeon_prepare_render for page flipping.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Peter Clifton (1):
|
||||
<ul>
|
||||
<li>intel: Fix emit_linear_blit to use DWORD aligned width blits</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Robert Hooker (2):
|
||||
<ul>
|
||||
<li>intel: Add a new B43 pci id.</li>
|
||||
<li>egl_dri2: Add missing intel chip ids.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Roland Scheidegger (1):
|
||||
<ul>
|
||||
<li>r200: fix r200 large points</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Thomas Hellstrom (17):
|
||||
<ul>
|
||||
<li>st/xorg: Don't try to use option values before processing options</li>
|
||||
<li>xorg/vmwgfx: Make vmwarectrl work also on 64-bit servers</li>
|
||||
<li>st/xorg: Add a customizer option to get rid of annoying cursor update flicker</li>
|
||||
<li>xorg/vmwgfx: Don't hide HW cursors when updating them</li>
|
||||
<li>st/xorg: Don't try to remove invalid fbs</li>
|
||||
<li>st/xorg: Fix typo</li>
|
||||
<li>st/xorg, xorg/vmwgfx: Be a bit more frendly towards cross-compiling environments</li>
|
||||
<li>st/xorg: Fix compilation errors for Xservers compiled without Composite</li>
|
||||
<li>st/xorg: Don't use deprecated x*alloc / xfree functions</li>
|
||||
<li>xorg/vmwgfx: Don't use deprecated x*alloc / xfree functions</li>
|
||||
<li>st/xorg: Fix compilation for Xservers >= 1.10</li>
|
||||
<li>mesa: Make sure we have the talloc cflags when using the talloc headers</li>
|
||||
<li>egl: Add an include for size_t</li>
|
||||
<li>mesa: Add talloc includes for gles</li>
|
||||
<li>st/egl: Fix build for include files in nonstandard places</li>
|
||||
<li>svga/drm: Optionally resolve calls to powf during link-time</li>
|
||||
<li>gallium/targets: Trivial crosscompiling fix</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Tom Stellard (7):
|
||||
<ul>
|
||||
<li>r300/compiler: Make sure presubtract sources use supported swizzles</li>
|
||||
<li>r300/compiler: Fix register allocator's handling of loops</li>
|
||||
<li>r300/compiler: Fix instruction scheduling within IF blocks</li>
|
||||
<li>r300/compiler: Use zero as the register index for unused sources</li>
|
||||
<li>r300/compiler: Ignore alpha dest register when replicating the result</li>
|
||||
<li>r300/compiler: Use correct swizzles for all presubtract sources</li>
|
||||
<li>r300/compiler: Don't allow presubtract sources to be remapped twice</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Vinson Lee (1):
|
||||
<ul>
|
||||
<li>glsl: Fix 'control reaches end of non-void function' warning.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>richard (1):
|
||||
<ul>
|
||||
<li>r600c : inline vertex format is not updated in an app, switch to use vfetch constants. For the 7.9 and 7.10 branches as well.</li>
|
||||
</ul></p>
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -8,7 +8,7 @@
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.9 Release Notes / date TBD</H1>
|
||||
<H1>Mesa 7.9 Release Notes / October 4, 2010</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.9 is a new development release.
|
||||
@@ -28,7 +28,12 @@ for DRI hardware acceleration.
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
tbd
|
||||
ed65ab425b25895c7f473d0a5e6e64f8 MesaLib-7.9.tar.gz
|
||||
82c740c49d572baa6da2b1a1eee90bca MesaLib-7.9.tar.bz2
|
||||
cd2b6ecec759b0457475e94bbb38fedb MesaLib-7.9.zip
|
||||
7b54af9fb9b1f6a1a65db2520f50848f MesaGLUT-7.9.tar.gz
|
||||
20d07419d1929f833fdb36bced290ad5 MesaGLUT-7.9.tar.bz2
|
||||
62a7edecd7c92675cd6029b05217eb0a MesaGLUT-7.9.zip
|
||||
</pre>
|
||||
|
||||
|
||||
@@ -37,16 +42,85 @@ tbd
|
||||
<li>New, improved GLSL compiler written by Intel.
|
||||
See the <a href="shading.html"> Shading Language</a> page for
|
||||
more information.
|
||||
<li>GL_EXT_timer_query extension (i965 driver only)
|
||||
<li>New, very experimental Gallium driver for R600-R700 Radeons.
|
||||
<li>Support for AMD Evergreen-based Radeons (HD 5xxx)
|
||||
<li>GL_EXT_timer_query extension (i965 driver and softpipe only)
|
||||
<li>GL_EXT_framebuffer_multisample extension (intel drivers, MAX_SAMPLES = 1)
|
||||
<li>GL_ARB_texture_swizzle extension (alias of GL_EXT_texture_swizzle)
|
||||
<li>GL_ARB_draw_elements_base_vertex, GL_ARB_fragment_program_shadow
|
||||
and GL_EXT_draw_buffers2 in Gallium drivers
|
||||
<li>GL_ARB_draw_elements_base_vertex, GL_ARB_fragment_program_shadow,
|
||||
GL_ARB_window_pos, GL_EXT_gpu_program_parameters,
|
||||
GL_ATI_texture_env_combine3, GL_MESA_pack_invert, and GL_OES_EGL_image
|
||||
extensions in Gallium drivers
|
||||
<li>GL_ARB_depth_clamp and GL_NV_depth_clamp extensions (in nv50 and r600
|
||||
Gallium drivers)
|
||||
<li>GL_ARB_half_float_vertex extension (in nvfx, r300, r600, softpipe,
|
||||
and llvmpipe Gallium drivers)
|
||||
<li>GL_EXT_draw_buffers2 (in nv50, r600, softpipe, and llvmpipe Gallium
|
||||
drivers)
|
||||
<li>GL_EXT_texture_swizzle (in nvfx, r300, r600, softpipe, and llvmpipe
|
||||
Gallium drivers)
|
||||
<li>GL_ATI_texture_mirror_once (in nvfx, nv50, r300, r600, softpipe, and
|
||||
llvmpipe Gallium drivers)
|
||||
<li>GL_NV_conditional_render (in r300 Gallium driver)
|
||||
<li>Initial "signs of life" support for Sandybridge hardware in i965 DRI
|
||||
driver.
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<p>This list is likely incomplete.</p>
|
||||
<ul>
|
||||
<li>Massive improvements to the Gallium driver for R300-R500 Radeons; this
|
||||
driver is now considered stable for use as a DRI (OpenGL) driver.
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=10908">Bug 10908</a> - GLSL: gl_FogParamaters gl_Fog built-in uniform not functioning</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=13753">Bug 13753</a> - Numerous bugs in GLSL uniform handling</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=16854">Bug 16854</a> - GLSL function call at global scope causes SEGV</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=16856">Bug 16856</a> - GLSL indexing of unsized array results in assertion failure</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=18659">Bug 18659</a> - Crash in shader/slang/slang_codegen.c _slang_gen_function_call_name()</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=19089">Bug 19089</a> - [GLSL] glsl1/shadow2D() cases fail</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=22622">Bug 22622</a> - [GM965 GLSL] noise*() cause GPU lockup</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=23743">Bug 23743</a> - For loop from 0 to 0 not optimized out</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=24553">Bug 24553</a> - shader compilation times explode when using more () pairs</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25664">Bug 25664</a> - [GLSL] re-declaring an empty array fails to compile</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25769">Bug 25769</a> - [GLSL] "float" can be implicitly converted to "int"</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25808">Bug 25808</a> - [GLSL] const variable is modified successfully</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25826">Bug 25826</a> - [GLSL] declaring an unsized array then re-declaring with a size fails</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25827">Bug 25827</a> - [GLSL] vector constructor accepts too many arguments successfully</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25829">Bug 25829</a> - [GLSL] allowing non-void function without returning value</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25830">Bug 25830</a> - [GLSL] allowing non-constant-expression as const declaration initializer</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25877">Bug 25877</a> - [GLSL 1.10] implicit conversion from "int" to "float" should not be allowed</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25878">Bug 25878</a> - [GLSL] sampler is converted to int successfully</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25994">Bug 25994</a> - [GM45][GLSL] 'return' statement in vertex shader unsupported</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25999">Bug 25999</a> - [GLSL] embedded structure constructor fails to compile</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26000">Bug 26000</a> - [GLSL] allowing different parameter qualifier between the function definition and declaration</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26001">Bug 26001</a> - [GLSL 1.10] constructing matrix from matrix succeeds</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26224">Bug 26224</a> - [GLSL] Cannot get location of a uniform struct member</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26990">Bug 26990</a> - [GLSL] variable declaration in "while" fails to compile</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27004">Bug 27004</a> - [GLSL] allowing macro redefinition</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27060">Bug 27060</a> - [965] piglit glsl-fs-raytrace failure due to lack of function calls.</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27216">Bug 27216</a> - Assignment with a function call in an if statement causes an assertion failure</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27261">Bug 27261</a> - GLSL Compiler fails on the following vertex shader</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27265">Bug 27265</a> - GLSL Compiler doesnt link the attached vertex shader</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27388">Bug 27388</a> - [i965] piglit glsl-vs-arrays failure</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27403">Bug 27403</a> - GLSL struct causing "Invalid src register file ..." error</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27914">Bug 27914</a> - GLSL compiler uses MUL+ADD where it could use MAD</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28055">Bug 28055</a> - glsl-texcoord-array fails GLSL compilation</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28374">Bug 28374</a> - SIGSEGV shader/slang/slang_typeinfo.c:534</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28748">Bug 28748</a> - [i965] uninlined function calls support</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28833">Bug 28833</a> - piglit/shaders/glsl-texcoord-array fail</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28834">Bug 28834</a> - Add support for system fpclassify to GL_OES_query_matrix function for OpenBSD / NetBSD</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28837">Bug 28837</a> - varying vec4 index support</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28845">Bug 28845</a> - The GLU tesselator code has some warnings</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28889">Bug 28889</a> - [regression] wine game crash</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28894">Bug 28894</a> - slang build fails if absolute path contains spaces</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28913">Bug 28913</a> - [GLSL] allowing two version statements</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28931">Bug 28931</a> - Floating Point Exception in Warzone2100 Trunk version</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28966">Bug 28966</a> - [r300g] Dynamic branching 3 demo does not run</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28967">Bug 28967</a> - slang/slang_emit.c:350: storage_to_src_reg: Assertion `index >= 0' failed.</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29013">Bug 29013</a> - [r300g] translate_rgb_op: unknown opcode ILLEGAL OPCODE</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29020">Bug 29020</a> - [r300g] Wine d3d9 tests hardlock</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29910">Bug 29910</a> - Mesa advertises bogus GL_ARB_shading_language_120</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30196">Bug 30196</a> - [GLSL] gl_TextureMatrix{Inverse,Transpose,InverseTranspose} unsupported</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
@@ -14,6 +14,7 @@ The release notes summarize what's new or changed in each Mesa release.
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="relnotes-7.9.html">7.9 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.3.html">7.8.3 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.2.html">7.8.2 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.1.html">7.8.1 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.html">7.8 release notes</A>
|
||||
|
@@ -805,7 +805,7 @@ typedef struct __DRIimageExtensionRec __DRIimageExtension;
|
||||
struct __DRIimageExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*createImageFromName)(__DRIcontext *context,
|
||||
__DRIimage *(*createImageFromName)(__DRIscreen *screen,
|
||||
int width, int height, int format,
|
||||
int name, int pitch,
|
||||
void *loaderPrivate);
|
||||
@@ -841,7 +841,7 @@ typedef struct __DRIimageLookupExtensionRec __DRIimageLookupExtension;
|
||||
struct __DRIimageLookupExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*lookupEGLImage)(__DRIcontext *context, void *image,
|
||||
__DRIimage *(*lookupEGLImage)(__DRIscreen *screen, void *image,
|
||||
void *loaderPrivate);
|
||||
};
|
||||
|
||||
|
@@ -370,10 +370,9 @@ dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_lookup_egl_image(__DRIcontext *context, void *image, void *data)
|
||||
dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data)
|
||||
{
|
||||
struct dri2_egl_context *dri2_ctx = data;
|
||||
_EGLDisplay *disp = dri2_ctx->base.Resource.Display;
|
||||
_EGLDisplay *disp = data;
|
||||
struct dri2_egl_image *dri2_img;
|
||||
_EGLImage *img;
|
||||
|
||||
@@ -728,7 +727,7 @@ dri2_create_screen(_EGLDisplay *disp)
|
||||
dri2_dpy = disp->DriverData;
|
||||
dri2_dpy->dri_screen =
|
||||
dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, dri2_dpy->extensions,
|
||||
&dri2_dpy->driver_configs, dri2_dpy);
|
||||
&dri2_dpy->driver_configs, disp);
|
||||
|
||||
if (dri2_dpy->dri_screen == NULL) {
|
||||
_eglLog(_EGL_WARNING, "DRI2: failed to create dri screen");
|
||||
@@ -742,7 +741,7 @@ dri2_create_screen(_EGLDisplay *disp)
|
||||
if (dri2_dpy->dri2->base.version >= 2)
|
||||
api_mask = dri2_dpy->dri2->getAPIMask(dri2_dpy->dri_screen);
|
||||
else
|
||||
api_mask = __DRI_API_OPENGL;
|
||||
api_mask = 1 << __DRI_API_OPENGL;
|
||||
|
||||
disp->ClientAPIsMask = 0;
|
||||
if (api_mask & (1 <<__DRI_API_OPENGL))
|
||||
@@ -889,10 +888,20 @@ const int i915_chip_ids[] = {
|
||||
0x29b2, /* PCI_CHIP_Q35_G */
|
||||
0x29c2, /* PCI_CHIP_G33_G */
|
||||
0x29d2, /* PCI_CHIP_Q33_G */
|
||||
0xa001, /* PCI_CHIP_IGD_G */
|
||||
0xa011, /* Pineview */
|
||||
};
|
||||
|
||||
const int i965_chip_ids[] = {
|
||||
0x0042, /* PCI_CHIP_ILD_G */
|
||||
0x0046, /* PCI_CHIP_ILM_G */
|
||||
0x0102, /* PCI_CHIP_SANDYBRIDGE_GT1 */
|
||||
0x0106, /* PCI_CHIP_SANDYBRIDGE_M_GT1 */
|
||||
0x010a, /* PCI_CHIP_SANDYBRIDGE_S */
|
||||
0x0112, /* PCI_CHIP_SANDYBRIDGE_GT2 */
|
||||
0x0116, /* PCI_CHIP_SANDYBRIDGE_M_GT2 */
|
||||
0x0122, /* PCI_CHIP_SANDYBRIDGE_GT2_PLUS */
|
||||
0x0126, /* PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS */
|
||||
0x29a2, /* PCI_CHIP_I965_G */
|
||||
0x2992, /* PCI_CHIP_I965_Q */
|
||||
0x2982, /* PCI_CHIP_I965_G_1 */
|
||||
@@ -904,6 +913,8 @@ const int i965_chip_ids[] = {
|
||||
0x2e12, /* PCI_CHIP_Q45_G */
|
||||
0x2e22, /* PCI_CHIP_G45_G */
|
||||
0x2e32, /* PCI_CHIP_G41_G */
|
||||
0x2e42, /* PCI_CHIP_B43_G */
|
||||
0x2e92, /* PCI_CHIP_B43_G1 */
|
||||
};
|
||||
|
||||
const struct dri2_driver_map driver_map[] = {
|
||||
@@ -1509,7 +1520,6 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
EGLClientBuffer buffer, const EGLint *attr_list)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img;
|
||||
unsigned int attachments[1];
|
||||
xcb_drawable_t drawable;
|
||||
@@ -1577,7 +1587,7 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
|
||||
stride = buffers[0].pitch / buffers[0].cpp;
|
||||
dri2_img->dri_image =
|
||||
dri2_dpy->image->createImageFromName(dri2_ctx->dri_context,
|
||||
dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
buffers_reply->width,
|
||||
buffers_reply->height,
|
||||
format,
|
||||
@@ -1628,7 +1638,6 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
EGLClientBuffer buffer, const EGLint *attr_list)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img;
|
||||
EGLint width, height, format, name, stride, pitch, i, err;
|
||||
|
||||
@@ -1697,7 +1706,7 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
}
|
||||
|
||||
dri2_img->dri_image =
|
||||
dri2_dpy->image->createImageFromName(dri2_ctx->dri_context,
|
||||
dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
width,
|
||||
height,
|
||||
format,
|
||||
|
@@ -142,7 +142,6 @@ static const struct {
|
||||
{ GLX_STENCIL_SIZE, EGL_STENCIL_SIZE },
|
||||
{ GLX_SAMPLE_BUFFERS, EGL_SAMPLE_BUFFERS },
|
||||
{ GLX_SAMPLES, EGL_SAMPLES },
|
||||
{ GLX_RENDER_TYPE, EGL_RENDERABLE_TYPE },
|
||||
{ GLX_X_RENDERABLE, EGL_NATIVE_RENDERABLE },
|
||||
{ GLX_X_VISUAL_TYPE, EGL_NATIVE_VISUAL_TYPE },
|
||||
{ GLX_CONFIG_CAVEAT, EGL_CONFIG_CAVEAT },
|
||||
@@ -218,6 +217,16 @@ convert_fbconfig(Display *dpy, GLXFBConfig fbconfig,
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_SURFACE_TYPE, surface_type);
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT);
|
||||
|
||||
glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_TYPE, &val);
|
||||
if (val == GLX_NONE) {
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_TYPE, EGL_NONE);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_RED_VALUE, 0);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_GREEN_VALUE, 0);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_BLUE_VALUE, 0);
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
@@ -294,6 +303,7 @@ convert_visual(Display *dpy, XVisualInfo *vinfo,
|
||||
surface_type |= EGL_PIXMAP_BIT;
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_SURFACE_TYPE, surface_type);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT);
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_NATIVE_RENDERABLE, EGL_TRUE);
|
||||
|
||||
|
@@ -57,7 +57,7 @@ EGL_NATIVE_PLATFORM=_EGL_INVALID_PLATFORM
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),x11)
|
||||
EGL_NATIVE_PLATFORM=_EGL_PLATFORM_X11
|
||||
endif
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),kms)
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),drm)
|
||||
EGL_NATIVE_PLATFORM=_EGL_PLATFORM_DRM
|
||||
endif
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),fbdev)
|
||||
|
@@ -402,10 +402,15 @@ eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
|
||||
_EGLContext *context;
|
||||
EGLContext ret;
|
||||
|
||||
if (config)
|
||||
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv);
|
||||
else
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
|
||||
|
||||
if (!config) {
|
||||
/* config may be NULL if surfaceless */
|
||||
if (!disp->Extensions.KHR_surfaceless_gles1 &&
|
||||
!disp->Extensions.KHR_surfaceless_gles2 &&
|
||||
!disp->Extensions.KHR_surfaceless_opengl)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
|
||||
}
|
||||
|
||||
if (!share && share_list != EGL_NO_CONTEXT)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
|
||||
@@ -459,9 +464,19 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
|
||||
|
||||
if (!context && ctx != EGL_NO_CONTEXT)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
|
||||
if ((!draw_surf && draw != EGL_NO_SURFACE) ||
|
||||
(!read_surf && read != EGL_NO_SURFACE))
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
if (!draw_surf || !read_surf) {
|
||||
/* surfaces may be NULL if surfaceless */
|
||||
if (!disp->Extensions.KHR_surfaceless_gles1 &&
|
||||
!disp->Extensions.KHR_surfaceless_gles2 &&
|
||||
!disp->Extensions.KHR_surfaceless_opengl)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
|
||||
if ((!draw_surf && draw != EGL_NO_SURFACE) ||
|
||||
(!read_surf && read != EGL_NO_SURFACE))
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
if (draw_surf || read_surf)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
|
||||
}
|
||||
|
||||
ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
|
||||
|
||||
@@ -1276,6 +1291,8 @@ eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
|
||||
EGLImageKHR ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
|
||||
if (!disp->Extensions.KHR_image_base)
|
||||
RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
|
||||
if (!context && ctx != EGL_NO_CONTEXT)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
|
||||
|
||||
@@ -1296,6 +1313,8 @@ eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
|
||||
if (!disp->Extensions.KHR_image_base)
|
||||
RETURN_EGL_EVAL(disp, EGL_FALSE);
|
||||
if (!img)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
|
||||
|
||||
@@ -1321,6 +1340,8 @@ eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
|
||||
EGLSyncKHR ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
|
||||
if (!disp->Extensions.KHR_reusable_sync)
|
||||
RETURN_EGL_EVAL(disp, EGL_NO_SYNC_KHR);
|
||||
|
||||
sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
|
||||
ret = (sync) ? _eglLinkSync(sync, disp) : EGL_NO_SYNC_KHR;
|
||||
@@ -1338,6 +1359,8 @@ eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
|
||||
_eglUnlinkSync(s);
|
||||
ret = drv->API.DestroySyncKHR(drv, disp, s);
|
||||
|
||||
@@ -1354,6 +1377,7 @@ eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR t
|
||||
EGLint ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
@@ -1369,6 +1393,7 @@ eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
@@ -1384,6 +1409,7 @@ eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *v
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
ret = drv->API.GetSyncAttribKHR(drv, disp, s, attribute, value);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
@@ -1407,14 +1433,14 @@ eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
|
||||
|
||||
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
|
||||
|
||||
if (!disp->Extensions.NOK_swap_region)
|
||||
RETURN_EGL_EVAL(disp, EGL_FALSE);
|
||||
|
||||
/* surface must be bound to current context in EGL 1.4 */
|
||||
if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
|
||||
if (drv->API.SwapBuffersRegionNOK)
|
||||
ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
|
||||
else
|
||||
ret = drv->API.SwapBuffers(drv, disp, surf);
|
||||
ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
}
|
||||
@@ -1433,6 +1459,8 @@ eglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
|
||||
EGLImageKHR ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
|
||||
if (!disp->Extensions.MESA_drm_image)
|
||||
RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
|
||||
|
||||
img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
|
||||
ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR;
|
||||
@@ -1450,6 +1478,8 @@ eglExportDRMImageMESA(EGLDisplay dpy, EGLImageKHR image,
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.MESA_drm_image);
|
||||
|
||||
if (!img)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
|
||||
|
||||
|
@@ -272,10 +272,6 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
|
||||
if (!surfaceless && (draw == NULL || read == NULL))
|
||||
return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
|
||||
|
||||
/* context stealing from another thread is not allowed */
|
||||
if (ctx->Binding && ctx->Binding != t)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
|
||||
/*
|
||||
* The spec says
|
||||
*
|
||||
@@ -283,16 +279,23 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
|
||||
* bound to contexts in another thread, an EGL_BAD_ACCESS error is
|
||||
* generated."
|
||||
*
|
||||
* But it also says
|
||||
* and
|
||||
*
|
||||
* "at most one context may be bound to a particular surface at a given
|
||||
* time"
|
||||
*
|
||||
* The latter is more restrictive so we can check only the latter case.
|
||||
*/
|
||||
if ((draw && draw->CurrentContext && draw->CurrentContext != ctx) ||
|
||||
(read && read->CurrentContext && read->CurrentContext != ctx))
|
||||
if (ctx->Binding && ctx->Binding != t)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
if (draw && draw->CurrentContext && draw->CurrentContext != ctx) {
|
||||
if (draw->CurrentContext->Binding != t ||
|
||||
draw->CurrentContext->ClientAPI != ctx->ClientAPI)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
}
|
||||
if (read && read->CurrentContext && read->CurrentContext != ctx) {
|
||||
if (read->CurrentContext->Binding != t ||
|
||||
read->CurrentContext->ClientAPI != ctx->ClientAPI)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
}
|
||||
|
||||
/* simply require the configs to be equal */
|
||||
if ((draw && draw->Config != ctx->Config) ||
|
||||
|
@@ -27,7 +27,7 @@ _eglGetNativePlatformFromEnv(void)
|
||||
} egl_platforms[_EGL_NUM_PLATFORMS] = {
|
||||
{ _EGL_PLATFORM_WINDOWS, "gdi" },
|
||||
{ _EGL_PLATFORM_X11, "x11" },
|
||||
{ _EGL_PLATFORM_DRM, "kms" },
|
||||
{ _EGL_PLATFORM_DRM, "drm" },
|
||||
{ _EGL_PLATFORM_FBDEV, "fbdev" }
|
||||
};
|
||||
_EGLPlatformType plat = _EGL_INVALID_PLATFORM;
|
||||
|
@@ -4,7 +4,7 @@
|
||||
|
||||
#include "egltypedefs.h"
|
||||
#include "eglapi.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/**
|
||||
* Define an inline driver typecast function.
|
||||
|
@@ -206,16 +206,16 @@ include ../Makefile.template
|
||||
|
||||
|
||||
indices/u_indices_gen.c: indices/u_indices_gen.py
|
||||
python $< > $@
|
||||
$(PYTHON2) $< > $@
|
||||
|
||||
indices/u_unfilled_gen.c: indices/u_unfilled_gen.py
|
||||
python $< > $@
|
||||
$(PYTHON2) $< > $@
|
||||
|
||||
util/u_format_srgb.c: util/u_format_srgb.py
|
||||
python $< > $@
|
||||
$(PYTHON2) $< > $@
|
||||
|
||||
util/u_format_table.c: util/u_format_table.py util/u_format_pack.py util/u_format_parse.py util/u_format.csv
|
||||
python util/u_format_table.py util/u_format.csv > $@
|
||||
$(PYTHON2) util/u_format_table.py util/u_format.csv > $@
|
||||
|
||||
util/u_half.c: util/u_half.py
|
||||
python util/u_half.py > $@
|
||||
$(PYTHON2) util/u_half.py > $@
|
||||
|
@@ -263,6 +263,8 @@ do_clip_tri( struct draw_stage *stage,
|
||||
clipmask &= ~(1<<plane_idx);
|
||||
|
||||
assert(n < MAX_CLIPPED_VERTICES);
|
||||
if (n >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
inlist[n] = inlist[0]; /* prevent rotation of vertices */
|
||||
|
||||
for (i = 1; i <= n; i++) {
|
||||
@@ -272,16 +274,22 @@ do_clip_tri( struct draw_stage *stage,
|
||||
|
||||
if (!IS_NEGATIVE(dp_prev)) {
|
||||
assert(outcount < MAX_CLIPPED_VERTICES);
|
||||
if (outcount >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
outlist[outcount++] = vert_prev;
|
||||
}
|
||||
|
||||
if (DIFFERENT_SIGNS(dp, dp_prev)) {
|
||||
struct vertex_header *new_vert;
|
||||
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES+1);
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
new_vert = clipper->stage.tmp[tmpnr++];
|
||||
|
||||
assert(outcount < MAX_CLIPPED_VERTICES);
|
||||
if (outcount >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
outlist[outcount++] = new_vert;
|
||||
|
||||
if (IS_NEGATIVE(dp)) {
|
||||
@@ -321,27 +329,32 @@ do_clip_tri( struct draw_stage *stage,
|
||||
|
||||
/* If flat-shading, copy provoking vertex color to polygon vertex[0]
|
||||
*/
|
||||
if (clipper->flat) {
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
if (inlist[0] != header->v[0]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[0]);
|
||||
if (n >= 3) {
|
||||
if (clipper->flat) {
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
if (inlist[0] != header->v[0]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[0]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (inlist[0] != header->v[2]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (inlist[0] != header->v[2]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Emit the polygon as triangles to the setup stage:
|
||||
*/
|
||||
if (n >= 3)
|
||||
|
||||
/* Emit the polygon as triangles to the setup stage:
|
||||
*/
|
||||
emit_poly( stage, inlist, n, header );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -76,11 +76,15 @@ lp_build_broadcast_scalar(struct lp_build_context *bld,
|
||||
}
|
||||
else {
|
||||
LLVMValueRef res;
|
||||
/* The shuffle vector is always made of int32 elements */
|
||||
struct lp_type i32_vec_type = lp_type_int_vec(32);
|
||||
i32_vec_type.length = type.length;
|
||||
|
||||
#if HAVE_LLVM >= 0x207
|
||||
res = LLVMBuildInsertElement(bld->builder, bld->undef, scalar,
|
||||
LLVMConstInt(LLVMInt32Type(), 0, 0), "");
|
||||
res = LLVMBuildShuffleVector(bld->builder, res, bld->undef,
|
||||
lp_build_const_int_vec(type, 0), "");
|
||||
lp_build_const_int_vec(i32_vec_type, 0), "");
|
||||
#else
|
||||
/* XXX: The above path provokes a bug in LLVM 2.6 */
|
||||
unsigned i;
|
||||
|
@@ -605,8 +605,10 @@ tgsi_check_soa_dependencies(const struct tgsi_full_instruction *inst)
|
||||
for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
|
||||
if ((inst->Src[i].Register.File ==
|
||||
inst->Dst[0].Register.File) &&
|
||||
(inst->Src[i].Register.Index ==
|
||||
inst->Dst[0].Register.Index)) {
|
||||
((inst->Src[i].Register.Index ==
|
||||
inst->Dst[0].Register.Index) ||
|
||||
inst->Src[i].Register.Indirect ||
|
||||
inst->Dst[0].Register.Indirect)) {
|
||||
/* loop over dest channels */
|
||||
uint channelsWritten = 0x0;
|
||||
FOR_EACH_ENABLED_CHANNEL(*inst, chan) {
|
||||
|
@@ -2703,8 +2703,7 @@ static void aos_to_soa( struct x86_function *func,
|
||||
struct x86_reg aos_input = x86_make_reg( file_REG32, reg_BX );
|
||||
struct x86_reg num_inputs = x86_make_reg( file_REG32, reg_CX );
|
||||
struct x86_reg stride = x86_make_reg( file_REG32, reg_DX );
|
||||
int inner_loop;
|
||||
|
||||
int loop_top, loop_exit_fixup;
|
||||
|
||||
/* Save EBX */
|
||||
x86_push( func, x86_make_reg( file_REG32, reg_BX ) );
|
||||
@@ -2717,8 +2716,11 @@ static void aos_to_soa( struct x86_function *func,
|
||||
x86_mov( func, num_inputs, x86_fn_arg( func, arg_num ) );
|
||||
x86_mov( func, stride, x86_fn_arg( func, arg_stride ) );
|
||||
|
||||
/* do */
|
||||
inner_loop = x86_get_label( func );
|
||||
/* while (num_inputs != 0) */
|
||||
loop_top = x86_get_label( func );
|
||||
x86_cmp_imm( func, num_inputs, 0 );
|
||||
loop_exit_fixup = x86_jcc_forward( func, cc_E );
|
||||
|
||||
{
|
||||
x86_push( func, aos_input );
|
||||
sse_movlps( func, make_xmm( 0 ), x86_make_disp( aos_input, 0 ) );
|
||||
@@ -2750,9 +2752,10 @@ static void aos_to_soa( struct x86_function *func,
|
||||
x86_lea( func, aos_input, x86_make_disp(aos_input, 16) );
|
||||
x86_lea( func, soa_input, x86_make_disp(soa_input, 64) );
|
||||
}
|
||||
/* while --num_inputs */
|
||||
/* --num_inputs */
|
||||
x86_dec( func, num_inputs );
|
||||
x86_jcc( func, cc_NE, inner_loop );
|
||||
x86_jmp( func, loop_top );
|
||||
x86_fixup_fwd_jump( func, loop_exit_fixup );
|
||||
|
||||
/* Restore EBX */
|
||||
x86_pop( func, x86_make_reg( file_REG32, reg_BX ) );
|
||||
@@ -2827,31 +2830,52 @@ static void soa_to_aos( struct x86_function *func,
|
||||
* Check if the instructions dst register is the same as any src
|
||||
* register and warn if there's a posible SOA dependency.
|
||||
*/
|
||||
static void
|
||||
static boolean
|
||||
check_soa_dependencies(const struct tgsi_full_instruction *inst)
|
||||
{
|
||||
switch (inst->Instruction.Opcode) {
|
||||
uint opcode = inst->Instruction.Opcode;
|
||||
|
||||
/* XXX: we only handle src/dst aliasing in a few opcodes currently.
|
||||
* Need to use an additional temporay to hold the result in the
|
||||
* cases where the code is too opaque to fix.
|
||||
*/
|
||||
|
||||
switch (opcode) {
|
||||
case TGSI_OPCODE_ADD:
|
||||
case TGSI_OPCODE_MOV:
|
||||
case TGSI_OPCODE_MUL:
|
||||
case TGSI_OPCODE_RCP:
|
||||
case TGSI_OPCODE_RSQ:
|
||||
case TGSI_OPCODE_EXP:
|
||||
case TGSI_OPCODE_LOG:
|
||||
case TGSI_OPCODE_DP3:
|
||||
case TGSI_OPCODE_DP4:
|
||||
case TGSI_OPCODE_DP2A:
|
||||
case TGSI_OPCODE_EX2:
|
||||
case TGSI_OPCODE_LG2:
|
||||
case TGSI_OPCODE_POW:
|
||||
case TGSI_OPCODE_XPD:
|
||||
case TGSI_OPCODE_DPH:
|
||||
case TGSI_OPCODE_COS:
|
||||
case TGSI_OPCODE_SIN:
|
||||
case TGSI_OPCODE_TEX:
|
||||
case TGSI_OPCODE_TXB:
|
||||
case TGSI_OPCODE_TXP:
|
||||
case TGSI_OPCODE_NRM:
|
||||
case TGSI_OPCODE_NRM4:
|
||||
case TGSI_OPCODE_DP2:
|
||||
/* OK - these opcodes correctly handle SOA dependencies */
|
||||
break;
|
||||
return TRUE;
|
||||
default:
|
||||
if (tgsi_check_soa_dependencies(inst)) {
|
||||
uint opcode = inst->Instruction.Opcode;
|
||||
if (!tgsi_check_soa_dependencies(inst))
|
||||
return TRUE;
|
||||
|
||||
/* XXX: we only handle src/dst aliasing in a few opcodes
|
||||
* currently. Need to use an additional temporay to hold
|
||||
* the result in the cases where the code is too opaque to
|
||||
* fix.
|
||||
*/
|
||||
if (opcode != TGSI_OPCODE_MOV) {
|
||||
debug_printf("Warning: src/dst aliasing in instruction"
|
||||
" is not handled:\n");
|
||||
tgsi_dump_instruction(inst, 1);
|
||||
}
|
||||
}
|
||||
debug_printf("Warning: src/dst aliasing in instruction"
|
||||
" is not handled:\n");
|
||||
debug_printf("Warning: ");
|
||||
tgsi_dump_instruction(inst, 1);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2951,7 +2975,8 @@ tgsi_emit_sse2(
|
||||
tgsi_get_processor_name(proc));
|
||||
}
|
||||
|
||||
check_soa_dependencies(&parse.FullToken.FullInstruction);
|
||||
if (ok)
|
||||
ok = check_soa_dependencies(&parse.FullToken.FullInstruction);
|
||||
break;
|
||||
|
||||
case TGSI_TOKEN_TYPE_IMMEDIATE:
|
||||
|
@@ -262,19 +262,20 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst,
|
||||
case TGSI_OPCODE_TXL:
|
||||
case TGSI_OPCODE_TXP:
|
||||
if (src_idx == 0) {
|
||||
/* Note that the SHADOW variants use the Z component too */
|
||||
switch (inst->Texture.Texture) {
|
||||
case TGSI_TEXTURE_1D:
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
read_mask = TGSI_WRITEMASK_X;
|
||||
break;
|
||||
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
read_mask = TGSI_WRITEMASK_XZ;
|
||||
break;
|
||||
case TGSI_TEXTURE_2D:
|
||||
case TGSI_TEXTURE_RECT:
|
||||
case TGSI_TEXTURE_SHADOW2D:
|
||||
case TGSI_TEXTURE_SHADOWRECT:
|
||||
read_mask = TGSI_WRITEMASK_XY;
|
||||
break;
|
||||
|
||||
case TGSI_TEXTURE_SHADOW2D:
|
||||
case TGSI_TEXTURE_SHADOWRECT:
|
||||
case TGSI_TEXTURE_3D:
|
||||
case TGSI_TEXTURE_CUBE:
|
||||
read_mask = TGSI_WRITEMASK_XYZ;
|
||||
|
@@ -29,6 +29,8 @@
|
||||
#define PIPE_ATOMIC_ASM_MSVC_X86
|
||||
#elif (defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86))
|
||||
#define PIPE_ATOMIC_ASM_GCC_X86
|
||||
#elif (defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86_64))
|
||||
#define PIPE_ATOMIC_ASM_GCC_X86_64
|
||||
#elif defined(PIPE_CC_GCC) && (PIPE_CC_GCC_VERSION >= 401)
|
||||
#define PIPE_ATOMIC_GCC_INTRINSIC
|
||||
#else
|
||||
@@ -36,6 +38,51 @@
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(PIPE_ATOMIC_ASM_GCC_X86_64)
|
||||
#define PIPE_ATOMIC "GCC x86_64 assembly"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define p_atomic_set(_v, _i) (*(_v) = (_i))
|
||||
#define p_atomic_read(_v) (*(_v))
|
||||
|
||||
static INLINE boolean
|
||||
p_atomic_dec_zero(int32_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__("lock; decl %0; sete %1":"+m"(*v), "=qm"(c)
|
||||
::"memory");
|
||||
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
p_atomic_inc(int32_t *v)
|
||||
{
|
||||
__asm__ __volatile__("lock; incl %0":"+m"(*v));
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
p_atomic_dec(int32_t *v)
|
||||
{
|
||||
__asm__ __volatile__("lock; decl %0":"+m"(*v));
|
||||
}
|
||||
|
||||
static INLINE int32_t
|
||||
p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new)
|
||||
{
|
||||
return __sync_val_compare_and_swap(v, old, _new);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* PIPE_ATOMIC_ASM_GCC_X86_64 */
|
||||
|
||||
|
||||
#if defined(PIPE_ATOMIC_ASM_GCC_X86)
|
||||
|
||||
|
@@ -268,7 +268,7 @@ void util_blitter_destroy(struct blitter_context *blitter)
|
||||
pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++)
|
||||
for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++)
|
||||
if (ctx->fs_col[i])
|
||||
pipe->delete_fs_state(pipe, ctx->fs_col[i]);
|
||||
|
||||
|
@@ -82,6 +82,7 @@ util_check_caps_out(struct pipe_screen *screen, const unsigned *list, int *out)
|
||||
*out = i - 3;
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case UTIL_CAPS_CHECK_UNIMPLEMENTED:
|
||||
*out = i - 1;
|
||||
return FALSE;
|
||||
|
@@ -394,7 +394,7 @@ util_pack_color(const float rgba[4], enum pipe_format format, union util_color *
|
||||
return;
|
||||
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
||||
{
|
||||
uc->ub = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
|
||||
uc->us = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
|
||||
}
|
||||
return;
|
||||
case PIPE_FORMAT_A8_UNORM:
|
||||
|
@@ -46,6 +46,8 @@
|
||||
do { \
|
||||
(elem)->next->prev = (elem)->prev; \
|
||||
(elem)->prev->next = (elem)->next; \
|
||||
(elem)->next = elem; \
|
||||
(elem)->prev = elem; \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
@@ -332,7 +332,7 @@ util_clear_depth_stencil(struct pipe_context *pipe,
|
||||
uint32_t *row = (uint32_t *)dst_map;
|
||||
for (j = 0; j < width; j++) {
|
||||
uint32_t tmp = *row & dst_mask;
|
||||
*row++ = tmp & (zstencil & ~dst_mask);
|
||||
*row++ = tmp | (zstencil & ~dst_mask);
|
||||
}
|
||||
dst_map += dst_stride;
|
||||
}
|
||||
|
@@ -70,7 +70,7 @@ PROGS_DEPS := ../../auxiliary/libgallium.a
|
||||
include ../../Makefile.template
|
||||
|
||||
lp_tile_soa.c: lp_tile_soa.py ../../auxiliary/util/u_format_parse.py ../../auxiliary/util/u_format_pack.py ../../auxiliary/util/u_format.csv
|
||||
python lp_tile_soa.py ../../auxiliary/util/u_format.csv > $@
|
||||
$(PYTHON2) $(PYTHON_FLAGS) lp_tile_soa.py ../../auxiliary/util/u_format.csv > $@
|
||||
|
||||
LDFLAGS += $(LLVM_LDFLAGS)
|
||||
LIBS += -L../../auxiliary/ -lgallium libllvmpipe.a $(LLVM_LIBS) $(GL_LIB_DEPS)
|
||||
|
@@ -262,7 +262,7 @@ lp_build_stencil_op_single(struct lp_build_context *bld,
|
||||
LLVMValueRef writemask = lp_build_const_int_vec(type, stencil->writemask);
|
||||
mask = LLVMBuildAnd(bld->builder, mask, writemask, "");
|
||||
/* res = (res & mask) | (stencilVals & ~mask) */
|
||||
res = lp_build_select_bitwise(bld, writemask, res, stencilVals);
|
||||
res = lp_build_select_bitwise(bld, mask, res, stencilVals);
|
||||
}
|
||||
else {
|
||||
/* res = mask ? res : stencilVals */
|
||||
|
@@ -155,12 +155,9 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
|
||||
draw_install_aapoint_stage(llvmpipe->draw, &llvmpipe->pipe);
|
||||
draw_install_pstipple_stage(llvmpipe->draw, &llvmpipe->pipe);
|
||||
|
||||
/* convert points and lines into triangles:
|
||||
* (otherwise, draw points and lines natively)
|
||||
*/
|
||||
draw_wide_point_sprites(llvmpipe->draw, FALSE);
|
||||
draw_enable_point_sprites(llvmpipe->draw, FALSE);
|
||||
draw_wide_point_threshold(llvmpipe->draw, 10000.0);
|
||||
/* convert points/sprites into triangles. Draw non-AA lines natively */
|
||||
draw_wide_point_sprites(llvmpipe->draw, TRUE);
|
||||
draw_enable_point_sprites(llvmpipe->draw, TRUE);
|
||||
draw_wide_line_threshold(llvmpipe->draw, 10000.0);
|
||||
|
||||
#if USE_DRAW_STAGE_PSTIPPLE
|
||||
|
@@ -92,8 +92,9 @@ llvmpipe_get_query_result(struct pipe_context *pipe,
|
||||
int i;
|
||||
|
||||
if (!pq->fence) {
|
||||
assert(0); /* query not in issued state */
|
||||
return FALSE;
|
||||
/* no fence because there was no scene, so results is zero */
|
||||
*result = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!lp_fence_signalled(pq->fence)) {
|
||||
|
@@ -292,6 +292,7 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
float x2diff;
|
||||
float y2diff;
|
||||
float dx, dy;
|
||||
float area;
|
||||
|
||||
boolean draw_start;
|
||||
boolean draw_end;
|
||||
@@ -311,6 +312,18 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
|
||||
dx = v1[0][0] - v2[0][0];
|
||||
dy = v1[0][1] - v2[0][1];
|
||||
area = (dx * dx + dy * dy);
|
||||
if (area == 0) {
|
||||
LP_COUNT(nr_culled_tris);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
info.oneoverarea = 1.0f / area;
|
||||
info.dx = dx;
|
||||
info.dy = dy;
|
||||
info.v1 = v1;
|
||||
info.v2 = v2;
|
||||
|
||||
|
||||
/* X-MAJOR LINE */
|
||||
if (fabsf(dx) >= fabsf(dy)) {
|
||||
@@ -573,12 +586,6 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
line->plane[3].dcdx = y[3] - y[0];
|
||||
|
||||
|
||||
info.oneoverarea = 1.0f / (dx * dx + dy * dy);
|
||||
info.dx = dx;
|
||||
info.dy = dy;
|
||||
info.v1 = v1;
|
||||
info.v2 = v2;
|
||||
|
||||
/* Setup parameter interpolants:
|
||||
*/
|
||||
setup_line_coefficients( setup, line, &info);
|
||||
|
@@ -447,8 +447,10 @@ do_triangle_ccw(struct lp_setup_context *setup,
|
||||
static INLINE uint32_t
|
||||
floor_pot(uint32_t n)
|
||||
{
|
||||
assert(n);
|
||||
#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86)
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
__asm__("bsr %1,%0"
|
||||
: "=r" (n)
|
||||
: "rm" (n));
|
||||
|
@@ -39,5 +39,6 @@ EXTRA_OBJECTS = \
|
||||
|
||||
include ../../Makefile.template
|
||||
|
||||
.PHONY: $(COMPILER_ARCHIVE)
|
||||
$(COMPILER_ARCHIVE):
|
||||
$(MAKE) -C $(TOP)/src/mesa/drivers/dri/r300/compiler
|
||||
|
@@ -263,10 +263,6 @@ static void r300_clear(struct pipe_context* pipe,
|
||||
zstex->hiz_in_use[fb->zsbuf->level])) {
|
||||
r300->hyperz_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
/* XXX this flush "fixes" a hardlock in the cubestorm xscreensaver */
|
||||
if (r300->flush_counter == 0)
|
||||
pipe->flush(pipe, 0, NULL);
|
||||
}
|
||||
|
||||
/* Clear a region of a color surface to a constant value. */
|
||||
|
@@ -424,4 +424,5 @@ void r300_parse_chipset(struct r300_capabilities* caps)
|
||||
}
|
||||
|
||||
caps->is_rv350 = caps->family >= CHIP_FAMILY_RV350;
|
||||
caps->dxtc_swizzle = caps->is_r400 || caps->is_r500;
|
||||
}
|
||||
|
@@ -79,6 +79,8 @@ struct r300_capabilities {
|
||||
boolean is_r500;
|
||||
/* Whether or not the second pixel pipe is accessed with the high bit */
|
||||
boolean high_second_pipe;
|
||||
/* DXTC texture swizzling. */
|
||||
boolean dxtc_swizzle;
|
||||
};
|
||||
|
||||
/* Enumerations for legibility and telling which card we're running on. */
|
||||
|
@@ -79,6 +79,9 @@ static void r300_release_referenced_objects(struct r300_context *r300)
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* The dummy VBO. */
|
||||
pipe_resource_reference(&r300->dummy_vb, NULL);
|
||||
|
||||
/* The SWTCL VBO. */
|
||||
pipe_resource_reference(&r300->vbo, NULL);
|
||||
|
||||
@@ -488,6 +491,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
rtempl.target = PIPE_TEXTURE_2D;
|
||||
rtempl.format = PIPE_FORMAT_I8_UNORM;
|
||||
rtempl.bind = PIPE_BIND_SAMPLER_VIEW;
|
||||
rtempl.usage = PIPE_USAGE_IMMUTABLE;
|
||||
rtempl.width0 = 1;
|
||||
rtempl.height0 = 1;
|
||||
rtempl.depth0 = 1;
|
||||
@@ -501,6 +505,19 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
pipe_resource_reference(&tex, NULL);
|
||||
}
|
||||
|
||||
{
|
||||
struct pipe_resource vb = {};
|
||||
vb.target = PIPE_BUFFER;
|
||||
vb.format = PIPE_FORMAT_R8_UNORM;
|
||||
vb.bind = PIPE_BIND_VERTEX_BUFFER;
|
||||
vb.usage = PIPE_USAGE_IMMUTABLE;
|
||||
vb.width0 = sizeof(float) * 16;
|
||||
vb.height0 = 1;
|
||||
vb.depth0 = 1;
|
||||
|
||||
r300->dummy_vb = screen->resource_create(screen, &vb);
|
||||
}
|
||||
|
||||
return &r300->context;
|
||||
|
||||
fail:
|
||||
|
@@ -162,7 +162,6 @@ struct r300_sampler_state {
|
||||
|
||||
uint32_t filter0; /* R300_TX_FILTER0: 0x4400 */
|
||||
uint32_t filter1; /* R300_TX_FILTER1: 0x4440 */
|
||||
uint32_t border_color; /* R300_TX_BORDER_COLOR: 0x45c0 */
|
||||
|
||||
/* Min/max LOD must be clamped to [0, last_level], thus
|
||||
* it's dependent on a currently bound texture */
|
||||
@@ -457,6 +456,7 @@ struct r300_context {
|
||||
size_t draw_vbo_size;
|
||||
/* Whether the VBO must not be flushed. */
|
||||
boolean draw_vbo_locked;
|
||||
boolean draw_first_emitted;
|
||||
|
||||
/* Accelerated blit support. */
|
||||
struct blitter_context* blitter;
|
||||
@@ -470,6 +470,10 @@ struct r300_context {
|
||||
* dummy texture there. */
|
||||
struct r300_sampler_view *texkill_sampler;
|
||||
|
||||
/* When no vertex buffer is set, this one is used instead to prevent
|
||||
* hardlocks. */
|
||||
struct pipe_resource *dummy_vb;
|
||||
|
||||
/* The currently active query. */
|
||||
struct r300_query *query_current;
|
||||
/* The saved query for blitter operations. */
|
||||
|
@@ -158,7 +158,7 @@ static void r300_render_condition(struct pipe_context *pipe,
|
||||
uint mode)
|
||||
{
|
||||
struct r300_context *r300 = r300_context(pipe);
|
||||
uint64_t result;
|
||||
uint64_t result = 0;
|
||||
boolean wait;
|
||||
|
||||
if (query) {
|
||||
@@ -167,9 +167,9 @@ static void r300_render_condition(struct pipe_context *pipe,
|
||||
|
||||
if (!r300_get_query_result(pipe, query, wait, &result)) {
|
||||
r300->skip_rendering = FALSE;
|
||||
} else {
|
||||
r300->skip_rendering = result == 0;
|
||||
}
|
||||
|
||||
r300->skip_rendering = result == 0;
|
||||
} else {
|
||||
r300->skip_rendering = FALSE;
|
||||
}
|
||||
|
@@ -1520,11 +1520,11 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
# define R300_TX_TRI_PERF_3_8 (3<<15)
|
||||
# define R300_ANISO_THRESHOLD_MASK (7<<17)
|
||||
|
||||
# define R400_DXTC_SWIZZLE_ENABLE (1<<21)
|
||||
# define R500_MACRO_SWITCH (1<<22)
|
||||
# define R500_TX_MAX_ANISO(x) ((x) << 23)
|
||||
# define R500_TX_MAX_ANISO_MASK (63 << 23)
|
||||
# define R500_TX_ANISO_HIGH_QUALITY (1 << 30)
|
||||
|
||||
# define R500_BORDER_FIX (1<<31)
|
||||
|
||||
#define R300_TX_FORMAT0_0 0x4480
|
||||
|
@@ -676,9 +676,6 @@ static void r300_draw_vbo(struct pipe_context* pipe,
|
||||
{
|
||||
struct r300_context* r300 = r300_context(pipe);
|
||||
|
||||
if (!r300->velems->count || !r300->vertex_buffer_count)
|
||||
return;
|
||||
|
||||
if (info->indexed && r300->index_buffer.buffer) {
|
||||
unsigned offset;
|
||||
|
||||
@@ -753,6 +750,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
|
||||
draw_set_mapped_index_buffer(r300->draw, indices);
|
||||
|
||||
r300->draw_vbo_locked = TRUE;
|
||||
r300->draw_first_emitted = FALSE;
|
||||
draw_vbo(r300->draw, info);
|
||||
draw_flush(r300->draw);
|
||||
r300->draw_vbo_locked = FALSE;
|
||||
@@ -907,10 +905,17 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
|
||||
|
||||
DBG(r300, DBG_DRAW, "r300: render_draw_arrays (count: %d)\n", count);
|
||||
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
if (r300->draw_first_emitted) {
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 6, 0, 0))
|
||||
return;
|
||||
} else {
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
}
|
||||
|
||||
/* Uncomment to dump all VBOs rendered through this interface.
|
||||
* Slow and noisy!
|
||||
@@ -937,6 +942,8 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
|
||||
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (count << 16) |
|
||||
r300render->hwprim);
|
||||
END_CS;
|
||||
|
||||
r300->draw_first_emitted = TRUE;
|
||||
}
|
||||
|
||||
static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
@@ -955,10 +962,17 @@ static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
CS_LOCALS(r300);
|
||||
DBG(r300, DBG_DRAW, "r300: render_draw_elements (count: %d)\n", count);
|
||||
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
if (r300->draw_first_emitted) {
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 256, 0, 0))
|
||||
return;
|
||||
} else {
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
}
|
||||
|
||||
/* Below we manage the CS space manually because there may be more
|
||||
* indices than it can fit in CS. */
|
||||
@@ -999,6 +1013,8 @@ static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
end_cs_dwords = r300_get_num_cs_end_dwords(r300);
|
||||
}
|
||||
}
|
||||
|
||||
r300->draw_first_emitted = TRUE;
|
||||
}
|
||||
|
||||
static void r300_render_destroy(struct vbuf_render* render)
|
||||
|
@@ -114,8 +114,9 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
||||
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
|
||||
case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
|
||||
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
|
||||
case PIPE_CAP_TEXTURE_SWIZZLE:
|
||||
return 1;
|
||||
case PIPE_CAP_TEXTURE_SWIZZLE:
|
||||
return util_format_s3tc_enabled ? r300screen->caps.dxtc_swizzle : 1;
|
||||
|
||||
/* Unsupported features (boolean caps). */
|
||||
case PIPE_CAP_TIMER_QUERY:
|
||||
|
@@ -1171,7 +1171,6 @@ static void*
|
||||
struct r300_sampler_state* sampler = CALLOC_STRUCT(r300_sampler_state);
|
||||
boolean is_r500 = r300->screen->caps.is_r500;
|
||||
int lod_bias;
|
||||
union util_color uc;
|
||||
|
||||
sampler->state = *state;
|
||||
|
||||
@@ -1228,9 +1227,6 @@ static void*
|
||||
sampler->filter1 |= r500_anisotropy(state->max_anisotropy);
|
||||
}
|
||||
|
||||
util_pack_color(state->border_color, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
sampler->border_color = uc.ui;
|
||||
|
||||
/* R500-specific fixups and optimizations */
|
||||
if (r300->screen->caps.is_r500) {
|
||||
sampler->filter1 |= R500_BORDER_FIX;
|
||||
@@ -1317,29 +1313,27 @@ static void r300_set_fragment_sampler_views(struct pipe_context* pipe,
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (&state->sampler_views[i]->base != views[i]) {
|
||||
pipe_sampler_view_reference(
|
||||
(struct pipe_sampler_view**)&state->sampler_views[i],
|
||||
views[i]);
|
||||
pipe_sampler_view_reference(
|
||||
(struct pipe_sampler_view**)&state->sampler_views[i],
|
||||
views[i]);
|
||||
|
||||
if (!views[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* A new sampler view (= texture)... */
|
||||
dirty_tex = TRUE;
|
||||
|
||||
/* Set the texrect factor in the fragment shader.
|
||||
* Needed for RECT and NPOT fallback. */
|
||||
texture = r300_texture(views[i]->texture);
|
||||
if (texture->desc.is_npot) {
|
||||
r300->fs_rc_constant_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
state->sampler_views[i]->texcache_region =
|
||||
r300_assign_texture_cache_region(view_index, real_num_views);
|
||||
view_index++;
|
||||
if (!views[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* A new sampler view (= texture)... */
|
||||
dirty_tex = TRUE;
|
||||
|
||||
/* Set the texrect factor in the fragment shader.
|
||||
* Needed for RECT and NPOT fallback. */
|
||||
texture = r300_texture(views[i]->texture);
|
||||
if (texture->desc.is_npot) {
|
||||
r300->fs_rc_constant_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
state->sampler_views[i]->texcache_region =
|
||||
r300_assign_texture_cache_region(view_index, real_num_views);
|
||||
view_index++;
|
||||
}
|
||||
|
||||
for (i = count; i < tex_units; i++) {
|
||||
@@ -1367,6 +1361,7 @@ r300_create_sampler_view(struct pipe_context *pipe,
|
||||
struct r300_sampler_view *view = CALLOC_STRUCT(r300_sampler_view);
|
||||
struct r300_texture *tex = r300_texture(texture);
|
||||
boolean is_r500 = r300_screen(pipe->screen)->caps.is_r500;
|
||||
boolean dxtc_swizzle = r300_screen(pipe->screen)->caps.dxtc_swizzle;
|
||||
|
||||
if (view) {
|
||||
view->base = *templ;
|
||||
@@ -1383,7 +1378,8 @@ r300_create_sampler_view(struct pipe_context *pipe,
|
||||
view->format = tex->tx_format;
|
||||
view->format.format1 |= r300_translate_texformat(templ->format,
|
||||
view->swizzle,
|
||||
is_r500);
|
||||
is_r500,
|
||||
dxtc_swizzle);
|
||||
if (is_r500) {
|
||||
view->format.format2 |= r500_tx_format_msb_bit(templ->format);
|
||||
}
|
||||
@@ -1468,6 +1464,15 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
|
||||
struct pipe_vertex_buffer *vbo;
|
||||
unsigned i, max_index = (1 << 24) - 1;
|
||||
boolean any_user_buffer = FALSE;
|
||||
struct pipe_vertex_buffer dummy_vb = {0};
|
||||
|
||||
/* There must be at least one vertex buffer set, otherwise it locks up. */
|
||||
if (!count) {
|
||||
dummy_vb.buffer = r300->dummy_vb;
|
||||
dummy_vb.max_index = r300->dummy_vb->width0 / 4;
|
||||
buffers = &dummy_vb;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
if (count == r300->vertex_buffer_count &&
|
||||
memcmp(r300->vertex_buffer, buffers,
|
||||
@@ -1503,14 +1508,14 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
|
||||
any_user_buffer = TRUE;
|
||||
}
|
||||
|
||||
/* The stride of zero means we will be fetching only the first
|
||||
* vertex, so don't care about max_index. */
|
||||
if (!vbo->stride)
|
||||
continue;
|
||||
|
||||
if (vbo->max_index == ~0) {
|
||||
/* if no VBO stride then only one vertex value so max index is 1 */
|
||||
/* should think about converting to VS constants like svga does */
|
||||
if (!vbo->stride)
|
||||
vbo->max_index = 1;
|
||||
else
|
||||
vbo->max_index =
|
||||
(vbo->buffer->width0 - vbo->buffer_offset) / vbo->stride;
|
||||
vbo->max_index =
|
||||
(vbo->buffer->width0 - vbo->buffer_offset) / vbo->stride;
|
||||
}
|
||||
|
||||
max_index = MIN2(vbo->max_index, max_index);
|
||||
@@ -1621,6 +1626,14 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
||||
struct r300_vertex_element_state *velems;
|
||||
unsigned i;
|
||||
enum pipe_format *format;
|
||||
struct pipe_vertex_element dummy_attrib = {0};
|
||||
|
||||
/* R300 Programmable Stream Control (PSC) doesn't support 0 vertex elements. */
|
||||
if (!count) {
|
||||
dummy_attrib.src_format = PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
attribs = &dummy_attrib;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
assert(count <= PIPE_MAX_ATTRIBS);
|
||||
velems = CALLOC_STRUCT(r300_vertex_element_state);
|
||||
@@ -1687,7 +1700,8 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
||||
* swizzles are already set up.
|
||||
* Also compute the vertex size. */
|
||||
for (i = 0; i < count; i++) {
|
||||
/* This is OK because we check for aligned strides too. */
|
||||
/* This is OK because we check for aligned strides too
|
||||
* elsewhere. */
|
||||
velems->hw_format_size[i] =
|
||||
align(util_format_get_blocksize(velems->hw_format[i]), 4);
|
||||
velems->vertex_size_dwords += velems->hw_format_size[i] / 4;
|
||||
|
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_pack_color.h"
|
||||
|
||||
#include "r300_context.h"
|
||||
#include "r300_fs.h"
|
||||
@@ -567,6 +568,96 @@ static void r300_update_rs_block(struct r300_context *r300)
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t r300_get_border_color(enum pipe_format format,
|
||||
const float border[4],
|
||||
boolean is_r500)
|
||||
{
|
||||
const struct util_format_description *desc;
|
||||
float border_swizzled[4] = {0};
|
||||
unsigned i;
|
||||
union util_color uc = {0};
|
||||
|
||||
desc = util_format_description(format);
|
||||
|
||||
/* Do depth formats first. */
|
||||
if (util_format_is_depth_or_stencil(format)) {
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]);
|
||||
case PIPE_FORMAT_X8Z24_UNORM:
|
||||
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
|
||||
if (is_r500) {
|
||||
return util_pack_z(PIPE_FORMAT_X8Z24_UNORM, border[0]);
|
||||
} else {
|
||||
return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]) << 16;
|
||||
}
|
||||
default:
|
||||
assert(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Apply inverse swizzle of the format. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
switch (desc->swizzle[i]) {
|
||||
case UTIL_FORMAT_SWIZZLE_X:
|
||||
border_swizzled[2] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Y:
|
||||
border_swizzled[1] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Z:
|
||||
border_swizzled[0] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_W:
|
||||
border_swizzled[3] = border[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Compressed formats. */
|
||||
if (util_format_is_compressed(format)) {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc);
|
||||
return uc.ui;
|
||||
}
|
||||
|
||||
switch (desc->channel[0].size) {
|
||||
case 4:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if (desc->channel[1].size == 5) {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G5R5A1_UNORM, &uc);
|
||||
} else if (desc->channel[1].size == 6) {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G6R5_UNORM, &uc);
|
||||
} else {
|
||||
assert(0);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
case 8:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 10:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B10G10R10A2_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
if (desc->nr_channels <= 2) {
|
||||
border_swizzled[0] = border_swizzled[2];
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_R16G16_UNORM, &uc);
|
||||
} else {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return uc.ui;
|
||||
}
|
||||
|
||||
static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
{
|
||||
struct r300_textures_state *state =
|
||||
@@ -599,7 +690,12 @@ static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
texstate->format = view->format;
|
||||
texstate->filter0 = sampler->filter0;
|
||||
texstate->filter1 = sampler->filter1;
|
||||
texstate->border_color = sampler->border_color;
|
||||
|
||||
/* Set the border color. */
|
||||
texstate->border_color =
|
||||
r300_get_border_color(view->base.format,
|
||||
sampler->state.border_color,
|
||||
r300->screen->caps.is_r500);
|
||||
|
||||
/* determine min/max levels */
|
||||
max_level = MIN3(sampler->max_lod + view->base.first_level,
|
||||
@@ -645,13 +741,18 @@ static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
if (sampler->state.compare_mode == PIPE_TEX_COMPARE_NONE) {
|
||||
texstate->format.format1 |=
|
||||
r300_get_swizzle_combined(depth_swizzle,
|
||||
view->swizzle);
|
||||
view->swizzle, FALSE);
|
||||
} else {
|
||||
texstate->format.format1 |=
|
||||
r300_get_swizzle_combined(depth_swizzle, 0);
|
||||
r300_get_swizzle_combined(depth_swizzle, 0, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (r300->screen->caps.dxtc_swizzle &&
|
||||
util_format_is_compressed(tex->desc.b.b.format)) {
|
||||
texstate->filter1 |= R400_DXTC_SWIZZLE_ENABLE;
|
||||
}
|
||||
|
||||
/* to emulate 1D textures through 2D ones correctly */
|
||||
if (tex->desc.b.b.target == PIPE_TEXTURE_1D) {
|
||||
texstate->filter0 &= ~R300_TX_WRAP_T_MASK;
|
||||
|
@@ -40,7 +40,8 @@
|
||||
#include "pipe/p_screen.h"
|
||||
|
||||
unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
const unsigned char *swizzle_view)
|
||||
const unsigned char *swizzle_view,
|
||||
boolean dxtc_swizzle)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned char swizzle[4];
|
||||
@@ -51,10 +52,10 @@ unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
R300_TX_FORMAT_B_SHIFT,
|
||||
R300_TX_FORMAT_A_SHIFT
|
||||
};
|
||||
const uint32_t swizzle_bit[4] = {
|
||||
R300_TX_FORMAT_X,
|
||||
uint32_t swizzle_bit[4] = {
|
||||
dxtc_swizzle ? R300_TX_FORMAT_Z : R300_TX_FORMAT_X,
|
||||
R300_TX_FORMAT_Y,
|
||||
R300_TX_FORMAT_Z,
|
||||
dxtc_swizzle ? R300_TX_FORMAT_X : R300_TX_FORMAT_Z,
|
||||
R300_TX_FORMAT_W
|
||||
};
|
||||
|
||||
@@ -107,7 +108,8 @@ unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
* makes available X, Y, Z, W, ZERO, and ONE for swizzling. */
|
||||
uint32_t r300_translate_texformat(enum pipe_format format,
|
||||
const unsigned char *swizzle_view,
|
||||
boolean is_r500)
|
||||
boolean is_r500,
|
||||
boolean dxtc_swizzle)
|
||||
{
|
||||
uint32_t result = 0;
|
||||
const struct util_format_description *desc;
|
||||
@@ -169,7 +171,8 @@ uint32_t r300_translate_texformat(enum pipe_format format,
|
||||
}
|
||||
}
|
||||
|
||||
result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view);
|
||||
result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
|
||||
util_format_is_compressed(format) && dxtc_swizzle);
|
||||
|
||||
/* S3TC formats. */
|
||||
if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
|
||||
@@ -538,7 +541,7 @@ boolean r300_is_zs_format_supported(enum pipe_format format)
|
||||
|
||||
boolean r300_is_sampler_format_supported(enum pipe_format format)
|
||||
{
|
||||
return r300_translate_texformat(format, 0, TRUE) != ~0;
|
||||
return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0;
|
||||
}
|
||||
|
||||
void r300_texture_setup_format_state(struct r300_screen *screen,
|
||||
@@ -862,7 +865,7 @@ struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen,
|
||||
tex->desc.b.b.nr_samples,
|
||||
tex->desc.microtile,
|
||||
tex->desc.macrotile[level],
|
||||
DIM_HEIGHT);
|
||||
DIM_HEIGHT, 0);
|
||||
|
||||
surface->cbzb_height = align((surface->base.height + 1) / 2,
|
||||
tile_height);
|
||||
|
@@ -35,11 +35,13 @@ struct r300_texture;
|
||||
struct r300_screen;
|
||||
|
||||
unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
const unsigned char *swizzle_view);
|
||||
const unsigned char *swizzle_view,
|
||||
boolean dxtc_swizzle);
|
||||
|
||||
uint32_t r300_translate_texformat(enum pipe_format format,
|
||||
const unsigned char *swizzle_view,
|
||||
boolean is_r500);
|
||||
boolean is_r500,
|
||||
boolean dxtc_swizzle);
|
||||
|
||||
uint32_t r500_tx_format_msb_bit(enum pipe_format format);
|
||||
|
||||
|
@@ -34,7 +34,7 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
unsigned num_samples,
|
||||
enum r300_buffer_tiling microtile,
|
||||
enum r300_buffer_tiling macrotile,
|
||||
enum r300_dim dim)
|
||||
enum r300_dim dim, boolean is_rs690)
|
||||
{
|
||||
static const unsigned table[2][5][3][2] =
|
||||
{
|
||||
@@ -44,7 +44,7 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
{{ 32, 1}, { 8, 4}, { 0, 0}}, /* 8 bits per pixel */
|
||||
{{ 16, 1}, { 8, 2}, { 4, 4}}, /* 16 bits per pixel */
|
||||
{{ 8, 1}, { 4, 2}, { 0, 0}}, /* 32 bits per pixel */
|
||||
{{ 4, 1}, { 0, 0}, { 2, 2}}, /* 64 bits per pixel */
|
||||
{{ 4, 1}, { 2, 2}, { 0, 0}}, /* 64 bits per pixel */
|
||||
{{ 2, 1}, { 0, 0}, { 0, 0}} /* 128 bits per pixel */
|
||||
},
|
||||
{
|
||||
@@ -53,10 +53,11 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
{{256, 8}, {64, 32}, { 0, 0}}, /* 8 bits per pixel */
|
||||
{{128, 8}, {64, 16}, {32, 32}}, /* 16 bits per pixel */
|
||||
{{ 64, 8}, {32, 16}, { 0, 0}}, /* 32 bits per pixel */
|
||||
{{ 32, 8}, { 0, 0}, {16, 16}}, /* 64 bits per pixel */
|
||||
{{ 32, 8}, {16, 16}, { 0, 0}}, /* 64 bits per pixel */
|
||||
{{ 16, 8}, { 0, 0}, { 0, 0}} /* 128 bits per pixel */
|
||||
}
|
||||
};
|
||||
|
||||
static const unsigned aa_block[2] = {4, 8};
|
||||
unsigned tile = 0;
|
||||
unsigned pixsize = util_format_get_blocksize(format);
|
||||
@@ -74,6 +75,14 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
} else {
|
||||
/* Standard alignment. */
|
||||
tile = table[macrotile][util_logbase2(pixsize)][microtile][dim];
|
||||
if (macrotile == 0 && is_rs690 && dim == DIM_WIDTH) {
|
||||
int align;
|
||||
int h_tile;
|
||||
h_tile = table[macrotile][util_logbase2(pixsize)][microtile][DIM_HEIGHT];
|
||||
align = 64 / (pixsize * h_tile);
|
||||
if (tile < align)
|
||||
tile = align;
|
||||
}
|
||||
}
|
||||
|
||||
assert(tile);
|
||||
@@ -89,7 +98,7 @@ static boolean r300_texture_macro_switch(struct r300_texture_desc *desc,
|
||||
unsigned tile, texdim;
|
||||
|
||||
tile = r300_get_pixel_alignment(desc->b.b.format, desc->b.b.nr_samples,
|
||||
desc->microtile, R300_BUFFER_TILED, dim);
|
||||
desc->microtile, R300_BUFFER_TILED, dim, 0);
|
||||
if (dim == DIM_WIDTH) {
|
||||
texdim = u_minify(desc->b.b.width0, level);
|
||||
} else {
|
||||
@@ -113,6 +122,9 @@ static unsigned r300_texture_get_stride(struct r300_screen *screen,
|
||||
unsigned level)
|
||||
{
|
||||
unsigned tile_width, width, stride;
|
||||
boolean is_rs690 = (screen->caps.family == CHIP_FAMILY_RS600 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS690 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS740);
|
||||
|
||||
if (desc->stride_in_bytes_override)
|
||||
return desc->stride_in_bytes_override;
|
||||
@@ -131,38 +143,14 @@ static unsigned r300_texture_get_stride(struct r300_screen *screen,
|
||||
desc->b.b.nr_samples,
|
||||
desc->microtile,
|
||||
desc->macrotile[level],
|
||||
DIM_WIDTH);
|
||||
DIM_WIDTH, is_rs690);
|
||||
width = align(width, tile_width);
|
||||
|
||||
stride = util_format_get_stride(desc->b.b.format, width);
|
||||
|
||||
/* Some IGPs need a minimum stride of 64 bytes, hmm... */
|
||||
if (!desc->macrotile[level] &&
|
||||
(screen->caps.family == CHIP_FAMILY_RS600 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS690 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS740)) {
|
||||
unsigned min_stride;
|
||||
|
||||
if (desc->microtile) {
|
||||
unsigned tile_height =
|
||||
r300_get_pixel_alignment(desc->b.b.format,
|
||||
desc->b.b.nr_samples,
|
||||
desc->microtile,
|
||||
desc->macrotile[level],
|
||||
DIM_HEIGHT);
|
||||
|
||||
min_stride = 64 / tile_height;
|
||||
} else {
|
||||
min_stride = 64;
|
||||
}
|
||||
|
||||
return stride < min_stride ? min_stride : stride;
|
||||
}
|
||||
|
||||
/* The alignment to 32 bytes is sort of implied by the layout... */
|
||||
return stride;
|
||||
} else {
|
||||
return align(util_format_get_stride(desc->b.b.format, width), 32);
|
||||
return align(util_format_get_stride(desc->b.b.format, width), is_rs690 ? 64 : 32);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,7 +167,7 @@ static unsigned r300_texture_get_nblocksy(struct r300_texture_desc *desc,
|
||||
desc->b.b.nr_samples,
|
||||
desc->microtile,
|
||||
desc->macrotile[level],
|
||||
DIM_HEIGHT);
|
||||
DIM_HEIGHT, 0);
|
||||
height = align(height, tile_height);
|
||||
|
||||
/* This is needed for the kernel checker, unfortunately. */
|
||||
@@ -256,7 +244,7 @@ static void r300_setup_miptree(struct r300_screen *screen,
|
||||
{
|
||||
struct pipe_resource *base = &desc->b.b;
|
||||
unsigned stride, size, layer_size, nblocksy, i;
|
||||
boolean rv350_mode = screen->caps.is_rv350;
|
||||
boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350;
|
||||
boolean aligned_for_cbzb;
|
||||
|
||||
desc->size_in_bytes = 0;
|
||||
@@ -351,7 +339,7 @@ static void r300_setup_tiling(struct r300_screen *screen,
|
||||
{
|
||||
struct r300_winsys_screen *rws = screen->rws;
|
||||
enum pipe_format format = desc->b.b.format;
|
||||
boolean rv350_mode = screen->caps.is_rv350;
|
||||
boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350;
|
||||
boolean is_zb = util_format_is_depth_or_stencil(format);
|
||||
boolean dbg_no_tiling = SCREEN_DBG_ON(screen, DBG_NO_TILING);
|
||||
|
||||
@@ -368,11 +356,11 @@ static void r300_setup_tiling(struct r300_screen *screen,
|
||||
switch (util_format_get_blocksize(format)) {
|
||||
case 1:
|
||||
case 4:
|
||||
case 8:
|
||||
desc->microtile = R300_BUFFER_TILED;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 8:
|
||||
if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) {
|
||||
desc->microtile = R300_BUFFER_SQUARETILED;
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
unsigned num_samples,
|
||||
enum r300_buffer_tiling microtile,
|
||||
enum r300_buffer_tiling macrotile,
|
||||
enum r300_dim dim);
|
||||
enum r300_dim dim, boolean is_rs690);
|
||||
|
||||
boolean r300_texture_desc_init(struct r300_screen *rscreen,
|
||||
struct r300_texture_desc *desc,
|
||||
|
@@ -203,7 +203,7 @@ svga_tgsi_translate( const struct svga_shader *shader,
|
||||
emit.imm_start += key.vkey.num_zero_stride_vertex_elements;
|
||||
}
|
||||
|
||||
emit.nr_hw_const = (emit.imm_start + emit.info.file_max[TGSI_FILE_IMMEDIATE] + 1);
|
||||
emit.nr_hw_float_const = (emit.imm_start + emit.info.file_max[TGSI_FILE_IMMEDIATE] + 1);
|
||||
|
||||
emit.nr_hw_temp = emit.info.file_max[TGSI_FILE_TEMPORARY] + 1;
|
||||
emit.in_main_func = TRUE;
|
||||
|
@@ -62,7 +62,8 @@ struct svga_shader_emitter
|
||||
|
||||
int imm_start;
|
||||
|
||||
int nr_hw_const;
|
||||
int nr_hw_float_const;
|
||||
int nr_hw_int_const;
|
||||
int nr_hw_temp;
|
||||
|
||||
int insn_offset;
|
||||
|
@@ -197,22 +197,37 @@ translate_src_register( const struct svga_shader_emitter *emit,
|
||||
break;
|
||||
}
|
||||
|
||||
/* Indirect addressing (for coninstant buffer lookups only)
|
||||
/* Indirect addressing.
|
||||
*/
|
||||
if (reg->Register.Indirect)
|
||||
{
|
||||
/* we shift the offset towards the minimum */
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
src.base.num -= svga_arl_adjustment( emit );
|
||||
if (reg->Register.Indirect) {
|
||||
if (emit->unit == PIPE_SHADER_FRAGMENT) {
|
||||
/* Pixel shaders have only loop registers for relative
|
||||
* addressing into inputs. Ignore the redundant address
|
||||
* register, the contents of aL should be in sync with it.
|
||||
*/
|
||||
if (reg->Register.File == TGSI_FILE_INPUT) {
|
||||
src.base.relAddr = 1;
|
||||
src.indirect = src_token(SVGA3DREG_LOOP, 0);
|
||||
}
|
||||
}
|
||||
src.base.relAddr = 1;
|
||||
else {
|
||||
/* Constant buffers only.
|
||||
*/
|
||||
if (reg->Register.File == TGSI_FILE_CONSTANT) {
|
||||
/* we shift the offset towards the minimum */
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
src.base.num -= svga_arl_adjustment( emit );
|
||||
}
|
||||
src.base.relAddr = 1;
|
||||
|
||||
/* Not really sure what should go in the second token:
|
||||
*/
|
||||
src.indirect = src_token( SVGA3DREG_ADDR,
|
||||
reg->Indirect.Index );
|
||||
/* Not really sure what should go in the second token:
|
||||
*/
|
||||
src.indirect = src_token( SVGA3DREG_ADDR,
|
||||
reg->Indirect.Index );
|
||||
|
||||
src.indirect.swizzle = SWIZZLE_XXXX;
|
||||
src.indirect.swizzle = SWIZZLE_XXXX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
src = swizzle( src,
|
||||
@@ -538,7 +553,7 @@ static boolean emit_def_const( struct svga_shader_emitter *emit,
|
||||
static INLINE boolean
|
||||
create_zero_immediate( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT,
|
||||
idx, 0, 0, 0, 1 ))
|
||||
@@ -553,7 +568,7 @@ create_zero_immediate( struct svga_shader_emitter *emit )
|
||||
static INLINE boolean
|
||||
create_loop_const( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_int_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_INT, idx,
|
||||
255, /* iteration count */
|
||||
@@ -571,7 +586,7 @@ create_loop_const( struct svga_shader_emitter *emit )
|
||||
static INLINE boolean
|
||||
create_sincos_consts( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT, idx,
|
||||
-1.5500992e-006f,
|
||||
@@ -581,7 +596,7 @@ create_sincos_consts( struct svga_shader_emitter *emit )
|
||||
return FALSE;
|
||||
|
||||
emit->sincos_consts_idx = idx;
|
||||
idx = emit->nr_hw_const++;
|
||||
idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT, idx,
|
||||
-0.020833334f,
|
||||
@@ -602,7 +617,7 @@ create_arl_consts( struct svga_shader_emitter *emit )
|
||||
|
||||
for (i = 0; i < emit->num_arl_consts; i += 4) {
|
||||
int j;
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
float vals[4];
|
||||
for (j = 0; j < 4 && (j + i) < emit->num_arl_consts; ++j) {
|
||||
vals[j] = emit->arl_consts[i + j].number;
|
||||
@@ -1593,6 +1608,14 @@ static boolean emit_arl(struct svga_shader_emitter *emit,
|
||||
const struct tgsi_full_instruction *insn)
|
||||
{
|
||||
++emit->current_arl;
|
||||
if (emit->unit == PIPE_SHADER_FRAGMENT) {
|
||||
/* MOVA not present in pixel shader instruction set.
|
||||
* Ignore this instruction altogether since it is
|
||||
* only used for loop counters -- and for that
|
||||
* we reference aL directly.
|
||||
*/
|
||||
return TRUE;
|
||||
}
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
return emit_fake_arl( emit, insn );
|
||||
} else {
|
||||
@@ -2384,7 +2407,7 @@ static boolean make_immediate( struct svga_shader_emitter *emit,
|
||||
float d,
|
||||
struct src_register *out )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT,
|
||||
idx, a, b, c, d ))
|
||||
|
@@ -384,7 +384,6 @@ struct st_manager
|
||||
* This function is optional.
|
||||
*/
|
||||
boolean (*get_egl_image)(struct st_manager *smapi,
|
||||
struct st_context_iface *stctx,
|
||||
void *egl_image,
|
||||
struct st_egl_image *out);
|
||||
|
||||
|
@@ -61,9 +61,6 @@ struct dri_context
|
||||
/* gallium */
|
||||
struct st_api *stapi;
|
||||
struct st_context_iface *st;
|
||||
|
||||
/* hooks filled in by dri2 & drisw */
|
||||
__DRIimage * (*lookup_egl_image)(struct dri_context *ctx, void *handle);
|
||||
};
|
||||
|
||||
static INLINE struct dri_context *
|
||||
|
@@ -287,16 +287,14 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
|
||||
|
||||
static boolean
|
||||
dri_get_egl_image(struct st_manager *smapi,
|
||||
struct st_context_iface *stctxi,
|
||||
void *egl_image,
|
||||
struct st_egl_image *stimg)
|
||||
{
|
||||
struct dri_context *ctx =
|
||||
(struct dri_context *)stctxi->st_manager_private;
|
||||
struct dri_screen *screen = (struct dri_screen *)smapi;
|
||||
__DRIimage *img = NULL;
|
||||
|
||||
if (ctx->lookup_egl_image) {
|
||||
img = ctx->lookup_egl_image(ctx, egl_image);
|
||||
if (screen->lookup_egl_image) {
|
||||
img = screen->lookup_egl_image(screen, egl_image);
|
||||
}
|
||||
|
||||
if (!img)
|
||||
|
@@ -69,6 +69,9 @@ struct dri_screen
|
||||
boolean sd_depth_bits_last;
|
||||
boolean auto_fake_front;
|
||||
enum pipe_texture_target target;
|
||||
|
||||
/* hooks filled in by dri2 & drisw */
|
||||
__DRIimage * (*lookup_egl_image)(struct dri_screen *ctx, void *handle);
|
||||
};
|
||||
|
||||
/** cast wrapper */
|
||||
|
@@ -291,25 +291,26 @@ dri2_flush_frontbuffer(struct dri_drawable *drawable,
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_lookup_egl_image(struct dri_context *ctx, void *handle)
|
||||
dri2_lookup_egl_image(struct dri_screen *screen, void *handle)
|
||||
{
|
||||
__DRIimageLookupExtension *loader = ctx->sPriv->dri2.image;
|
||||
__DRIimageLookupExtension *loader = screen->sPriv->dri2.image;
|
||||
__DRIimage *img;
|
||||
|
||||
if (!loader->lookupEGLImage)
|
||||
return NULL;
|
||||
|
||||
img = loader->lookupEGLImage(ctx->cPriv, handle, ctx->cPriv->loaderPrivate);
|
||||
img = loader->lookupEGLImage(screen->sPriv,
|
||||
handle, screen->sPriv->loaderPrivate);
|
||||
|
||||
return img;
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_create_image_from_name(__DRIcontext *context,
|
||||
dri2_create_image_from_name(__DRIscreen *_screen,
|
||||
int width, int height, int format,
|
||||
int name, int pitch, void *loaderPrivate)
|
||||
{
|
||||
struct dri_screen *screen = dri_screen(context->driScreenPriv);
|
||||
struct dri_screen *screen = dri_screen(_screen);
|
||||
__DRIimage *img;
|
||||
struct pipe_resource templ;
|
||||
struct winsys_handle whandle;
|
||||
@@ -537,6 +538,7 @@ dri2_init_screen(__DRIscreen * sPriv)
|
||||
|
||||
screen->auto_fake_front = dri_with_format(sPriv);
|
||||
screen->broken_invalidate = !sPriv->dri2.useInvalidate;
|
||||
screen->lookup_egl_image = dri2_lookup_egl_image;
|
||||
|
||||
return configs;
|
||||
fail:
|
||||
@@ -556,8 +558,6 @@ dri2_create_context(gl_api api, const __GLcontextModes * visual,
|
||||
|
||||
ctx = cPriv->driverPrivate;
|
||||
|
||||
ctx->lookup_egl_image = dri2_lookup_egl_image;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@@ -17,16 +17,16 @@ x11_INCLUDES = \
|
||||
-I$(TOP)/src/mapi \
|
||||
-I$(TOP)/src/mesa \
|
||||
$(X11_CFLAGS) \
|
||||
$(shell pkg-config --cflags-only-I libdrm)
|
||||
$(shell pkg-config --cflags-only-I libdrm dri2proto)
|
||||
|
||||
x11_SOURCES = $(wildcard x11/*.c) \
|
||||
$(TOP)/src/glx/dri2.c
|
||||
x11_OBJECTS = $(x11_SOURCES:.c=.o)
|
||||
|
||||
|
||||
kms_INCLUDES = -I$(TOP)/src/gallium/winsys $(shell pkg-config --cflags-only-I libdrm)
|
||||
kms_SOURCES = $(wildcard kms/*.c)
|
||||
kms_OBJECTS = $(kms_SOURCES:.c=.o)
|
||||
drm_INCLUDES = -I$(TOP)/src/gallium/winsys $(shell pkg-config --cflags-only-I libdrm)
|
||||
drm_SOURCES = $(wildcard drm/*.c)
|
||||
drm_OBJECTS = $(drm_SOURCES:.c=.o)
|
||||
|
||||
|
||||
fbdev_INCLUDES = -I$(TOP)/src/gallium/winsys/sw
|
||||
@@ -34,8 +34,8 @@ fbdev_SOURCES = $(wildcard fbdev/*.c)
|
||||
fbdev_OBJECTS = $(fbdev_SOURCES:.c=.o)
|
||||
|
||||
|
||||
ALL_INCLUDES = $(common_INCLUDES) $(x11_INCLUDES) $(kms_INCLUDES) $(fbdev_INCLUDES)
|
||||
ALL_SOURCES = $(common_SOURCES) $(x11_SOURCES) $(kms_SOURCES) $(fbdev_SOURCES)
|
||||
ALL_INCLUDES = $(common_INCLUDES) $(x11_INCLUDES) $(drm_INCLUDES) $(fbdev_INCLUDES)
|
||||
ALL_SOURCES = $(common_SOURCES) $(x11_SOURCES) $(drm_SOURCES) $(fbdev_SOURCES)
|
||||
|
||||
EGL_OBJECTS = $(common_OBJECTS)
|
||||
EGL_CPPFLAGS = $(common_INCLUDES)
|
||||
@@ -45,9 +45,9 @@ ifneq ($(findstring x11, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(x11_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_X11_BACKEND
|
||||
endif
|
||||
ifneq ($(findstring kms, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(kms_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_KMS_BACKEND
|
||||
ifneq ($(findstring drm, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(drm_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_DRM_BACKEND
|
||||
endif
|
||||
ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(fbdev_OBJECTS)
|
||||
@@ -87,8 +87,8 @@ $(common_OBJECTS): %.o: %.c
|
||||
$(x11_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,x11)
|
||||
|
||||
$(kms_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,kms)
|
||||
$(drm_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,drm)
|
||||
|
||||
$(fbdev_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,fbdev)
|
||||
|
@@ -65,8 +65,8 @@ egl_g3d_get_platform(_EGLDriver *drv, _EGLPlatformType plat)
|
||||
break;
|
||||
case _EGL_PLATFORM_DRM:
|
||||
plat_name = "DRM";
|
||||
#ifdef HAVE_KMS_BACKEND
|
||||
nplat = native_get_kms_platform();
|
||||
#ifdef HAVE_DRM_BACKEND
|
||||
nplat = native_get_drm_platform();
|
||||
#endif
|
||||
break;
|
||||
case _EGL_PLATFORM_FBDEV:
|
||||
|
@@ -609,8 +609,10 @@ egl_g3d_wait_client(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
|
||||
|
||||
gctx->stctxi->flush(gctx->stctxi,
|
||||
PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
screen->fence_finish(screen, fence, 0);
|
||||
screen->fence_reference(screen, &fence, NULL);
|
||||
if (fence) {
|
||||
screen->fence_finish(screen, fence, 0);
|
||||
screen->fence_reference(screen, &fence, NULL);
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
@@ -51,7 +51,6 @@ egl_g3d_st_manager(struct st_manager *smapi)
|
||||
|
||||
static boolean
|
||||
egl_g3d_st_manager_get_egl_image(struct st_manager *smapi,
|
||||
struct st_context_iface *stctx,
|
||||
void *egl_image,
|
||||
struct st_egl_image *out)
|
||||
{
|
||||
|
@@ -227,7 +227,7 @@ const struct native_platform *
|
||||
native_get_x11_platform(void);
|
||||
|
||||
const struct native_platform *
|
||||
native_get_kms_platform(void);
|
||||
native_get_drm_platform(void);
|
||||
|
||||
const struct native_platform *
|
||||
native_get_fbdev_platform(void);
|
||||
|
619
src/gallium/state_trackers/egl/drm/modeset.c
Normal file
619
src/gallium/state_trackers/egl/drm/modeset.c
Normal file
@@ -0,0 +1,619 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.9
|
||||
*
|
||||
* Copyright (C) 2010 LunarG Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Chia-I Wu <olv@lunarg.com>
|
||||
*/
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_drm.h"
|
||||
|
||||
static boolean
|
||||
drm_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
int *width, int *height)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
|
||||
if (!resource_surface_add_resources(drmsurf->rsurf, attachment_mask))
|
||||
return FALSE;
|
||||
if (textures)
|
||||
resource_surface_get_resources(drmsurf->rsurf, textures, attachment_mask);
|
||||
|
||||
if (seq_num)
|
||||
*seq_num = drmsurf->sequence_number;
|
||||
if (width)
|
||||
*width = drmsurf->width;
|
||||
if (height)
|
||||
*height = drmsurf->height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add textures as DRM framebuffers.
|
||||
*/
|
||||
static boolean
|
||||
drm_surface_init_framebuffers(struct native_surface *nsurf, boolean need_back)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
int num_framebuffers = (need_back) ? 2 : 1;
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < num_framebuffers; i++) {
|
||||
struct drm_framebuffer *fb;
|
||||
enum native_attachment natt;
|
||||
struct winsys_handle whandle;
|
||||
uint block_bits;
|
||||
|
||||
if (i == 0) {
|
||||
fb = &drmsurf->front_fb;
|
||||
natt = NATIVE_ATTACHMENT_FRONT_LEFT;
|
||||
}
|
||||
else {
|
||||
fb = &drmsurf->back_fb;
|
||||
natt = NATIVE_ATTACHMENT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if (!fb->texture) {
|
||||
/* make sure the texture has been allocated */
|
||||
resource_surface_add_resources(drmsurf->rsurf, 1 << natt);
|
||||
fb->texture =
|
||||
resource_surface_get_single_resource(drmsurf->rsurf, natt);
|
||||
if (!fb->texture)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* already initialized */
|
||||
if (fb->buffer_id)
|
||||
continue;
|
||||
|
||||
/* TODO detect the real value */
|
||||
fb->is_passive = TRUE;
|
||||
|
||||
memset(&whandle, 0, sizeof(whandle));
|
||||
whandle.type = DRM_API_HANDLE_TYPE_KMS;
|
||||
|
||||
if (!drmdpy->base.screen->resource_get_handle(drmdpy->base.screen,
|
||||
fb->texture, &whandle))
|
||||
return FALSE;
|
||||
|
||||
block_bits = util_format_get_blocksizebits(drmsurf->color_format);
|
||||
err = drmModeAddFB(drmdpy->fd, drmsurf->width, drmsurf->height,
|
||||
block_bits, block_bits, whandle.stride, whandle.handle,
|
||||
&fb->buffer_id);
|
||||
if (err) {
|
||||
fb->buffer_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_surface_flush_frontbuffer(struct native_surface *nsurf)
|
||||
{
|
||||
#ifdef DRM_MODE_FEATURE_DIRTYFB
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
|
||||
if (drmsurf->front_fb.is_passive)
|
||||
drmModeDirtyFB(drmdpy->fd, drmsurf->front_fb.buffer_id, NULL, 0);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_surface_swap_buffers(struct native_surface *nsurf)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_crtc *drmcrtc = &drmsurf->current_crtc;
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
struct drm_framebuffer tmp_fb;
|
||||
int err;
|
||||
|
||||
if (!drmsurf->back_fb.buffer_id) {
|
||||
if (!drm_surface_init_framebuffers(&drmsurf->base, TRUE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (drmsurf->is_shown && drmcrtc->crtc) {
|
||||
err = drmModeSetCrtc(drmdpy->fd, drmcrtc->crtc->crtc_id,
|
||||
drmsurf->back_fb.buffer_id, drmcrtc->crtc->x, drmcrtc->crtc->y,
|
||||
drmcrtc->connectors, drmcrtc->num_connectors, &drmcrtc->crtc->mode);
|
||||
if (err)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* swap the buffers */
|
||||
tmp_fb = drmsurf->front_fb;
|
||||
drmsurf->front_fb = drmsurf->back_fb;
|
||||
drmsurf->back_fb = tmp_fb;
|
||||
|
||||
resource_surface_swap_buffers(drmsurf->rsurf,
|
||||
NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
|
||||
/* the front/back textures are swapped */
|
||||
drmsurf->sequence_number++;
|
||||
drmdpy->event_handler->invalid_surface(&drmdpy->base,
|
||||
&drmsurf->base, drmsurf->sequence_number);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
static void
|
||||
drm_surface_destroy(struct native_surface *nsurf)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
|
||||
if (drmsurf->current_crtc.crtc)
|
||||
drmModeFreeCrtc(drmsurf->current_crtc.crtc);
|
||||
|
||||
if (drmsurf->front_fb.buffer_id)
|
||||
drmModeRmFB(drmsurf->drmdpy->fd, drmsurf->front_fb.buffer_id);
|
||||
pipe_resource_reference(&drmsurf->front_fb.texture, NULL);
|
||||
|
||||
if (drmsurf->back_fb.buffer_id)
|
||||
drmModeRmFB(drmsurf->drmdpy->fd, drmsurf->back_fb.buffer_id);
|
||||
pipe_resource_reference(&drmsurf->back_fb.texture, NULL);
|
||||
|
||||
resource_surface_destroy(drmsurf->rsurf);
|
||||
FREE(drmsurf);
|
||||
}
|
||||
|
||||
static struct drm_surface *
|
||||
drm_display_create_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_config *drmconf = drm_config(nconf);
|
||||
struct drm_surface *drmsurf;
|
||||
|
||||
drmsurf = CALLOC_STRUCT(drm_surface);
|
||||
if (!drmsurf)
|
||||
return NULL;
|
||||
|
||||
drmsurf->drmdpy = drmdpy;
|
||||
drmsurf->color_format = drmconf->base.color_format;
|
||||
drmsurf->width = width;
|
||||
drmsurf->height = height;
|
||||
|
||||
drmsurf->rsurf = resource_surface_create(drmdpy->base.screen,
|
||||
drmsurf->color_format,
|
||||
PIPE_BIND_RENDER_TARGET |
|
||||
PIPE_BIND_SAMPLER_VIEW |
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT);
|
||||
if (!drmsurf->rsurf) {
|
||||
FREE(drmsurf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resource_surface_set_size(drmsurf->rsurf, drmsurf->width, drmsurf->height);
|
||||
|
||||
drmsurf->base.destroy = drm_surface_destroy;
|
||||
drmsurf->base.swap_buffers = drm_surface_swap_buffers;
|
||||
drmsurf->base.flush_frontbuffer = drm_surface_flush_frontbuffer;
|
||||
drmsurf->base.validate = drm_surface_validate;
|
||||
drmsurf->base.wait = drm_surface_wait;
|
||||
|
||||
return drmsurf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Choose a CRTC that supports all given connectors.
|
||||
*/
|
||||
static uint32_t
|
||||
drm_display_choose_crtc(struct native_display *ndpy,
|
||||
uint32_t *connectors, int num_connectors)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < drmdpy->resources->count_crtcs; idx++) {
|
||||
boolean found_crtc = TRUE;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < num_connectors; i++) {
|
||||
drmModeConnectorPtr connector;
|
||||
int encoder_idx = -1;
|
||||
|
||||
connector = drmModeGetConnector(drmdpy->fd, connectors[i]);
|
||||
if (!connector) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* find an encoder the CRTC supports */
|
||||
for (j = 0; j < connector->count_encoders; j++) {
|
||||
drmModeEncoderPtr encoder =
|
||||
drmModeGetEncoder(drmdpy->fd, connector->encoders[j]);
|
||||
if (encoder->possible_crtcs & (1 << idx)) {
|
||||
encoder_idx = j;
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
|
||||
drmModeFreeConnector(connector);
|
||||
if (encoder_idx < 0) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_crtc)
|
||||
break;
|
||||
}
|
||||
|
||||
if (idx >= drmdpy->resources->count_crtcs) {
|
||||
_eglLog(_EGL_WARNING,
|
||||
"failed to find a CRTC that supports the given %d connectors",
|
||||
num_connectors);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return drmdpy->resources->crtcs[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remember the original CRTC status and set the CRTC
|
||||
*/
|
||||
static boolean
|
||||
drm_display_set_crtc(struct native_display *ndpy, int crtc_idx,
|
||||
uint32_t buffer_id, uint32_t x, uint32_t y,
|
||||
uint32_t *connectors, int num_connectors,
|
||||
drmModeModeInfoPtr mode)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_crtc *drmcrtc = &drmdpy->saved_crtcs[crtc_idx];
|
||||
uint32_t crtc_id;
|
||||
int err;
|
||||
|
||||
if (drmcrtc->crtc) {
|
||||
crtc_id = drmcrtc->crtc->crtc_id;
|
||||
}
|
||||
else {
|
||||
int count = 0, i;
|
||||
|
||||
/*
|
||||
* Choose the CRTC once. It could be more dynamic, but let's keep it
|
||||
* simple for now.
|
||||
*/
|
||||
crtc_id = drm_display_choose_crtc(&drmdpy->base,
|
||||
connectors, num_connectors);
|
||||
|
||||
/* save the original CRTC status */
|
||||
drmcrtc->crtc = drmModeGetCrtc(drmdpy->fd, crtc_id);
|
||||
if (!drmcrtc->crtc)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < drmdpy->num_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
drmModeConnectorPtr connector = drmconn->connector;
|
||||
drmModeEncoderPtr encoder;
|
||||
|
||||
encoder = drmModeGetEncoder(drmdpy->fd, connector->encoder_id);
|
||||
if (encoder) {
|
||||
if (encoder->crtc_id == crtc_id) {
|
||||
drmcrtc->connectors[count++] = connector->connector_id;
|
||||
if (count >= Elements(drmcrtc->connectors))
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
drmcrtc->num_connectors = count;
|
||||
}
|
||||
|
||||
err = drmModeSetCrtc(drmdpy->fd, crtc_id, buffer_id, x, y,
|
||||
connectors, num_connectors, mode);
|
||||
if (err) {
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
drmcrtc->crtc = NULL;
|
||||
drmcrtc->num_connectors = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_display_program(struct native_display *ndpy, int crtc_idx,
|
||||
struct native_surface *nsurf, uint x, uint y,
|
||||
const struct native_connector **nconns, int num_nconns,
|
||||
const struct native_mode *nmode)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
const struct drm_mode *drmmode = drm_mode(nmode);
|
||||
uint32_t connector_ids[32];
|
||||
uint32_t buffer_id;
|
||||
drmModeModeInfo mode_tmp, *mode;
|
||||
int i;
|
||||
|
||||
if (num_nconns > Elements(connector_ids)) {
|
||||
_eglLog(_EGL_WARNING, "too many connectors (%d)", num_nconns);
|
||||
num_nconns = Elements(connector_ids);
|
||||
}
|
||||
|
||||
if (drmsurf) {
|
||||
if (!drm_surface_init_framebuffers(&drmsurf->base, FALSE))
|
||||
return FALSE;
|
||||
|
||||
buffer_id = drmsurf->front_fb.buffer_id;
|
||||
/* the mode argument of drmModeSetCrtc is not constified */
|
||||
mode_tmp = drmmode->mode;
|
||||
mode = &mode_tmp;
|
||||
}
|
||||
else {
|
||||
/* disable the CRTC */
|
||||
buffer_id = 0;
|
||||
mode = NULL;
|
||||
num_nconns = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_nconns; i++) {
|
||||
struct drm_connector *drmconn = drm_connector(nconns[i]);
|
||||
connector_ids[i] = drmconn->connector->connector_id;
|
||||
}
|
||||
|
||||
if (!drm_display_set_crtc(&drmdpy->base, crtc_idx, buffer_id, x, y,
|
||||
connector_ids, num_nconns, mode)) {
|
||||
_eglLog(_EGL_WARNING, "failed to set CRTC %d", crtc_idx);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (drmdpy->shown_surfaces[crtc_idx])
|
||||
drmdpy->shown_surfaces[crtc_idx]->is_shown = FALSE;
|
||||
drmdpy->shown_surfaces[crtc_idx] = drmsurf;
|
||||
|
||||
/* remember the settings for buffer swapping */
|
||||
if (drmsurf) {
|
||||
uint32_t crtc_id = drmdpy->saved_crtcs[crtc_idx].crtc->crtc_id;
|
||||
struct drm_crtc *drmcrtc = &drmsurf->current_crtc;
|
||||
|
||||
if (drmcrtc->crtc)
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
drmcrtc->crtc = drmModeGetCrtc(drmdpy->fd, crtc_id);
|
||||
|
||||
assert(num_nconns < Elements(drmcrtc->connectors));
|
||||
memcpy(drmcrtc->connectors, connector_ids,
|
||||
sizeof(*connector_ids) * num_nconns);
|
||||
drmcrtc->num_connectors = num_nconns;
|
||||
|
||||
drmsurf->is_shown = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const struct native_mode **
|
||||
drm_display_get_modes(struct native_display *ndpy,
|
||||
const struct native_connector *nconn,
|
||||
int *num_modes)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_connector *drmconn = drm_connector(nconn);
|
||||
const struct native_mode **nmodes_return;
|
||||
int count, i;
|
||||
|
||||
/* delete old data */
|
||||
if (drmconn->connector) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
FREE(drmconn->drm_modes);
|
||||
|
||||
drmconn->connector = NULL;
|
||||
drmconn->drm_modes = NULL;
|
||||
drmconn->num_modes = 0;
|
||||
}
|
||||
|
||||
/* detect again */
|
||||
drmconn->connector = drmModeGetConnector(drmdpy->fd, drmconn->connector_id);
|
||||
if (!drmconn->connector)
|
||||
return NULL;
|
||||
|
||||
count = drmconn->connector->count_modes;
|
||||
drmconn->drm_modes = CALLOC(count, sizeof(*drmconn->drm_modes));
|
||||
if (!drmconn->drm_modes) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
drmconn->connector = NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct drm_mode *drmmode = &drmconn->drm_modes[i];
|
||||
drmModeModeInfoPtr mode = &drmconn->connector->modes[i];
|
||||
|
||||
drmmode->mode = *mode;
|
||||
|
||||
drmmode->base.desc = drmmode->mode.name;
|
||||
drmmode->base.width = drmmode->mode.hdisplay;
|
||||
drmmode->base.height = drmmode->mode.vdisplay;
|
||||
drmmode->base.refresh_rate = drmmode->mode.vrefresh;
|
||||
/* not all kernels have vrefresh = refresh_rate * 1000 */
|
||||
if (drmmode->base.refresh_rate > 1000)
|
||||
drmmode->base.refresh_rate = (drmmode->base.refresh_rate + 500) / 1000;
|
||||
}
|
||||
|
||||
nmodes_return = MALLOC(count * sizeof(*nmodes_return));
|
||||
if (nmodes_return) {
|
||||
for (i = 0; i < count; i++)
|
||||
nmodes_return[i] = &drmconn->drm_modes[i].base;
|
||||
if (num_modes)
|
||||
*num_modes = count;
|
||||
}
|
||||
|
||||
return nmodes_return;
|
||||
}
|
||||
|
||||
static const struct native_connector **
|
||||
drm_display_get_connectors(struct native_display *ndpy, int *num_connectors,
|
||||
int *num_crtc)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
const struct native_connector **connectors;
|
||||
int i;
|
||||
|
||||
if (!drmdpy->connectors) {
|
||||
drmdpy->connectors =
|
||||
CALLOC(drmdpy->resources->count_connectors, sizeof(*drmdpy->connectors));
|
||||
if (!drmdpy->connectors)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < drmdpy->resources->count_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
|
||||
drmconn->connector_id = drmdpy->resources->connectors[i];
|
||||
/* drmconn->connector is allocated when the modes are asked */
|
||||
}
|
||||
|
||||
drmdpy->num_connectors = drmdpy->resources->count_connectors;
|
||||
}
|
||||
|
||||
connectors = MALLOC(drmdpy->num_connectors * sizeof(*connectors));
|
||||
if (connectors) {
|
||||
for (i = 0; i < drmdpy->num_connectors; i++)
|
||||
connectors[i] = &drmdpy->connectors[i].base;
|
||||
if (num_connectors)
|
||||
*num_connectors = drmdpy->num_connectors;
|
||||
}
|
||||
|
||||
if (num_crtc)
|
||||
*num_crtc = drmdpy->resources->count_crtcs;
|
||||
|
||||
return connectors;
|
||||
}
|
||||
|
||||
static struct native_surface *
|
||||
drm_display_create_scanout_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct drm_surface *drmsurf;
|
||||
|
||||
drmsurf = drm_display_create_surface(ndpy, nconf, width, height);
|
||||
return &drmsurf->base;
|
||||
}
|
||||
|
||||
static struct native_display_modeset drm_display_modeset = {
|
||||
.get_connectors = drm_display_get_connectors,
|
||||
.get_modes = drm_display_get_modes,
|
||||
.create_scanout_surface = drm_display_create_scanout_surface,
|
||||
.program = drm_display_program
|
||||
};
|
||||
|
||||
void
|
||||
drm_display_fini_modeset(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
int i;
|
||||
|
||||
if (drmdpy->connectors) {
|
||||
for (i = 0; i < drmdpy->num_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
if (drmconn->connector) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
FREE(drmconn->drm_modes);
|
||||
}
|
||||
}
|
||||
FREE(drmdpy->connectors);
|
||||
}
|
||||
|
||||
if (drmdpy->shown_surfaces) {
|
||||
FREE(drmdpy->shown_surfaces);
|
||||
drmdpy->shown_surfaces = NULL;
|
||||
}
|
||||
|
||||
if (drmdpy->saved_crtcs) {
|
||||
for (i = 0; i < drmdpy->resources->count_crtcs; i++) {
|
||||
struct drm_crtc *drmcrtc = &drmdpy->saved_crtcs[i];
|
||||
|
||||
if (drmcrtc->crtc) {
|
||||
/* restore crtc */
|
||||
drmModeSetCrtc(drmdpy->fd, drmcrtc->crtc->crtc_id,
|
||||
drmcrtc->crtc->buffer_id, drmcrtc->crtc->x, drmcrtc->crtc->y,
|
||||
drmcrtc->connectors, drmcrtc->num_connectors,
|
||||
&drmcrtc->crtc->mode);
|
||||
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
}
|
||||
}
|
||||
FREE(drmdpy->saved_crtcs);
|
||||
}
|
||||
|
||||
if (drmdpy->resources) {
|
||||
drmModeFreeResources(drmdpy->resources);
|
||||
drmdpy->resources = NULL;
|
||||
}
|
||||
|
||||
drmdpy->base.modeset = NULL;
|
||||
}
|
||||
|
||||
boolean
|
||||
drm_display_init_modeset(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
|
||||
/* resources are fixed, unlike crtc, connector, or encoder */
|
||||
drmdpy->resources = drmModeGetResources(drmdpy->fd);
|
||||
if (!drmdpy->resources) {
|
||||
_eglLog(_EGL_DEBUG, "Failed to get KMS resources. Disable modeset.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->saved_crtcs =
|
||||
CALLOC(drmdpy->resources->count_crtcs, sizeof(*drmdpy->saved_crtcs));
|
||||
if (!drmdpy->saved_crtcs) {
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->shown_surfaces =
|
||||
CALLOC(drmdpy->resources->count_crtcs, sizeof(*drmdpy->shown_surfaces));
|
||||
if (!drmdpy->shown_surfaces) {
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->base.modeset = &drm_display_modeset;
|
||||
|
||||
return TRUE;
|
||||
}
|
240
src/gallium/state_trackers/egl/drm/native_drm.c
Normal file
240
src/gallium/state_trackers/egl/drm/native_drm.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.8
|
||||
*
|
||||
* Copyright (C) 2010 Chia-I Wu <olv@0xlab.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_drm.h"
|
||||
|
||||
/* see get_drm_screen_name */
|
||||
#include <radeon_drm.h>
|
||||
#include "radeon/drm/radeon_drm.h"
|
||||
|
||||
static boolean
|
||||
drm_display_is_format_supported(struct native_display *ndpy,
|
||||
enum pipe_format fmt, boolean is_color)
|
||||
{
|
||||
return ndpy->screen->is_format_supported(ndpy->screen,
|
||||
fmt, PIPE_TEXTURE_2D, 0,
|
||||
(is_color) ? PIPE_BIND_RENDER_TARGET :
|
||||
PIPE_BIND_DEPTH_STENCIL, 0);
|
||||
}
|
||||
|
||||
static const struct native_config **
|
||||
drm_display_get_configs(struct native_display *ndpy, int *num_configs)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
const struct native_config **configs;
|
||||
|
||||
/* first time */
|
||||
if (!drmdpy->config) {
|
||||
struct native_config *nconf;
|
||||
enum pipe_format format;
|
||||
|
||||
drmdpy->config = CALLOC(1, sizeof(*drmdpy->config));
|
||||
if (!drmdpy->config)
|
||||
return NULL;
|
||||
|
||||
nconf = &drmdpy->config->base;
|
||||
|
||||
nconf->buffer_mask =
|
||||
(1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
|
||||
(1 << NATIVE_ATTACHMENT_BACK_LEFT);
|
||||
|
||||
format = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
if (!drm_display_is_format_supported(&drmdpy->base, format, TRUE)) {
|
||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
||||
if (!drm_display_is_format_supported(&drmdpy->base, format, TRUE))
|
||||
format = PIPE_FORMAT_NONE;
|
||||
}
|
||||
if (format == PIPE_FORMAT_NONE) {
|
||||
FREE(drmdpy->config);
|
||||
drmdpy->config = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nconf->color_format = format;
|
||||
|
||||
/* support KMS */
|
||||
if (drmdpy->resources)
|
||||
nconf->scanout_bit = TRUE;
|
||||
}
|
||||
|
||||
configs = MALLOC(sizeof(*configs));
|
||||
if (configs) {
|
||||
configs[0] = &drmdpy->config->base;
|
||||
if (num_configs)
|
||||
*num_configs = 1;
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
static int
|
||||
drm_display_get_param(struct native_display *ndpy,
|
||||
enum native_param_type param)
|
||||
{
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_display_destroy(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
|
||||
if (drmdpy->config)
|
||||
FREE(drmdpy->config);
|
||||
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
|
||||
if (drmdpy->base.screen)
|
||||
drmdpy->base.screen->destroy(drmdpy->base.screen);
|
||||
|
||||
if (drmdpy->fd >= 0)
|
||||
close(drmdpy->fd);
|
||||
|
||||
FREE(drmdpy);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_drm_screen_name(int fd, drmVersionPtr version)
|
||||
{
|
||||
const char *name = version->name;
|
||||
|
||||
if (name && !strcmp(name, "radeon")) {
|
||||
int chip_id;
|
||||
struct drm_radeon_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.request = RADEON_INFO_DEVICE_ID;
|
||||
info.value = pointer_to_intptr(&chip_id);
|
||||
if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
|
||||
return NULL;
|
||||
|
||||
name = is_r3xx(chip_id) ? "r300" : "r600";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize KMS and pipe screen.
|
||||
*/
|
||||
static boolean
|
||||
drm_display_init_screen(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
drmVersionPtr version;
|
||||
const char *name;
|
||||
|
||||
version = drmGetVersion(drmdpy->fd);
|
||||
if (!version) {
|
||||
_eglLog(_EGL_WARNING, "invalid fd %d", drmdpy->fd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name = get_drm_screen_name(drmdpy->fd, version);
|
||||
if (name) {
|
||||
drmdpy->base.screen =
|
||||
drmdpy->event_handler->new_drm_screen(&drmdpy->base, name, drmdpy->fd);
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
|
||||
if (!drmdpy->base.screen) {
|
||||
_eglLog(_EGL_WARNING, "failed to create DRM screen");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
drm_create_display(int fd, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
struct drm_display *drmdpy;
|
||||
|
||||
drmdpy = CALLOC_STRUCT(drm_display);
|
||||
if (!drmdpy)
|
||||
return NULL;
|
||||
|
||||
drmdpy->fd = fd;
|
||||
drmdpy->event_handler = event_handler;
|
||||
drmdpy->base.user_data = user_data;
|
||||
|
||||
if (!drm_display_init_screen(&drmdpy->base)) {
|
||||
drm_display_destroy(&drmdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
drmdpy->base.destroy = drm_display_destroy;
|
||||
drmdpy->base.get_param = drm_display_get_param;
|
||||
drmdpy->base.get_configs = drm_display_get_configs;
|
||||
|
||||
drm_display_init_modeset(&drmdpy->base);
|
||||
|
||||
return &drmdpy->base;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
native_create_display(void *dpy, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (dpy) {
|
||||
fd = dup((int) pointer_to_intptr(dpy));
|
||||
}
|
||||
else {
|
||||
fd = open("/dev/dri/card0", O_RDWR);
|
||||
}
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return drm_create_display(fd, event_handler, user_data);
|
||||
}
|
||||
|
||||
static const struct native_platform drm_platform = {
|
||||
"DRM", /* name */
|
||||
native_create_display
|
||||
};
|
||||
|
||||
const struct native_platform *
|
||||
native_get_drm_platform(void)
|
||||
{
|
||||
return &drm_platform;
|
||||
}
|
@@ -23,8 +23,8 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _NATIVE_KMS_H_
|
||||
#define _NATIVE_KMS_H_
|
||||
#ifndef _NATIVE_DRM_H_
|
||||
#define _NATIVE_DRM_H_
|
||||
|
||||
#include <xf86drm.h>
|
||||
#include <xf86drmMode.h>
|
||||
@@ -37,101 +37,110 @@
|
||||
#include "common/native.h"
|
||||
#include "common/native_helper.h"
|
||||
|
||||
struct kms_config;
|
||||
struct kms_connector;
|
||||
struct kms_mode;
|
||||
struct drm_config;
|
||||
struct drm_crtc;
|
||||
struct drm_connector;
|
||||
struct drm_mode;
|
||||
struct drm_surface;
|
||||
|
||||
struct kms_crtc {
|
||||
drmModeCrtcPtr crtc;
|
||||
uint32_t connectors[32];
|
||||
int num_connectors;
|
||||
};
|
||||
|
||||
struct kms_display {
|
||||
struct drm_display {
|
||||
struct native_display base;
|
||||
|
||||
struct native_event_handler *event_handler;
|
||||
|
||||
int fd;
|
||||
drmModeResPtr resources;
|
||||
struct kms_config *config;
|
||||
struct drm_config *config;
|
||||
|
||||
struct kms_connector *connectors;
|
||||
/* for modesetting */
|
||||
drmModeResPtr resources;
|
||||
struct drm_connector *connectors;
|
||||
int num_connectors;
|
||||
|
||||
struct kms_surface **shown_surfaces;
|
||||
struct drm_surface **shown_surfaces;
|
||||
/* save the original settings of the CRTCs */
|
||||
struct kms_crtc *saved_crtcs;
|
||||
struct drm_crtc *saved_crtcs;
|
||||
};
|
||||
|
||||
struct kms_framebuffer {
|
||||
struct drm_config {
|
||||
struct native_config base;
|
||||
};
|
||||
|
||||
struct drm_crtc {
|
||||
drmModeCrtcPtr crtc;
|
||||
uint32_t connectors[32];
|
||||
int num_connectors;
|
||||
};
|
||||
|
||||
struct drm_framebuffer {
|
||||
struct pipe_resource *texture;
|
||||
boolean is_passive;
|
||||
|
||||
uint32_t buffer_id;
|
||||
};
|
||||
|
||||
struct kms_surface {
|
||||
struct drm_surface {
|
||||
struct native_surface base;
|
||||
struct kms_display *kdpy;
|
||||
struct drm_display *drmdpy;
|
||||
|
||||
struct resource_surface *rsurf;
|
||||
enum pipe_format color_format;
|
||||
int width, height;
|
||||
|
||||
unsigned int sequence_number;
|
||||
struct kms_framebuffer front_fb, back_fb;
|
||||
struct drm_framebuffer front_fb, back_fb;
|
||||
|
||||
boolean is_shown;
|
||||
struct kms_crtc current_crtc;
|
||||
struct drm_crtc current_crtc;
|
||||
};
|
||||
|
||||
struct kms_config {
|
||||
struct native_config base;
|
||||
};
|
||||
|
||||
struct kms_connector {
|
||||
struct drm_connector {
|
||||
struct native_connector base;
|
||||
|
||||
uint32_t connector_id;
|
||||
drmModeConnectorPtr connector;
|
||||
struct kms_mode *kms_modes;
|
||||
struct drm_mode *drm_modes;
|
||||
int num_modes;
|
||||
};
|
||||
|
||||
struct kms_mode {
|
||||
struct drm_mode {
|
||||
struct native_mode base;
|
||||
drmModeModeInfo mode;
|
||||
};
|
||||
|
||||
static INLINE struct kms_display *
|
||||
kms_display(const struct native_display *ndpy)
|
||||
static INLINE struct drm_display *
|
||||
drm_display(const struct native_display *ndpy)
|
||||
{
|
||||
return (struct kms_display *) ndpy;
|
||||
return (struct drm_display *) ndpy;
|
||||
}
|
||||
|
||||
static INLINE struct kms_surface *
|
||||
kms_surface(const struct native_surface *nsurf)
|
||||
static INLINE struct drm_config *
|
||||
drm_config(const struct native_config *nconf)
|
||||
{
|
||||
return (struct kms_surface *) nsurf;
|
||||
return (struct drm_config *) nconf;
|
||||
}
|
||||
|
||||
static INLINE struct kms_config *
|
||||
kms_config(const struct native_config *nconf)
|
||||
static INLINE struct drm_surface *
|
||||
drm_surface(const struct native_surface *nsurf)
|
||||
{
|
||||
return (struct kms_config *) nconf;
|
||||
return (struct drm_surface *) nsurf;
|
||||
}
|
||||
|
||||
static INLINE struct kms_connector *
|
||||
kms_connector(const struct native_connector *nconn)
|
||||
static INLINE struct drm_connector *
|
||||
drm_connector(const struct native_connector *nconn)
|
||||
{
|
||||
return (struct kms_connector *) nconn;
|
||||
return (struct drm_connector *) nconn;
|
||||
}
|
||||
|
||||
static INLINE struct kms_mode *
|
||||
kms_mode(const struct native_mode *nmode)
|
||||
static INLINE struct drm_mode *
|
||||
drm_mode(const struct native_mode *nmode)
|
||||
{
|
||||
return (struct kms_mode *) nmode;
|
||||
return (struct drm_mode *) nmode;
|
||||
}
|
||||
|
||||
#endif /* _NATIVE_KMS_H_ */
|
||||
boolean
|
||||
drm_display_init_modeset(struct native_display *ndpy);
|
||||
|
||||
void
|
||||
drm_display_fini_modeset(struct native_display *ndpy);
|
||||
|
||||
#endif /* _NATIVE_DRM_H_ */
|
@@ -1,808 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.8
|
||||
*
|
||||
* Copyright (C) 2010 Chia-I Wu <olv@0xlab.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_pointer.h"
|
||||
#include "util/u_string.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_kms.h"
|
||||
|
||||
/* see get_drm_screen_name */
|
||||
#include <radeon_drm.h>
|
||||
#include "radeon/drm/radeon_drm.h"
|
||||
|
||||
static boolean
|
||||
kms_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
int *width, int *height)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
|
||||
if (!resource_surface_add_resources(ksurf->rsurf, attachment_mask))
|
||||
return FALSE;
|
||||
if (textures)
|
||||
resource_surface_get_resources(ksurf->rsurf, textures, attachment_mask);
|
||||
|
||||
if (seq_num)
|
||||
*seq_num = ksurf->sequence_number;
|
||||
if (width)
|
||||
*width = ksurf->width;
|
||||
if (height)
|
||||
*height = ksurf->height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add textures as DRM framebuffers.
|
||||
*/
|
||||
static boolean
|
||||
kms_surface_init_framebuffers(struct native_surface *nsurf, boolean need_back)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
int num_framebuffers = (need_back) ? 2 : 1;
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < num_framebuffers; i++) {
|
||||
struct kms_framebuffer *fb;
|
||||
enum native_attachment natt;
|
||||
struct winsys_handle whandle;
|
||||
uint block_bits;
|
||||
|
||||
if (i == 0) {
|
||||
fb = &ksurf->front_fb;
|
||||
natt = NATIVE_ATTACHMENT_FRONT_LEFT;
|
||||
}
|
||||
else {
|
||||
fb = &ksurf->back_fb;
|
||||
natt = NATIVE_ATTACHMENT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if (!fb->texture) {
|
||||
/* make sure the texture has been allocated */
|
||||
resource_surface_add_resources(ksurf->rsurf, 1 << natt);
|
||||
fb->texture =
|
||||
resource_surface_get_single_resource(ksurf->rsurf, natt);
|
||||
if (!fb->texture)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* already initialized */
|
||||
if (fb->buffer_id)
|
||||
continue;
|
||||
|
||||
/* TODO detect the real value */
|
||||
fb->is_passive = TRUE;
|
||||
|
||||
memset(&whandle, 0, sizeof(whandle));
|
||||
whandle.type = DRM_API_HANDLE_TYPE_KMS;
|
||||
|
||||
if (!kdpy->base.screen->resource_get_handle(kdpy->base.screen,
|
||||
fb->texture, &whandle))
|
||||
return FALSE;
|
||||
|
||||
block_bits = util_format_get_blocksizebits(ksurf->color_format);
|
||||
err = drmModeAddFB(kdpy->fd, ksurf->width, ksurf->height,
|
||||
block_bits, block_bits, whandle.stride, whandle.handle,
|
||||
&fb->buffer_id);
|
||||
if (err) {
|
||||
fb->buffer_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_surface_flush_frontbuffer(struct native_surface *nsurf)
|
||||
{
|
||||
#ifdef DRM_MODE_FEATURE_DIRTYFB
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
|
||||
if (ksurf->front_fb.is_passive)
|
||||
drmModeDirtyFB(kdpy->fd, ksurf->front_fb.buffer_id, NULL, 0);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_surface_swap_buffers(struct native_surface *nsurf)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_crtc *kcrtc = &ksurf->current_crtc;
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
struct kms_framebuffer tmp_fb;
|
||||
int err;
|
||||
|
||||
if (!ksurf->back_fb.buffer_id) {
|
||||
if (!kms_surface_init_framebuffers(&ksurf->base, TRUE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ksurf->is_shown && kcrtc->crtc) {
|
||||
err = drmModeSetCrtc(kdpy->fd, kcrtc->crtc->crtc_id,
|
||||
ksurf->back_fb.buffer_id, kcrtc->crtc->x, kcrtc->crtc->y,
|
||||
kcrtc->connectors, kcrtc->num_connectors, &kcrtc->crtc->mode);
|
||||
if (err)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* swap the buffers */
|
||||
tmp_fb = ksurf->front_fb;
|
||||
ksurf->front_fb = ksurf->back_fb;
|
||||
ksurf->back_fb = tmp_fb;
|
||||
|
||||
resource_surface_swap_buffers(ksurf->rsurf,
|
||||
NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
|
||||
/* the front/back textures are swapped */
|
||||
ksurf->sequence_number++;
|
||||
kdpy->event_handler->invalid_surface(&kdpy->base,
|
||||
&ksurf->base, ksurf->sequence_number);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
kms_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
static void
|
||||
kms_surface_destroy(struct native_surface *nsurf)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
|
||||
if (ksurf->current_crtc.crtc)
|
||||
drmModeFreeCrtc(ksurf->current_crtc.crtc);
|
||||
|
||||
if (ksurf->front_fb.buffer_id)
|
||||
drmModeRmFB(ksurf->kdpy->fd, ksurf->front_fb.buffer_id);
|
||||
pipe_resource_reference(&ksurf->front_fb.texture, NULL);
|
||||
|
||||
if (ksurf->back_fb.buffer_id)
|
||||
drmModeRmFB(ksurf->kdpy->fd, ksurf->back_fb.buffer_id);
|
||||
pipe_resource_reference(&ksurf->back_fb.texture, NULL);
|
||||
|
||||
resource_surface_destroy(ksurf->rsurf);
|
||||
FREE(ksurf);
|
||||
}
|
||||
|
||||
static struct kms_surface *
|
||||
kms_display_create_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_config *kconf = kms_config(nconf);
|
||||
struct kms_surface *ksurf;
|
||||
|
||||
ksurf = CALLOC_STRUCT(kms_surface);
|
||||
if (!ksurf)
|
||||
return NULL;
|
||||
|
||||
ksurf->kdpy = kdpy;
|
||||
ksurf->color_format = kconf->base.color_format;
|
||||
ksurf->width = width;
|
||||
ksurf->height = height;
|
||||
|
||||
ksurf->rsurf = resource_surface_create(kdpy->base.screen,
|
||||
ksurf->color_format,
|
||||
PIPE_BIND_RENDER_TARGET |
|
||||
PIPE_BIND_SAMPLER_VIEW |
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT);
|
||||
if (!ksurf->rsurf) {
|
||||
FREE(ksurf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resource_surface_set_size(ksurf->rsurf, ksurf->width, ksurf->height);
|
||||
|
||||
ksurf->base.destroy = kms_surface_destroy;
|
||||
ksurf->base.swap_buffers = kms_surface_swap_buffers;
|
||||
ksurf->base.flush_frontbuffer = kms_surface_flush_frontbuffer;
|
||||
ksurf->base.validate = kms_surface_validate;
|
||||
ksurf->base.wait = kms_surface_wait;
|
||||
|
||||
return ksurf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Choose a CRTC that supports all given connectors.
|
||||
*/
|
||||
static uint32_t
|
||||
kms_display_choose_crtc(struct native_display *ndpy,
|
||||
uint32_t *connectors, int num_connectors)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < kdpy->resources->count_crtcs; idx++) {
|
||||
boolean found_crtc = TRUE;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < num_connectors; i++) {
|
||||
drmModeConnectorPtr connector;
|
||||
int encoder_idx = -1;
|
||||
|
||||
connector = drmModeGetConnector(kdpy->fd, connectors[i]);
|
||||
if (!connector) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* find an encoder the CRTC supports */
|
||||
for (j = 0; j < connector->count_encoders; j++) {
|
||||
drmModeEncoderPtr encoder =
|
||||
drmModeGetEncoder(kdpy->fd, connector->encoders[j]);
|
||||
if (encoder->possible_crtcs & (1 << idx)) {
|
||||
encoder_idx = j;
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
|
||||
drmModeFreeConnector(connector);
|
||||
if (encoder_idx < 0) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_crtc)
|
||||
break;
|
||||
}
|
||||
|
||||
if (idx >= kdpy->resources->count_crtcs) {
|
||||
_eglLog(_EGL_WARNING,
|
||||
"failed to find a CRTC that supports the given %d connectors",
|
||||
num_connectors);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return kdpy->resources->crtcs[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remember the original CRTC status and set the CRTC
|
||||
*/
|
||||
static boolean
|
||||
kms_display_set_crtc(struct native_display *ndpy, int crtc_idx,
|
||||
uint32_t buffer_id, uint32_t x, uint32_t y,
|
||||
uint32_t *connectors, int num_connectors,
|
||||
drmModeModeInfoPtr mode)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_crtc *kcrtc = &kdpy->saved_crtcs[crtc_idx];
|
||||
uint32_t crtc_id;
|
||||
int err;
|
||||
|
||||
if (kcrtc->crtc) {
|
||||
crtc_id = kcrtc->crtc->crtc_id;
|
||||
}
|
||||
else {
|
||||
int count = 0, i;
|
||||
|
||||
/*
|
||||
* Choose the CRTC once. It could be more dynamic, but let's keep it
|
||||
* simple for now.
|
||||
*/
|
||||
crtc_id = kms_display_choose_crtc(&kdpy->base,
|
||||
connectors, num_connectors);
|
||||
|
||||
/* save the original CRTC status */
|
||||
kcrtc->crtc = drmModeGetCrtc(kdpy->fd, crtc_id);
|
||||
if (!kcrtc->crtc)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < kdpy->num_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
drmModeConnectorPtr connector = kconn->connector;
|
||||
drmModeEncoderPtr encoder;
|
||||
|
||||
encoder = drmModeGetEncoder(kdpy->fd, connector->encoder_id);
|
||||
if (encoder) {
|
||||
if (encoder->crtc_id == crtc_id) {
|
||||
kcrtc->connectors[count++] = connector->connector_id;
|
||||
if (count >= Elements(kcrtc->connectors))
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
kcrtc->num_connectors = count;
|
||||
}
|
||||
|
||||
err = drmModeSetCrtc(kdpy->fd, crtc_id, buffer_id, x, y,
|
||||
connectors, num_connectors, mode);
|
||||
if (err) {
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
kcrtc->crtc = NULL;
|
||||
kcrtc->num_connectors = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_display_program(struct native_display *ndpy, int crtc_idx,
|
||||
struct native_surface *nsurf, uint x, uint y,
|
||||
const struct native_connector **nconns, int num_nconns,
|
||||
const struct native_mode *nmode)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
const struct kms_mode *kmode = kms_mode(nmode);
|
||||
uint32_t connector_ids[32];
|
||||
uint32_t buffer_id;
|
||||
drmModeModeInfo mode_tmp, *mode;
|
||||
int i;
|
||||
|
||||
if (num_nconns > Elements(connector_ids)) {
|
||||
_eglLog(_EGL_WARNING, "too many connectors (%d)", num_nconns);
|
||||
num_nconns = Elements(connector_ids);
|
||||
}
|
||||
|
||||
if (ksurf) {
|
||||
if (!kms_surface_init_framebuffers(&ksurf->base, FALSE))
|
||||
return FALSE;
|
||||
|
||||
buffer_id = ksurf->front_fb.buffer_id;
|
||||
/* the mode argument of drmModeSetCrtc is not constified */
|
||||
mode_tmp = kmode->mode;
|
||||
mode = &mode_tmp;
|
||||
}
|
||||
else {
|
||||
/* disable the CRTC */
|
||||
buffer_id = 0;
|
||||
mode = NULL;
|
||||
num_nconns = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_nconns; i++) {
|
||||
struct kms_connector *kconn = kms_connector(nconns[i]);
|
||||
connector_ids[i] = kconn->connector->connector_id;
|
||||
}
|
||||
|
||||
if (!kms_display_set_crtc(&kdpy->base, crtc_idx, buffer_id, x, y,
|
||||
connector_ids, num_nconns, mode)) {
|
||||
_eglLog(_EGL_WARNING, "failed to set CRTC %d", crtc_idx);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (kdpy->shown_surfaces[crtc_idx])
|
||||
kdpy->shown_surfaces[crtc_idx]->is_shown = FALSE;
|
||||
kdpy->shown_surfaces[crtc_idx] = ksurf;
|
||||
|
||||
/* remember the settings for buffer swapping */
|
||||
if (ksurf) {
|
||||
uint32_t crtc_id = kdpy->saved_crtcs[crtc_idx].crtc->crtc_id;
|
||||
struct kms_crtc *kcrtc = &ksurf->current_crtc;
|
||||
|
||||
if (kcrtc->crtc)
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
kcrtc->crtc = drmModeGetCrtc(kdpy->fd, crtc_id);
|
||||
|
||||
assert(num_nconns < Elements(kcrtc->connectors));
|
||||
memcpy(kcrtc->connectors, connector_ids,
|
||||
sizeof(*connector_ids) * num_nconns);
|
||||
kcrtc->num_connectors = num_nconns;
|
||||
|
||||
ksurf->is_shown = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const struct native_mode **
|
||||
kms_display_get_modes(struct native_display *ndpy,
|
||||
const struct native_connector *nconn,
|
||||
int *num_modes)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_connector *kconn = kms_connector(nconn);
|
||||
const struct native_mode **nmodes_return;
|
||||
int count, i;
|
||||
|
||||
/* delete old data */
|
||||
if (kconn->connector) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
FREE(kconn->kms_modes);
|
||||
|
||||
kconn->connector = NULL;
|
||||
kconn->kms_modes = NULL;
|
||||
kconn->num_modes = 0;
|
||||
}
|
||||
|
||||
/* detect again */
|
||||
kconn->connector = drmModeGetConnector(kdpy->fd, kconn->connector_id);
|
||||
if (!kconn->connector)
|
||||
return NULL;
|
||||
|
||||
count = kconn->connector->count_modes;
|
||||
kconn->kms_modes = CALLOC(count, sizeof(*kconn->kms_modes));
|
||||
if (!kconn->kms_modes) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
kconn->connector = NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct kms_mode *kmode = &kconn->kms_modes[i];
|
||||
drmModeModeInfoPtr mode = &kconn->connector->modes[i];
|
||||
|
||||
kmode->mode = *mode;
|
||||
|
||||
kmode->base.desc = kmode->mode.name;
|
||||
kmode->base.width = kmode->mode.hdisplay;
|
||||
kmode->base.height = kmode->mode.vdisplay;
|
||||
kmode->base.refresh_rate = kmode->mode.vrefresh;
|
||||
/* not all kernels have vrefresh = refresh_rate * 1000 */
|
||||
if (kmode->base.refresh_rate > 1000)
|
||||
kmode->base.refresh_rate = (kmode->base.refresh_rate + 500) / 1000;
|
||||
}
|
||||
|
||||
nmodes_return = MALLOC(count * sizeof(*nmodes_return));
|
||||
if (nmodes_return) {
|
||||
for (i = 0; i < count; i++)
|
||||
nmodes_return[i] = &kconn->kms_modes[i].base;
|
||||
if (num_modes)
|
||||
*num_modes = count;
|
||||
}
|
||||
|
||||
return nmodes_return;
|
||||
}
|
||||
|
||||
static const struct native_connector **
|
||||
kms_display_get_connectors(struct native_display *ndpy, int *num_connectors,
|
||||
int *num_crtc)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
const struct native_connector **connectors;
|
||||
int i;
|
||||
|
||||
if (!kdpy->connectors) {
|
||||
kdpy->connectors =
|
||||
CALLOC(kdpy->resources->count_connectors, sizeof(*kdpy->connectors));
|
||||
if (!kdpy->connectors)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < kdpy->resources->count_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
|
||||
kconn->connector_id = kdpy->resources->connectors[i];
|
||||
/* kconn->connector is allocated when the modes are asked */
|
||||
}
|
||||
|
||||
kdpy->num_connectors = kdpy->resources->count_connectors;
|
||||
}
|
||||
|
||||
connectors = MALLOC(kdpy->num_connectors * sizeof(*connectors));
|
||||
if (connectors) {
|
||||
for (i = 0; i < kdpy->num_connectors; i++)
|
||||
connectors[i] = &kdpy->connectors[i].base;
|
||||
if (num_connectors)
|
||||
*num_connectors = kdpy->num_connectors;
|
||||
}
|
||||
|
||||
if (num_crtc)
|
||||
*num_crtc = kdpy->resources->count_crtcs;
|
||||
|
||||
return connectors;
|
||||
}
|
||||
|
||||
static struct native_surface *
|
||||
kms_display_create_scanout_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct kms_surface *ksurf;
|
||||
|
||||
ksurf = kms_display_create_surface(ndpy, nconf, width, height);
|
||||
return &ksurf->base;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_display_is_format_supported(struct native_display *ndpy,
|
||||
enum pipe_format fmt, boolean is_color)
|
||||
{
|
||||
return ndpy->screen->is_format_supported(ndpy->screen,
|
||||
fmt, PIPE_TEXTURE_2D, 0,
|
||||
(is_color) ? PIPE_BIND_RENDER_TARGET :
|
||||
PIPE_BIND_DEPTH_STENCIL, 0);
|
||||
}
|
||||
|
||||
static const struct native_config **
|
||||
kms_display_get_configs(struct native_display *ndpy, int *num_configs)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
const struct native_config **configs;
|
||||
|
||||
/* first time */
|
||||
if (!kdpy->config) {
|
||||
struct native_config *nconf;
|
||||
enum pipe_format format;
|
||||
|
||||
kdpy->config = CALLOC(1, sizeof(*kdpy->config));
|
||||
if (!kdpy->config)
|
||||
return NULL;
|
||||
|
||||
nconf = &kdpy->config->base;
|
||||
|
||||
nconf->buffer_mask =
|
||||
(1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
|
||||
(1 << NATIVE_ATTACHMENT_BACK_LEFT);
|
||||
|
||||
format = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
if (!kms_display_is_format_supported(&kdpy->base, format, TRUE)) {
|
||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
||||
if (!kms_display_is_format_supported(&kdpy->base, format, TRUE))
|
||||
format = PIPE_FORMAT_NONE;
|
||||
}
|
||||
if (format == PIPE_FORMAT_NONE) {
|
||||
FREE(kdpy->config);
|
||||
kdpy->config = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nconf->color_format = format;
|
||||
|
||||
/* support KMS */
|
||||
if (kdpy->resources)
|
||||
nconf->scanout_bit = TRUE;
|
||||
}
|
||||
|
||||
configs = MALLOC(sizeof(*configs));
|
||||
if (configs) {
|
||||
configs[0] = &kdpy->config->base;
|
||||
if (num_configs)
|
||||
*num_configs = 1;
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
static int
|
||||
kms_display_get_param(struct native_display *ndpy,
|
||||
enum native_param_type param)
|
||||
{
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
kms_display_destroy(struct native_display *ndpy)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
int i;
|
||||
|
||||
if (kdpy->config)
|
||||
FREE(kdpy->config);
|
||||
|
||||
if (kdpy->connectors) {
|
||||
for (i = 0; i < kdpy->num_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
if (kconn->connector) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
FREE(kconn->kms_modes);
|
||||
}
|
||||
}
|
||||
FREE(kdpy->connectors);
|
||||
}
|
||||
|
||||
if (kdpy->shown_surfaces)
|
||||
FREE(kdpy->shown_surfaces);
|
||||
|
||||
if (kdpy->saved_crtcs) {
|
||||
for (i = 0; i < kdpy->resources->count_crtcs; i++) {
|
||||
struct kms_crtc *kcrtc = &kdpy->saved_crtcs[i];
|
||||
|
||||
if (kcrtc->crtc) {
|
||||
/* restore crtc */
|
||||
drmModeSetCrtc(kdpy->fd, kcrtc->crtc->crtc_id,
|
||||
kcrtc->crtc->buffer_id, kcrtc->crtc->x, kcrtc->crtc->y,
|
||||
kcrtc->connectors, kcrtc->num_connectors,
|
||||
&kcrtc->crtc->mode);
|
||||
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
}
|
||||
}
|
||||
FREE(kdpy->saved_crtcs);
|
||||
}
|
||||
|
||||
if (kdpy->resources)
|
||||
drmModeFreeResources(kdpy->resources);
|
||||
|
||||
if (kdpy->base.screen)
|
||||
kdpy->base.screen->destroy(kdpy->base.screen);
|
||||
|
||||
if (kdpy->fd >= 0)
|
||||
close(kdpy->fd);
|
||||
|
||||
FREE(kdpy);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_drm_screen_name(int fd, drmVersionPtr version)
|
||||
{
|
||||
const char *name = version->name;
|
||||
|
||||
if (name && !strcmp(name, "radeon")) {
|
||||
int chip_id;
|
||||
struct drm_radeon_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.request = RADEON_INFO_DEVICE_ID;
|
||||
info.value = pointer_to_intptr(&chip_id);
|
||||
if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
|
||||
return NULL;
|
||||
|
||||
name = is_r3xx(chip_id) ? "r300" : "r600";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize KMS and pipe screen.
|
||||
*/
|
||||
static boolean
|
||||
kms_display_init_screen(struct native_display *ndpy)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
drmVersionPtr version;
|
||||
const char *name;
|
||||
|
||||
version = drmGetVersion(kdpy->fd);
|
||||
if (!version) {
|
||||
_eglLog(_EGL_WARNING, "invalid fd %d", kdpy->fd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name = get_drm_screen_name(kdpy->fd, version);
|
||||
if (name) {
|
||||
kdpy->base.screen =
|
||||
kdpy->event_handler->new_drm_screen(&kdpy->base, name, kdpy->fd);
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
|
||||
if (!kdpy->base.screen) {
|
||||
_eglLog(_EGL_WARNING, "failed to create DRM screen");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static struct native_display_modeset kms_display_modeset = {
|
||||
.get_connectors = kms_display_get_connectors,
|
||||
.get_modes = kms_display_get_modes,
|
||||
.create_scanout_surface = kms_display_create_scanout_surface,
|
||||
.program = kms_display_program
|
||||
};
|
||||
|
||||
static struct native_display *
|
||||
kms_create_display(int fd, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
struct kms_display *kdpy;
|
||||
|
||||
kdpy = CALLOC_STRUCT(kms_display);
|
||||
if (!kdpy)
|
||||
return NULL;
|
||||
|
||||
kdpy->fd = fd;
|
||||
kdpy->event_handler = event_handler;
|
||||
kdpy->base.user_data = user_data;
|
||||
|
||||
if (!kms_display_init_screen(&kdpy->base)) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->base.destroy = kms_display_destroy;
|
||||
kdpy->base.get_param = kms_display_get_param;
|
||||
kdpy->base.get_configs = kms_display_get_configs;
|
||||
|
||||
/* resources are fixed, unlike crtc, connector, or encoder */
|
||||
kdpy->resources = drmModeGetResources(kdpy->fd);
|
||||
if (kdpy->resources) {
|
||||
kdpy->saved_crtcs =
|
||||
CALLOC(kdpy->resources->count_crtcs, sizeof(*kdpy->saved_crtcs));
|
||||
if (!kdpy->saved_crtcs) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->shown_surfaces =
|
||||
CALLOC(kdpy->resources->count_crtcs, sizeof(*kdpy->shown_surfaces));
|
||||
if (!kdpy->shown_surfaces) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->base.modeset = &kms_display_modeset;
|
||||
}
|
||||
else {
|
||||
_eglLog(_EGL_DEBUG, "Failed to get KMS resources. Disable modeset.");
|
||||
}
|
||||
|
||||
return &kdpy->base;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
native_create_display(void *dpy, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (dpy) {
|
||||
fd = dup((int) pointer_to_intptr(dpy));
|
||||
}
|
||||
else {
|
||||
fd = open("/dev/dri/card0", O_RDWR);
|
||||
}
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return kms_create_display(fd, event_handler, user_data);
|
||||
}
|
||||
|
||||
static const struct native_platform kms_platform = {
|
||||
"KMS", /* name */
|
||||
native_create_display
|
||||
};
|
||||
|
||||
const struct native_platform *
|
||||
native_get_kms_platform(void)
|
||||
{
|
||||
return &kms_platform;
|
||||
}
|
@@ -27,6 +27,7 @@
|
||||
#define _NATIVE_X11_H_
|
||||
|
||||
#include "common/native.h"
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
struct native_display *
|
||||
x11_create_ximage_display(Display *dpy,
|
||||
|
@@ -1086,20 +1086,30 @@ XMesaDestroyBuffer(XMesaBuffer b)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Notify the binding context to validate the buffer.
|
||||
*/
|
||||
void
|
||||
xmesa_notify_invalid_buffer(XMesaBuffer b)
|
||||
{
|
||||
XMesaContext xmctx = XMesaGetCurrentContext();
|
||||
|
||||
if (xmctx && xmctx->xm_buffer == b)
|
||||
xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Query the current drawable size and notify the binding context.
|
||||
*/
|
||||
void
|
||||
xmesa_check_buffer_size(XMesaBuffer b)
|
||||
{
|
||||
XMesaContext xmctx = XMesaGetCurrentContext();
|
||||
|
||||
if (b->type == PBUFFER)
|
||||
return;
|
||||
|
||||
xmesa_get_window_size(b->xm_visual->display, b, &b->width, &b->height);
|
||||
if (xmctx && xmctx->xm_buffer == b)
|
||||
xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
|
||||
xmesa_notify_invalid_buffer(b);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -360,6 +360,9 @@ extern void
|
||||
xmesa_get_window_size(Display *dpy, XMesaBuffer b,
|
||||
GLuint *width, GLuint *height);
|
||||
|
||||
extern void
|
||||
xmesa_notify_invalid_buffer(XMesaBuffer b);
|
||||
|
||||
extern void
|
||||
xmesa_check_buffer_size(XMesaBuffer b);
|
||||
|
||||
|
@@ -339,6 +339,10 @@ xmesa_swap_st_framebuffer(struct st_framebuffer_iface *stfbi)
|
||||
tmp = *front;
|
||||
*front = *back;
|
||||
*back = tmp;
|
||||
|
||||
/* the current context should validate the buffer after swapping */
|
||||
if (!xmesa_strict_invalidate)
|
||||
xmesa_notify_invalid_buffer(xstfb->buffer);
|
||||
}
|
||||
|
||||
if (xmesa_strict_invalidate)
|
||||
|
@@ -73,7 +73,8 @@ void vegaFinish(void)
|
||||
pipe = ctx->pipe;
|
||||
|
||||
pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
if (fence) {
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
}
|
||||
}
|
||||
|
@@ -352,7 +352,7 @@ vg_api_create_context(struct st_api *stapi, struct st_manager *smapi,
|
||||
return NULL;
|
||||
|
||||
/* only 1.0 is supported */
|
||||
if (attribs->major != 1 || attribs->minor > 0)
|
||||
if (attribs->major > 1 || (attribs->major == 1 && attribs->minor > 0))
|
||||
return NULL;
|
||||
|
||||
pipe = smapi->screen->context_create(smapi->screen, NULL);
|
||||
|
@@ -10,7 +10,7 @@ LIBRARY_INCLUDES = \
|
||||
$(shell pkg-config libkms --atleast-version=1.0 \
|
||||
&& echo "-DHAVE_LIBKMS") \
|
||||
$(shell pkg-config libkms --silence-errors --cflags-only-I) \
|
||||
$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \
|
||||
$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto dri2proto) \
|
||||
-I$(TOP)/src/gallium/include \
|
||||
-I$(TOP)/src/gallium/auxiliary \
|
||||
-I$(TOP)/include \
|
||||
|
@@ -234,6 +234,10 @@ crtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image)
|
||||
64, 64, (void*)image, 64 * 4, 0, 0);
|
||||
ms->ctx->transfer_unmap(ms->ctx, transfer);
|
||||
ms->ctx->transfer_destroy(ms->ctx, transfer);
|
||||
|
||||
if (crtc->cursor_shown)
|
||||
drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
|
||||
crtcp->cursor_handle, 64, 64);
|
||||
}
|
||||
|
||||
#if HAVE_LIBKMS
|
||||
@@ -271,6 +275,10 @@ crtc_load_cursor_argb_kms(xf86CrtcPtr crtc, CARD32 * image)
|
||||
memcpy(ptr, image, 64*64*4);
|
||||
kms_bo_unmap(crtcp->cursor_bo);
|
||||
|
||||
if (crtc->cursor_shown)
|
||||
drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
|
||||
crtcp->cursor_handle, 64, 64);
|
||||
|
||||
return;
|
||||
|
||||
err_bo_destroy:
|
||||
@@ -353,7 +361,7 @@ crtc_destroy(xf86CrtcPtr crtc)
|
||||
|
||||
drmModeFreeCrtc(crtcp->drm_crtc);
|
||||
|
||||
xfree(crtcp);
|
||||
free(crtcp);
|
||||
crtc->driver_private = NULL;
|
||||
}
|
||||
|
||||
@@ -401,7 +409,7 @@ xorg_crtc_init(ScrnInfoPtr pScrn)
|
||||
if (crtc == NULL)
|
||||
goto out;
|
||||
|
||||
crtcp = xcalloc(1, sizeof(struct crtc_private));
|
||||
crtcp = calloc(1, sizeof(struct crtc_private));
|
||||
if (!crtcp) {
|
||||
xf86CrtcDestroy(crtc);
|
||||
goto out;
|
||||
|
@@ -201,11 +201,11 @@ dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, unsigned int form
|
||||
DRI2Buffer2Ptr buffer;
|
||||
BufferPrivatePtr private;
|
||||
|
||||
buffer = xcalloc(1, sizeof *buffer);
|
||||
buffer = calloc(1, sizeof *buffer);
|
||||
if (!buffer)
|
||||
return NULL;
|
||||
|
||||
private = xcalloc(1, sizeof *private);
|
||||
private = calloc(1, sizeof *private);
|
||||
if (!private) {
|
||||
goto fail;
|
||||
}
|
||||
@@ -217,9 +217,9 @@ dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, unsigned int form
|
||||
if (dri2_do_create_buffer(pDraw, (DRI2BufferPtr)buffer, format))
|
||||
return buffer;
|
||||
|
||||
xfree(private);
|
||||
free(private);
|
||||
fail:
|
||||
xfree(buffer);
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -229,8 +229,8 @@ dri2_destroy_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer)
|
||||
/* So far it is safe to downcast a DRI2Buffer2Ptr to DRI2BufferPtr */
|
||||
dri2_do_destroy_buffer(pDraw, (DRI2BufferPtr)buffer);
|
||||
|
||||
xfree(buffer->driverPrivate);
|
||||
xfree(buffer);
|
||||
free(buffer->driverPrivate);
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
#endif /* DRI2INFOREC_VERSION >= 2 */
|
||||
@@ -244,11 +244,11 @@ dri2_create_buffers(DrawablePtr pDraw, unsigned int *attachments, int count)
|
||||
DRI2BufferPtr buffers;
|
||||
int i;
|
||||
|
||||
buffers = xcalloc(count, sizeof *buffers);
|
||||
buffers = calloc(count, sizeof *buffers);
|
||||
if (!buffers)
|
||||
goto fail_buffers;
|
||||
|
||||
privates = xcalloc(count, sizeof *privates);
|
||||
privates = calloc(count, sizeof *privates);
|
||||
if (!privates)
|
||||
goto fail_privates;
|
||||
|
||||
@@ -263,9 +263,9 @@ dri2_create_buffers(DrawablePtr pDraw, unsigned int *attachments, int count)
|
||||
return buffers;
|
||||
|
||||
fail:
|
||||
xfree(privates);
|
||||
free(privates);
|
||||
fail_privates:
|
||||
xfree(buffers);
|
||||
free(buffers);
|
||||
fail_buffers:
|
||||
return NULL;
|
||||
}
|
||||
@@ -280,8 +280,8 @@ dri2_destroy_buffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
|
||||
}
|
||||
|
||||
if (buffers) {
|
||||
xfree(buffers[0].driverPrivate);
|
||||
xfree(buffers);
|
||||
free(buffers[0].driverPrivate);
|
||||
free(buffers);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -45,6 +45,7 @@
|
||||
#include "miscstruct.h"
|
||||
#include "dixstruct.h"
|
||||
#include "xf86xv.h"
|
||||
#include "xorgVersion.h"
|
||||
#ifndef XSERVER_LIBPCIACCESS
|
||||
#error "libpciaccess needed"
|
||||
#endif
|
||||
@@ -122,7 +123,7 @@ xorg_tracker_set_functions(ScrnInfoPtr scrn)
|
||||
Bool
|
||||
xorg_tracker_have_modesetting(ScrnInfoPtr pScrn, struct pci_device *device)
|
||||
{
|
||||
char *BusID = xalloc(64);
|
||||
char *BusID = malloc(64);
|
||||
sprintf(BusID, "pci:%04x:%02x:%02x.%d",
|
||||
device->domain, device->bus,
|
||||
device->dev, device->func);
|
||||
@@ -130,14 +131,14 @@ xorg_tracker_have_modesetting(ScrnInfoPtr pScrn, struct pci_device *device)
|
||||
if (drmCheckModesettingSupported(BusID)) {
|
||||
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
|
||||
"Drm modesetting not supported %s\n", BusID);
|
||||
xfree(BusID);
|
||||
free(BusID);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
|
||||
"Drm modesetting supported on %s\n", BusID);
|
||||
|
||||
xfree(BusID);
|
||||
free(BusID);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -174,7 +175,7 @@ drv_free_rec(ScrnInfoPtr pScrn)
|
||||
if (!pScrn->driverPrivate)
|
||||
return;
|
||||
|
||||
xfree(pScrn->driverPrivate);
|
||||
free(pScrn->driverPrivate);
|
||||
|
||||
pScrn->driverPrivate = NULL;
|
||||
}
|
||||
@@ -274,7 +275,7 @@ drv_init_drm(ScrnInfoPtr pScrn)
|
||||
if (ms->fd < 0) {
|
||||
char *BusID;
|
||||
|
||||
BusID = xalloc(64);
|
||||
BusID = malloc(64);
|
||||
sprintf(BusID, "PCI:%d:%d:%d",
|
||||
((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
|
||||
ms->PciInfo->dev, ms->PciInfo->func
|
||||
@@ -283,7 +284,7 @@ drv_init_drm(ScrnInfoPtr pScrn)
|
||||
|
||||
ms->fd = drmOpen(driver_descriptor.driver_name, BusID);
|
||||
ms->isMaster = TRUE;
|
||||
xfree(BusID);
|
||||
free(BusID);
|
||||
|
||||
if (ms->fd >= 0)
|
||||
return TRUE;
|
||||
@@ -369,6 +370,7 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
|
||||
ms = modesettingPTR(pScrn);
|
||||
ms->pEnt = pEnt;
|
||||
ms->cust = cust;
|
||||
ms->fb_id = -1;
|
||||
|
||||
pScrn->displayWidth = 640; /* default it */
|
||||
|
||||
@@ -402,19 +404,6 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
|
||||
if (!drv_init_drm(pScrn))
|
||||
return FALSE;
|
||||
|
||||
use3D = cust ? !cust->no_3d : TRUE;
|
||||
ms->from_3D = xf86GetOptValBool(ms->Options, OPTION_3D_ACCEL,
|
||||
&use3D) ?
|
||||
X_CONFIG : X_PROBED;
|
||||
|
||||
ms->no3D = !use3D;
|
||||
|
||||
if (!drv_init_resource_management(pScrn)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not init "
|
||||
"Gallium3D or libKMS.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pScrn->monitor = pScrn->confScreen->monitor;
|
||||
pScrn->progClock = TRUE;
|
||||
pScrn->rgbBits = 8;
|
||||
@@ -444,11 +433,24 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
|
||||
|
||||
/* Process the options */
|
||||
xf86CollectOptions(pScrn, NULL);
|
||||
if (!(ms->Options = xalloc(sizeof(drv_options))))
|
||||
if (!(ms->Options = malloc(sizeof(drv_options))))
|
||||
return FALSE;
|
||||
memcpy(ms->Options, drv_options, sizeof(drv_options));
|
||||
xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, ms->Options);
|
||||
|
||||
use3D = cust ? !cust->no_3d : TRUE;
|
||||
ms->from_3D = xf86GetOptValBool(ms->Options, OPTION_3D_ACCEL,
|
||||
&use3D) ?
|
||||
X_CONFIG : X_PROBED;
|
||||
|
||||
ms->no3D = !use3D;
|
||||
|
||||
if (!drv_init_resource_management(pScrn)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not init "
|
||||
"Gallium3D or libKMS.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Allocate an xf86CrtcConfig */
|
||||
xf86CrtcConfigInit(pScrn, &crtc_config_funcs);
|
||||
xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
@@ -791,7 +793,9 @@ drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
|
||||
if (!ms->SWCursor)
|
||||
xf86_cursors_init(pScreen, 64, 64,
|
||||
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
|
||||
HARDWARE_CURSOR_ARGB);
|
||||
HARDWARE_CURSOR_ARGB |
|
||||
((cust && cust->unhidden_hw_cursor_update) ?
|
||||
HARDWARE_CURSOR_UPDATE_UNHIDDEN : 0));
|
||||
|
||||
/* Must force it before EnterVT, so we are in control of VT and
|
||||
* later memory should be bound when allocating, e.g rotate_mem */
|
||||
@@ -862,8 +866,10 @@ drv_leave_vt(int scrnIndex, int flags)
|
||||
}
|
||||
}
|
||||
|
||||
drmModeRmFB(ms->fd, ms->fb_id);
|
||||
ms->fb_id = -1;
|
||||
if (ms->fb_id != -1) {
|
||||
drmModeRmFB(ms->fd, ms->fb_id);
|
||||
ms->fb_id = -1;
|
||||
}
|
||||
|
||||
/* idle hardware */
|
||||
if (!ms->kms)
|
||||
@@ -944,7 +950,6 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen)
|
||||
}
|
||||
#endif
|
||||
|
||||
drmModeRmFB(ms->fd, ms->fb_id);
|
||||
ms->destroy_front_buffer(pScrn);
|
||||
|
||||
if (ms->exa)
|
||||
@@ -1178,6 +1183,8 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
|
||||
stride,
|
||||
ptr);
|
||||
|
||||
#if (XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 9, 99, 1, 0))
|
||||
|
||||
/* This a hack to work around EnableDisableFBAccess setting the pointer
|
||||
* the real fix would be to replace pScrn->EnableDisableFBAccess hook
|
||||
* and set the rootPixmap->devPrivate.ptr to something valid before that.
|
||||
@@ -1187,6 +1194,8 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
|
||||
*/
|
||||
pScrn->pixmapPrivate.ptr = ptr;
|
||||
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
|
||||
err_destroy:
|
||||
|
@@ -720,7 +720,7 @@ ExaCreatePixmap(ScreenPtr pScreen, int size, int align)
|
||||
{
|
||||
struct exa_pixmap_priv *priv;
|
||||
|
||||
priv = xcalloc(1, sizeof(struct exa_pixmap_priv));
|
||||
priv = calloc(1, sizeof(struct exa_pixmap_priv));
|
||||
if (!priv)
|
||||
return NULL;
|
||||
|
||||
@@ -737,7 +737,7 @@ ExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
|
||||
|
||||
pipe_resource_reference(&priv->tex, NULL);
|
||||
|
||||
xfree(priv);
|
||||
free(priv);
|
||||
}
|
||||
|
||||
static Bool
|
||||
@@ -975,7 +975,7 @@ xorg_exa_close(ScrnInfoPtr pScrn)
|
||||
ms->ctx = NULL;
|
||||
|
||||
exaDriverFini(pScrn->pScreen);
|
||||
xfree(exa);
|
||||
free(exa);
|
||||
ms->exa = NULL;
|
||||
}
|
||||
|
||||
@@ -987,7 +987,7 @@ xorg_exa_init(ScrnInfoPtr pScrn, Bool accel)
|
||||
ExaDriverPtr pExa;
|
||||
CustomizerPtr cust = ms->cust;
|
||||
|
||||
exa = xcalloc(1, sizeof(struct exa_context));
|
||||
exa = calloc(1, sizeof(struct exa_context));
|
||||
if (!exa)
|
||||
return NULL;
|
||||
|
||||
|
@@ -128,7 +128,7 @@ output_get_modes(xf86OutputPtr output)
|
||||
for (i = 0; i < drm_connector->count_modes; i++) {
|
||||
drm_mode = &drm_connector->modes[i];
|
||||
if (drm_mode) {
|
||||
mode = xcalloc(1, sizeof(DisplayModeRec));
|
||||
mode = calloc(1, sizeof(DisplayModeRec));
|
||||
if (!mode)
|
||||
continue;
|
||||
mode->Clock = drm_mode->clock;
|
||||
@@ -195,7 +195,7 @@ output_destroy(xf86OutputPtr output)
|
||||
{
|
||||
struct output_private *priv = output->driver_private;
|
||||
drmModeFreeConnector(priv->drm_connector);
|
||||
xfree(priv);
|
||||
free(priv);
|
||||
output->driver_private = NULL;
|
||||
}
|
||||
|
||||
@@ -262,14 +262,14 @@ xorg_output_init(ScrnInfoPtr pScrn)
|
||||
drm_connector->connector_type_id);
|
||||
|
||||
|
||||
priv = xcalloc(sizeof(*priv), 1);
|
||||
priv = calloc(sizeof(*priv), 1);
|
||||
if (!priv) {
|
||||
continue;
|
||||
}
|
||||
|
||||
output = xf86OutputCreate(pScrn, &output_funcs, name);
|
||||
if (!output) {
|
||||
xfree(priv);
|
||||
free(priv);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@@ -76,6 +76,7 @@ typedef struct _CustomizerRec
|
||||
Bool dirty_throttling;
|
||||
Bool swap_throttling;
|
||||
Bool no_3d;
|
||||
Bool unhidden_hw_cursor_update;
|
||||
Bool (*winsys_pre_init) (struct _CustomizerRec *cust, int fd);
|
||||
Bool (*winsys_screen_init)(struct _CustomizerRec *cust);
|
||||
Bool (*winsys_screen_close)(struct _CustomizerRec *cust);
|
||||
|
@@ -536,8 +536,10 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id,
|
||||
dst_surf = xorg_gpu_surface(pPriv->r->pipe->screen, dst);
|
||||
hdtv = ((src_w >= RES_720P_X) && (src_h >= RES_720P_Y));
|
||||
|
||||
#ifdef COMPOSITE
|
||||
REGION_TRANSLATE(pScrn->pScreen, dstRegion, -pPixmap->screen_x,
|
||||
-pPixmap->screen_y);
|
||||
#endif
|
||||
|
||||
dxo = dstRegion->extents.x1;
|
||||
dyo = dstRegion->extents.y1;
|
||||
@@ -562,11 +564,16 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id,
|
||||
int box_y2 = pbox->y2;
|
||||
float diff_x = (float)src_w / (float)dst_w;
|
||||
float diff_y = (float)src_h / (float)dst_h;
|
||||
float offset_x = box_x1 - dstX + pPixmap->screen_x;
|
||||
float offset_y = box_y1 - dstY + pPixmap->screen_y;
|
||||
float offset_x = box_x1 - dstX;
|
||||
float offset_y = box_y1 - dstY;
|
||||
float offset_w;
|
||||
float offset_h;
|
||||
|
||||
#ifdef COMPOSITE
|
||||
offset_x += pPixmap->screen_x;
|
||||
offset_y += pPixmap->screen_y;
|
||||
#endif
|
||||
|
||||
x = box_x1;
|
||||
y = box_y1;
|
||||
w = box_x2 - box_x1;
|
||||
|
@@ -80,7 +80,7 @@ $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) Makefile \
|
||||
$(OBJECTS) $(PIPE_DRIVERS) \
|
||||
-Wl,--start-group $(MESA_MODULES) -Wl,--end-group \
|
||||
$(DRI_LIB_DEPS) $(DRIVER_EXTRAS)
|
||||
$(CXX) $(CFLAGS) -o $@.test $(TOP)/src/mesa/drivers/dri/common/dri_test.o $@.tmp $(DRI_LIB_DEPS);
|
||||
$(CXX) $(CFLAGS) -o $@.test $(TOP)/src/mesa/drivers/dri/common/dri_test.o $@.tmp $(DRI_LIB_DEPS) $(LDFLAGS);
|
||||
@rm -f $@.test
|
||||
mv -f $@.tmp $@
|
||||
|
||||
|
@@ -29,7 +29,7 @@ INCLUDES = \
|
||||
LIBNAME_STAGING = $(TOP)/$(LIB_DIR)/gallium/$(TARGET)
|
||||
|
||||
ifeq ($(MESA_LLVM),1)
|
||||
LD = g++
|
||||
LD = $(CXX)
|
||||
LDFLAGS += $(LLVM_LDFLAGS)
|
||||
USE_CXX=1
|
||||
DRIVER_PIPES += $(TOP)/src/gallium/drivers/llvmpipe/libllvmpipe.a
|
||||
@@ -42,7 +42,7 @@ endif
|
||||
default: depend $(TOP)/$(LIB_DIR)/gallium $(LIBNAME) $(LIBNAME_STAGING)
|
||||
|
||||
$(LIBNAME): $(OBJECTS) Makefile ../Makefile.xorg $(LIBS) $(DRIVER_PIPES)
|
||||
$(MKLIB) -noprefix -o $@ $(LDFLAGS) $(OBJECTS) $(DRIVER_PIPES) $(GALLIUM_AUXILIARIES) $(DRIVER_LINKS)
|
||||
$(MKLIB) -linker $(CC) -noprefix -o $@ $(LDFLAGS) $(OBJECTS) $(DRIVER_PIPES) $(GALLIUM_AUXILIARIES) $(DRIVER_LINKS)
|
||||
|
||||
depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(SYMLINKS) $(GENERATED_SOURCES)
|
||||
rm -f depend
|
||||
|
@@ -69,6 +69,7 @@ COMMON_DRI_DRM_OBJECTS = [
|
||||
|
||||
drienv.AppendUnique(LIBS = [
|
||||
'expat',
|
||||
'talloc',
|
||||
])
|
||||
|
||||
Export([
|
||||
|
@@ -11,6 +11,7 @@ env.ParseConfig('pkg-config --cflags --libs libdrm_intel')
|
||||
env.Append(CPPDEFINES = ['GALLIUM_RBUG', 'GALLIUM_TRACE', 'GALLIUM_GALAHAD'])
|
||||
|
||||
env.Prepend(LIBS = [
|
||||
ws_wrapper,
|
||||
st_dri,
|
||||
i915drm,
|
||||
i915,
|
||||
|
@@ -12,6 +12,7 @@ PIPE_DRIVERS = \
|
||||
|
||||
C_SOURCES = \
|
||||
target.c \
|
||||
vmw_powf.c \
|
||||
$(COMMON_GALLIUM_SOURCES)
|
||||
|
||||
DRIVER_DEFINES = \
|
||||
|
17
src/gallium/targets/dri-vmwgfx/vmw_powf.c
Normal file
17
src/gallium/targets/dri-vmwgfx/vmw_powf.c
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Powf may leave an unresolved symbol pointing to a libstdc++.so powf.
|
||||
* However, not all libstdc++.so include this function, so optionally
|
||||
* replace the powf function with calls to expf and logf.
|
||||
*/
|
||||
|
||||
#ifdef VMW_RESOLVE_POWF
|
||||
|
||||
extern float expf(float x);
|
||||
extern float logf(float x);
|
||||
extern float powf(float x, float y);
|
||||
|
||||
float powf(float x, float y) {
|
||||
return expf(logf(x)*y);
|
||||
}
|
||||
|
||||
#endif
|
@@ -24,7 +24,9 @@ common_CPPFLAGS := \
|
||||
-I$(TOP)/src/gallium/auxiliary \
|
||||
-I$(TOP)/src/gallium/drivers \
|
||||
-I$(TOP)/src/gallium/include \
|
||||
-I$(TOP)/src/gallium/winsys
|
||||
-I$(TOP)/src/gallium/winsys \
|
||||
$(LIBDRM_CFLAGS)
|
||||
|
||||
common_SYS :=
|
||||
common_LIBS := \
|
||||
$(TOP)/src/gallium/drivers/identity/libidentity.a \
|
||||
@@ -41,11 +43,11 @@ egl_SYS := -lm $(DLOPEN_LIBS) -L$(TOP)/$(LIB_DIR) -lEGL
|
||||
egl_LIBS := $(TOP)/src/gallium/state_trackers/egl/libegl.a
|
||||
|
||||
ifneq ($(findstring x11, $(EGL_PLATFORMS)),)
|
||||
egl_SYS += -lX11 -lXext -lXfixes
|
||||
egl_SYS += -lX11 -lXext -lXfixes $(LIBDRM_LIB)
|
||||
egl_LIBS += $(TOP)/src/gallium/winsys/sw/xlib/libws_xlib.a
|
||||
endif
|
||||
ifneq ($(findstring kms, $(EGL_PLATFORMS)),)
|
||||
egl_SYS += -ldrm
|
||||
ifneq ($(findstring drm, $(EGL_PLATFORMS)),)
|
||||
egl_SYS += $(LIBDRM_LIB)
|
||||
endif
|
||||
ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),)
|
||||
egl_LIBS += $(TOP)/src/gallium/winsys/sw/fbdev/libfbdev.a
|
||||
@@ -185,6 +187,13 @@ $(MKLIB) -o $(notdir $@) -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \
|
||||
$(common_SYS) $($(1)_SYS)
|
||||
endef
|
||||
|
||||
define mklib-cxx
|
||||
$(MKLIB) -o $(notdir $@) -noprefix -linker '$(CXX)' -ldflags '$(LDFLAGS)' \
|
||||
-cplusplus -install $(OUTPUT_PATH) $(MKLIB_OPTIONS) $< \
|
||||
-Wl,--start-group $(common_LIBS) $($(1)_LIBS) -Wl,--end-group \
|
||||
$(common_SYS) $($(1)_SYS)
|
||||
endef
|
||||
|
||||
# EGL driver
|
||||
$(OUTPUT_PATH)/egl_gallium.so: egl.o $(egl_LIBS)
|
||||
$(call mklib,egl)
|
||||
@@ -213,13 +222,13 @@ $(OUTPUT_PATH)/$(PIPE_PREFIX)swrast.so: pipe_swrast.o $(swrast_LIBS)
|
||||
|
||||
# state trackers
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(GL_LIB).so: st_GL.o $(GL_LIBS)
|
||||
$(call mklib,GL)
|
||||
$(call mklib-cxx,GL)
|
||||
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(GLESv1_CM_LIB).so: st_GLESv1_CM.o $(GLESv1_CM_LIBS)
|
||||
$(call mklib,GLESv1_CM)
|
||||
$(call mklib-cxx,GLESv1_CM)
|
||||
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(GLESv2_LIB).so: st_GLESv2.o $(GLESv2_LIBS)
|
||||
$(call mklib,GLESv2)
|
||||
$(call mklib-cxx,GLESv2)
|
||||
|
||||
$(OUTPUT_PATH)/$(ST_PREFIX)$(VG_LIB).so: st_OpenVG.o $(OpenVG_LIBS)
|
||||
$(call mklib,OpenVG)
|
||||
|
@@ -1,6 +1,7 @@
|
||||
|
||||
#include "target-helpers/inline_wrapper_sw_helper.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "target-helpers/inline_wrapper_sw_helper.h"
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "i965/drm/i965_drm_public.h"
|
||||
#include "i965/brw_public.h"
|
||||
|
@@ -39,14 +39,6 @@
|
||||
#include "state_tracker/st_api.h"
|
||||
#include "state_tracker/st_gl_api.h"
|
||||
|
||||
/* piggy back on this libGL for OpenGL support in EGL */
|
||||
struct st_api *
|
||||
st_api_create_OpenGL()
|
||||
{
|
||||
return st_gl_api_create();
|
||||
}
|
||||
|
||||
|
||||
/* Helper function to choose and instantiate one of the software rasterizers:
|
||||
* cell, llvmpipe, softpipe.
|
||||
*
|
||||
|
@@ -32,6 +32,7 @@
|
||||
* allows X clients to communicate with the driver.
|
||||
*/
|
||||
|
||||
#include <xorg-server.h>
|
||||
#include "dixstruct.h"
|
||||
#include "extnsionst.h"
|
||||
#include <X11/X.h>
|
||||
@@ -211,7 +212,7 @@ VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
|
||||
struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn));
|
||||
int i;
|
||||
|
||||
rects = xcalloc(number, sizeof(*rects));
|
||||
rects = calloc(number, sizeof(*rects));
|
||||
if (!rects)
|
||||
return FALSE;
|
||||
|
||||
@@ -224,7 +225,7 @@ VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
|
||||
|
||||
vmw_ioctl_update_layout(vmw, number, rects);
|
||||
|
||||
xfree(rects);
|
||||
free(rects);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@@ -165,7 +165,7 @@ vmw_ioctl_buffer_create(struct vmw_customizer *vmw, uint32_t size, unsigned *han
|
||||
struct drm_vmw_dmabuf_rep *rep = &arg.rep;
|
||||
int ret;
|
||||
|
||||
buf = xcalloc(1, sizeof(*buf));
|
||||
buf = calloc(1, sizeof(*buf));
|
||||
if (!buf)
|
||||
goto err;
|
||||
|
||||
@@ -192,7 +192,7 @@ vmw_ioctl_buffer_create(struct vmw_customizer *vmw, uint32_t size, unsigned *han
|
||||
return buf;
|
||||
|
||||
err_free:
|
||||
xfree(buf);
|
||||
free(buf);
|
||||
err:
|
||||
return NULL;
|
||||
}
|
||||
@@ -211,7 +211,7 @@ vmw_ioctl_buffer_destroy(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf)
|
||||
arg.handle = buf->handle;
|
||||
drmCommandWrite(vmw->fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg));
|
||||
|
||||
xfree(buf);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
void *
|
||||
|
@@ -245,6 +245,7 @@ vmw_screen_pre_init(ScrnInfoPtr pScrn, int flags)
|
||||
cust->winsys_enter_vt = vmw_screen_enter_vt;
|
||||
cust->winsys_leave_vt = vmw_screen_leave_vt;
|
||||
cust->no_3d = TRUE;
|
||||
cust->unhidden_hw_cursor_update = TRUE;
|
||||
vmw->pScrn = pScrn;
|
||||
|
||||
pScrn->driverPrivate = cust;
|
||||
|
@@ -300,7 +300,7 @@ vmw_video_init(struct vmw_customizer *vmw)
|
||||
numAdaptors = 1;
|
||||
overlayAdaptors = &newAdaptor;
|
||||
} else {
|
||||
newAdaptors = xalloc((numAdaptors + 1) *
|
||||
newAdaptors = malloc((numAdaptors + 1) *
|
||||
sizeof(XF86VideoAdaptorPtr*));
|
||||
if (!newAdaptors) {
|
||||
xf86XVFreeVideoAdaptorRec(newAdaptor);
|
||||
@@ -320,7 +320,7 @@ vmw_video_init(struct vmw_customizer *vmw)
|
||||
}
|
||||
|
||||
if (newAdaptors) {
|
||||
xfree(newAdaptors);
|
||||
free(newAdaptors);
|
||||
}
|
||||
|
||||
debug_printf("Initialized VMware Xv extension successfully\n");
|
||||
@@ -438,7 +438,7 @@ vmw_video_init_adaptor(ScrnInfoPtr pScrn, struct vmw_customizer *vmw)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
video = xcalloc(1, sizeof(*video));
|
||||
video = calloc(1, sizeof(*video));
|
||||
if (!video) {
|
||||
debug_printf("Not enough memory.\n");
|
||||
xf86XVFreeVideoAdaptorRec(adaptor);
|
||||
@@ -742,7 +742,7 @@ vmw_video_buffer_alloc(struct vmw_customizer *vmw, int size,
|
||||
}
|
||||
|
||||
out->size = size;
|
||||
out->extra_data = xcalloc(1, size);
|
||||
out->extra_data = calloc(1, size);
|
||||
|
||||
debug_printf("\t\t%s: allocated buffer %p of size %i\n", __func__, out, size);
|
||||
|
||||
@@ -773,7 +773,7 @@ vmw_video_buffer_free(struct vmw_customizer *vmw,
|
||||
if (out->size == 0)
|
||||
return Success;
|
||||
|
||||
xfree(out->extra_data);
|
||||
free(out->extra_data);
|
||||
vmw_ioctl_buffer_unmap(vmw, out->buf);
|
||||
vmw_ioctl_buffer_destroy(vmw, out->buf);
|
||||
|
||||
|
@@ -37,7 +37,214 @@
|
||||
* I believe that this check is valid, but I haven't been exhaustive. */
|
||||
static INLINE boolean is_r3xx(int pciid)
|
||||
{
|
||||
return (pciid > 0x3150) && (pciid < 0x796f);
|
||||
switch (pciid) {
|
||||
case 0x4144: /* PCI_CHIP_R300_AD */
|
||||
case 0x4145: /* PCI_CHIP_R300_AE */
|
||||
case 0x4146: /* PCI_CHIP_R300_AF */
|
||||
case 0x4147: /* PCI_CHIP_R300_AG */
|
||||
case 0x4E44: /* PCI_CHIP_R300_ND */
|
||||
case 0x4E45: /* PCI_CHIP_R300_NE */
|
||||
case 0x4E46: /* PCI_CHIP_R300_NF */
|
||||
case 0x4E47: /* PCI_CHIP_R300_NG */
|
||||
case 0x4E48: /* PCI_CHIP_R350_NH */
|
||||
case 0x4E49: /* PCI_CHIP_R350_NI */
|
||||
case 0x4E4B: /* PCI_CHIP_R350_NK */
|
||||
case 0x4148: /* PCI_CHIP_R350_AH */
|
||||
case 0x4149: /* PCI_CHIP_R350_AI */
|
||||
case 0x414A: /* PCI_CHIP_R350_AJ */
|
||||
case 0x414B: /* PCI_CHIP_R350_AK */
|
||||
case 0x4E4A: /* PCI_CHIP_R360_NJ */
|
||||
case 0x4150: /* PCI_CHIP_RV350_AP */
|
||||
case 0x4151: /* PCI_CHIP_RV350_AQ */
|
||||
case 0x4152: /* PCI_CHIP_RV350_AR */
|
||||
case 0x4153: /* PCI_CHIP_RV350_AS */
|
||||
case 0x4154: /* PCI_CHIP_RV350_AT */
|
||||
case 0x4155: /* PCI_CHIP_RV350_AU */
|
||||
case 0x4156: /* PCI_CHIP_RV350_AV */
|
||||
case 0x4E50: /* PCI_CHIP_RV350_NP */
|
||||
case 0x4E51: /* PCI_CHIP_RV350_NQ */
|
||||
case 0x4E52: /* PCI_CHIP_RV350_NR */
|
||||
case 0x4E53: /* PCI_CHIP_RV350_NS */
|
||||
case 0x4E54: /* PCI_CHIP_RV350_NT */
|
||||
case 0x4E56: /* PCI_CHIP_RV350_NV */
|
||||
case 0x5460: /* PCI_CHIP_RV370_5460 */
|
||||
case 0x5462: /* PCI_CHIP_RV370_5462 */
|
||||
case 0x5464: /* PCI_CHIP_RV370_5464 */
|
||||
case 0x5B60: /* PCI_CHIP_RV370_5B60 */
|
||||
case 0x5B62: /* PCI_CHIP_RV370_5B62 */
|
||||
case 0x5B63: /* PCI_CHIP_RV370_5B63 */
|
||||
case 0x5B64: /* PCI_CHIP_RV370_5B64 */
|
||||
case 0x5B65: /* PCI_CHIP_RV370_5B65 */
|
||||
case 0x3150: /* PCI_CHIP_RV380_3150 */
|
||||
case 0x3152: /* PCI_CHIP_RV380_3152 */
|
||||
case 0x3154: /* PCI_CHIP_RV380_3154 */
|
||||
case 0x3155: /* PCI_CHIP_RV380_3155 */
|
||||
case 0x3E50: /* PCI_CHIP_RV380_3E50 */
|
||||
case 0x3E54: /* PCI_CHIP_RV380_3E54 */
|
||||
case 0x4A48: /* PCI_CHIP_R420_JH */
|
||||
case 0x4A49: /* PCI_CHIP_R420_JI */
|
||||
case 0x4A4A: /* PCI_CHIP_R420_JJ */
|
||||
case 0x4A4B: /* PCI_CHIP_R420_JK */
|
||||
case 0x4A4C: /* PCI_CHIP_R420_JL */
|
||||
case 0x4A4D: /* PCI_CHIP_R420_JM */
|
||||
case 0x4A4E: /* PCI_CHIP_R420_JN */
|
||||
case 0x4A4F: /* PCI_CHIP_R420_JO */
|
||||
case 0x4A50: /* PCI_CHIP_R420_JP */
|
||||
case 0x4A54: /* PCI_CHIP_R420_JT */
|
||||
case 0x5548: /* PCI_CHIP_R423_UH */
|
||||
case 0x5549: /* PCI_CHIP_R423_UI */
|
||||
case 0x554A: /* PCI_CHIP_R423_UJ */
|
||||
case 0x554B: /* PCI_CHIP_R423_UK */
|
||||
case 0x5550: /* PCI_CHIP_R423_5550 */
|
||||
case 0x5551: /* PCI_CHIP_R423_UQ */
|
||||
case 0x5552: /* PCI_CHIP_R423_UR */
|
||||
case 0x5554: /* PCI_CHIP_R423_UT */
|
||||
case 0x5D57: /* PCI_CHIP_R423_5D57 */
|
||||
case 0x554C: /* PCI_CHIP_R430_554C */
|
||||
case 0x554D: /* PCI_CHIP_R430_554D */
|
||||
case 0x554E: /* PCI_CHIP_R430_554E */
|
||||
case 0x554F: /* PCI_CHIP_R430_554F */
|
||||
case 0x5D48: /* PCI_CHIP_R430_5D48 */
|
||||
case 0x5D49: /* PCI_CHIP_R430_5D49 */
|
||||
case 0x5D4A: /* PCI_CHIP_R430_5D4A */
|
||||
case 0x5D4C: /* PCI_CHIP_R480_5D4C */
|
||||
case 0x5D4D: /* PCI_CHIP_R480_5D4D */
|
||||
case 0x5D4E: /* PCI_CHIP_R480_5D4E */
|
||||
case 0x5D4F: /* PCI_CHIP_R480_5D4F */
|
||||
case 0x5D50: /* PCI_CHIP_R480_5D50 */
|
||||
case 0x5D52: /* PCI_CHIP_R480_5D52 */
|
||||
case 0x4B49: /* PCI_CHIP_R481_4B49 */
|
||||
case 0x4B4A: /* PCI_CHIP_R481_4B4A */
|
||||
case 0x4B4B: /* PCI_CHIP_R481_4B4B */
|
||||
case 0x4B4C: /* PCI_CHIP_R481_4B4C */
|
||||
case 0x564A: /* PCI_CHIP_RV410_564A */
|
||||
case 0x564B: /* PCI_CHIP_RV410_564B */
|
||||
case 0x564F: /* PCI_CHIP_RV410_564F */
|
||||
case 0x5652: /* PCI_CHIP_RV410_5652 */
|
||||
case 0x5653: /* PCI_CHIP_RV410_5653 */
|
||||
case 0x5657: /* PCI_CHIP_RV410_5657 */
|
||||
case 0x5E48: /* PCI_CHIP_RV410_5E48 */
|
||||
case 0x5E4A: /* PCI_CHIP_RV410_5E4A */
|
||||
case 0x5E4B: /* PCI_CHIP_RV410_5E4B */
|
||||
case 0x5E4C: /* PCI_CHIP_RV410_5E4C */
|
||||
case 0x5E4D: /* PCI_CHIP_RV410_5E4D */
|
||||
case 0x5E4F: /* PCI_CHIP_RV410_5E4F */
|
||||
case 0x5A41: /* PCI_CHIP_RS400_5A41 */
|
||||
case 0x5A42: /* PCI_CHIP_RS400_5A42 */
|
||||
case 0x5A61: /* PCI_CHIP_RC410_5A61 */
|
||||
case 0x5A62: /* PCI_CHIP_RC410_5A62 */
|
||||
case 0x5954: /* PCI_CHIP_RS480_5954 */
|
||||
case 0x5955: /* PCI_CHIP_RS480_5955 */
|
||||
case 0x5974: /* PCI_CHIP_RS482_5974 */
|
||||
case 0x5975: /* PCI_CHIP_RS482_5975 */
|
||||
case 0x7100: /* PCI_CHIP_R520_7100 */
|
||||
case 0x7101: /* PCI_CHIP_R520_7101 */
|
||||
case 0x7102: /* PCI_CHIP_R520_7102 */
|
||||
case 0x7103: /* PCI_CHIP_R520_7103 */
|
||||
case 0x7104: /* PCI_CHIP_R520_7104 */
|
||||
case 0x7105: /* PCI_CHIP_R520_7105 */
|
||||
case 0x7106: /* PCI_CHIP_R520_7106 */
|
||||
case 0x7108: /* PCI_CHIP_R520_7108 */
|
||||
case 0x7109: /* PCI_CHIP_R520_7109 */
|
||||
case 0x710A: /* PCI_CHIP_R520_710A */
|
||||
case 0x710B: /* PCI_CHIP_R520_710B */
|
||||
case 0x710C: /* PCI_CHIP_R520_710C */
|
||||
case 0x710E: /* PCI_CHIP_R520_710E */
|
||||
case 0x710F: /* PCI_CHIP_R520_710F */
|
||||
case 0x7140: /* PCI_CHIP_RV515_7140 */
|
||||
case 0x7141: /* PCI_CHIP_RV515_7141 */
|
||||
case 0x7142: /* PCI_CHIP_RV515_7142 */
|
||||
case 0x7143: /* PCI_CHIP_RV515_7143 */
|
||||
case 0x7144: /* PCI_CHIP_RV515_7144 */
|
||||
case 0x7145: /* PCI_CHIP_RV515_7145 */
|
||||
case 0x7146: /* PCI_CHIP_RV515_7146 */
|
||||
case 0x7147: /* PCI_CHIP_RV515_7147 */
|
||||
case 0x7149: /* PCI_CHIP_RV515_7149 */
|
||||
case 0x714A: /* PCI_CHIP_RV515_714A */
|
||||
case 0x714B: /* PCI_CHIP_RV515_714B */
|
||||
case 0x714C: /* PCI_CHIP_RV515_714C */
|
||||
case 0x714D: /* PCI_CHIP_RV515_714D */
|
||||
case 0x714E: /* PCI_CHIP_RV515_714E */
|
||||
case 0x714F: /* PCI_CHIP_RV515_714F */
|
||||
case 0x7151: /* PCI_CHIP_RV515_7151 */
|
||||
case 0x7152: /* PCI_CHIP_RV515_7152 */
|
||||
case 0x7153: /* PCI_CHIP_RV515_7153 */
|
||||
case 0x715E: /* PCI_CHIP_RV515_715E */
|
||||
case 0x715F: /* PCI_CHIP_RV515_715F */
|
||||
case 0x7180: /* PCI_CHIP_RV515_7180 */
|
||||
case 0x7181: /* PCI_CHIP_RV515_7181 */
|
||||
case 0x7183: /* PCI_CHIP_RV515_7183 */
|
||||
case 0x7186: /* PCI_CHIP_RV515_7186 */
|
||||
case 0x7187: /* PCI_CHIP_RV515_7187 */
|
||||
case 0x7188: /* PCI_CHIP_RV515_7188 */
|
||||
case 0x718A: /* PCI_CHIP_RV515_718A */
|
||||
case 0x718B: /* PCI_CHIP_RV515_718B */
|
||||
case 0x718C: /* PCI_CHIP_RV515_718C */
|
||||
case 0x718D: /* PCI_CHIP_RV515_718D */
|
||||
case 0x718F: /* PCI_CHIP_RV515_718F */
|
||||
case 0x7193: /* PCI_CHIP_RV515_7193 */
|
||||
case 0x7196: /* PCI_CHIP_RV515_7196 */
|
||||
case 0x719B: /* PCI_CHIP_RV515_719B */
|
||||
case 0x719F: /* PCI_CHIP_RV515_719F */
|
||||
case 0x7200: /* PCI_CHIP_RV515_7200 */
|
||||
case 0x7210: /* PCI_CHIP_RV515_7210 */
|
||||
case 0x7211: /* PCI_CHIP_RV515_7211 */
|
||||
case 0x71C0: /* PCI_CHIP_RV530_71C0 */
|
||||
case 0x71C1: /* PCI_CHIP_RV530_71C1 */
|
||||
case 0x71C2: /* PCI_CHIP_RV530_71C2 */
|
||||
case 0x71C3: /* PCI_CHIP_RV530_71C3 */
|
||||
case 0x71C4: /* PCI_CHIP_RV530_71C4 */
|
||||
case 0x71C5: /* PCI_CHIP_RV530_71C5 */
|
||||
case 0x71C6: /* PCI_CHIP_RV530_71C6 */
|
||||
case 0x71C7: /* PCI_CHIP_RV530_71C7 */
|
||||
case 0x71CD: /* PCI_CHIP_RV530_71CD */
|
||||
case 0x71CE: /* PCI_CHIP_RV530_71CE */
|
||||
case 0x71D2: /* PCI_CHIP_RV530_71D2 */
|
||||
case 0x71D4: /* PCI_CHIP_RV530_71D4 */
|
||||
case 0x71D5: /* PCI_CHIP_RV530_71D5 */
|
||||
case 0x71D6: /* PCI_CHIP_RV530_71D6 */
|
||||
case 0x71DA: /* PCI_CHIP_RV530_71DA */
|
||||
case 0x71DE: /* PCI_CHIP_RV530_71DE */
|
||||
case 0x7281: /* PCI_CHIP_RV560_7281 */
|
||||
case 0x7283: /* PCI_CHIP_RV560_7283 */
|
||||
case 0x7287: /* PCI_CHIP_RV560_7287 */
|
||||
case 0x7290: /* PCI_CHIP_RV560_7290 */
|
||||
case 0x7291: /* PCI_CHIP_RV560_7291 */
|
||||
case 0x7293: /* PCI_CHIP_RV560_7293 */
|
||||
case 0x7297: /* PCI_CHIP_RV560_7297 */
|
||||
case 0x7280: /* PCI_CHIP_RV570_7280 */
|
||||
case 0x7288: /* PCI_CHIP_RV570_7288 */
|
||||
case 0x7289: /* PCI_CHIP_RV570_7289 */
|
||||
case 0x728B: /* PCI_CHIP_RV570_728B */
|
||||
case 0x728C: /* PCI_CHIP_RV570_728C */
|
||||
case 0x7240: /* PCI_CHIP_R580_7240 */
|
||||
case 0x7243: /* PCI_CHIP_R580_7243 */
|
||||
case 0x7244: /* PCI_CHIP_R580_7244 */
|
||||
case 0x7245: /* PCI_CHIP_R580_7245 */
|
||||
case 0x7246: /* PCI_CHIP_R580_7246 */
|
||||
case 0x7247: /* PCI_CHIP_R580_7247 */
|
||||
case 0x7248: /* PCI_CHIP_R580_7248 */
|
||||
case 0x7249: /* PCI_CHIP_R580_7249 */
|
||||
case 0x724A: /* PCI_CHIP_R580_724A */
|
||||
case 0x724B: /* PCI_CHIP_R580_724B */
|
||||
case 0x724C: /* PCI_CHIP_R580_724C */
|
||||
case 0x724D: /* PCI_CHIP_R580_724D */
|
||||
case 0x724E: /* PCI_CHIP_R580_724E */
|
||||
case 0x724F: /* PCI_CHIP_R580_724F */
|
||||
case 0x7284: /* PCI_CHIP_R580_7284 */
|
||||
case 0x793F: /* PCI_CHIP_RS600_793F */
|
||||
case 0x7941: /* PCI_CHIP_RS600_7941 */
|
||||
case 0x7942: /* PCI_CHIP_RS600_7942 */
|
||||
case 0x791E: /* PCI_CHIP_RS690_791E */
|
||||
case 0x791F: /* PCI_CHIP_RS690_791F */
|
||||
case 0x796C: /* PCI_CHIP_RS740_796C */
|
||||
case 0x796D: /* PCI_CHIP_RS740_796D */
|
||||
case 0x796E: /* PCI_CHIP_RS740_796E */
|
||||
case 0x796F: /* PCI_CHIP_RS740_796F */
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -5,13 +5,16 @@
|
||||
#include "radeon_cs_gem.h"
|
||||
#include "radeon_buffer.h"
|
||||
|
||||
#include "util/u_hash_table.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_simple_list.h"
|
||||
#include "pipebuffer/pb_buffer.h"
|
||||
#include "pipebuffer/pb_bufmgr.h"
|
||||
#include "os/os_thread.h"
|
||||
|
||||
#include "radeon_winsys.h"
|
||||
|
||||
struct radeon_drm_bufmgr;
|
||||
|
||||
struct radeon_drm_buffer {
|
||||
@@ -38,9 +41,19 @@ radeon_drm_buffer(struct pb_buffer *buf)
|
||||
}
|
||||
|
||||
struct radeon_drm_bufmgr {
|
||||
/* Base class. */
|
||||
struct pb_manager base;
|
||||
|
||||
/* Winsys. */
|
||||
struct radeon_libdrm_winsys *rws;
|
||||
|
||||
/* List of mapped buffers and its mutex. */
|
||||
struct radeon_drm_buffer buffer_map_list;
|
||||
pipe_mutex buffer_map_list_mutex;
|
||||
|
||||
/* List of buffer handles and its mutex. */
|
||||
struct util_hash_table *buffer_handles;
|
||||
pipe_mutex buffer_handles_mutex;
|
||||
};
|
||||
|
||||
static INLINE struct radeon_drm_bufmgr *
|
||||
@@ -54,11 +67,24 @@ static void
|
||||
radeon_drm_buffer_destroy(struct pb_buffer *_buf)
|
||||
{
|
||||
struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
|
||||
int name;
|
||||
|
||||
if (buf->bo->ptr != NULL) {
|
||||
remove_from_list(buf);
|
||||
radeon_bo_unmap(buf->bo);
|
||||
buf->bo->ptr = NULL;
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
/* Now test it again inside the mutex. */
|
||||
if (buf->bo->ptr != NULL) {
|
||||
remove_from_list(buf);
|
||||
radeon_bo_unmap(buf->bo);
|
||||
buf->bo->ptr = NULL;
|
||||
}
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
}
|
||||
name = radeon_gem_name_bo(buf->bo);
|
||||
if (name) {
|
||||
pipe_mutex_lock(buf->mgr->buffer_handles_mutex);
|
||||
util_hash_table_remove(buf->mgr->buffer_handles,
|
||||
(void*)(uintptr_t)name);
|
||||
pipe_mutex_unlock(buf->mgr->buffer_handles_mutex);
|
||||
}
|
||||
radeon_bo_unref(buf->bo);
|
||||
|
||||
@@ -110,8 +136,16 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (buf->bo->ptr != NULL)
|
||||
if (buf->bo->ptr != NULL) {
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
/* Now test ptr again inside the mutex. We might have gotten a race
|
||||
* during the first test. */
|
||||
if (buf->bo->ptr != NULL) {
|
||||
remove_from_list(buf);
|
||||
}
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
return buf->bo->ptr;
|
||||
}
|
||||
|
||||
if (flags & PB_USAGE_DONTBLOCK) {
|
||||
uint32_t domain;
|
||||
@@ -134,14 +168,22 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
|
||||
if (radeon_bo_map(buf->bo, write)) {
|
||||
return NULL;
|
||||
}
|
||||
insert_at_tail(&buf->mgr->buffer_map_list, buf);
|
||||
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
remove_from_list(buf);
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
return buf->bo->ptr;
|
||||
}
|
||||
|
||||
static void
|
||||
radeon_drm_buffer_unmap_internal(struct pb_buffer *_buf)
|
||||
{
|
||||
(void)_buf;
|
||||
struct radeon_drm_buffer *buf = radeon_drm_buffer(_buf);
|
||||
pipe_mutex_lock(buf->mgr->buffer_map_list_mutex);
|
||||
if (is_empty_list(buf)) { /* = is not inserted... */
|
||||
insert_at_tail(&buf->mgr->buffer_map_list, buf);
|
||||
}
|
||||
pipe_mutex_unlock(buf->mgr->buffer_map_list_mutex);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -155,7 +197,7 @@ radeon_drm_buffer_get_base_buffer(struct pb_buffer *buf,
|
||||
|
||||
|
||||
static enum pipe_error
|
||||
radeon_drm_buffer_validate(struct pb_buffer *_buf,
|
||||
radeon_drm_buffer_validate(struct pb_buffer *_buf,
|
||||
struct pb_validate *vl,
|
||||
unsigned flags)
|
||||
{
|
||||
@@ -178,14 +220,23 @@ const struct pb_vtbl radeon_drm_buffer_vtbl = {
|
||||
radeon_drm_buffer_get_base_buffer,
|
||||
};
|
||||
|
||||
struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
|
||||
uint32_t handle)
|
||||
static struct pb_buffer *
|
||||
radeon_drm_bufmgr_create_buffer_from_handle_unsafe(struct pb_manager *_mgr,
|
||||
uint32_t handle)
|
||||
{
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
struct radeon_libdrm_winsys *rws = mgr->rws;
|
||||
struct radeon_drm_buffer *buf;
|
||||
struct radeon_bo *bo;
|
||||
|
||||
buf = util_hash_table_get(mgr->buffer_handles, (void*)(uintptr_t)handle);
|
||||
|
||||
if (buf) {
|
||||
struct pb_buffer *b = NULL;
|
||||
pb_reference(&b, &buf->base);
|
||||
return b;
|
||||
}
|
||||
|
||||
bo = radeon_bo_open(rws->bom, handle, 0,
|
||||
0, 0, 0);
|
||||
if (bo == NULL)
|
||||
@@ -208,9 +259,25 @@ struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager
|
||||
|
||||
buf->bo = bo;
|
||||
|
||||
util_hash_table_set(mgr->buffer_handles, (void*)(uintptr_t)handle, buf);
|
||||
|
||||
return &buf->base;
|
||||
}
|
||||
|
||||
struct pb_buffer *
|
||||
radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
|
||||
uint32_t handle)
|
||||
{
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
struct pb_buffer *pb;
|
||||
|
||||
pipe_mutex_lock(mgr->buffer_handles_mutex);
|
||||
pb = radeon_drm_bufmgr_create_buffer_from_handle_unsafe(_mgr, handle);
|
||||
pipe_mutex_unlock(mgr->buffer_handles_mutex);
|
||||
|
||||
return pb;
|
||||
}
|
||||
|
||||
static struct pb_buffer *
|
||||
radeon_drm_bufmgr_create_buffer(struct pb_manager *_mgr,
|
||||
pb_size size,
|
||||
@@ -261,9 +328,22 @@ static void
|
||||
radeon_drm_bufmgr_destroy(struct pb_manager *_mgr)
|
||||
{
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
util_hash_table_destroy(mgr->buffer_handles);
|
||||
pipe_mutex_destroy(mgr->buffer_map_list_mutex);
|
||||
pipe_mutex_destroy(mgr->buffer_handles_mutex);
|
||||
FREE(mgr);
|
||||
}
|
||||
|
||||
static unsigned handle_hash(void *key)
|
||||
{
|
||||
return (unsigned)key;
|
||||
}
|
||||
|
||||
static int handle_compare(void *key1, void *key2)
|
||||
{
|
||||
return !((int)key1 == (int)key2);
|
||||
}
|
||||
|
||||
struct pb_manager *
|
||||
radeon_drm_bufmgr_create(struct radeon_libdrm_winsys *rws)
|
||||
{
|
||||
@@ -279,6 +359,9 @@ radeon_drm_bufmgr_create(struct radeon_libdrm_winsys *rws)
|
||||
|
||||
mgr->rws = rws;
|
||||
make_empty_list(&mgr->buffer_map_list);
|
||||
mgr->buffer_handles = util_hash_table_create(handle_hash, handle_compare);
|
||||
pipe_mutex_init(mgr->buffer_map_list_mutex);
|
||||
pipe_mutex_init(mgr->buffer_handles_mutex);
|
||||
return &mgr->base;
|
||||
}
|
||||
|
||||
@@ -454,6 +537,8 @@ void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr)
|
||||
struct radeon_drm_bufmgr *mgr = radeon_drm_bufmgr(_mgr);
|
||||
struct radeon_drm_buffer *rpb, *t_rpb;
|
||||
|
||||
pipe_mutex_lock(mgr->buffer_map_list_mutex);
|
||||
|
||||
foreach_s(rpb, t_rpb, &mgr->buffer_map_list) {
|
||||
radeon_bo_unmap(rpb->bo);
|
||||
rpb->bo->ptr = NULL;
|
||||
@@ -461,6 +546,8 @@ void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr)
|
||||
}
|
||||
|
||||
make_empty_list(&mgr->buffer_map_list);
|
||||
|
||||
pipe_mutex_unlock(mgr->buffer_map_list_mutex);
|
||||
}
|
||||
|
||||
void radeon_drm_bufmgr_wait(struct r300_winsys_screen *ws,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user