Compare commits
193 Commits
mesa-12.0.
...
mesa-10.6.
Author | SHA1 | Date | |
---|---|---|---|
|
6b2fcee64e | ||
|
95ecedf6d9 | ||
|
736f6e16d9 | ||
|
f13ba8a5ab | ||
|
791cf8a025 | ||
|
58b2e95c1f | ||
|
1f6798a70a | ||
|
84ef345dff | ||
|
7722a24cab | ||
|
880a0ce2e9 | ||
|
842a3af20b | ||
|
bc29f8f6b7 | ||
|
f2f62059dc | ||
|
2a72e18abb | ||
|
b70176d96b | ||
|
d8116f8ec5 | ||
|
8f8c842338 | ||
|
eddea78fb3 | ||
|
080c4713bc | ||
|
ba10c9ff50 | ||
|
f167d9b46c | ||
|
def2d2e018 | ||
|
831bf63e6b | ||
|
6321bf72be | ||
|
acaac69ccd | ||
|
fbc464803a | ||
|
56e4cc67fe | ||
|
a31dfd91b5 | ||
|
504903b827 | ||
|
c33ca1696a | ||
|
ccef8901de | ||
|
ddc976368f | ||
|
2eef0b7d86 | ||
|
954c18fb5c | ||
|
2a77b82a92 | ||
|
7efc693ef2 | ||
|
440f465f5f | ||
|
9656b34fae | ||
|
329763791b | ||
|
8132c7ac41 | ||
|
da8bc16739 | ||
|
6012eeca0b | ||
|
9c7f594705 | ||
|
9e62e1a1d3 | ||
|
4a3d6d04e1 | ||
|
9850b9ca73 | ||
|
89cbd91b17 | ||
|
9643cce94c | ||
|
187f919c90 | ||
|
5e92541945 | ||
|
6b6e14ac35 | ||
|
25daf2592c | ||
|
b85e389d6c | ||
|
57a6f5208d | ||
|
f3abea1577 | ||
|
6fbe4bf790 | ||
|
4c3a4ac6da | ||
|
2ca2f3701b | ||
|
fcc9f9e06e | ||
|
5de0e9f982 | ||
|
083840d365 | ||
|
afa43fa696 | ||
|
03cf14a713 | ||
|
e529d5ffb4 | ||
|
4d8c6edab4 | ||
|
8ef284366c | ||
|
0b5a9660dc | ||
|
1e8c43f4d0 | ||
|
6902a36d22 | ||
|
96bed9fea8 | ||
|
3fe9fe9cb9 | ||
|
1beb6738a7 | ||
|
f3e514a41d | ||
|
b150817c19 | ||
|
619b9e84bf | ||
|
cc7caf9239 | ||
|
a70904bc78 | ||
|
e00aab1654 | ||
|
887a18018d | ||
|
a09b91792c | ||
|
0eaf0e16dd | ||
|
542299185b | ||
|
16d35dbd56 | ||
|
e77d8eb4b6 | ||
|
1e84989ffc | ||
|
6ff3ae8deb | ||
|
a871e80fc6 | ||
|
f513cc8836 | ||
|
da588875ce | ||
|
684c81a75f | ||
|
9ffa1f7a1b | ||
|
c4dc2a5e2c | ||
|
d93677eb48 | ||
|
0db9835d3b | ||
|
ca079a77f9 | ||
|
9ba9c030ad | ||
|
c96d9c2371 | ||
|
f036512122 | ||
|
0c46196e1d | ||
|
74f2c1c282 | ||
|
8ed4c7acc2 | ||
|
fc3af254b1 | ||
|
9d2b9e7724 | ||
|
acfaacb18b | ||
|
0736a2aa79 | ||
|
1a153e1fd3 | ||
|
1f3ec92976 | ||
|
2040c18ecc | ||
|
b590ee6d45 | ||
|
5d327b3735 | ||
|
3b9cde5c81 | ||
|
9719f26cc6 | ||
|
81027ea1e2 | ||
|
a439cafc7c | ||
|
1c2a462125 | ||
|
279b1d85cc | ||
|
28b3e4f925 | ||
|
ea3d26eeb4 | ||
|
39aa6b8bea | ||
|
1a47d37c99 | ||
|
a2f216b329 | ||
|
9b8d492781 | ||
|
ef90205704 | ||
|
c6184b2b5c | ||
|
bf538839ed | ||
|
7abb5e3f13 | ||
|
2353b2197c | ||
|
10b7dba331 | ||
|
55104870a1 | ||
|
fbc04dcddb | ||
|
8631c00acb | ||
|
add82b672d | ||
|
3514680b91 | ||
|
4f68af254e | ||
|
70ac6a2655 | ||
|
9dc43dc361 | ||
|
038fc5a7f7 | ||
|
66e1ee52ad | ||
|
bc8fa4311e | ||
|
eafe639aee | ||
|
97eb22e959 | ||
|
964d358bc1 | ||
|
384ee736e7 | ||
|
3599928fc6 | ||
|
0330429005 | ||
|
828eeb65dc | ||
|
74e7328281 | ||
|
9e71637022 | ||
|
83eed1ea90 | ||
|
7ddacf6df3 | ||
|
83007290c6 | ||
|
38fb22cece | ||
|
1deda22b88 | ||
|
ef6670ca43 | ||
|
b8c030d9cf | ||
|
9c04f375db | ||
|
944bf20c17 | ||
|
b4da1d9ebd | ||
|
75691166be | ||
|
8c57dc26a7 | ||
|
230891cc9c | ||
|
ffd133bdbe | ||
|
77b116f1d3 | ||
|
1eef92e336 | ||
|
317fa3e7ef | ||
|
580351d3d3 | ||
|
534f5e8d80 | ||
|
74e2db8a92 | ||
|
c288bf3b89 | ||
|
18e05588df | ||
|
407e20d45d | ||
|
5eef18390d | ||
|
34ff020aea | ||
|
8fc109160e | ||
|
cb0c057a31 | ||
|
60294f8c39 | ||
|
6319fd51fe | ||
|
08baacb6db | ||
|
c23bbfc007 | ||
|
aa326e4e22 | ||
|
1595955974 | ||
|
a760db21ec | ||
|
2cf0e748c3 | ||
|
564c56de12 | ||
|
45986bd391 | ||
|
90644f9217 | ||
|
61c6819d1a | ||
|
bf33fc653d | ||
|
e4f74121db | ||
|
62fda88080 | ||
|
4c83138e5f | ||
|
f02f25dcf7 | ||
|
7c5cca5ee2 |
@@ -15,17 +15,14 @@
|
||||
# $ DRYRUN=yes bin/bugzilla_mesa.sh mesa-9.0.2..mesa-9.0.3 | wc -l
|
||||
|
||||
|
||||
# regex pattern: trim before url
|
||||
trim_before='s/.*\(http\)/\1/'
|
||||
# regex pattern: trim before bug number
|
||||
trim_before='s/.*show_bug.cgi?id=\([0-9]*\).*/\1/'
|
||||
|
||||
# regex pattern: trim after url
|
||||
trim_after='s/\(show_bug.cgi?id=[0-9]*\).*/\1/'
|
||||
|
||||
# regex pattern: always use https
|
||||
use_https='s/http:/https:/'
|
||||
# regex pattern: reconstruct the url
|
||||
use_after='s,^,https://bugs.freedesktop.org/show_bug.cgi?id=,'
|
||||
|
||||
# extract fdo urls from commit log
|
||||
urls=$(git log $* | grep 'bugs.freedesktop.org/show_bug' | sed -e $trim_before -e $trim_after -e $use_https | sort | uniq)
|
||||
urls=$(git log $* | grep 'bugs.freedesktop.org/show_bug' | sed -e $trim_before | sort -n -u | sed -e $use_after)
|
||||
|
||||
# if DRYRUN is set to "yes", simply print the URLs and don't fetch the
|
||||
# details from fdo bugzilla.
|
||||
|
183
configure.ac
183
configure.ac
@@ -9,7 +9,6 @@ dnl Copyright © 2009-2014 Jon TURNEY
|
||||
dnl Copyright © 2011-2012 Benjamin Franzke
|
||||
dnl Copyright © 2008-2014 David Airlie
|
||||
dnl Copyright © 2009-2013 Brian Paul
|
||||
dnl Copyright © 2003-2007 Keith Packard, Daniel Stone
|
||||
dnl
|
||||
dnl Permission is hereby granted, free of charge, to any person obtaining a
|
||||
dnl copy of this software and associated documentation files (the "Software"),
|
||||
@@ -64,6 +63,8 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
|
||||
dnl Set internal versions
|
||||
OSMESA_VERSION=8
|
||||
AC_SUBST([OSMESA_VERSION])
|
||||
OPENCL_VERSION=1
|
||||
AC_SUBST([OPENCL_VERSION])
|
||||
|
||||
dnl Versions for external dependencies
|
||||
LIBDRM_REQUIRED=2.4.38
|
||||
@@ -649,6 +650,7 @@ if test "x$enable_asm" = xyes; then
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADER([xlocale.h], [DEFINES="$DEFINES -DHAVE_XLOCALE_H"])
|
||||
AC_CHECK_HEADER([sys/sysctl.h], [DEFINES="$DEFINES -DHAVE_SYS_SYSCTL_H"])
|
||||
AC_CHECK_FUNC([strtof], [DEFINES="$DEFINES -DHAVE_STRTOF"])
|
||||
|
||||
dnl Check to see if dlopen is in default libraries (like Solaris, which
|
||||
@@ -909,6 +911,13 @@ fi
|
||||
AM_CONDITIONAL(HAVE_DRI_GLX, test "x$enable_glx" = xyes -a \
|
||||
"x$enable_dri" = xyes)
|
||||
|
||||
# Check for libdrm
|
||||
PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED],
|
||||
[have_libdrm=yes], [have_libdrm=no])
|
||||
if test "x$have_libdrm" = xyes; then
|
||||
DEFINES="$DEFINES -DHAVE_LIBDRM"
|
||||
fi
|
||||
|
||||
# Select which platform-dependent DRI code gets built
|
||||
case "$host_os" in
|
||||
darwin*)
|
||||
@@ -921,8 +930,8 @@ esac
|
||||
|
||||
AM_CONDITIONAL(HAVE_DRICOMMON, test "x$enable_dri" = xyes )
|
||||
AM_CONDITIONAL(HAVE_DRISW, test "x$enable_dri" = xyes )
|
||||
AM_CONDITIONAL(HAVE_DRI2, test "x$enable_dri" = xyes -a "x$dri_platform" = xdrm )
|
||||
AM_CONDITIONAL(HAVE_DRI3, test "x$enable_dri3" = xyes -a "x$dri_platform" = xdrm )
|
||||
AM_CONDITIONAL(HAVE_DRI2, test "x$enable_dri" = xyes -a "x$dri_platform" = xdrm -a "x$have_libdrm" = xyes )
|
||||
AM_CONDITIONAL(HAVE_DRI3, test "x$enable_dri3" = xyes -a "x$dri_platform" = xdrm -a "x$have_libdrm" = xyes )
|
||||
AM_CONDITIONAL(HAVE_APPLEDRI, test "x$enable_dri" = xyes -a "x$dri_platform" = xapple )
|
||||
|
||||
AC_ARG_ENABLE([shared-glapi],
|
||||
@@ -941,7 +950,7 @@ x*yes*yes*)
|
||||
esac
|
||||
|
||||
# Building Xlib-GLX requires shared glapi to be disabled.
|
||||
if test "x$enable_xlib_glx" = xyes; then
|
||||
if test "x$enable_shared_glapi$enable_xlib_glx" = xyesyes; then
|
||||
AC_MSG_NOTICE([Shared GLAPI should not used with Xlib-GLX, disabling])
|
||||
enable_shared_glapi=no
|
||||
fi
|
||||
@@ -978,151 +987,6 @@ fi
|
||||
|
||||
AC_SUBST([MESA_LLVM])
|
||||
|
||||
# SHA1 hashing
|
||||
AC_ARG_WITH([sha1],
|
||||
[AS_HELP_STRING([--with-sha1=libc|libmd|libnettle|libgcrypt|libcrypto|libsha1|CommonCrypto|CryptoAPI],
|
||||
[choose SHA1 implementation])])
|
||||
case "x$with_sha1" in
|
||||
x | xlibc | xlibmd | xlibnettle | xlibgcrypt | xlibcrypto | xlibsha1 | xCommonCrypto | xCryptoAPI)
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([Illegal value for --with-sha1: $with_sha1])
|
||||
esac
|
||||
|
||||
AC_CHECK_FUNC([SHA1Init], [HAVE_SHA1_IN_LIBC=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_LIBC" = xyes; then
|
||||
with_sha1=libc
|
||||
fi
|
||||
if test "x$with_sha1" = xlibc && test "x$HAVE_SHA1_IN_LIBC" != xyes; then
|
||||
AC_MSG_ERROR([sha1 in libc requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibc; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBC], [1],
|
||||
[Use libc SHA1 functions])
|
||||
SHA1_LIBS=""
|
||||
fi
|
||||
AC_CHECK_FUNC([CC_SHA1_Init], [HAVE_SHA1_IN_COMMONCRYPTO=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_COMMONCRYPTO" = xyes; then
|
||||
with_sha1=CommonCrypto
|
||||
fi
|
||||
if test "x$with_sha1" = xCommonCrypto && test "x$HAVE_SHA1_IN_COMMONCRYPTO" != xyes; then
|
||||
AC_MSG_ERROR([CommonCrypto requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xCommonCrypto; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_COMMONCRYPTO], [1],
|
||||
[Use CommonCrypto SHA1 functions])
|
||||
SHA1_LIBS=""
|
||||
fi
|
||||
dnl stdcall functions cannot be tested with AC_CHECK_LIB
|
||||
AC_CHECK_HEADER([wincrypt.h], [HAVE_SHA1_IN_CRYPTOAPI=yes], [], [#include <windows.h>])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_CRYPTOAPI" = xyes; then
|
||||
with_sha1=CryptoAPI
|
||||
fi
|
||||
if test "x$with_sha1" = xCryptoAPI && test "x$HAVE_SHA1_IN_CRYPTOAPI" != xyes; then
|
||||
AC_MSG_ERROR([CryptoAPI requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xCryptoAPI; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_CRYPTOAPI], [1],
|
||||
[Use CryptoAPI SHA1 functions])
|
||||
SHA1_LIBS=""
|
||||
fi
|
||||
AC_CHECK_LIB([md], [SHA1Init], [HAVE_LIBMD=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBMD" = xyes; then
|
||||
with_sha1=libmd
|
||||
fi
|
||||
if test "x$with_sha1" = xlibmd && test "x$HAVE_LIBMD" != xyes; then
|
||||
AC_MSG_ERROR([libmd requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibmd; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBMD], [1],
|
||||
[Use libmd SHA1 functions])
|
||||
SHA1_LIBS=-lmd
|
||||
fi
|
||||
PKG_CHECK_MODULES([LIBSHA1], [libsha1], [HAVE_LIBSHA1=yes], [HAVE_LIBSHA1=no])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBSHA1" = xyes; then
|
||||
with_sha1=libsha1
|
||||
fi
|
||||
if test "x$with_sha1" = xlibsha1 && test "x$HAVE_LIBSHA1" != xyes; then
|
||||
AC_MSG_ERROR([libsha1 requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibsha1; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBSHA1], [1],
|
||||
[Use libsha1 for SHA1])
|
||||
SHA1_LIBS=-lsha1
|
||||
fi
|
||||
AC_CHECK_LIB([nettle], [nettle_sha1_init], [HAVE_LIBNETTLE=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBNETTLE" = xyes; then
|
||||
with_sha1=libnettle
|
||||
fi
|
||||
if test "x$with_sha1" = xlibnettle && test "x$HAVE_LIBNETTLE" != xyes; then
|
||||
AC_MSG_ERROR([libnettle requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibnettle; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBNETTLE], [1],
|
||||
[Use libnettle SHA1 functions])
|
||||
SHA1_LIBS=-lnettle
|
||||
fi
|
||||
AC_CHECK_LIB([gcrypt], [gcry_md_open], [HAVE_LIBGCRYPT=yes])
|
||||
if test "x$with_sha1" = x && test "x$HAVE_LIBGCRYPT" = xyes; then
|
||||
with_sha1=libgcrypt
|
||||
fi
|
||||
if test "x$with_sha1" = xlibgcrypt && test "x$HAVE_LIBGCRYPT" != xyes; then
|
||||
AC_MSG_ERROR([libgcrypt requested but not found])
|
||||
fi
|
||||
if test "x$with_sha1" = xlibgcrypt; then
|
||||
AC_DEFINE([HAVE_SHA1_IN_LIBGCRYPT], [1],
|
||||
[Use libgcrypt SHA1 functions])
|
||||
SHA1_LIBS=-lgcrypt
|
||||
fi
|
||||
# We don't need all of the OpenSSL libraries, just libcrypto
|
||||
AC_CHECK_LIB([crypto], [SHA1_Init], [HAVE_LIBCRYPTO=yes])
|
||||
PKG_CHECK_MODULES([OPENSSL], [openssl], [HAVE_OPENSSL_PKC=yes],
|
||||
[HAVE_OPENSSL_PKC=no])
|
||||
if test "x$HAVE_LIBCRYPTO" = xyes || test "x$HAVE_OPENSSL_PKC" = xyes; then
|
||||
if test "x$with_sha1" = x; then
|
||||
with_sha1=libcrypto
|
||||
fi
|
||||
else
|
||||
if test "x$with_sha1" = xlibcrypto; then
|
||||
AC_MSG_ERROR([OpenSSL libcrypto requested but not found])
|
||||
fi
|
||||
fi
|
||||
if test "x$with_sha1" = xlibcrypto; then
|
||||
if test "x$HAVE_LIBCRYPTO" = xyes; then
|
||||
SHA1_LIBS=-lcrypto
|
||||
else
|
||||
SHA1_LIBS="$OPENSSL_LIBS"
|
||||
SHA1_CFLAGS="$OPENSSL_CFLAGS"
|
||||
fi
|
||||
fi
|
||||
AC_MSG_CHECKING([for SHA1 implementation])
|
||||
AC_MSG_RESULT([$with_sha1])
|
||||
AC_SUBST(SHA1_LIBS)
|
||||
AC_SUBST(SHA1_CFLAGS)
|
||||
|
||||
# Allow user to configure out the shader-cache feature
|
||||
AC_ARG_ENABLE([shader-cache],
|
||||
AS_HELP_STRING([--disable-shader-cache], [Disable binary shader cache]),
|
||||
[enable_shader_cache="$enableval"],
|
||||
[if test "x$with_sha1" != "x"; then
|
||||
enable_shader_cache=yes
|
||||
else
|
||||
enable_shader_cache=no
|
||||
fi])
|
||||
if test "x$with_sha1" = "x"; then
|
||||
if test "x$enable_shader_cache" = "xyes"; then
|
||||
AC_MSG_ERROR([Cannot enable shader cache (no SHA-1 implementation found)])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL([ENABLE_SHADER_CACHE], [test x$enable_shader_cache = xyes])
|
||||
|
||||
# Check for libdrm
|
||||
PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED],
|
||||
[have_libdrm=yes], [have_libdrm=no])
|
||||
if test "x$have_libdrm" = xyes; then
|
||||
DEFINES="$DEFINES -DHAVE_LIBDRM"
|
||||
fi
|
||||
|
||||
case "$host_os" in
|
||||
linux*)
|
||||
need_pci_id=yes ;;
|
||||
@@ -1547,8 +1411,15 @@ if test "x$enable_egl" = xyes; then
|
||||
|
||||
if test "$enable_static" != yes; then
|
||||
if test "x$enable_dri" = xyes; then
|
||||
HAVE_EGL_DRIVER_DRI2=1
|
||||
fi
|
||||
HAVE_EGL_DRIVER_DRI2=1
|
||||
if test "x$enable_shared_glapi" = xno; then
|
||||
AC_MSG_ERROR([egl_dri2 requires --enable-shared-glapi])
|
||||
fi
|
||||
else
|
||||
# Avoid building an "empty" libEGL. Drop/update this
|
||||
# when other backends (haiku?) come along.
|
||||
AC_MSG_ERROR([egl requires --enable-dri])
|
||||
fi
|
||||
|
||||
fi
|
||||
fi
|
||||
@@ -1758,6 +1629,9 @@ egl_platforms=`IFS=', '; echo $with_egl_platforms`
|
||||
for plat in $egl_platforms; do
|
||||
case "$plat" in
|
||||
wayland)
|
||||
test "x$have_libdrm" != xyes &&
|
||||
AC_MSG_ERROR([EGL platform wayland requires libdrm >= $LIBDRM_REQUIRED])
|
||||
|
||||
PKG_CHECK_MODULES([WAYLAND], [wayland-client >= $WAYLAND_REQUIRED wayland-server >= $WAYLAND_REQUIRED])
|
||||
|
||||
if test "x$WAYLAND_SCANNER" = x; then
|
||||
@@ -2369,6 +2243,7 @@ AC_CONFIG_FILES([Makefile
|
||||
src/gallium/targets/libgl-xlib/Makefile
|
||||
src/gallium/targets/omx/Makefile
|
||||
src/gallium/targets/opencl/Makefile
|
||||
src/gallium/targets/opencl/mesa.icd
|
||||
src/gallium/targets/osmesa/Makefile
|
||||
src/gallium/targets/osmesa/osmesa.pc
|
||||
src/gallium/targets/pipe-loader/Makefile
|
||||
@@ -2504,12 +2379,6 @@ else
|
||||
echo " Gallium: no"
|
||||
fi
|
||||
|
||||
dnl Shader cache
|
||||
echo ""
|
||||
echo " Shader cache: $enable_shader_cache"
|
||||
if test "x$enable_shader_cache" = "xyes"; then
|
||||
echo " With SHA1 from: $with_sha1"
|
||||
fi
|
||||
|
||||
dnl Libraries
|
||||
echo ""
|
||||
|
@@ -14,7 +14,7 @@
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 10.6.0 Release Notes / TBD</h1>
|
||||
<h1>Mesa 10.6.0 Release Notes / June 14, 2015</h1>
|
||||
|
||||
<p>
|
||||
Mesa 10.6.0 is a new development release.
|
||||
@@ -31,9 +31,10 @@ because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
TBD.
|
||||
9bc659abdba26202509304f259723aaa4343dba6aac4bd87d5baea11d23c8c63 mesa-10.6.0.tar.gz
|
||||
f37e2633978deed02ff0522abc36c709586e2b555fd439a82ab71dce2c866c76 mesa-10.6.0.tar.xz
|
||||
</pre>
|
||||
|
||||
|
||||
@@ -71,7 +72,246 @@ Note: some of the new features are only available with certain drivers.
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
|
||||
TBD.
|
||||
<p>This list is likely incomplete.</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=15006">Bug 15006</a> - translate & rotate the line cause Aliasing</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27007">Bug 27007</a> - Lines disappear with GL_LINE_SMOOTH</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28832">Bug 28832</a> - piglit/general/line-aa-width fail</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=45348">Bug 45348</a> - [swrast] piglit fbo-drawbuffers-arbfp regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=60797">Bug 60797</a> - 1px lines in octave plot aliased to 0</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=67564">Bug 67564</a> - HiZ buffers are much larger than necessary</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=69226">Bug 69226</a> - Cannot enable basic shaders with Second Life aborts attempt</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=71591">Bug 71591</a> - Second Life shaders fail to compile (extension declared in middle of shader)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=79202">Bug 79202</a> - valgrind errors in glsl-fs-uniform-array-loop-unroll.shader_test; random code generation</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=81025">Bug 81025</a> - [IVB/BYT Bisected]Piglit spec_ARB_draw_indirect_arb_draw_indirect-draw-elements-prim-restart-ugly fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=82477">Bug 82477</a> - [softpipe] piglit fp-long-alu regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=82668">Bug 82668</a> - Can't set int attributes to certain values on 32-bit</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=82831">Bug 82831</a> - i965: Support GL_ARB_blend_func_extended in SIMD16</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83962">Bug 83962</a> - [HSW/BYT]Piglit spec_ARB_gpu_shader5_arb_gpu_shader5-emitstreamvertex_nodraw fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84613">Bug 84613</a> - [G965, bisected] piglit regressions : glslparsertest.glsl2</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86747">Bug 86747</a> - Noise in Football Manager 2014 textures</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86792">Bug 86792</a> - [NVC0] Portal 2 Crashes in Wine</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86811">Bug 86811</a> - [BDW/BSW Bisected]Piglit spec_arb_shading_language_packing_execution_built-in-functions_vs-unpackSnorm4x8 fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86837">Bug 86837</a> - kodi segfault since auxiliary/vl: rework the build of the VL code</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86944">Bug 86944</a> - glsl_parser_extras.cpp", line 1455: Error: Badly formed expression. (Oracle Studio)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86974">Bug 86974</a> - INTEL_DEBUG=shader_time always asserts in fs_generator::generate_code() when Mesa is built with --enable-debug (= with asserts)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86980">Bug 86980</a> - [swrast] piglit fp-rfl regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87258">Bug 87258</a> - [BDW/BSW Bisected]Piglit spec_ARB_shader_atomic_counters_array-indexing fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88246">Bug 88246</a> - Commit 2881b12 causes 43 DrawElements test regressions</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88248">Bug 88248</a> - Calling glClear while there is an occlusion query in progress messes up the results</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88521">Bug 88521</a> - GLBenchmark 2.7 TRex renders with artifacts on Gen8 with !UXA</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88534">Bug 88534</a> - include/c11/threads_posix.h PTHREAD_MUTEX_RECURSIVE_NP not defined</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88561">Bug 88561</a> - [radeonsi][regression,bisected] Depth test/buffer issues in Portal</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88793">Bug 88793</a> - [BDW/BSW Bisected]Piglit/shaders_glsl-max-varyings fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88815">Bug 88815</a> - Incorrect handling of GLSL #line directive</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88883">Bug 88883</a> - ir-a2xx.c: variable changed in assert statement</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88885">Bug 88885</a> - Transform feedback uses incorrect interleaving if a previous draw did not write gl_Position</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88905">Bug 88905</a> - [SNB+ Bisected]Ogles3conform ES3-CTS.gtf.GL3Tests.packed_pixels.packed_pixels fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88999">Bug 88999</a> - [SKL] Compiz crashes after opening unity dash</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89014">Bug 89014</a> - PIPE_QUERY_GPU_FINISHED is not acting as expected on SI</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89026">Bug 89026</a> - Renderbuffer layered state used for framebuffer completeness test</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89032">Bug 89032</a> - [BDW/BSW/SKL Bisected]Piglit spec_OpenGL_1.1_infinite-spot-light fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89037">Bug 89037</a> - [SKL]Piglit spec_EXT_texture_array_copyteximage_1D_ARRAY_samples=2 sporadically causes GPU hang</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89039">Bug 89039</a> - [SKL]etqw system hang</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89058">Bug 89058</a> - [SKL]Render error in some games (etqw-demo, nexuiz, portal)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89068">Bug 89068</a> - glTexImage2D regression by texstore_rgba switch to _mesa_format_convert</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89069">Bug 89069</a> - Lack of grass in The Talos Principle on radeonsi (native\wine\nine)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89094">Bug 89094</a> - [SNB/IVB/HSW/BYT Bisected]Ogles3conform ES3-CTS.gtf.GL3Tests.shadow.shadow_execution_vert fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89095">Bug 89095</a> - [SNB/IVB/BYT Bisected]Webglc conformance/glsl/functions/glsl-function-mix-float.html fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89112">Bug 89112</a> - u_atomic_test: u_atomic_test.c:124: test_atomic_8bits_bool: Assertion `r == 65 && "p_atomic_add"' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89118">Bug 89118</a> - [SKL Bisected]many Ogles3conform cases core dumped</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89131">Bug 89131</a> - [Bisected] Graphical corruption in Weston, shows old framebuffer pieces</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89156">Bug 89156</a> - r300g: GL_COMPRESSED_RED_RGTC1 / ATI1N support broken</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89180">Bug 89180</a> - [IVB regression] Rendering issues in Mass Effect through VMware Workstation</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89210">Bug 89210</a> - GS statistics fail on SNB</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89218">Bug 89218</a> - lower_instructions.cpp:648:48: error: invalid suffix 'd' on floating constant</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89224">Bug 89224</a> - Incorrect rendering of Unigine Valley running in VM on VMware Workstation</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89260">Bug 89260</a> - macros.h:34:25: fatal error: util/u_math.h: No such file or directory</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89292">Bug 89292</a> - [regression,bisected] incomplete screenshots in some cases</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89311">Bug 89311</a> - [regression, bisected] dEQP: Added entry points for glCompressedTextureSubImage*D.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89312">Bug 89312</a> - [regression, bisected] main: Added entry points for CopyTextureSubImage*D. (d6b7c40cecfe01)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89315">Bug 89315</a> - [HSW, regression, bisected] i965/fs: Emit MAD instructions when possible.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89317">Bug 89317</a> - [HSW, regression, bisected] i965: Add LINTERP/CINTERP to can_do_cmod() (d91390634)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89328">Bug 89328</a> - python required to build Mesa release tarballs</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89342">Bug 89342</a> - main/light.c:159:62: error: 'M_PI' undeclared (first use in this function)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89343">Bug 89343</a> - compiler/tests/radeon_compiler_optimize_tests.c:43:3: error: implicit declaration of function ‘fprintf’ [-Werror=implicit-function-declaration]</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89345">Bug 89345</a> - imports.h:452:58: error: expected declaration specifiers or '...' before 'va_list'</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89364">Bug 89364</a> - c99_alloca.h:40:22: fatal error: alloca.h: No such file or directory</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89372">Bug 89372</a> - [softpipe] piglit glsl-1.50 generate-zero-primitives regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89387">Bug 89387</a> - Double delete in lp_bld_misc.cpp</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89416">Bug 89416</a> - UE4Editor crash after load project</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89430">Bug 89430</a> - [g965][bisected] arb_copy_image-targets gl_texture* tests fail</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89433">Bug 89433</a> - GCC 4.2 does not support -Wvla</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89455">Bug 89455</a> - [NVC0/Gallium] Unigine Heaven black and white boxes</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89457">Bug 89457</a> - [BSW Bisected]ogles3conform ES3-CTS.gtf.GL3Tests.shadow.shadow_execution_vert fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89477">Bug 89477</a> - include/no_extern_c.h:47:1: error: template with C linkage</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89508">Bug 89508</a> - Bad int(floatBitsToInt(vec4))</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89530">Bug 89530</a> - FTBFS in loader: missing fstat</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89569">Bug 89569</a> - Papo & Yo crash on startup [HSW]</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89590">Bug 89590</a> - Crash in glLinkProgram with shaders with multiple constant arrays</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89662">Bug 89662</a> - context.c:943: undefined reference to `_glapi_new_nop_table'</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89670">Bug 89670</a> - cmod_propagation_test.andnz_one regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89679">Bug 89679</a> - [NV50] Portal/Half-Life 2 will not start (native Steam)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89689">Bug 89689</a> - [Regression] Weston on DRM backend won't start with new version of mesa</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89722">Bug 89722</a> - [ILK Bisected]Ogles2conform/ES2-CTS.gtf.GL.equal.equal_vec2_frag fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89726">Bug 89726</a> - [Bisected] dEQP-GLES3: uniform linking logic in the presence of structs</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89746">Bug 89746</a> - Mesa and LLVM 3.6+ break opengl for genymotion</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89754">Bug 89754</a> - vertexAttrib fails WebGL Conformance test with mesa drivers</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89758">Bug 89758</a> - pow WebGL Conformance test with mesa drivers</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89759">Bug 89759</a> - WebGL OGL ES GLSL conformance test with mesa drivers fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89831">Bug 89831</a> - [r600] r600_asm.c:310:assign_alu_units: Assertion `0' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89899">Bug 89899</a> - nir/nir_lower_tex_projector.c:112: error: unknown field ‘ssa’ specified in initializer</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89957">Bug 89957</a> - vm protection faults in piglit lest: texsubimage cube_map_array pbo</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89960">Bug 89960</a> - [softpipe] piglit copy-pixels regreession</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89961">Bug 89961</a> - [BDW/BSW Bisected]Synmark2_v6 OglDrvRes/OglDrvShComp/OglDrvState/OglPSPom Image Validation fail</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=89963">Bug 89963</a> - lp_bld_debug.cpp:100:31: error: no matching function for call to ‘llvm::raw_ostream::raw_ostream()’</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90000">Bug 90000</a> - [i965 Bisected NIR] Piglit/gglean_fragprog1-z-write_test fail</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90109">Bug 90109</a> - [SNB+ Bisected]Ogles3conform ES3-CTS.shaders.uniform_block.random.basic_arrays.3 fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90114">Bug 90114</a> - [SNB+ Bisected]Ogles3conform ES3-CTS.shaders.struct.uniform.sampler_array_fragment fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90130">Bug 90130</a> - gl_PrimitiveId seems to reset at 340</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90147">Bug 90147</a> - swrast: build error undeclared _SC_PHYS_PAGES on osx</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90149">Bug 90149</a> - [SNB+ Bisected]ES3-CTS.gtf.GL3Tests.uniform_buffer_object.uniform_buffer_object_getactiveuniformsiv_for_nonexistent_uniform_indices fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90153">Bug 90153</a> - [SKL Bisected]ES3-CTS.gtf.GL3Tests.uniform_buffer_object.uniform_buffer_object_all_valid_basic_types fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90167">Bug 90167</a> - [softpipe] piglit depthstencil-default_fb-drawpixels-32f_24_8_rev regression</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90207">Bug 90207</a> - [r600g, bisected] regression: NI/Turks crash on WebGL Water (most WebGL stuff)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90213">Bug 90213</a> - glDrawPixels with GL_COLOR_INDEX never returns.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90243">Bug 90243</a> - [bisected] regression: spec.!opengl 3_2.get-active-attrib-returns-all-inputs</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90258">Bug 90258</a> - [IVB] spec.glsl-1_10.execution.fs-dfdy-accuracy fails intermittently</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90310">Bug 90310</a> - Fails to build gallium_dri.so at linking stage with clang because of multiple redefinitions</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90350">Bug 90350</a> - [G96] Portal's portal are incorrectly rendered</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90363">Bug 90363</a> - [nv50] HW state is not reset correctly when using a new GL context</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90397">Bug 90397</a> - ARB_program_interface_query: glGetProgramResourceiv() returns wrong value for GL_REFERENCED_BY_*_SHADER prop for GL_UNIFORM for members of an interface block with an instance name</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90466">Bug 90466</a> - arm: linker error ndefined reference to `nir_metadata_preserve'</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90520">Bug 90520</a> - Register spilling clobbers registers used elsewhere in the shader</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90547">Bug 90547</a> - [BDW/BSW/SKL Bisected]Piglit/glean@vertprog1-rsq_test_2_(reciprocal_square_root_of_negative_value) fais</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90580">Bug 90580</a> - [HSW bisected] integer multiplication bug</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90629">Bug 90629</a> - [i965] SIMD16 dual_source_blend assertion `src[i].file != GRF || src[i].width == dst.width' failed</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90749">Bug 90749</a> - [BDW Bisected]dEQP-GLES3.functional.rasterization.fbo.rbo_multisample_max.primitives.lines_wide fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90830">Bug 90830</a> - [bsw bisected regression] GPU hang for spec.arb_gpu_shader5.execution.sampler_array_indexing.vs-nonzero-base</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90839">Bug 90839</a> - [10.5.5/10.6 regression, bisected] PBO glDrawPixels no longer using blit fastpath</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90905">Bug 90905</a> - mesa: Finish subdir-objects transition</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=9951">Bug 9951</a> - GL_LINE_SMOOTH and GL_POLYGON_SMOOTH with i965 driver</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
|
104
docs/relnotes/10.6.1.html
Normal file
104
docs/relnotes/10.6.1.html
Normal file
@@ -0,0 +1,104 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Mesa Release Notes</title>
|
||||
<link rel="stylesheet" type="text/css" href="../mesa.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="header">
|
||||
<h1>The Mesa 3D Graphics Library</h1>
|
||||
</div>
|
||||
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 10.6.1 Release Notes / June 29, 2015</h1>
|
||||
|
||||
<p>
|
||||
Mesa 10.6.1 is a bug fix release which fixes bugs found since the 10.6.0 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 10.6.1 implements the OpenGL 3.3 API, but the version reported by
|
||||
glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) /
|
||||
glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 3.3. OpenGL
|
||||
3.3 is <strong>only</strong> available if requested at context creation
|
||||
because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
b4cccd4d0eabcc2bca00c3175d3ad88fdda57ffdb883a7998525b873a21fe607 mesa-10.6.1.tar.gz
|
||||
6c80a2b647e57c85dc36e609d9aed17f878f0d8e0cf9ace86d14cf604101e1eb mesa-10.6.1.tar.xz
|
||||
</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=90347">Bug 90347</a> - [NVE0+] Failure to insert texbar under some circumstances (causing bad colors in Terasology)</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Anuj Phogat (4):</p>
|
||||
<ul>
|
||||
<li>mesa: Handle integer formats in need_rgb_to_luminance_conversion()</li>
|
||||
<li>mesa: Use helper function need_rgb_to_luminance_conversion()</li>
|
||||
<li>mesa: Turn need_rgb_to_luminance_conversion() in to a global function</li>
|
||||
<li>meta: Abort meta path if ReadPixels need rgb to luminance conversion</li>
|
||||
</ul>
|
||||
|
||||
<p>Ben Widawsky (1):</p>
|
||||
<ul>
|
||||
<li>i965/gen9: Implement Push Constant Buffer workaround</li>
|
||||
</ul>
|
||||
|
||||
<p>Boyan Ding (2):</p>
|
||||
<ul>
|
||||
<li>egl/x11: Set version of swrastLoader to 2</li>
|
||||
<li>egl/x11: Remove duplicate call to dri2_x11_add_configs_for_visuals</li>
|
||||
</ul>
|
||||
|
||||
<p>Emil Velikov (6):</p>
|
||||
<ul>
|
||||
<li>docs: Add sha256sums for the 10.6.0 release</li>
|
||||
<li>configure: warn about shared_glapi & xlib-glx only when both are set</li>
|
||||
<li>configure: error out when building backend-less libEGL</li>
|
||||
<li>configure: error out when building libEGL without shared-glapi</li>
|
||||
<li>gbm: do not (over)link against libglapi.so</li>
|
||||
<li>Update version to 10.6.1</li>
|
||||
</ul>
|
||||
|
||||
<p>Frank Henigman (1):</p>
|
||||
<ul>
|
||||
<li>gbm: dlopen libglapi so gbm_create_device works</li>
|
||||
</ul>
|
||||
|
||||
<p>Ilia Mirkin (9):</p>
|
||||
<ul>
|
||||
<li>nvc0/ir: fix collection of first uses for texture barrier insertion</li>
|
||||
<li>nv50,nvc0: clamp uniform size to 64k</li>
|
||||
<li>nvc0/ir: can't have a join on a load with an indirect source</li>
|
||||
<li>glsl: handle conversions to double when comparing param matches</li>
|
||||
<li>glsl: add version checks to conditionals for builtin variable enablement</li>
|
||||
<li>mesa: add GL_PROGRAM_PIPELINE support in KHR_debug calls</li>
|
||||
<li>glsl: binding point is a texture unit, which is a combined space</li>
|
||||
<li>nvc0: always put all tfb bufs into bufctx</li>
|
||||
<li>nv50,nvc0: make sure to pushbuf_refn before putting bo into pushbuf_data</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
165
docs/relnotes/10.6.2.html
Normal file
165
docs/relnotes/10.6.2.html
Normal file
@@ -0,0 +1,165 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Mesa Release Notes</title>
|
||||
<link rel="stylesheet" type="text/css" href="../mesa.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="header">
|
||||
<h1>The Mesa 3D Graphics Library</h1>
|
||||
</div>
|
||||
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 10.6.2 Release Notes / July 11, 2015</h1>
|
||||
|
||||
<p>
|
||||
Mesa 10.6.2 is a bug fix release which fixes bugs found since the 10.6.1 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 10.6.2 implements the OpenGL 3.3 API, but the version reported by
|
||||
glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) /
|
||||
glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 3.3. OpenGL
|
||||
3.3 is <strong>only</strong> available if requested at context creation
|
||||
because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
9c7ab9300dda6c912faaaff97995ec1820ba21d114d9cf555f145cbad90995f4 mesa-10.6.2.tar.gz
|
||||
05753d3db4212900927b9894221a1669a10f56786e86a7e818b6e18a0817dca9 mesa-10.6.2.tar.xz
|
||||
</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=73528">Bug 73528</a> - Deferred lighting in Second Life causes system hiccups and screen flickering</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=80500">Bug 80500</a> - Flickering shadows in unreleased title trace</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=82186">Bug 82186</a> - [r600g] BARTS GPU lockup with minecraft shaders</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84225">Bug 84225</a> - Allow constant-index-expression sampler array indexing with GLSL-ES < 300</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90537">Bug 90537</a> - radeonsi bo/va conflict on RADEON_GEM_VA (rscreen->ws->buffer_from_handle returns NULL)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=90873">Bug 90873</a> - Kernel hang, TearFree On, Mate desktop environment</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91022">Bug 91022</a> - [g45 g965 bisected] assertions generated from textureGrad cube samplers fix</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91047">Bug 91047</a> - [SNB Bisected] Messed up Fog in Super Smash Bros. Melee in Dolphin</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91056">Bug 91056</a> - The Bard's Tale (2005, native) has rendering issues</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91117">Bug 91117</a> - Nimbus (running in wine) has rendering issues, objects are semi-transparent</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91124">Bug 91124</a> - Civilization V (in Wine) has rendering issues: text missing, menu bar corrupted</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91173">Bug 91173</a> - Oddworld: Stranger's Wrath HD: disfigured models in wrong colors</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91226">Bug 91226</a> - Crash in glLinkProgram (NEW)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91231">Bug 91231</a> - [NV92] Psychonauts (native) segfaults on start when DRI3 enabled</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Chris Wilson (1):</p>
|
||||
<ul>
|
||||
<li>loader: Look for any version of currently linked libudev.so</li>
|
||||
</ul>
|
||||
|
||||
<p>Emil Velikov (2):</p>
|
||||
<ul>
|
||||
<li>docs: Add sha256 checksums for the 10.6.1 release</li>
|
||||
<li>Update version to 10.6.2</li>
|
||||
</ul>
|
||||
|
||||
<p>Ilia Mirkin (8):</p>
|
||||
<ul>
|
||||
<li>nv50/ir: propagate modifier to right arg when const-folding mad</li>
|
||||
<li>nv50/ir: fix emission of address reg in 3rd source</li>
|
||||
<li>nv50/ir: copy joinAt when splitting both before and after</li>
|
||||
<li>mesa: reset the source packing when creating temp transfer image</li>
|
||||
<li>nv50/ir: don't emit src2 in immediate form</li>
|
||||
<li>mesa/prog: relative offsets into constbufs are not constant</li>
|
||||
<li>nv50/ir: UCMP arguments are float, so make sure modifiers are applied</li>
|
||||
<li>nvc0: turn sample counts off during blit</li>
|
||||
</ul>
|
||||
|
||||
<p>Kenneth Graunke (5):</p>
|
||||
<ul>
|
||||
<li>i965/fs: Fix ir_txs in emit_texture_gen4_simd16().</li>
|
||||
<li>i965: Reserve more batch space to accomodate Gen6 perfmonitors.</li>
|
||||
<li>i965/vs: Fix matNxM vertex attributes where M != 4.</li>
|
||||
<li>Revert "glsl: clone inputs and outputs during linking"</li>
|
||||
<li>Revert "i965: Delete linked GLSL IR when using NIR."</li>
|
||||
</ul>
|
||||
|
||||
<p>Marek Olšák (3):</p>
|
||||
<ul>
|
||||
<li>r600g: disable single-sample fast color clear due to hangs</li>
|
||||
<li>radeonsi: fix a hang with DrawTransformFeedback on 4 SE chips</li>
|
||||
<li>st/dri: don't set PIPE_BIND_SCANOUT for MSAA surfaces</li>
|
||||
</ul>
|
||||
|
||||
<p>Mario Kleiner (2):</p>
|
||||
<ul>
|
||||
<li>nouveau: Use dup fd as key in drm-winsys hash table to fix ZaphodHeads.</li>
|
||||
<li>winsys/radeon: Use dup fd as key in drm-winsys hash table to fix ZaphodHeads.</li>
|
||||
</ul>
|
||||
|
||||
<p>Matt Turner (2):</p>
|
||||
<ul>
|
||||
<li>i965/fs: Don't mess up stride for uniform integer multiplication.</li>
|
||||
<li>Revert SHA1 additions.</li>
|
||||
</ul>
|
||||
|
||||
<p>Michel Dänzer (1):</p>
|
||||
<ul>
|
||||
<li>winsys/radeon: Unmap GPU VM address range when destroying BO</li>
|
||||
</ul>
|
||||
|
||||
<p>Mike Stroyan (2):</p>
|
||||
<ul>
|
||||
<li>meta: Only change and restore viewport 0 in mesa meta mode</li>
|
||||
<li>i965: allocate at least 1 BLEND_STATE element</li>
|
||||
</ul>
|
||||
|
||||
<p>Neil Roberts (4):</p>
|
||||
<ul>
|
||||
<li>i965/skl: Set the pulls bary bit in 3DSTATE_PS_EXTRA</li>
|
||||
<li>glsl: Add missing check for whether an expression is an add operation</li>
|
||||
<li>glsl: Make sure not to dereference NULL</li>
|
||||
<li>i965: Don't try to print the GLSL IR if it has been freed</li>
|
||||
</ul>
|
||||
|
||||
<p>Tapani Pälli (8):</p>
|
||||
<ul>
|
||||
<li>glsl: clone inputs and outputs during linking</li>
|
||||
<li>i965: Delete linked GLSL IR when using NIR.</li>
|
||||
<li>glsl: Allow dynamic sampler array indexing with GLSL ES < 3.00</li>
|
||||
<li>mesa/glsl: new compiler option EmitNoIndirectSampler</li>
|
||||
<li>i965: use EmitNoIndirectSampler for gen < 7</li>
|
||||
<li>i915: use EmitNoIndirectSampler</li>
|
||||
<li>mesa/st: use EmitNoIndirectSampler if !ARB_gpu_shader5</li>
|
||||
<li>glsl: validate sampler array indexing for 'constant-index-expression'</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
106
docs/relnotes/10.6.3.html
Normal file
106
docs/relnotes/10.6.3.html
Normal file
@@ -0,0 +1,106 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Mesa Release Notes</title>
|
||||
<link rel="stylesheet" type="text/css" href="../mesa.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="header">
|
||||
<h1>The Mesa 3D Graphics Library</h1>
|
||||
</div>
|
||||
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 10.6.3 Release Notes / July 26, 2015</h1>
|
||||
|
||||
<p>
|
||||
Mesa 10.6.3 is a bug fix release which fixes bugs found since the 10.6.2 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 10.6.3 implements the OpenGL 3.3 API, but the version reported by
|
||||
glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) /
|
||||
glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 3.3. OpenGL
|
||||
3.3 is <strong>only</strong> available if requested at context creation
|
||||
because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>SHA256 checksums</h2>
|
||||
<pre>
|
||||
c27e1e33798e69a6d2d2425aee8ac7b4c0b243066a65dd76cbb182ea31b1c7f2 mesa-10.6.3.tar.gz
|
||||
58592e07c350cd2e8969b73fa83048c657a39fe2f13f3b88f5e5818fe2e4676d mesa-10.6.3.tar.xz
|
||||
</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=90728">Bug 90728</a> - dvd playback with vlc and vdpau causes segmentation fault</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91337">Bug 91337</a> - OSMesaGetProcAdress("OSMesaPixelStore") returns nil</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Brian Paul (1):</p>
|
||||
<ul>
|
||||
<li>osmesa: fix OSMesaPixelsStore typo</li>
|
||||
</ul>
|
||||
|
||||
<p>Chad Versace (1):</p>
|
||||
<ul>
|
||||
<li>mesa: Fix generation of git_sha1.h.tmp for gitlinks</li>
|
||||
</ul>
|
||||
|
||||
<p>Christian König (2):</p>
|
||||
<ul>
|
||||
<li>vl: cleanup video buffer private when the decoder is destroyed</li>
|
||||
<li>st/vdpau: fix mixer size checks</li>
|
||||
</ul>
|
||||
|
||||
<p>Emil Velikov (3):</p>
|
||||
<ul>
|
||||
<li>docs: Add sha256 checksums for the 10.6.2 release</li>
|
||||
<li>auxiliary/vl: use the correct screen index</li>
|
||||
<li>Update version to 10.6.3</li>
|
||||
</ul>
|
||||
|
||||
<p>Francisco Jerez (1):</p>
|
||||
<ul>
|
||||
<li>i965/gen9: Use custom MOCS entries set up by the kernel.</li>
|
||||
</ul>
|
||||
|
||||
<p>Ilia Mirkin (5):</p>
|
||||
<ul>
|
||||
<li>nv50, nvc0: enable at least one color RT if alphatest is enabled</li>
|
||||
<li>nvc0/ir: fix txq on indirect samplers</li>
|
||||
<li>nvc0/ir: don't worry about sampler in txq handling</li>
|
||||
<li>gm107/ir: fix indirect txq emission</li>
|
||||
<li>nv50: fix max level clamping on G80</li>
|
||||
</ul>
|
||||
|
||||
<p>Kenneth Graunke (1):</p>
|
||||
<ul>
|
||||
<li>program: Allow redundant OPTION ARB_fog_* directives.</li>
|
||||
</ul>
|
||||
|
||||
<p>Rob Clark (1):</p>
|
||||
<ul>
|
||||
<li>xa: don't leak fences</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
136
docs/relnotes/10.6.4.html
Normal file
136
docs/relnotes/10.6.4.html
Normal file
@@ -0,0 +1,136 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Mesa Release Notes</title>
|
||||
<link rel="stylesheet" type="text/css" href="../mesa.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="header">
|
||||
<h1>The Mesa 3D Graphics Library</h1>
|
||||
</div>
|
||||
|
||||
<iframe src="../contents.html"></iframe>
|
||||
<div class="content">
|
||||
|
||||
<h1>Mesa 10.6.4 Release Notes / August 11, 2015</h1>
|
||||
|
||||
<p>
|
||||
Mesa 10.6.4 is a bug fix release which fixes bugs found since the 10.6.3 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 10.6.4 implements the OpenGL 3.3 API, but the version reported by
|
||||
glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) /
|
||||
glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 3.3. OpenGL
|
||||
3.3 is <strong>only</strong> available if requested at context creation
|
||||
because compatibility contexts are not supported.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>SHA256 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=73512">Bug 73512</a> - [clover] mesa.icd. should contain full path</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=91290">Bug 91290</a> - SIGSEGV glcpp/glcpp-parse.y:1077</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
|
||||
<p>Anuj Phogat (6):</p>
|
||||
<ul>
|
||||
<li>mesa: Turn get_readpixels_transfer_ops() in to a global function</li>
|
||||
<li>meta: Fix transfer operations check in meta pbo path for readpixels</li>
|
||||
<li>meta: Abort meta pbo path if readpixels need signed-unsigned conversion</li>
|
||||
<li>meta: Don't do fragment color clamping in _mesa_meta_pbo_GetTexSubImage</li>
|
||||
<li>mesa: Add a helper function _mesa_need_luminance_to_rgb_conversion()</li>
|
||||
<li>meta: Fix reading luminance texture as rgba in _mesa_meta_pbo_GetTexSubImage()</li>
|
||||
</ul>
|
||||
|
||||
<p>Ben Widawsky (1):</p>
|
||||
<ul>
|
||||
<li>i965/skl: Add production thread counts and URB size</li>
|
||||
</ul>
|
||||
|
||||
<p>Eduardo Lima Mitev (3):</p>
|
||||
<ul>
|
||||
<li>mesa: Fix errors values returned by glShaderBinary()</li>
|
||||
<li>mesa: Validate target before resolving tex obj in glTex(ture)SubImageXD</li>
|
||||
<li>mesa: Fix error returned by glCopyTexImage2D() upon an invalid internal format</li>
|
||||
</ul>
|
||||
|
||||
<p>Emil Velikov (6):</p>
|
||||
<ul>
|
||||
<li>docs: Add checksums for mesa 10.6.3 tarballs</li>
|
||||
<li>configure.ac: do not set HAVE_DRI(23) when libdrm is missing</li>
|
||||
<li>egl/wayland: libdrm is a hard requirement, treat it as such</li>
|
||||
<li>winsys/radeon: don't leak the fd when it is 0</li>
|
||||
<li>bugzilla_mesa.sh: sort the bugs list by number</li>
|
||||
<li>Update version to 10.6.4</li>
|
||||
</ul>
|
||||
|
||||
<p>Francisco Jerez (1):</p>
|
||||
<ul>
|
||||
<li>i965/fs: Fix fs_inst::regs_read() for sources in the ATTR file.</li>
|
||||
</ul>
|
||||
|
||||
<p>Frank Binns (2):</p>
|
||||
<ul>
|
||||
<li>egl/dri: Add error info needed for EGL_EXT_image_dma_buf_import extension</li>
|
||||
<li>egl: Add eglQuerySurface surface type check for EGL_LARGEST_PBUFFER attrib</li>
|
||||
</ul>
|
||||
|
||||
<p>Igor Gnatenko (1):</p>
|
||||
<ul>
|
||||
<li>opencl: use versioned .so in mesa.icd</li>
|
||||
</ul>
|
||||
|
||||
<p>Ilia Mirkin (1):</p>
|
||||
<ul>
|
||||
<li>nvc0: fix geometry program revalidation of clipping params</li>
|
||||
</ul>
|
||||
|
||||
<p>Kenneth Graunke (1):</p>
|
||||
<ul>
|
||||
<li>glsl: Fix a bug where LHS swizzles of swizzles were too small.</li>
|
||||
</ul>
|
||||
|
||||
<p>Marek Olšák (6):</p>
|
||||
<ul>
|
||||
<li>st/mesa: don't call st_validate_state in BlitFramebuffer</li>
|
||||
<li>radeonsi: upload shader rodata after updating scratch relocations</li>
|
||||
<li>st/mesa: don't ignore texture buffer state changes</li>
|
||||
<li>radeonsi: rework how shader pointers to descriptors are set</li>
|
||||
<li>radeonsi: completely rework updating descriptors without CP DMA</li>
|
||||
<li>r600g: fix the CB_SHADER_MASK setup</li>
|
||||
</ul>
|
||||
|
||||
<p>Samuel Iglesias Gonsalvez (1):</p>
|
||||
<ul>
|
||||
<li>glsl/glcpp: fix SIGSEGV when checking error condition for macro redefinition</li>
|
||||
</ul>
|
||||
|
||||
<p>Samuel Pitoiset (1):</p>
|
||||
<ul>
|
||||
<li>nv50: avoid segfault with enabled but unbound vertex attrib</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@@ -1180,7 +1180,8 @@ enum __DRIChromaSiting {
|
||||
};
|
||||
|
||||
/**
|
||||
* \name Reasons that __DRIimageExtensionRec::createImageFromTexture might fail
|
||||
* \name Reasons that __DRIimageExtensionRec::createImageFromTexture or
|
||||
* __DRIimageExtensionRec::createImageFromDmaBufs might fail
|
||||
*/
|
||||
/*@{*/
|
||||
/** Success! */
|
||||
@@ -1189,11 +1190,14 @@ enum __DRIChromaSiting {
|
||||
/** Memory allocation failure */
|
||||
#define __DRI_IMAGE_ERROR_BAD_ALLOC 1
|
||||
|
||||
/** Client requested an invalid attribute for a texture object */
|
||||
/** Client requested an invalid attribute */
|
||||
#define __DRI_IMAGE_ERROR_BAD_MATCH 2
|
||||
|
||||
/** Client requested an invalid texture object */
|
||||
#define __DRI_IMAGE_ERROR_BAD_PARAMETER 3
|
||||
|
||||
/** Client requested an invalid pitch and/or offset */
|
||||
#define __DRI_IMAGE_ERROR_BAD_ACCESS 4
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
|
@@ -72,4 +72,5 @@ noinst_LTLIBRARIES = libglsl_util.la
|
||||
libglsl_util_la_SOURCES = \
|
||||
mesa/main/imports.c \
|
||||
mesa/program/prog_hash_table.c \
|
||||
mesa/program/symbol_table.c
|
||||
mesa/program/symbol_table.c \
|
||||
mesa/program/dummy_errors.c
|
||||
|
@@ -1510,6 +1510,10 @@ dri2_create_image_khr_texture_error(int dri_error)
|
||||
egl_error = EGL_BAD_PARAMETER;
|
||||
break;
|
||||
|
||||
case __DRI_IMAGE_ERROR_BAD_ACCESS:
|
||||
egl_error = EGL_BAD_ACCESS;
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
egl_error = EGL_BAD_MATCH;
|
||||
@@ -2123,13 +2127,11 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
|
||||
wl_drm_callbacks.authenticate =
|
||||
(int(*)(void *, uint32_t)) dri2_dpy->vtbl->authenticate;
|
||||
|
||||
#ifdef HAVE_LIBDRM
|
||||
if (drmGetCap(dri2_dpy->fd, DRM_CAP_PRIME, &cap) == 0 &&
|
||||
cap == (DRM_PRIME_CAP_IMPORT | DRM_PRIME_CAP_EXPORT) &&
|
||||
dri2_dpy->image->base.version >= 7 &&
|
||||
dri2_dpy->image->createImageFromFds != NULL)
|
||||
flags |= WAYLAND_DRM_PRIME;
|
||||
#endif
|
||||
|
||||
dri2_dpy->wl_server_drm =
|
||||
wayland_drm_init(wl_dpy, dri2_dpy->device_name,
|
||||
|
@@ -1112,7 +1112,7 @@ dri2_initialize_x11_swrast(_EGLDriver *drv, _EGLDisplay *disp)
|
||||
goto cleanup_conn;
|
||||
|
||||
dri2_dpy->swrast_loader_extension.base.name = __DRI_SWRAST_LOADER;
|
||||
dri2_dpy->swrast_loader_extension.base.version = __DRI_SWRAST_LOADER_VERSION;
|
||||
dri2_dpy->swrast_loader_extension.base.version = 2;
|
||||
dri2_dpy->swrast_loader_extension.getDrawableInfo = swrastGetDrawableInfo;
|
||||
dri2_dpy->swrast_loader_extension.putImage = swrastPutImage;
|
||||
dri2_dpy->swrast_loader_extension.getImage = swrastGetImage;
|
||||
@@ -1283,11 +1283,6 @@ dri2_initialize_x11_dri2(_EGLDriver *drv, _EGLDisplay *disp)
|
||||
|
||||
dri2_x11_setup_swap_interval(dri2_dpy);
|
||||
|
||||
if (dri2_dpy->conn) {
|
||||
if (!dri2_x11_add_configs_for_visuals(dri2_dpy, disp))
|
||||
goto cleanup_configs;
|
||||
}
|
||||
|
||||
disp->Extensions.KHR_image_pixmap = EGL_TRUE;
|
||||
disp->Extensions.NOK_swap_region = EGL_TRUE;
|
||||
disp->Extensions.NOK_texture_from_pixmap = EGL_TRUE;
|
||||
|
@@ -131,7 +131,7 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
|
||||
break;
|
||||
}
|
||||
|
||||
ctx->Flags = val;
|
||||
ctx->Flags |= val;
|
||||
break;
|
||||
|
||||
case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
|
||||
@@ -194,7 +194,8 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
|
||||
break;
|
||||
}
|
||||
|
||||
ctx->Flags = EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
|
||||
if (val == EGL_TRUE)
|
||||
ctx->Flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@@ -309,7 +309,8 @@ _eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
|
||||
*value = surface->Config->ConfigID;
|
||||
break;
|
||||
case EGL_LARGEST_PBUFFER:
|
||||
*value = surface->LargestPbuffer;
|
||||
if (surface->Type == EGL_PBUFFER_BIT)
|
||||
*value = surface->LargestPbuffer;
|
||||
break;
|
||||
case EGL_TEXTURE_FORMAT:
|
||||
/* texture attributes: only for pbuffers, no error otherwise */
|
||||
|
@@ -300,6 +300,8 @@ void cso_destroy_context( struct cso_context *ctx )
|
||||
unsigned i, shader;
|
||||
|
||||
if (ctx->pipe) {
|
||||
ctx->pipe->set_index_buffer(ctx->pipe, NULL);
|
||||
|
||||
ctx->pipe->bind_blend_state( ctx->pipe, NULL );
|
||||
ctx->pipe->bind_rasterizer_state( ctx->pipe, NULL );
|
||||
|
||||
@@ -326,13 +328,18 @@ void cso_destroy_context( struct cso_context *ctx )
|
||||
|
||||
ctx->pipe->bind_depth_stencil_alpha_state( ctx->pipe, NULL );
|
||||
ctx->pipe->bind_fs_state( ctx->pipe, NULL );
|
||||
ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_FRAGMENT, 0, NULL);
|
||||
ctx->pipe->bind_vs_state( ctx->pipe, NULL );
|
||||
ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_VERTEX, 0, NULL);
|
||||
if (ctx->has_geometry_shader) {
|
||||
ctx->pipe->bind_gs_state(ctx->pipe, NULL);
|
||||
ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_GEOMETRY, 0, NULL);
|
||||
}
|
||||
if (ctx->has_tessellation) {
|
||||
ctx->pipe->bind_tcs_state(ctx->pipe, NULL);
|
||||
ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_TESS_CTRL, 0, NULL);
|
||||
ctx->pipe->bind_tes_state(ctx->pipe, NULL);
|
||||
ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_TESS_EVAL, 0, NULL);
|
||||
}
|
||||
ctx->pipe->bind_vertex_elements_state( ctx->pipe, NULL );
|
||||
|
||||
|
@@ -1965,7 +1965,7 @@ draw_llvm_set_sampler_state(struct draw_context *draw,
|
||||
for (i = 0; i < draw->num_samplers[PIPE_SHADER_VERTEX]; i++) {
|
||||
struct draw_jit_sampler *jit_sam = &draw->llvm->jit_context.samplers[i];
|
||||
|
||||
if (draw->samplers[i]) {
|
||||
if (draw->samplers[PIPE_SHADER_VERTEX][i]) {
|
||||
const struct pipe_sampler_state *s
|
||||
= draw->samplers[PIPE_SHADER_VERTEX][i];
|
||||
jit_sam->min_lod = s->min_lod;
|
||||
@@ -1978,7 +1978,7 @@ draw_llvm_set_sampler_state(struct draw_context *draw,
|
||||
for (i = 0; i < draw->num_samplers[PIPE_SHADER_GEOMETRY]; i++) {
|
||||
struct draw_jit_sampler *jit_sam = &draw->llvm->gs_jit_context.samplers[i];
|
||||
|
||||
if (draw->samplers[i]) {
|
||||
if (draw->samplers[PIPE_SHADER_GEOMETRY][i]) {
|
||||
const struct pipe_sampler_state *s
|
||||
= draw->samplers[PIPE_SHADER_GEOMETRY][i];
|
||||
jit_sam->min_lod = s->min_lod;
|
||||
|
@@ -42,6 +42,7 @@
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
#include "c99_math.h"
|
||||
#include <assert.h>
|
||||
#include <float.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
|
@@ -84,6 +84,9 @@ static const unsigned const_empty_block_mask_420[3][2][2] = {
|
||||
|
||||
struct video_buffer_private
|
||||
{
|
||||
struct list_head list;
|
||||
struct pipe_video_buffer *video_buffer;
|
||||
|
||||
struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS];
|
||||
struct pipe_surface *surfaces[VL_MAX_SURFACES];
|
||||
|
||||
@@ -99,6 +102,8 @@ destroy_video_buffer_private(void *private)
|
||||
struct video_buffer_private *priv = private;
|
||||
unsigned i;
|
||||
|
||||
list_del(&priv->list);
|
||||
|
||||
for (i = 0; i < VL_NUM_COMPONENTS; ++i)
|
||||
pipe_sampler_view_reference(&priv->sampler_view_planes[i], NULL);
|
||||
|
||||
@@ -126,6 +131,9 @@ get_video_buffer_private(struct vl_mpeg12_decoder *dec, struct pipe_video_buffer
|
||||
|
||||
priv = CALLOC_STRUCT(video_buffer_private);
|
||||
|
||||
list_add(&priv->list, &dec->buffer_privates);
|
||||
priv->video_buffer = buf;
|
||||
|
||||
sv = buf->get_sampler_view_planes(buf);
|
||||
for (i = 0; i < VL_NUM_COMPONENTS; ++i)
|
||||
if (sv[i])
|
||||
@@ -141,6 +149,18 @@ get_video_buffer_private(struct vl_mpeg12_decoder *dec, struct pipe_video_buffer
|
||||
return priv;
|
||||
}
|
||||
|
||||
static void
|
||||
free_video_buffer_privates(struct vl_mpeg12_decoder *dec)
|
||||
{
|
||||
struct video_buffer_private *priv, *next;
|
||||
|
||||
LIST_FOR_EACH_ENTRY_SAFE(priv, next, &dec->buffer_privates, list) {
|
||||
struct pipe_video_buffer *buf = priv->video_buffer;
|
||||
|
||||
vl_video_buffer_set_associated_data(buf, &dec->base, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer)
|
||||
{
|
||||
@@ -464,6 +484,8 @@ vl_mpeg12_destroy(struct pipe_video_codec *decoder)
|
||||
|
||||
assert(decoder);
|
||||
|
||||
free_video_buffer_privates(dec);
|
||||
|
||||
/* Asserted in softpipe_delete_fs_state() for some reason */
|
||||
dec->context->bind_vs_state(dec->context, NULL);
|
||||
dec->context->bind_fs_state(dec->context, NULL);
|
||||
@@ -1187,6 +1209,8 @@ vl_create_mpeg12_decoder(struct pipe_context *context,
|
||||
if (!init_pipe_state(dec))
|
||||
goto error_pipe_state;
|
||||
|
||||
list_inithead(&dec->buffer_privates);
|
||||
|
||||
return &dec->base;
|
||||
|
||||
error_pipe_state:
|
||||
|
@@ -30,6 +30,8 @@
|
||||
|
||||
#include "pipe/p_video_codec.h"
|
||||
|
||||
#include "util/list.h"
|
||||
|
||||
#include "vl_mpeg12_bitstream.h"
|
||||
#include "vl_zscan.h"
|
||||
#include "vl_idct.h"
|
||||
@@ -77,6 +79,8 @@ struct vl_mpeg12_decoder
|
||||
|
||||
unsigned current_buffer;
|
||||
struct vl_mpeg12_buffer *dec_buffers[4];
|
||||
|
||||
struct list_head buffer_privates;
|
||||
};
|
||||
|
||||
struct vl_mpeg12_buffer
|
||||
|
@@ -293,6 +293,16 @@ vl_screen_get_private(struct vl_screen *vscreen)
|
||||
return vscreen;
|
||||
}
|
||||
|
||||
static xcb_screen_t *
|
||||
get_xcb_screen(xcb_screen_iterator_t iter, int screen)
|
||||
{
|
||||
for (; iter.rem; --screen, xcb_screen_next(&iter))
|
||||
if (screen == 0)
|
||||
return iter.data;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct vl_screen*
|
||||
vl_screen_create(Display *display, int screen)
|
||||
{
|
||||
@@ -334,8 +344,7 @@ vl_screen_create(Display *display, int screen)
|
||||
goto free_query;
|
||||
|
||||
s = xcb_setup_roots_iterator(xcb_get_setup(scrn->conn));
|
||||
while (screen--)
|
||||
xcb_screen_next(&s);
|
||||
|
||||
driverType = XCB_DRI2_DRIVER_TYPE_DRI;
|
||||
#ifdef DRI2DriverPrimeShift
|
||||
{
|
||||
@@ -351,7 +360,7 @@ vl_screen_create(Display *display, int screen)
|
||||
}
|
||||
#endif
|
||||
|
||||
connect_cookie = xcb_dri2_connect_unchecked(scrn->conn, s.data->root, driverType);
|
||||
connect_cookie = xcb_dri2_connect_unchecked(scrn->conn, get_xcb_screen(s, screen)->root, driverType);
|
||||
connect = xcb_dri2_connect_reply(scrn->conn, connect_cookie, NULL);
|
||||
if (connect == NULL || connect->driver_name_length + connect->device_name_length == 0)
|
||||
goto free_connect;
|
||||
@@ -370,7 +379,7 @@ vl_screen_create(Display *display, int screen)
|
||||
if (drmGetMagic(fd, &magic))
|
||||
goto free_connect;
|
||||
|
||||
authenticate_cookie = xcb_dri2_authenticate_unchecked(scrn->conn, s.data->root, magic);
|
||||
authenticate_cookie = xcb_dri2_authenticate_unchecked(scrn->conn, get_xcb_screen(s, screen)->root, magic);
|
||||
authenticate = xcb_dri2_authenticate_reply(scrn->conn, authenticate_cookie, NULL);
|
||||
|
||||
if (authenticate == NULL || !authenticate->authenticated)
|
||||
|
@@ -21,6 +21,8 @@ libfreedreno_la_SOURCES = \
|
||||
|
||||
noinst_PROGRAMS = ir3_compiler
|
||||
|
||||
# XXX: Required due to the C++ sources in libnir/libglsl_util
|
||||
nodist_EXTRA_ir3_compiler_SOURCES = dummy.cpp
|
||||
ir3_compiler_SOURCES = \
|
||||
ir3/ir3_cmdline.c
|
||||
|
||||
@@ -29,7 +31,6 @@ ir3_compiler_LDADD = \
|
||||
../../auxiliary/libgallium.la \
|
||||
$(top_builddir)/src/glsl/libnir.la \
|
||||
$(top_builddir)/src/libglsl_util.la \
|
||||
-lstdc++ \
|
||||
$(top_builddir)/src/util/libmesautil.la \
|
||||
$(GALLIUM_COMMON_LIB_DEPS) \
|
||||
$(FREEDRENO_LIBS)
|
||||
|
@@ -413,12 +413,15 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit,
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO: Figure out if there's a way to make it spit out 0's and
|
||||
* 1's for the .z and .w components.
|
||||
/* Replace the .xy coordinates with S/T from the point sprite. Set
|
||||
* interpolation bits for .zw such that they become .01
|
||||
*/
|
||||
if (emit->sprite_coord_enable & (1 << sem2idx(fp->inputs[j].semantic)))
|
||||
if (emit->sprite_coord_enable & (1 << sem2idx(fp->inputs[j].semantic))) {
|
||||
vpsrepl[inloc / 16] |= (emit->sprite_coord_mode ? 0x0d : 0x09)
|
||||
<< ((inloc % 16) * 2);
|
||||
vinterp[(inloc + 2) / 16] |= 2 << (((inloc + 2) % 16) * 2);
|
||||
vinterp[(inloc + 3) / 16] |= 3 << (((inloc + 3) % 16) * 2);
|
||||
}
|
||||
}
|
||||
|
||||
OUT_PKT0(ring, REG_A3XX_VPC_ATTR, 2);
|
||||
|
@@ -360,11 +360,3 @@ int main(int argc, char **argv)
|
||||
}
|
||||
dump_info(&v, info);
|
||||
}
|
||||
|
||||
void _mesa_error_no_memory(const char *caller);
|
||||
|
||||
void
|
||||
_mesa_error_no_memory(const char *caller)
|
||||
{
|
||||
fprintf(stderr, "Mesa error: out of memory in %s", caller);
|
||||
}
|
||||
|
@@ -1615,7 +1615,7 @@ trans_samp(const struct instr_translater *t,
|
||||
instr->cat1.src_type = type_mov;
|
||||
instr->cat1.dst_type = type_mov;
|
||||
add_dst_reg(ctx, instr, &tmp_dst, i);
|
||||
add_src_reg(ctx, instr, &zero, 0);
|
||||
add_src_reg(ctx, instr, &zero, zero.SwizzleX);
|
||||
i++;
|
||||
}
|
||||
if (tgt->array) {
|
||||
@@ -1669,15 +1669,18 @@ trans_samp(const struct instr_translater *t,
|
||||
*/
|
||||
if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
|
||||
while (collect->regs_count < 5)
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA), &zero, 0);
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA),
|
||||
&zero, zero.SwizzleX);
|
||||
for (i = 0; i < tgt->dims; i++)
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA), dpdx, i);
|
||||
if (tgt->dims < 2)
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA), &zero, 0);
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA),
|
||||
&zero, zero.SwizzleX);
|
||||
for (i = 0; i < tgt->dims; i++)
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA), dpdy, i);
|
||||
if (tgt->dims < 2)
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA), &zero, 0);
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA),
|
||||
&zero, zero.SwizzleX);
|
||||
tinf.src_wrmask |= ((1 << (2 * MAX2(tgt->dims, 2))) - 1) << 4;
|
||||
}
|
||||
|
||||
@@ -1700,7 +1703,8 @@ trans_samp(const struct instr_translater *t,
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA),
|
||||
offset, i);
|
||||
if (tgt->dims < 2)
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA), &zero, 0);
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA),
|
||||
&zero, zero.SwizzleX);
|
||||
}
|
||||
if (inst->Instruction.Opcode == TGSI_OPCODE_TXB2)
|
||||
ssa_src(ctx, ir3_reg_create(collect, 0, IR3_REG_SSA),
|
||||
|
@@ -315,7 +315,7 @@ llvmpipe_check_render_cond(struct llvmpipe_context *lp)
|
||||
|
||||
b = pipe->get_query_result(pipe, lp->render_cond_query, wait, (void*)&result);
|
||||
if (b)
|
||||
return (!result == lp->render_cond_cond);
|
||||
return ((!result) == lp->render_cond_cond);
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
@@ -332,6 +332,9 @@ BasicBlock::splitBefore(Instruction *insn, bool attach)
|
||||
BasicBlock *bb = new BasicBlock(func);
|
||||
assert(!insn || insn->op != OP_PHI);
|
||||
|
||||
bb->joinAt = joinAt;
|
||||
joinAt = NULL;
|
||||
|
||||
splitCommon(insn, bb, attach);
|
||||
return bb;
|
||||
}
|
||||
|
@@ -2437,8 +2437,14 @@ CodeEmitterGM107::emitTXQ()
|
||||
break;
|
||||
}
|
||||
|
||||
emitInsn (0xdf4a0000);
|
||||
emitField(0x24, 13, insn->tex.r);
|
||||
if (insn->tex.rIndirectSrc >= 0) {
|
||||
emitInsn (0xdf500000);
|
||||
} else {
|
||||
emitInsn (0xdf480000);
|
||||
emitField(0x24, 13, insn->tex.r);
|
||||
}
|
||||
|
||||
emitField(0x31, 1, insn->tex.liveOnly);
|
||||
emitField(0x1f, 4, insn->tex.mask);
|
||||
emitField(0x16, 6, type);
|
||||
emitGPR (0x08, insn->src(0));
|
||||
|
@@ -499,10 +499,14 @@ CodeEmitterNV50::emitForm_MAD(const Instruction *i)
|
||||
setSrc(i, 2, 2);
|
||||
|
||||
if (i->getIndirect(0, 0)) {
|
||||
assert(!i->getIndirect(1, 0));
|
||||
assert(!i->srcExists(1) || !i->getIndirect(1, 0));
|
||||
assert(!i->srcExists(2) || !i->getIndirect(2, 0));
|
||||
setAReg16(i, 0);
|
||||
} else {
|
||||
} else if (i->srcExists(1) && i->getIndirect(1, 0)) {
|
||||
assert(!i->srcExists(2) || !i->getIndirect(2, 0));
|
||||
setAReg16(i, 1);
|
||||
} else {
|
||||
setAReg16(i, 2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -546,7 +550,7 @@ CodeEmitterNV50::emitForm_MUL(const Instruction *i)
|
||||
}
|
||||
|
||||
// usual immediate form
|
||||
// - 1 to 3 sources where last is immediate (rir, gir)
|
||||
// - 1 to 3 sources where second is immediate (rir, gir)
|
||||
// - no address or predicate possible
|
||||
void
|
||||
CodeEmitterNV50::emitForm_IMM(const Instruction *i)
|
||||
@@ -562,7 +566,7 @@ CodeEmitterNV50::emitForm_IMM(const Instruction *i)
|
||||
if (Target::operationSrcNr[i->op] > 1) {
|
||||
setSrc(i, 0, 0);
|
||||
setImmediate(i, 1);
|
||||
setSrc(i, 2, 1);
|
||||
// If there is another source, it has to be the same as the dest reg.
|
||||
} else {
|
||||
setImmediate(i, 0);
|
||||
}
|
||||
|
@@ -434,7 +434,6 @@ nv50_ir::DataType Instruction::inferSrcType() const
|
||||
case TGSI_OPCODE_USLT:
|
||||
case TGSI_OPCODE_USNE:
|
||||
case TGSI_OPCODE_USHR:
|
||||
case TGSI_OPCODE_UCMP:
|
||||
case TGSI_OPCODE_ATOMUADD:
|
||||
case TGSI_OPCODE_ATOMXCHG:
|
||||
case TGSI_OPCODE_ATOMCAS:
|
||||
@@ -1356,18 +1355,20 @@ Converter::srcToSym(tgsi::Instruction::SrcRegister src, int c)
|
||||
{
|
||||
const int swz = src.getSwizzle(c);
|
||||
|
||||
/* TODO: Use Array ID when it's available for the index */
|
||||
return makeSym(src.getFile(),
|
||||
src.is2D() ? src.getIndex(1) : 0,
|
||||
src.isIndirect(0) ? -1 : src.getIndex(0), swz,
|
||||
src.getIndex(0), swz,
|
||||
src.getIndex(0) * 16 + swz * 4);
|
||||
}
|
||||
|
||||
Symbol *
|
||||
Converter::dstToSym(tgsi::Instruction::DstRegister dst, int c)
|
||||
{
|
||||
/* TODO: Use Array ID when it's available for the index */
|
||||
return makeSym(dst.getFile(),
|
||||
dst.is2D() ? dst.getIndex(1) : 0,
|
||||
dst.isIndirect(0) ? -1 : dst.getIndex(0), c,
|
||||
dst.getIndex(0), c,
|
||||
dst.getIndex(0) * 16 + c * 4);
|
||||
}
|
||||
|
||||
@@ -1696,6 +1697,7 @@ Converter::insertConvergenceOps(BasicBlock *conv, BasicBlock *fork)
|
||||
join->fixed = 1;
|
||||
conv->insertHead(join);
|
||||
|
||||
assert(!fork->joinAt);
|
||||
fork->joinAt = new_FlowInstruction(func, OP_JOINAT, conv);
|
||||
fork->insertBefore(fork->getExit(), fork->joinAt);
|
||||
}
|
||||
@@ -1737,7 +1739,7 @@ Converter::handleTXQ(Value *dst0[4], enum TexQuery query)
|
||||
}
|
||||
tex->setSrc((c = 0), fetchSrc(0, 0)); // mip level
|
||||
|
||||
setTexRS(tex, c, 1, -1);
|
||||
setTexRS(tex, ++c, 1, -1);
|
||||
|
||||
bb->insertTail(tex);
|
||||
}
|
||||
@@ -2578,6 +2580,8 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
|
||||
}
|
||||
break;
|
||||
case TGSI_OPCODE_UCMP:
|
||||
srcTy = TYPE_U32;
|
||||
/* fallthrough */
|
||||
case TGSI_OPCODE_CMP:
|
||||
FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) {
|
||||
src0 = fetchSrc(0, c);
|
||||
|
@@ -240,6 +240,7 @@ GM107LoweringPass::visit(Instruction *i)
|
||||
Value *ptr = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
||||
i->getIndirect(0, 0), bld.mkImm(4));
|
||||
i->setIndirect(0, 0, ptr);
|
||||
i->op = OP_VFETCH;
|
||||
} else {
|
||||
i->op = OP_VFETCH;
|
||||
assert(prog->getType() != Program::TYPE_FRAGMENT); // INTERP
|
||||
|
@@ -871,6 +871,7 @@ NV50LoweringPreSSA::handleTXL(TexInstruction *i)
|
||||
BasicBlock *joinBB = i->bb->splitAfter(i);
|
||||
|
||||
bld.setPosition(currBB, true);
|
||||
assert(!currBB->joinAt);
|
||||
currBB->joinAt = bld.mkFlow(OP_JOINAT, joinBB, CC_ALWAYS, NULL);
|
||||
|
||||
for (int l = 0; l <= 3; ++l) {
|
||||
|
@@ -100,8 +100,7 @@ void
|
||||
NVC0LegalizeSSA::handleFTZ(Instruction *i)
|
||||
{
|
||||
// Only want to flush float inputs
|
||||
if (i->sType != TYPE_F32)
|
||||
return;
|
||||
assert(i->sType == TYPE_F32);
|
||||
|
||||
// If we're already flushing denorms (and NaN's) to zero, no need for this.
|
||||
if (i->dnz)
|
||||
@@ -129,7 +128,7 @@ NVC0LegalizeSSA::visit(BasicBlock *bb)
|
||||
Instruction *next;
|
||||
for (Instruction *i = bb->getEntry(); i; i = next) {
|
||||
next = i->next;
|
||||
if (i->dType == TYPE_F32) {
|
||||
if (i->sType == TYPE_F32) {
|
||||
if (prog->getType() != Program::TYPE_COMPUTE)
|
||||
handleFTZ(i);
|
||||
continue;
|
||||
@@ -169,7 +168,7 @@ NVC0LegalizePostRA::insnDominatedBy(const Instruction *later,
|
||||
|
||||
void
|
||||
NVC0LegalizePostRA::addTexUse(std::list<TexUse> &uses,
|
||||
Instruction *usei, const Instruction *insn)
|
||||
Instruction *usei, const Instruction *texi)
|
||||
{
|
||||
bool add = true;
|
||||
for (std::list<TexUse>::iterator it = uses.begin();
|
||||
@@ -184,7 +183,7 @@ NVC0LegalizePostRA::addTexUse(std::list<TexUse> &uses,
|
||||
++it;
|
||||
}
|
||||
if (add)
|
||||
uses.push_back(TexUse(usei, insn));
|
||||
uses.push_back(TexUse(usei, texi));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -196,7 +195,8 @@ NVC0LegalizePostRA::findOverwritingDefs(const Instruction *texi,
|
||||
while (insn->op == OP_MOV && insn->getDef(0)->equals(insn->getSrc(0)))
|
||||
insn = insn->getSrc(0)->getUniqueInsn();
|
||||
|
||||
if (!insn->bb->reachableBy(texi->bb, term))
|
||||
// NOTE: the tex itself is, of course, not an overwriting definition
|
||||
if (insn == texi || !insn->bb->reachableBy(texi->bb, term))
|
||||
return;
|
||||
|
||||
switch (insn->op) {
|
||||
@@ -244,7 +244,12 @@ NVC0LegalizePostRA::findFirstUses(
|
||||
visited.insert(usei);
|
||||
|
||||
if (usei->op == OP_PHI || usei->op == OP_UNION) {
|
||||
// need a barrier before WAW cases
|
||||
// need a barrier before WAW cases, like:
|
||||
// %r0 = tex
|
||||
// if ...
|
||||
// texbar <- is required or tex might replace x again
|
||||
// %r1 = x <- overwriting def
|
||||
// %r2 = phi %r0, %r1
|
||||
for (int s = 0; usei->srcExists(s); ++s) {
|
||||
Instruction *defi = usei->getSrc(s)->getUniqueInsn();
|
||||
if (defi && &usei->src(s) != *u)
|
||||
@@ -263,7 +268,7 @@ NVC0LegalizePostRA::findFirstUses(
|
||||
usei->subOp != NV50_IR_SUBOP_MOV_FINAL) {
|
||||
findFirstUses(texi, usei, uses, visited);
|
||||
} else {
|
||||
addTexUse(uses, usei, insn);
|
||||
addTexUse(uses, usei, texi);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -951,7 +956,47 @@ NVC0LoweringPass::handleTXD(TexInstruction *txd)
|
||||
bool
|
||||
NVC0LoweringPass::handleTXQ(TexInstruction *txq)
|
||||
{
|
||||
// TODO: indirect resource/sampler index
|
||||
if (txq->tex.rIndirectSrc < 0)
|
||||
return true;
|
||||
|
||||
Value *ticRel = txq->getIndirectR();
|
||||
const int chipset = prog->getTarget()->getChipset();
|
||||
|
||||
txq->setIndirectS(NULL);
|
||||
txq->tex.sIndirectSrc = -1;
|
||||
|
||||
assert(ticRel);
|
||||
|
||||
if (chipset < NVISA_GK104_CHIPSET) {
|
||||
LValue *src = new_LValue(func, FILE_GPR); // 0xttxsaaaa
|
||||
|
||||
txq->setSrc(txq->tex.rIndirectSrc, NULL);
|
||||
if (txq->tex.r)
|
||||
ticRel = bld.mkOp2v(OP_ADD, TYPE_U32, bld.getScratch(),
|
||||
ticRel, bld.mkImm(txq->tex.r));
|
||||
|
||||
bld.mkOp2(OP_SHL, TYPE_U32, src, ticRel, bld.mkImm(0x17));
|
||||
|
||||
txq->moveSources(0, 1);
|
||||
txq->setSrc(0, src);
|
||||
} else {
|
||||
Value *hnd = loadTexHandle(
|
||||
bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
||||
txq->getIndirectR(), bld.mkImm(2)),
|
||||
txq->tex.r);
|
||||
txq->tex.r = 0xff;
|
||||
txq->tex.s = 0x1f;
|
||||
|
||||
if (chipset < NVISA_GM107_CHIPSET) {
|
||||
txq->setIndirectR(NULL);
|
||||
txq->moveSources(0, 1);
|
||||
txq->setSrc(0, hnd);
|
||||
txq->tex.rIndirectSrc = 0;
|
||||
} else {
|
||||
txq->setIndirectR(hnd);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1751,6 +1796,7 @@ NVC0LoweringPass::visit(Instruction *i)
|
||||
Value *ptr = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
||||
i->getIndirect(0, 0), bld.mkImm(4));
|
||||
i->setIndirect(0, 0, ptr);
|
||||
i->op = OP_VFETCH;
|
||||
} else {
|
||||
i->op = OP_VFETCH;
|
||||
assert(prog->getType() != Program::TYPE_FRAGMENT); // INTERP
|
||||
|
@@ -236,6 +236,9 @@ LoadPropagation::visit(BasicBlock *bb)
|
||||
if (i->op == OP_CALL) // calls have args as sources, they must be in regs
|
||||
continue;
|
||||
|
||||
if (i->op == OP_PFETCH) // pfetch expects arg1 to be a reg
|
||||
continue;
|
||||
|
||||
if (i->srcExists(1))
|
||||
checkSwapSrc01(i);
|
||||
|
||||
@@ -574,6 +577,11 @@ ConstantFolding::expr(Instruction *i,
|
||||
case OP_POPCNT:
|
||||
res.data.u32 = util_bitcount(a->data.u32 & b->data.u32);
|
||||
break;
|
||||
case OP_PFETCH:
|
||||
// The two arguments to pfetch are logically added together. Normally
|
||||
// the second argument will not be constant, but that can happen.
|
||||
res.data.u32 = a->data.u32 + b->data.u32;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
@@ -588,12 +596,17 @@ ConstantFolding::expr(Instruction *i,
|
||||
|
||||
i->getSrc(0)->reg.data = res.data;
|
||||
|
||||
if (i->op == OP_MAD || i->op == OP_FMA) {
|
||||
switch (i->op) {
|
||||
case OP_MAD:
|
||||
case OP_FMA: {
|
||||
i->op = OP_ADD;
|
||||
|
||||
/* Move the immediate to the second arg, otherwise the ADD operation
|
||||
* won't be emittable
|
||||
*/
|
||||
i->setSrc(1, i->getSrc(0));
|
||||
i->src(1).mod = i->src(2).mod;
|
||||
i->setSrc(0, i->getSrc(2));
|
||||
i->src(0).mod = i->src(2).mod;
|
||||
i->setSrc(2, NULL);
|
||||
|
||||
ImmediateValue src0;
|
||||
@@ -603,8 +616,14 @@ ConstantFolding::expr(Instruction *i,
|
||||
bld.setPosition(i, false);
|
||||
i->setSrc(1, bld.loadImm(NULL, res.data.u32));
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
case OP_PFETCH:
|
||||
// Leave PFETCH alone... we just folded its 2 args into 1.
|
||||
break;
|
||||
default:
|
||||
i->op = i->saturate ? OP_SAT : OP_MOV; /* SAT handled by unary() */
|
||||
break;
|
||||
}
|
||||
i->subOp = 0;
|
||||
}
|
||||
@@ -2216,7 +2235,7 @@ FlatteningPass::visit(BasicBlock *bb)
|
||||
insn->op != OP_LINTERP && // probably just nve4
|
||||
insn->op != OP_PINTERP && // probably just nve4
|
||||
((insn->op != OP_LOAD && insn->op != OP_STORE) ||
|
||||
typeSizeof(insn->dType) <= 4) &&
|
||||
(typeSizeof(insn->dType) <= 4 && !insn->src(0).isIndirect(0))) &&
|
||||
!insn->isNop()) {
|
||||
insn->join = 1;
|
||||
bb->remove(bb->getExit());
|
||||
|
@@ -58,7 +58,7 @@ nv30_clear(struct pipe_context *pipe, unsigned buffers,
|
||||
struct pipe_framebuffer_state *fb = &nv30->framebuffer;
|
||||
uint32_t colr = 0, zeta = 0, mode = 0;
|
||||
|
||||
if (!nv30_state_validate(nv30, TRUE))
|
||||
if (!nv30_state_validate(nv30, NV30_NEW_FRAMEBUFFER | NV30_NEW_SCISSOR, TRUE))
|
||||
return;
|
||||
|
||||
if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) {
|
||||
|
@@ -204,7 +204,7 @@ void
|
||||
nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info);
|
||||
|
||||
boolean
|
||||
nv30_state_validate(struct nv30_context *nv30, boolean hwtnl);
|
||||
nv30_state_validate(struct nv30_context *nv30, uint32_t mask, boolean hwtnl);
|
||||
|
||||
void
|
||||
nv30_state_release(struct nv30_context *nv30);
|
||||
|
@@ -71,12 +71,12 @@ nv30_render_allocate_vertices(struct vbuf_render *render,
|
||||
struct nv30_render *r = nv30_render(render);
|
||||
struct nv30_context *nv30 = r->nv30;
|
||||
|
||||
r->length = vertex_size * nr_vertices;
|
||||
r->length = (uint32_t)vertex_size * (uint32_t)nr_vertices;
|
||||
|
||||
if (r->offset + r->length >= render->max_vertex_buffer_bytes) {
|
||||
pipe_resource_reference(&r->buffer, NULL);
|
||||
r->buffer = pipe_buffer_create(&nv30->screen->base.base,
|
||||
PIPE_BIND_VERTEX_BUFFER, 0,
|
||||
PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM,
|
||||
render->max_vertex_buffer_bytes);
|
||||
if (!r->buffer)
|
||||
return FALSE;
|
||||
@@ -91,10 +91,14 @@ static void *
|
||||
nv30_render_map_vertices(struct vbuf_render *render)
|
||||
{
|
||||
struct nv30_render *r = nv30_render(render);
|
||||
char *map = pipe_buffer_map(&r->nv30->base.pipe, r->buffer,
|
||||
PIPE_TRANSFER_WRITE |
|
||||
PIPE_TRANSFER_UNSYNCHRONIZED, &r->transfer);
|
||||
return map + r->offset;
|
||||
char *map = pipe_buffer_map_range(
|
||||
&r->nv30->base.pipe, r->buffer,
|
||||
r->offset, r->length,
|
||||
PIPE_TRANSFER_WRITE |
|
||||
PIPE_TRANSFER_DISCARD_RANGE,
|
||||
&r->transfer);
|
||||
assert(map);
|
||||
return map;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -103,6 +107,7 @@ nv30_render_unmap_vertices(struct vbuf_render *render,
|
||||
{
|
||||
struct nv30_render *r = nv30_render(render);
|
||||
pipe_buffer_unmap(&r->nv30->base.pipe, r->transfer);
|
||||
r->transfer = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -126,10 +131,10 @@ nv30_render_draw_elements(struct vbuf_render *render,
|
||||
for (i = 0; i < r->vertex_info.num_attribs; i++) {
|
||||
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
||||
nv04_resource(r->buffer), r->offset + r->vtxptr[i],
|
||||
NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, 0);
|
||||
NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1);
|
||||
}
|
||||
|
||||
if (!nv30_state_validate(nv30, FALSE))
|
||||
if (!nv30_state_validate(nv30, ~0, FALSE))
|
||||
return;
|
||||
|
||||
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
||||
@@ -171,10 +176,10 @@ nv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr)
|
||||
for (i = 0; i < r->vertex_info.num_attribs; i++) {
|
||||
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
||||
nv04_resource(r->buffer), r->offset + r->vtxptr[i],
|
||||
NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, 0);
|
||||
NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1);
|
||||
}
|
||||
|
||||
if (!nv30_state_validate(nv30, FALSE))
|
||||
if (!nv30_state_validate(nv30, ~0, FALSE))
|
||||
return;
|
||||
|
||||
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
||||
@@ -213,22 +218,24 @@ static const struct {
|
||||
[TGSI_SEMANTIC_BCOLOR ] = { EMIT_4F, INTERP_LINEAR , 1, 3, 0x00000004 },
|
||||
[TGSI_SEMANTIC_FOG ] = { EMIT_4F, INTERP_PERSPECTIVE, 5, 5, 0x00000010 },
|
||||
[TGSI_SEMANTIC_PSIZE ] = { EMIT_1F_PSIZE, INTERP_POS , 6, 6, 0x00000020 },
|
||||
[TGSI_SEMANTIC_GENERIC ] = { EMIT_4F, INTERP_PERSPECTIVE, 8, 7, 0x00004000 }
|
||||
[TGSI_SEMANTIC_TEXCOORD] = { EMIT_4F, INTERP_PERSPECTIVE, 8, 7, 0x00004000 },
|
||||
};
|
||||
|
||||
static boolean
|
||||
vroute_add(struct nv30_render *r, uint attrib, uint sem, uint *idx)
|
||||
{
|
||||
struct pipe_screen *pscreen = &r->nv30->screen->base.base;
|
||||
struct nv30_screen *screen = r->nv30->screen;
|
||||
struct nv30_fragprog *fp = r->nv30->fragprog.program;
|
||||
struct vertex_info *vinfo = &r->vertex_info;
|
||||
enum pipe_format format;
|
||||
uint emit = EMIT_OMIT;
|
||||
uint result = *idx;
|
||||
|
||||
if (sem == TGSI_SEMANTIC_GENERIC && result >= 8) {
|
||||
for (result = 0; result < 8; result++) {
|
||||
if (fp->texcoord[result] == *idx) {
|
||||
if (sem == TGSI_SEMANTIC_GENERIC) {
|
||||
uint num_texcoords = (screen->eng3d->oclass < NV40_3D_CLASS) ? 8 : 10;
|
||||
for (result = 0; result < num_texcoords; result++) {
|
||||
if (fp->texcoord[result] == *idx + 8) {
|
||||
sem = TGSI_SEMANTIC_TEXCOORD;
|
||||
emit = vroute[sem].emit;
|
||||
break;
|
||||
}
|
||||
@@ -243,11 +250,11 @@ vroute_add(struct nv30_render *r, uint attrib, uint sem, uint *idx)
|
||||
draw_emit_vertex_attr(vinfo, emit, vroute[sem].interp, attrib);
|
||||
format = draw_translate_vinfo_format(emit);
|
||||
|
||||
r->vtxfmt[attrib] = nv30_vtxfmt(pscreen, format)->hw;
|
||||
r->vtxptr[attrib] = vinfo->size | NV30_3D_VTXBUF_DMA1;
|
||||
r->vtxfmt[attrib] = nv30_vtxfmt(&screen->base.base, format)->hw;
|
||||
r->vtxptr[attrib] = vinfo->size;
|
||||
vinfo->size += draw_translate_vinfo_size(emit);
|
||||
|
||||
if (nv30_screen(pscreen)->eng3d->oclass < NV40_3D_CLASS) {
|
||||
if (screen->eng3d->oclass < NV40_3D_CLASS) {
|
||||
r->vtxprog[attrib][0] = 0x001f38d8;
|
||||
r->vtxprog[attrib][1] = 0x0080001b | (attrib << 9);
|
||||
r->vtxprog[attrib][2] = 0x0836106c;
|
||||
@@ -259,7 +266,12 @@ vroute_add(struct nv30_render *r, uint attrib, uint sem, uint *idx)
|
||||
r->vtxprog[attrib][3] = 0x6041ff80 | (result + vroute[sem].vp40) << 2;
|
||||
}
|
||||
|
||||
*idx = vroute[sem].ow40 << result;
|
||||
if (result < 8)
|
||||
*idx = vroute[sem].ow40 << result;
|
||||
else {
|
||||
assert(sem == TGSI_SEMANTIC_TEXCOORD);
|
||||
*idx = 0x00001000 << (result - 8);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -313,7 +325,7 @@ nv30_render_validate(struct nv30_context *nv30)
|
||||
|
||||
while (pntc && attrib < 16) {
|
||||
uint index = ffs(pntc) - 1; pntc &= ~(1 << index);
|
||||
if (vroute_add(r, attrib, TGSI_SEMANTIC_GENERIC, &index)) {
|
||||
if (vroute_add(r, attrib, TGSI_SEMANTIC_TEXCOORD, &index)) {
|
||||
vp_attribs |= (1 << attrib++);
|
||||
vp_results |= index;
|
||||
}
|
||||
@@ -398,17 +410,17 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
||||
if (nv30->vertprog.constbuf) {
|
||||
void *map = nv04_resource(nv30->vertprog.constbuf)->data;
|
||||
draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0,
|
||||
map, nv30->vertprog.constbuf_nr);
|
||||
map, nv30->vertprog.constbuf_nr * 16);
|
||||
} else {
|
||||
draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < nv30->num_vtxbufs; i++) {
|
||||
const void *map = nv30->vtxbuf[i].user_buffer;
|
||||
if (!map) {
|
||||
if (!nv30->vtxbuf[i].buffer) {
|
||||
continue;
|
||||
}
|
||||
map = pipe_buffer_map(pipe, nv30->vtxbuf[i].buffer,
|
||||
if (nv30->vtxbuf[i].buffer)
|
||||
map = pipe_buffer_map(pipe, nv30->vtxbuf[i].buffer,
|
||||
PIPE_TRANSFER_UNSYNCHRONIZED |
|
||||
PIPE_TRANSFER_READ, &transfer[i]);
|
||||
}
|
||||
@@ -418,9 +430,9 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
||||
if (info->indexed) {
|
||||
const void *map = nv30->idxbuf.user_buffer;
|
||||
if (!map)
|
||||
pipe_buffer_map(pipe, nv30->idxbuf.buffer,
|
||||
PIPE_TRANSFER_UNSYNCHRONIZED |
|
||||
PIPE_TRANSFER_READ, &transferi);
|
||||
map = pipe_buffer_map(pipe, nv30->idxbuf.buffer,
|
||||
PIPE_TRANSFER_UNSYNCHRONIZED |
|
||||
PIPE_TRANSFER_READ, &transferi);
|
||||
draw_set_indexes(draw,
|
||||
(ubyte *) map + nv30->idxbuf.offset,
|
||||
nv30->idxbuf.index_size, ~0);
|
||||
@@ -444,6 +456,12 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
||||
static void
|
||||
nv30_render_destroy(struct vbuf_render *render)
|
||||
{
|
||||
struct nv30_render *r = nv30_render(render);
|
||||
|
||||
if (r->transfer)
|
||||
pipe_buffer_unmap(&r->nv30->base.pipe, r->transfer);
|
||||
pipe_resource_reference(&r->buffer, NULL);
|
||||
nouveau_heap_free(&r->vertprog);
|
||||
FREE(render);
|
||||
}
|
||||
|
||||
|
@@ -23,6 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "draw/draw_context.h"
|
||||
#include "tgsi/tgsi_parse.h"
|
||||
|
||||
#include "nv_object.xml.h"
|
||||
@@ -147,8 +148,12 @@ nv30_fp_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
|
||||
pipe_resource_reference(&fp->buffer, NULL);
|
||||
|
||||
if (fp->draw)
|
||||
draw_delete_fragment_shader(nv30_context(pipe)->draw, fp->draw);
|
||||
|
||||
FREE((void *)fp->pipe.tokens);
|
||||
FREE(fp->insn);
|
||||
FREE(fp->consts);
|
||||
FREE(fp);
|
||||
}
|
||||
|
||||
|
@@ -272,15 +272,13 @@ nv30_validate_clip(struct nv30_context *nv30)
|
||||
uint32_t clpd_enable = 0;
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
if (nv30->rast->pipe.clip_plane_enable & (1 << i)) {
|
||||
if (nv30->dirty & NV30_NEW_CLIP) {
|
||||
BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 5);
|
||||
PUSH_DATA (push, i);
|
||||
PUSH_DATAp(push, nv30->clip.ucp[i], 4);
|
||||
}
|
||||
|
||||
clpd_enable |= 1 << (1 + 4*i);
|
||||
if (nv30->dirty & NV30_NEW_CLIP) {
|
||||
BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 5);
|
||||
PUSH_DATA (push, i);
|
||||
PUSH_DATAp(push, nv30->clip.ucp[i], 4);
|
||||
}
|
||||
if (nv30->rast->pipe.clip_plane_enable & (1 << i))
|
||||
clpd_enable |= 2 << (4*i);
|
||||
}
|
||||
|
||||
BEGIN_NV04(push, NV30_3D(VP_CLIP_PLANES_ENABLE), 1);
|
||||
@@ -389,7 +387,7 @@ static struct state_validate hwtnl_validate_list[] = {
|
||||
{ nv30_validate_stipple, NV30_NEW_STIPPLE },
|
||||
{ nv30_validate_scissor, NV30_NEW_SCISSOR | NV30_NEW_RASTERIZER },
|
||||
{ nv30_validate_viewport, NV30_NEW_VIEWPORT },
|
||||
{ nv30_validate_clip, NV30_NEW_CLIP },
|
||||
{ nv30_validate_clip, NV30_NEW_CLIP | NV30_NEW_RASTERIZER },
|
||||
{ nv30_fragprog_validate, NV30_NEW_FRAGPROG | NV30_NEW_FRAGCONST },
|
||||
{ nv30_vertprog_validate, NV30_NEW_VERTPROG | NV30_NEW_VERTCONST |
|
||||
NV30_NEW_FRAGPROG | NV30_NEW_RASTERIZER },
|
||||
@@ -456,7 +454,7 @@ nv30_state_context_switch(struct nv30_context *nv30)
|
||||
}
|
||||
|
||||
boolean
|
||||
nv30_state_validate(struct nv30_context *nv30, boolean hwtnl)
|
||||
nv30_state_validate(struct nv30_context *nv30, uint32_t mask, boolean hwtnl)
|
||||
{
|
||||
struct nouveau_screen *screen = &nv30->screen->base;
|
||||
struct nouveau_pushbuf *push = nv30->base.pushbuf;
|
||||
@@ -481,14 +479,16 @@ nv30_state_validate(struct nv30_context *nv30, boolean hwtnl)
|
||||
else
|
||||
validate = swtnl_validate_list;
|
||||
|
||||
if (nv30->dirty) {
|
||||
mask &= nv30->dirty;
|
||||
|
||||
if (mask) {
|
||||
while (validate->func) {
|
||||
if (nv30->dirty & validate->mask)
|
||||
if (mask & validate->mask)
|
||||
validate->func(nv30);
|
||||
validate++;
|
||||
}
|
||||
|
||||
nv30->dirty = 0;
|
||||
nv30->dirty &= ~mask;
|
||||
}
|
||||
|
||||
nouveau_pushbuf_bufctx(push, bctx);
|
||||
|
@@ -564,7 +564,7 @@ nv30_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
||||
if (nv30->vbo_user && !(nv30->dirty & (NV30_NEW_VERTEX | NV30_NEW_ARRAYS)))
|
||||
nv30_update_user_vbufs(nv30);
|
||||
|
||||
nv30_state_validate(nv30, TRUE);
|
||||
nv30_state_validate(nv30, ~0, TRUE);
|
||||
if (nv30->draw_flags) {
|
||||
nv30_render_vbo(pipe, info);
|
||||
return;
|
||||
|
@@ -23,6 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "draw/draw_context.h"
|
||||
#include "util/u_dynarray.h"
|
||||
#include "tgsi/tgsi_parse.h"
|
||||
|
||||
@@ -237,6 +238,10 @@ nv30_vp_state_delete(struct pipe_context *pipe, void *hwcso)
|
||||
|
||||
if (vp->translated)
|
||||
nv30_vertprog_destroy(vp);
|
||||
|
||||
if (vp->draw)
|
||||
draw_delete_vertex_shader(nv30_context(pipe)->draw, vp->draw);
|
||||
|
||||
FREE((void *)vp->pipe.tokens);
|
||||
FREE(vp);
|
||||
}
|
||||
|
@@ -872,9 +872,8 @@ nvfx_vertprog_parse_decl_output(struct nvfx_vpc *vpc,
|
||||
}
|
||||
break;
|
||||
case TGSI_SEMANTIC_EDGEFLAG:
|
||||
/* not really an error just a fallback */
|
||||
NOUVEAU_ERR("cannot handle edgeflag output\n");
|
||||
return FALSE;
|
||||
vpc->r_result[idx] = nvfx_reg(NVFXSR_NONE, 0);
|
||||
return TRUE;
|
||||
default:
|
||||
NOUVEAU_ERR("bad output semantic\n");
|
||||
return FALSE;
|
||||
|
@@ -419,7 +419,7 @@ nv50_miptree_from_handle(struct pipe_screen *pscreen,
|
||||
FREE(mt);
|
||||
return NULL;
|
||||
}
|
||||
mt->base.domain = NOUVEAU_BO_VRAM;
|
||||
mt->base.domain = mt->base.bo->flags & NOUVEAU_BO_APER;
|
||||
mt->base.address = mt->base.bo->offset;
|
||||
|
||||
mt->base.base = *templ;
|
||||
|
@@ -434,6 +434,7 @@ nv50_query_pushbuf_submit(struct nouveau_pushbuf *push,
|
||||
/* XXX: does this exist ? */
|
||||
#define NV50_IB_ENTRY_1_NO_PREFETCH (0 << (31 - 8))
|
||||
|
||||
PUSH_REFN(push, q->bo, NOUVEAU_BO_RD | NOUVEAU_BO_GART);
|
||||
nouveau_pushbuf_space(push, 0, 0, 1);
|
||||
nouveau_pushbuf_data(push, q->bo, q->offset + result_offset, 4 |
|
||||
NV50_IB_ENTRY_1_NO_PREFETCH);
|
||||
|
@@ -811,12 +811,12 @@ nv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
|
||||
nv50->constbuf[s][i].user = (cb && cb->user_buffer) ? TRUE : FALSE;
|
||||
if (nv50->constbuf[s][i].user) {
|
||||
nv50->constbuf[s][i].u.data = cb->user_buffer;
|
||||
nv50->constbuf[s][i].size = cb->buffer_size;
|
||||
nv50->constbuf[s][i].size = MIN2(cb->buffer_size, 0x10000);
|
||||
nv50->constbuf_valid[s] |= 1 << i;
|
||||
} else
|
||||
if (res) {
|
||||
nv50->constbuf[s][i].offset = cb->buffer_offset;
|
||||
nv50->constbuf[s][i].size = align(cb->buffer_size, 0x100);
|
||||
nv50->constbuf[s][i].size = MIN2(align(cb->buffer_size, 0x100), 0x10000);
|
||||
nv50->constbuf_valid[s] |= 1 << i;
|
||||
} else {
|
||||
nv50->constbuf_valid[s] &= ~(1 << i);
|
||||
|
@@ -296,6 +296,23 @@ nv50_check_program_ucps(struct nv50_context *nv50,
|
||||
nv50_fp_linkage_validate(nv50);
|
||||
}
|
||||
|
||||
/* alpha test is disabled if there are no color RTs, so make sure we have at
|
||||
* least one if alpha test is enabled. Note that this must run after
|
||||
* nv50_validate_fb, otherwise that will override the RT count setting.
|
||||
*/
|
||||
static void
|
||||
nv50_validate_derived_2(struct nv50_context *nv50)
|
||||
{
|
||||
struct nouveau_pushbuf *push = nv50->base.pushbuf;
|
||||
|
||||
if (nv50->zsa && nv50->zsa->pipe.alpha.enabled &&
|
||||
nv50->framebuffer.nr_cbufs == 0) {
|
||||
nv50_fb_set_null_rt(push, 0);
|
||||
BEGIN_NV04(push, NV50_3D(RT_CONTROL), 1);
|
||||
PUSH_DATA (push, (076543210 << 4) | 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nv50_validate_clip(struct nv50_context *nv50)
|
||||
{
|
||||
@@ -456,6 +473,7 @@ static struct state_validate {
|
||||
{ nv50_gp_linkage_validate, NV50_NEW_GMTYPROG | NV50_NEW_VERTPROG },
|
||||
{ nv50_validate_derived_rs, NV50_NEW_FRAGPROG | NV50_NEW_RASTERIZER |
|
||||
NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG },
|
||||
{ nv50_validate_derived_2, NV50_NEW_ZSA | NV50_NEW_FRAMEBUFFER },
|
||||
{ nv50_validate_clip, NV50_NEW_CLIP | NV50_NEW_RASTERIZER |
|
||||
NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG },
|
||||
{ nv50_constbufs_validate, NV50_NEW_CONSTBUF },
|
||||
|
@@ -71,6 +71,7 @@ nv50_create_texture_view(struct pipe_context *pipe,
|
||||
uint32_t flags,
|
||||
enum pipe_texture_target target)
|
||||
{
|
||||
const uint32_t class_3d = nouveau_context(pipe)->screen->class_3d;
|
||||
const struct util_format_description *desc;
|
||||
uint64_t addr;
|
||||
uint32_t *tic;
|
||||
@@ -201,11 +202,17 @@ nv50_create_texture_view(struct pipe_context *pipe,
|
||||
|
||||
tic[5] = (mt->base.base.height0 << mt->ms_y) & 0xffff;
|
||||
tic[5] |= depth << 16;
|
||||
tic[5] |= mt->base.base.last_level << NV50_TIC_5_LAST_LEVEL__SHIFT;
|
||||
if (class_3d > NV50_3D_CLASS)
|
||||
tic[5] |= mt->base.base.last_level << NV50_TIC_5_LAST_LEVEL__SHIFT;
|
||||
else
|
||||
tic[5] |= view->pipe.u.tex.last_level << NV50_TIC_5_LAST_LEVEL__SHIFT;
|
||||
|
||||
tic[6] = (mt->ms_x > 1) ? 0x88000000 : 0x03000000; /* sampling points */
|
||||
|
||||
tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level;
|
||||
if (class_3d > NV50_3D_CLASS)
|
||||
tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level;
|
||||
else
|
||||
tic[7] = 0;
|
||||
|
||||
if (unlikely(!(tic[2] & NV50_TIC_2_NORMALIZED_COORDS)))
|
||||
if (mt->base.base.last_level)
|
||||
|
@@ -382,6 +382,11 @@ nv50_vertex_arrays_validate(struct nv50_context *nv50)
|
||||
if (nv50->vbo_user & (1 << b)) {
|
||||
address = addrs[b] + ve->pipe.src_offset;
|
||||
limit = addrs[b] + limits[b];
|
||||
} else
|
||||
if (!vb->buffer) {
|
||||
BEGIN_NV04(push, NV50_3D(VERTEX_ARRAY_FETCH(i)), 1);
|
||||
PUSH_DATA (push, 0);
|
||||
continue;
|
||||
} else {
|
||||
struct nv04_resource *buf = nv04_resource(vb->buffer);
|
||||
if (!(refd & (1 << b))) {
|
||||
@@ -628,6 +633,7 @@ nv50_draw_elements(struct nv50_context *nv50, boolean shorten,
|
||||
BEGIN_NV04(push, NV50_3D(VERTEX_BEGIN_GL), 1);
|
||||
PUSH_DATA (push, prim);
|
||||
|
||||
PUSH_REFN(push, buf->bo, NOUVEAU_BO_RD | buf->domain);
|
||||
nouveau_pushbuf_space(push, 8, 0, 1);
|
||||
|
||||
switch (index_size) {
|
||||
|
@@ -392,7 +392,7 @@ nvc0_gp_gen_header(struct nvc0_program *gp, struct nv50_ir_prog_info *info)
|
||||
break;
|
||||
}
|
||||
|
||||
gp->hdr[4] = info->prop.gp.maxVertices & 0x1ff;
|
||||
gp->hdr[4] = MIN2(info->prop.gp.maxVertices, 1024);
|
||||
|
||||
return nvc0_vtgp_gen_header(gp, info);
|
||||
}
|
||||
|
@@ -617,6 +617,7 @@ nvc0_query_pushbuf_submit(struct nouveau_pushbuf *push,
|
||||
|
||||
#define NVC0_IB_ENTRY_1_NO_PREFETCH (1 << (31 - 8))
|
||||
|
||||
PUSH_REFN(push, q->bo, NOUVEAU_BO_RD | NOUVEAU_BO_GART);
|
||||
nouveau_pushbuf_space(push, 0, 0, 1);
|
||||
nouveau_pushbuf_data(push, q->bo, q->offset + result_offset, 4 |
|
||||
NVC0_IB_ENTRY_1_NO_PREFETCH);
|
||||
|
@@ -262,11 +262,13 @@ nvc0_tfb_validate(struct nvc0_context *nvc0)
|
||||
if (tfb)
|
||||
targ->stride = tfb->stride[b];
|
||||
|
||||
buf = nv04_resource(targ->pipe.buffer);
|
||||
|
||||
BCTX_REFN(nvc0->bufctx_3d, TFB, buf, WR);
|
||||
|
||||
if (!(nvc0->tfbbuf_dirty & (1 << b)))
|
||||
continue;
|
||||
|
||||
buf = nv04_resource(targ->pipe.buffer);
|
||||
|
||||
if (!targ->clean)
|
||||
nvc0_query_fifo_wait(push, targ->pq);
|
||||
BEGIN_NVC0(push, NVC0_3D(TFB_BUFFER_ENABLE(b)), 5);
|
||||
@@ -280,7 +282,6 @@ nvc0_tfb_validate(struct nvc0_context *nvc0)
|
||||
PUSH_DATA(push, 0); /* TFB_BUFFER_OFFSET */
|
||||
targ->clean = FALSE;
|
||||
}
|
||||
BCTX_REFN(nvc0->bufctx_3d, TFB, buf, WR);
|
||||
}
|
||||
for (; b < 4; ++b)
|
||||
IMMED_NVC0(push, NVC0_3D(TFB_BUFFER_ENABLE(b)), 0);
|
||||
|
@@ -793,12 +793,12 @@ nvc0_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
|
||||
nvc0->constbuf[s][i].user = (cb && cb->user_buffer) ? TRUE : FALSE;
|
||||
if (nvc0->constbuf[s][i].user) {
|
||||
nvc0->constbuf[s][i].u.data = cb->user_buffer;
|
||||
nvc0->constbuf[s][i].size = cb->buffer_size;
|
||||
nvc0->constbuf[s][i].size = MIN2(cb->buffer_size, 0x10000);
|
||||
nvc0->constbuf_valid[s] |= 1 << i;
|
||||
} else
|
||||
if (cb) {
|
||||
nvc0->constbuf[s][i].offset = cb->buffer_offset;
|
||||
nvc0->constbuf[s][i].size = align(cb->buffer_size, 0x100);
|
||||
nvc0->constbuf[s][i].size = MIN2(align(cb->buffer_size, 0x100), 0x10000);
|
||||
nvc0->constbuf_valid[s] |= 1 << i;
|
||||
}
|
||||
else {
|
||||
|
@@ -339,7 +339,7 @@ nvc0_check_program_ucps(struct nvc0_context *nvc0,
|
||||
nvc0_vertprog_validate(nvc0);
|
||||
else
|
||||
if (likely(vp == nvc0->gmtyprog))
|
||||
nvc0_vertprog_validate(nvc0);
|
||||
nvc0_gmtyprog_validate(nvc0);
|
||||
else
|
||||
nvc0_tevlprog_validate(nvc0);
|
||||
}
|
||||
@@ -535,6 +535,23 @@ nvc0_validate_derived_1(struct nvc0_context *nvc0)
|
||||
}
|
||||
}
|
||||
|
||||
/* alpha test is disabled if there are no color RTs, so make sure we have at
|
||||
* least one if alpha test is enabled. Note that this must run after
|
||||
* nvc0_validate_fb, otherwise that will override the RT count setting.
|
||||
*/
|
||||
static void
|
||||
nvc0_validate_derived_2(struct nvc0_context *nvc0)
|
||||
{
|
||||
struct nouveau_pushbuf *push = nvc0->base.pushbuf;
|
||||
|
||||
if (nvc0->zsa && nvc0->zsa->pipe.alpha.enabled &&
|
||||
nvc0->framebuffer.nr_cbufs == 0) {
|
||||
nvc0_fb_set_null_rt(push, 0);
|
||||
BEGIN_NVC0(push, NVC0_3D(RT_CONTROL), 1);
|
||||
PUSH_DATA (push, (076543210 << 4) | 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nvc0_switch_pipe_context(struct nvc0_context *ctx_to)
|
||||
{
|
||||
@@ -597,6 +614,7 @@ static struct state_validate {
|
||||
{ nvc0_fragprog_validate, NVC0_NEW_FRAGPROG },
|
||||
{ nvc0_validate_derived_1, NVC0_NEW_FRAGPROG | NVC0_NEW_ZSA |
|
||||
NVC0_NEW_RASTERIZER },
|
||||
{ nvc0_validate_derived_2, NVC0_NEW_ZSA | NVC0_NEW_FRAMEBUFFER },
|
||||
{ nvc0_validate_clip, NVC0_NEW_CLIP | NVC0_NEW_RASTERIZER |
|
||||
NVC0_NEW_VERTPROG |
|
||||
NVC0_NEW_TEVLPROG |
|
||||
|
@@ -1376,6 +1376,7 @@ static void
|
||||
nvc0_blit(struct pipe_context *pipe, const struct pipe_blit_info *info)
|
||||
{
|
||||
struct nvc0_context *nvc0 = nvc0_context(pipe);
|
||||
struct nouveau_pushbuf *push = nvc0->base.pushbuf;
|
||||
boolean eng3d = FALSE;
|
||||
|
||||
if (util_format_is_depth_or_stencil(info->dst.resource->format)) {
|
||||
@@ -1439,11 +1440,17 @@ nvc0_blit(struct pipe_context *pipe, const struct pipe_blit_info *info)
|
||||
info->src.box.height != -info->dst.box.height))
|
||||
eng3d = TRUE;
|
||||
|
||||
if (nvc0->screen->num_occlusion_queries_active)
|
||||
IMMED_NVC0(push, NVC0_3D(SAMPLECNT_ENABLE), 0);
|
||||
|
||||
if (!eng3d)
|
||||
nvc0_blit_eng2d(nvc0, info);
|
||||
else
|
||||
nvc0_blit_3d(nvc0, info);
|
||||
|
||||
if (nvc0->screen->num_occlusion_queries_active)
|
||||
IMMED_NVC0(push, NVC0_3D(SAMPLECNT_ENABLE), 1);
|
||||
|
||||
NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_blit_count, 1);
|
||||
}
|
||||
|
||||
|
@@ -829,6 +829,7 @@ nvc0_draw_indirect(struct nvc0_context *nvc0, const struct pipe_draw_info *info)
|
||||
}
|
||||
PUSH_DATA(push, nvc0_prim_gl(info->mode));
|
||||
#define NVC0_IB_ENTRY_1_NO_PREFETCH (1 << (31 - 8))
|
||||
PUSH_REFN(push, buf->bo, NOUVEAU_BO_RD | buf->domain);
|
||||
nouveau_pushbuf_space(push, 0, 0, 1);
|
||||
nouveau_pushbuf_data(push,
|
||||
buf->bo, offset, NVC0_IB_ENTRY_1_NO_PREFETCH | size);
|
||||
|
@@ -1732,10 +1732,10 @@ static void evergreen_emit_cb_misc_state(struct r600_context *rctx, struct r600_
|
||||
|
||||
r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2);
|
||||
radeon_emit(cs, a->blend_colormask & fb_colormask); /* R_028238_CB_TARGET_MASK */
|
||||
/* Always enable the first colorbuffer in CB_SHADER_MASK. This
|
||||
* will assure that the alpha-test will work even if there is
|
||||
* no colorbuffer bound. */
|
||||
radeon_emit(cs, 0xf | (a->dual_src_blend ? ps_colormask : 0) | fb_colormask); /* R_02823C_CB_SHADER_MASK */
|
||||
/* This must match the used export instructions exactly.
|
||||
* Other values may lead to undefined behavior and hangs.
|
||||
*/
|
||||
radeon_emit(cs, ps_colormask); /* R_02823C_CB_SHADER_MASK */
|
||||
}
|
||||
|
||||
static void evergreen_emit_db_state(struct r600_context *rctx, struct r600_atom *atom)
|
||||
|
@@ -393,7 +393,12 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers,
|
||||
struct r600_context *rctx = (struct r600_context *)ctx;
|
||||
struct pipe_framebuffer_state *fb = &rctx->framebuffer.state;
|
||||
|
||||
if (buffers & PIPE_CLEAR_COLOR && rctx->b.chip_class >= EVERGREEN) {
|
||||
/* Single-sample fast color clear is broken on r600g:
|
||||
* https://bugs.freedesktop.org/show_bug.cgi?id=73528
|
||||
* https://bugs.freedesktop.org/show_bug.cgi?id=82186
|
||||
*/
|
||||
if (buffers & PIPE_CLEAR_COLOR && rctx->b.chip_class >= EVERGREEN &&
|
||||
rctx->framebuffer.nr_samples > 1) {
|
||||
evergreen_do_fast_color_clear(&rctx->b, fb, &rctx->framebuffer.atom,
|
||||
&buffers, color);
|
||||
}
|
||||
|
@@ -2482,6 +2482,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
|
||||
output[j].array_base = 0;
|
||||
output[j].op = CF_OP_EXPORT;
|
||||
j++;
|
||||
shader->nr_ps_color_exports++;
|
||||
}
|
||||
|
||||
noutput = j;
|
||||
|
@@ -24,14 +24,23 @@
|
||||
* Marek Olšák <marek.olsak@amd.com>
|
||||
*/
|
||||
|
||||
/* Resource binding slots and sampler states (each described with 8 or 4 dwords)
|
||||
* live in memory on SI.
|
||||
/* Resource binding slots and sampler states (each described with 8 or
|
||||
* 4 dwords) are stored in lists in memory which is accessed by shaders
|
||||
* using scalar load instructions.
|
||||
*
|
||||
* This file is responsible for managing lists of resources and sampler states
|
||||
* in memory and binding them, which means updating those structures in memory.
|
||||
* This file is responsible for managing such lists. It keeps a copy of all
|
||||
* descriptors in CPU memory and re-uploads a whole list if some slots have
|
||||
* been changed.
|
||||
*
|
||||
* There is also code for updating shader pointers to resources and sampler
|
||||
* states. CP DMA functions are here too.
|
||||
* This code is also reponsible for updating shader pointers to those lists.
|
||||
*
|
||||
* Note that CP DMA can't be used for updating the lists, because a GPU hang
|
||||
* could leave the list in a mid-IB state and the next IB would get wrong
|
||||
* descriptors and the whole context would be unusable at that point.
|
||||
* (Note: The register shadowing can't be used due to the same reason)
|
||||
*
|
||||
* Also, uploading descriptors to newly allocated memory doesn't require
|
||||
* a KCACHE flush.
|
||||
*/
|
||||
|
||||
#include "radeon/r600_cs.h"
|
||||
@@ -42,7 +51,6 @@
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_upload_mgr.h"
|
||||
|
||||
#define SI_NUM_CONTEXTS 16
|
||||
|
||||
/* NULL image and buffer descriptor.
|
||||
*
|
||||
@@ -139,209 +147,62 @@ static void si_emit_cp_dma_clear_buffer(struct si_context *sctx,
|
||||
}
|
||||
}
|
||||
|
||||
static void si_init_descriptors(struct si_context *sctx,
|
||||
struct si_descriptors *desc,
|
||||
unsigned shader_userdata_reg,
|
||||
static void si_init_descriptors(struct si_descriptors *desc,
|
||||
unsigned shader_userdata_index,
|
||||
unsigned element_dw_size,
|
||||
unsigned num_elements,
|
||||
void (*emit_func)(struct si_context *ctx, struct r600_atom *state))
|
||||
unsigned num_elements)
|
||||
{
|
||||
assert(num_elements <= sizeof(desc->enabled_mask)*8);
|
||||
assert(num_elements <= sizeof(desc->dirty_mask)*8);
|
||||
int i;
|
||||
|
||||
desc->atom.emit = (void*)emit_func;
|
||||
desc->shader_userdata_reg = shader_userdata_reg;
|
||||
assert(num_elements <= sizeof(desc->enabled_mask)*8);
|
||||
|
||||
desc->list = CALLOC(num_elements, element_dw_size * 4);
|
||||
desc->element_dw_size = element_dw_size;
|
||||
desc->num_elements = num_elements;
|
||||
desc->context_size = num_elements * element_dw_size * 4;
|
||||
desc->list_dirty = true; /* upload the list before the next draw */
|
||||
desc->shader_userdata_offset = shader_userdata_index * 4;
|
||||
|
||||
desc->buffer = (struct r600_resource*)
|
||||
pipe_buffer_create(sctx->b.b.screen, PIPE_BIND_CUSTOM,
|
||||
PIPE_USAGE_DEFAULT,
|
||||
SI_NUM_CONTEXTS * desc->context_size);
|
||||
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx, desc->buffer,
|
||||
RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_DATA);
|
||||
|
||||
/* We don't check for CS space here, because this should be called
|
||||
* only once at context initialization. */
|
||||
si_emit_cp_dma_clear_buffer(sctx, desc->buffer->gpu_address,
|
||||
desc->buffer->b.b.width0, 0,
|
||||
R600_CP_DMA_SYNC | CIK_CP_DMA_USE_L2);
|
||||
/* Initialize the array to NULL descriptors if the element size is 8. */
|
||||
if (element_dw_size == 8)
|
||||
for (i = 0; i < num_elements; i++)
|
||||
memcpy(desc->list + i*element_dw_size, null_descriptor,
|
||||
sizeof(null_descriptor));
|
||||
}
|
||||
|
||||
static void si_release_descriptors(struct si_descriptors *desc)
|
||||
{
|
||||
pipe_resource_reference((struct pipe_resource**)&desc->buffer, NULL);
|
||||
FREE(desc->list);
|
||||
}
|
||||
|
||||
static void si_update_descriptors(struct si_context *sctx,
|
||||
static bool si_upload_descriptors(struct si_context *sctx,
|
||||
struct si_descriptors *desc)
|
||||
{
|
||||
if (desc->dirty_mask) {
|
||||
desc->atom.num_dw =
|
||||
7 + /* copy */
|
||||
(4 + desc->element_dw_size) * util_bitcount64(desc->dirty_mask) + /* update */
|
||||
4; /* pointer update */
|
||||
unsigned list_size = desc->num_elements * desc->element_dw_size * 4;
|
||||
void *ptr;
|
||||
|
||||
if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
|
||||
desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0)
|
||||
desc->atom.num_dw += 4; /* second pointer update */
|
||||
if (!desc->list_dirty)
|
||||
return true;
|
||||
|
||||
desc->atom.dirty = true;
|
||||
u_upload_alloc(sctx->b.uploader, 0, list_size,
|
||||
&desc->buffer_offset,
|
||||
(struct pipe_resource**)&desc->buffer, &ptr);
|
||||
if (!desc->buffer)
|
||||
return false; /* skip the draw call */
|
||||
|
||||
/* TODO: Investigate if these flushes can be removed after
|
||||
* adding CE support. */
|
||||
util_memcpy_cpu_to_le32(ptr, desc->list, list_size);
|
||||
|
||||
/* The descriptors are read with the K cache. */
|
||||
sctx->b.flags |= SI_CONTEXT_INV_KCACHE;
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx, desc->buffer,
|
||||
RADEON_USAGE_READ, RADEON_PRIO_SHADER_DATA);
|
||||
|
||||
/* Since SI uses uncached CP DMA to update descriptors,
|
||||
* we have to flush TC L2, which is used to fetch constants
|
||||
* along with KCACHE. */
|
||||
if (sctx->b.chip_class == SI)
|
||||
sctx->b.flags |= SI_CONTEXT_INV_TC_L2;
|
||||
} else {
|
||||
desc->atom.dirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void si_emit_shader_pointer(struct si_context *sctx,
|
||||
struct r600_atom *atom)
|
||||
{
|
||||
struct si_descriptors *desc = (struct si_descriptors*)atom;
|
||||
struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
|
||||
uint64_t va = desc->buffer->gpu_address +
|
||||
desc->current_context_id * desc->context_size +
|
||||
desc->buffer_offset;
|
||||
|
||||
radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0));
|
||||
radeon_emit(cs, (desc->shader_userdata_reg - SI_SH_REG_OFFSET) >> 2);
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, va >> 32);
|
||||
|
||||
if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
|
||||
desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0) {
|
||||
radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0));
|
||||
radeon_emit(cs, (desc->shader_userdata_reg +
|
||||
(R_00B330_SPI_SHADER_USER_DATA_ES_0 -
|
||||
R_00B130_SPI_SHADER_USER_DATA_VS_0) -
|
||||
SI_SH_REG_OFFSET) >> 2);
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, va >> 32);
|
||||
}
|
||||
}
|
||||
|
||||
static void si_emit_descriptors(struct si_context *sctx,
|
||||
struct si_descriptors *desc,
|
||||
uint32_t **descriptors)
|
||||
{
|
||||
struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
|
||||
uint64_t va_base;
|
||||
int packet_start = 0;
|
||||
int packet_size = 0;
|
||||
int last_index = desc->num_elements; /* point to a non-existing element */
|
||||
uint64_t dirty_mask = desc->dirty_mask;
|
||||
unsigned new_context_id = (desc->current_context_id + 1) % SI_NUM_CONTEXTS;
|
||||
|
||||
assert(dirty_mask);
|
||||
|
||||
va_base = desc->buffer->gpu_address;
|
||||
|
||||
/* Copy the descriptors to a new context slot. */
|
||||
si_emit_cp_dma_copy_buffer(sctx,
|
||||
va_base + new_context_id * desc->context_size,
|
||||
va_base + desc->current_context_id * desc->context_size,
|
||||
desc->context_size, R600_CP_DMA_SYNC | CIK_CP_DMA_USE_L2);
|
||||
|
||||
va_base += new_context_id * desc->context_size;
|
||||
|
||||
/* Update the descriptors.
|
||||
* Updates of consecutive descriptors are merged to one WRITE_DATA packet.
|
||||
*
|
||||
* XXX When unbinding lots of resources, consider clearing the memory
|
||||
* with CP DMA instead of emitting zeros.
|
||||
*/
|
||||
while (dirty_mask) {
|
||||
int i = u_bit_scan64(&dirty_mask);
|
||||
|
||||
assert(i < desc->num_elements);
|
||||
|
||||
if (last_index+1 == i && packet_size) {
|
||||
/* Append new data at the end of the last packet. */
|
||||
packet_size += desc->element_dw_size;
|
||||
cs->buf[packet_start] = PKT3(PKT3_WRITE_DATA, packet_size, 0);
|
||||
} else {
|
||||
/* Start a new packet. */
|
||||
uint64_t va = va_base + i * desc->element_dw_size * 4;
|
||||
|
||||
packet_start = cs->cdw;
|
||||
packet_size = 2 + desc->element_dw_size;
|
||||
|
||||
radeon_emit(cs, PKT3(PKT3_WRITE_DATA, packet_size, 0));
|
||||
radeon_emit(cs, PKT3_WRITE_DATA_DST_SEL(sctx->b.chip_class == SI ?
|
||||
PKT3_WRITE_DATA_DST_SEL_MEM_SYNC :
|
||||
PKT3_WRITE_DATA_DST_SEL_TC_L2) |
|
||||
PKT3_WRITE_DATA_WR_CONFIRM |
|
||||
PKT3_WRITE_DATA_ENGINE_SEL(PKT3_WRITE_DATA_ENGINE_SEL_ME));
|
||||
radeon_emit(cs, va & 0xFFFFFFFFUL);
|
||||
radeon_emit(cs, (va >> 32UL) & 0xFFFFFFFFUL);
|
||||
}
|
||||
|
||||
radeon_emit_array(cs, descriptors[i], desc->element_dw_size);
|
||||
|
||||
last_index = i;
|
||||
}
|
||||
|
||||
desc->dirty_mask = 0;
|
||||
desc->current_context_id = new_context_id;
|
||||
|
||||
/* Now update the shader userdata pointer. */
|
||||
si_emit_shader_pointer(sctx, &desc->atom);
|
||||
}
|
||||
|
||||
static unsigned si_get_shader_user_data_base(unsigned shader)
|
||||
{
|
||||
switch (shader) {
|
||||
case PIPE_SHADER_VERTEX:
|
||||
return R_00B130_SPI_SHADER_USER_DATA_VS_0;
|
||||
case PIPE_SHADER_GEOMETRY:
|
||||
return R_00B230_SPI_SHADER_USER_DATA_GS_0;
|
||||
case PIPE_SHADER_FRAGMENT:
|
||||
return R_00B030_SPI_SHADER_USER_DATA_PS_0;
|
||||
default:
|
||||
assert(0);
|
||||
return 0;
|
||||
}
|
||||
desc->list_dirty = false;
|
||||
desc->pointer_dirty = true;
|
||||
sctx->shader_userdata.atom.dirty = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* SAMPLER VIEWS */
|
||||
|
||||
static void si_emit_sampler_views(struct si_context *sctx, struct r600_atom *atom)
|
||||
{
|
||||
struct si_sampler_views *views = (struct si_sampler_views*)atom;
|
||||
|
||||
si_emit_descriptors(sctx, &views->desc, views->desc_data);
|
||||
}
|
||||
|
||||
static void si_init_sampler_views(struct si_context *sctx,
|
||||
struct si_sampler_views *views,
|
||||
unsigned shader)
|
||||
{
|
||||
int i;
|
||||
|
||||
si_init_descriptors(sctx, &views->desc,
|
||||
si_get_shader_user_data_base(shader) +
|
||||
SI_SGPR_RESOURCE * 4,
|
||||
8, SI_NUM_SAMPLER_VIEWS, si_emit_sampler_views);
|
||||
|
||||
for (i = 0; i < views->desc.num_elements; i++) {
|
||||
views->desc_data[i] = null_descriptor;
|
||||
views->desc.dirty_mask |= 1llu << i;
|
||||
}
|
||||
si_update_descriptors(sctx, &views->desc);
|
||||
}
|
||||
|
||||
static void si_release_sampler_views(struct si_sampler_views *views)
|
||||
{
|
||||
int i;
|
||||
@@ -382,10 +243,10 @@ static void si_sampler_views_begin_new_cs(struct si_context *sctx,
|
||||
si_get_resource_ro_priority(rview->resource));
|
||||
}
|
||||
|
||||
if (!views->desc.buffer)
|
||||
return;
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx, views->desc.buffer,
|
||||
RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_DATA);
|
||||
|
||||
si_emit_shader_pointer(sctx, &views->desc.atom);
|
||||
}
|
||||
|
||||
static void si_set_sampler_view(struct si_context *sctx, unsigned shader,
|
||||
@@ -406,17 +267,16 @@ static void si_set_sampler_view(struct si_context *sctx, unsigned shader,
|
||||
rview->resource, RADEON_USAGE_READ,
|
||||
si_get_resource_ro_priority(rview->resource));
|
||||
|
||||
|
||||
pipe_sampler_view_reference(&views->views[slot], view);
|
||||
views->desc_data[slot] = view_desc;
|
||||
memcpy(views->desc.list + slot*8, view_desc, 8*4);
|
||||
views->desc.enabled_mask |= 1llu << slot;
|
||||
} else {
|
||||
pipe_sampler_view_reference(&views->views[slot], NULL);
|
||||
views->desc_data[slot] = null_descriptor;
|
||||
memcpy(views->desc.list + slot*8, null_descriptor, 8*4);
|
||||
views->desc.enabled_mask &= ~(1llu << slot);
|
||||
}
|
||||
|
||||
views->desc.dirty_mask |= 1llu << slot;
|
||||
views->desc.list_dirty = true;
|
||||
}
|
||||
|
||||
static void si_set_sampler_views(struct pipe_context *ctx,
|
||||
@@ -475,25 +335,17 @@ static void si_set_sampler_views(struct pipe_context *ctx,
|
||||
NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
si_update_descriptors(sctx, &samplers->views.desc);
|
||||
}
|
||||
|
||||
/* SAMPLER STATES */
|
||||
|
||||
static void si_emit_sampler_states(struct si_context *sctx, struct r600_atom *atom)
|
||||
{
|
||||
struct si_sampler_states *states = (struct si_sampler_states*)atom;
|
||||
|
||||
si_emit_descriptors(sctx, &states->desc, states->desc_data);
|
||||
}
|
||||
|
||||
static void si_sampler_states_begin_new_cs(struct si_context *sctx,
|
||||
struct si_sampler_states *states)
|
||||
{
|
||||
if (!states->desc.buffer)
|
||||
return;
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx, states->desc.buffer,
|
||||
RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_DATA);
|
||||
si_emit_shader_pointer(sctx, &states->desc.atom);
|
||||
}
|
||||
|
||||
void si_set_sampler_descriptors(struct si_context *sctx, unsigned shader,
|
||||
@@ -513,66 +365,39 @@ void si_set_sampler_descriptors(struct si_context *sctx, unsigned shader,
|
||||
for (i = 0; i < count; i++) {
|
||||
unsigned slot = start + i;
|
||||
|
||||
if (!sstates[i]) {
|
||||
samplers->desc.dirty_mask &= ~(1llu << slot);
|
||||
if (!sstates[i])
|
||||
continue;
|
||||
}
|
||||
|
||||
samplers->desc_data[slot] = sstates[i]->val;
|
||||
samplers->desc.dirty_mask |= 1llu << slot;
|
||||
memcpy(samplers->desc.list + slot*4, sstates[i]->val, 4*4);
|
||||
samplers->desc.list_dirty = true;
|
||||
}
|
||||
|
||||
si_update_descriptors(sctx, &samplers->desc);
|
||||
}
|
||||
|
||||
/* BUFFER RESOURCES */
|
||||
|
||||
static void si_emit_buffer_resources(struct si_context *sctx, struct r600_atom *atom)
|
||||
{
|
||||
struct si_buffer_resources *buffers = (struct si_buffer_resources*)atom;
|
||||
|
||||
si_emit_descriptors(sctx, &buffers->desc, buffers->desc_data);
|
||||
}
|
||||
|
||||
static void si_init_buffer_resources(struct si_context *sctx,
|
||||
struct si_buffer_resources *buffers,
|
||||
unsigned num_buffers, unsigned shader,
|
||||
static void si_init_buffer_resources(struct si_buffer_resources *buffers,
|
||||
unsigned num_buffers,
|
||||
unsigned shader_userdata_index,
|
||||
enum radeon_bo_usage shader_usage,
|
||||
enum radeon_bo_priority priority)
|
||||
{
|
||||
int i;
|
||||
|
||||
buffers->num_buffers = num_buffers;
|
||||
buffers->shader_usage = shader_usage;
|
||||
buffers->priority = priority;
|
||||
buffers->buffers = CALLOC(num_buffers, sizeof(struct pipe_resource*));
|
||||
buffers->desc_storage = CALLOC(num_buffers, sizeof(uint32_t) * 4);
|
||||
|
||||
/* si_emit_descriptors only accepts an array of arrays.
|
||||
* This adds such an array. */
|
||||
buffers->desc_data = CALLOC(num_buffers, sizeof(uint32_t*));
|
||||
for (i = 0; i < num_buffers; i++) {
|
||||
buffers->desc_data[i] = &buffers->desc_storage[i*4];
|
||||
}
|
||||
|
||||
si_init_descriptors(sctx, &buffers->desc,
|
||||
si_get_shader_user_data_base(shader) +
|
||||
shader_userdata_index*4, 4, num_buffers,
|
||||
si_emit_buffer_resources);
|
||||
si_init_descriptors(&buffers->desc, shader_userdata_index, 4,
|
||||
num_buffers);
|
||||
}
|
||||
|
||||
static void si_release_buffer_resources(struct si_buffer_resources *buffers)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < buffers->num_buffers; i++) {
|
||||
for (i = 0; i < buffers->desc.num_elements; i++) {
|
||||
pipe_resource_reference(&buffers->buffers[i], NULL);
|
||||
}
|
||||
|
||||
FREE(buffers->buffers);
|
||||
FREE(buffers->desc_storage);
|
||||
FREE(buffers->desc_data);
|
||||
si_release_descriptors(&buffers->desc);
|
||||
}
|
||||
|
||||
@@ -590,11 +415,11 @@ static void si_buffer_resources_begin_new_cs(struct si_context *sctx,
|
||||
buffers->shader_usage, buffers->priority);
|
||||
}
|
||||
|
||||
if (!buffers->desc.buffer)
|
||||
return;
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx,
|
||||
buffers->desc.buffer, RADEON_USAGE_READWRITE,
|
||||
RADEON_PRIO_SHADER_DATA);
|
||||
|
||||
si_emit_shader_pointer(sctx, &buffers->desc.atom);
|
||||
}
|
||||
|
||||
/* VERTEX BUFFERS */
|
||||
@@ -617,14 +442,15 @@ static void si_vertex_buffers_begin_new_cs(struct si_context *sctx)
|
||||
(struct r600_resource*)sctx->vertex_buffer[vb].buffer,
|
||||
RADEON_USAGE_READ, RADEON_PRIO_SHADER_BUFFER_RO);
|
||||
}
|
||||
|
||||
if (!desc->buffer)
|
||||
return;
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx,
|
||||
desc->buffer, RADEON_USAGE_READ,
|
||||
RADEON_PRIO_SHADER_DATA);
|
||||
|
||||
si_emit_shader_pointer(sctx, &desc->atom);
|
||||
}
|
||||
|
||||
void si_update_vertex_buffers(struct si_context *sctx)
|
||||
static bool si_upload_vertex_buffer_descriptors(struct si_context *sctx)
|
||||
{
|
||||
struct si_descriptors *desc = &sctx->vertex_buffers;
|
||||
bool bound[SI_NUM_VERTEX_BUFFERS] = {};
|
||||
@@ -632,8 +458,10 @@ void si_update_vertex_buffers(struct si_context *sctx)
|
||||
uint64_t va;
|
||||
uint32_t *ptr;
|
||||
|
||||
if (!sctx->vertex_buffers_dirty)
|
||||
return true;
|
||||
if (!count || !sctx->vertex_elements)
|
||||
return;
|
||||
return true;
|
||||
|
||||
/* Vertex buffer descriptors are the only ones which are uploaded
|
||||
* directly through a staging buffer and don't go through
|
||||
@@ -641,13 +469,14 @@ void si_update_vertex_buffers(struct si_context *sctx)
|
||||
*/
|
||||
u_upload_alloc(sctx->b.uploader, 0, count * 16, &desc->buffer_offset,
|
||||
(struct pipe_resource**)&desc->buffer, (void**)&ptr);
|
||||
if (!desc->buffer)
|
||||
return false;
|
||||
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx,
|
||||
desc->buffer, RADEON_USAGE_READ,
|
||||
RADEON_PRIO_SHADER_DATA);
|
||||
|
||||
assert(count <= SI_NUM_VERTEX_BUFFERS);
|
||||
assert(desc->current_context_id == 0);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct pipe_vertex_element *ve = &sctx->vertex_elements->elements[i];
|
||||
@@ -693,13 +522,14 @@ void si_update_vertex_buffers(struct si_context *sctx)
|
||||
}
|
||||
}
|
||||
|
||||
desc->atom.num_dw = 8; /* update 2 shader pointers (VS+ES) */
|
||||
desc->atom.dirty = true;
|
||||
|
||||
/* Don't flush the const cache. It would have a very negative effect
|
||||
* on performance (confirmed by testing). New descriptors are always
|
||||
* uploaded to a fresh new buffer, so I don't think flushing the const
|
||||
* cache is needed. */
|
||||
desc->pointer_dirty = true;
|
||||
sctx->shader_userdata.atom.dirty = true;
|
||||
sctx->vertex_buffers_dirty = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -724,7 +554,7 @@ static void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint s
|
||||
if (shader >= SI_NUM_SHADERS)
|
||||
return;
|
||||
|
||||
assert(slot < buffers->num_buffers);
|
||||
assert(slot < buffers->desc.num_elements);
|
||||
pipe_resource_reference(&buffers->buffers[slot], NULL);
|
||||
|
||||
/* CIK cannot unbind a constant buffer (S_BUFFER_LOAD is buggy
|
||||
@@ -751,7 +581,7 @@ static void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint s
|
||||
}
|
||||
|
||||
/* Set the descriptor. */
|
||||
uint32_t *desc = buffers->desc_data[slot];
|
||||
uint32_t *desc = buffers->desc.list + slot*4;
|
||||
desc[0] = va;
|
||||
desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
|
||||
S_008F04_STRIDE(0);
|
||||
@@ -770,12 +600,11 @@ static void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint s
|
||||
buffers->desc.enabled_mask |= 1llu << slot;
|
||||
} else {
|
||||
/* Clear the descriptor. */
|
||||
memset(buffers->desc_data[slot], 0, sizeof(uint32_t) * 4);
|
||||
memset(buffers->desc.list + slot*4, 0, sizeof(uint32_t) * 4);
|
||||
buffers->desc.enabled_mask &= ~(1llu << slot);
|
||||
}
|
||||
|
||||
buffers->desc.dirty_mask |= 1llu << slot;
|
||||
si_update_descriptors(sctx, &buffers->desc);
|
||||
buffers->desc.list_dirty = true;
|
||||
}
|
||||
|
||||
/* RING BUFFERS */
|
||||
@@ -795,7 +624,7 @@ void si_set_ring_buffer(struct pipe_context *ctx, uint shader, uint slot,
|
||||
/* The stride field in the resource descriptor has 14 bits */
|
||||
assert(stride < (1 << 14));
|
||||
|
||||
assert(slot < buffers->num_buffers);
|
||||
assert(slot < buffers->desc.num_elements);
|
||||
pipe_resource_reference(&buffers->buffers[slot], NULL);
|
||||
|
||||
if (buffer) {
|
||||
@@ -840,7 +669,7 @@ void si_set_ring_buffer(struct pipe_context *ctx, uint shader, uint slot,
|
||||
}
|
||||
|
||||
/* Set the descriptor. */
|
||||
uint32_t *desc = buffers->desc_data[slot];
|
||||
uint32_t *desc = buffers->desc.list + slot*4;
|
||||
desc[0] = va;
|
||||
desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) |
|
||||
S_008F04_STRIDE(stride) |
|
||||
@@ -863,12 +692,11 @@ void si_set_ring_buffer(struct pipe_context *ctx, uint shader, uint slot,
|
||||
buffers->desc.enabled_mask |= 1llu << slot;
|
||||
} else {
|
||||
/* Clear the descriptor. */
|
||||
memset(buffers->desc_data[slot], 0, sizeof(uint32_t) * 4);
|
||||
memset(buffers->desc.list + slot*4, 0, sizeof(uint32_t) * 4);
|
||||
buffers->desc.enabled_mask &= ~(1llu << slot);
|
||||
}
|
||||
|
||||
buffers->desc.dirty_mask |= 1llu << slot;
|
||||
si_update_descriptors(sctx, &buffers->desc);
|
||||
buffers->desc.list_dirty = true;
|
||||
}
|
||||
|
||||
/* STREAMOUT BUFFERS */
|
||||
@@ -930,7 +758,7 @@ static void si_set_streamout_targets(struct pipe_context *ctx,
|
||||
uint64_t va = r600_resource(buffer)->gpu_address;
|
||||
|
||||
/* Set the descriptor. */
|
||||
uint32_t *desc = buffers->desc_data[bufidx];
|
||||
uint32_t *desc = buffers->desc.list + bufidx*4;
|
||||
desc[0] = va;
|
||||
desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32);
|
||||
desc[2] = 0xffffffff;
|
||||
@@ -948,24 +776,22 @@ static void si_set_streamout_targets(struct pipe_context *ctx,
|
||||
buffers->desc.enabled_mask |= 1llu << bufidx;
|
||||
} else {
|
||||
/* Clear the descriptor and unset the resource. */
|
||||
memset(buffers->desc_data[bufidx], 0,
|
||||
memset(buffers->desc.list + bufidx*4, 0,
|
||||
sizeof(uint32_t) * 4);
|
||||
pipe_resource_reference(&buffers->buffers[bufidx],
|
||||
NULL);
|
||||
buffers->desc.enabled_mask &= ~(1llu << bufidx);
|
||||
}
|
||||
buffers->desc.dirty_mask |= 1llu << bufidx;
|
||||
}
|
||||
for (; i < old_num_targets; i++) {
|
||||
bufidx = SI_SO_BUF_OFFSET + i;
|
||||
/* Clear the descriptor and unset the resource. */
|
||||
memset(buffers->desc_data[bufidx], 0, sizeof(uint32_t) * 4);
|
||||
memset(buffers->desc.list + bufidx*4, 0, sizeof(uint32_t) * 4);
|
||||
pipe_resource_reference(&buffers->buffers[bufidx], NULL);
|
||||
buffers->desc.enabled_mask &= ~(1llu << bufidx);
|
||||
buffers->desc.dirty_mask |= 1llu << bufidx;
|
||||
}
|
||||
|
||||
si_update_descriptors(sctx, &buffers->desc);
|
||||
buffers->desc.list_dirty = true;
|
||||
}
|
||||
|
||||
static void si_desc_reset_buffer_offset(struct pipe_context *ctx,
|
||||
@@ -1034,22 +860,19 @@ static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource
|
||||
/* Read/Write buffers. */
|
||||
for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
|
||||
struct si_buffer_resources *buffers = &sctx->rw_buffers[shader];
|
||||
bool found = false;
|
||||
uint64_t mask = buffers->desc.enabled_mask;
|
||||
|
||||
while (mask) {
|
||||
i = u_bit_scan64(&mask);
|
||||
if (buffers->buffers[i] == buf) {
|
||||
si_desc_reset_buffer_offset(ctx, buffers->desc_data[i],
|
||||
si_desc_reset_buffer_offset(ctx, buffers->desc.list + i*4,
|
||||
old_va, buf);
|
||||
buffers->desc.list_dirty = true;
|
||||
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx,
|
||||
rbuffer, buffers->shader_usage,
|
||||
buffers->priority);
|
||||
|
||||
buffers->desc.dirty_mask |= 1llu << i;
|
||||
found = true;
|
||||
|
||||
if (i >= SI_SO_BUF_OFFSET && shader == PIPE_SHADER_VERTEX) {
|
||||
/* Update the streamout state. */
|
||||
if (sctx->b.streamout.begin_emitted) {
|
||||
@@ -1061,34 +884,25 @@ static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
si_update_descriptors(sctx, &buffers->desc);
|
||||
}
|
||||
}
|
||||
|
||||
/* Constant buffers. */
|
||||
for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
|
||||
struct si_buffer_resources *buffers = &sctx->const_buffers[shader];
|
||||
bool found = false;
|
||||
uint64_t mask = buffers->desc.enabled_mask;
|
||||
|
||||
while (mask) {
|
||||
unsigned i = u_bit_scan64(&mask);
|
||||
if (buffers->buffers[i] == buf) {
|
||||
si_desc_reset_buffer_offset(ctx, buffers->desc_data[i],
|
||||
si_desc_reset_buffer_offset(ctx, buffers->desc.list + i*4,
|
||||
old_va, buf);
|
||||
buffers->desc.list_dirty = true;
|
||||
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx,
|
||||
rbuffer, buffers->shader_usage,
|
||||
buffers->priority);
|
||||
|
||||
buffers->desc.dirty_mask |= 1llu << i;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
si_update_descriptors(sctx, &buffers->desc);
|
||||
}
|
||||
}
|
||||
|
||||
/* Texture buffers - update virtual addresses in sampler view descriptors. */
|
||||
@@ -1100,23 +914,20 @@ static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource
|
||||
/* Texture buffers - update bindings. */
|
||||
for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
|
||||
struct si_sampler_views *views = &sctx->samplers[shader].views;
|
||||
bool found = false;
|
||||
uint64_t mask = views->desc.enabled_mask;
|
||||
|
||||
while (mask) {
|
||||
unsigned i = u_bit_scan64(&mask);
|
||||
if (views->views[i]->texture == buf) {
|
||||
si_desc_reset_buffer_offset(ctx, views->desc.list + i*8+4,
|
||||
old_va, buf);
|
||||
views->desc.list_dirty = true;
|
||||
|
||||
r600_context_bo_reloc(&sctx->b, &sctx->b.rings.gfx,
|
||||
rbuffer, RADEON_USAGE_READ,
|
||||
RADEON_PRIO_SHADER_BUFFER_RO);
|
||||
|
||||
views->desc.dirty_mask |= 1llu << i;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
si_update_descriptors(sctx, &views->desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1277,39 +1088,133 @@ void si_copy_buffer(struct si_context *sctx,
|
||||
r600_resource(dst)->TC_L2_dirty = true;
|
||||
}
|
||||
|
||||
/* INIT/DEINIT */
|
||||
/* SHADER USER DATA */
|
||||
|
||||
static void si_mark_shader_pointers_dirty(struct si_context *sctx,
|
||||
unsigned shader)
|
||||
{
|
||||
sctx->const_buffers[shader].desc.pointer_dirty = true;
|
||||
sctx->rw_buffers[shader].desc.pointer_dirty = true;
|
||||
sctx->samplers[shader].views.desc.pointer_dirty = true;
|
||||
sctx->samplers[shader].states.desc.pointer_dirty = true;
|
||||
|
||||
if (shader == PIPE_SHADER_VERTEX)
|
||||
sctx->vertex_buffers.pointer_dirty = true;
|
||||
|
||||
sctx->shader_userdata.atom.dirty = true;
|
||||
}
|
||||
|
||||
static void si_shader_userdata_begin_new_cs(struct si_context *sctx)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < SI_NUM_SHADERS; i++) {
|
||||
si_mark_shader_pointers_dirty(sctx, i);
|
||||
}
|
||||
}
|
||||
|
||||
/* Set a base register address for user data constants in the given shader.
|
||||
* This assigns a mapping from PIPE_SHADER_* to SPI_SHADER_USER_DATA_*.
|
||||
*/
|
||||
static void si_set_user_data_base(struct si_context *sctx,
|
||||
unsigned shader, uint32_t new_base)
|
||||
{
|
||||
uint32_t *base = &sctx->shader_userdata.sh_base[shader];
|
||||
|
||||
if (*base != new_base) {
|
||||
*base = new_base;
|
||||
|
||||
if (new_base)
|
||||
si_mark_shader_pointers_dirty(sctx, shader);
|
||||
}
|
||||
}
|
||||
|
||||
/* This must be called when these shaders are changed from non-NULL to NULL
|
||||
* and vice versa:
|
||||
* - geometry shader
|
||||
* - tessellation control shader
|
||||
* - tessellation evaluation shader
|
||||
*/
|
||||
void si_shader_change_notify(struct si_context *sctx)
|
||||
{
|
||||
/* VS can be bound as VS or ES. */
|
||||
if (sctx->gs_shader)
|
||||
si_set_user_data_base(sctx, PIPE_SHADER_VERTEX,
|
||||
R_00B330_SPI_SHADER_USER_DATA_ES_0);
|
||||
else
|
||||
si_set_user_data_base(sctx, PIPE_SHADER_VERTEX,
|
||||
R_00B130_SPI_SHADER_USER_DATA_VS_0);
|
||||
}
|
||||
|
||||
static void si_emit_shader_pointer(struct si_context *sctx,
|
||||
struct si_descriptors *desc,
|
||||
unsigned sh_base, bool keep_dirty)
|
||||
{
|
||||
struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
|
||||
uint64_t va;
|
||||
|
||||
if (!desc->pointer_dirty || !desc->buffer)
|
||||
return;
|
||||
|
||||
va = desc->buffer->gpu_address +
|
||||
desc->buffer_offset;
|
||||
|
||||
radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0));
|
||||
radeon_emit(cs, (sh_base + desc->shader_userdata_offset - SI_SH_REG_OFFSET) >> 2);
|
||||
radeon_emit(cs, va);
|
||||
radeon_emit(cs, va >> 32);
|
||||
|
||||
desc->pointer_dirty = keep_dirty;
|
||||
}
|
||||
|
||||
static void si_emit_shader_userdata(struct si_context *sctx,
|
||||
struct r600_atom *atom)
|
||||
{
|
||||
unsigned i;
|
||||
uint32_t *sh_base = sctx->shader_userdata.sh_base;
|
||||
|
||||
/* The VS copy shader needs these for clipping, streamout, and rings. */
|
||||
if (sctx->gs_shader) {
|
||||
unsigned base = R_00B130_SPI_SHADER_USER_DATA_VS_0;
|
||||
unsigned i = PIPE_SHADER_VERTEX;
|
||||
|
||||
si_emit_shader_pointer(sctx, &sctx->const_buffers[i].desc, base, true);
|
||||
si_emit_shader_pointer(sctx, &sctx->rw_buffers[i].desc, base, true);
|
||||
}
|
||||
|
||||
for (i = 0; i < SI_NUM_SHADERS; i++) {
|
||||
unsigned base = sh_base[i];
|
||||
|
||||
si_emit_shader_pointer(sctx, &sctx->const_buffers[i].desc, base, false);
|
||||
si_emit_shader_pointer(sctx, &sctx->rw_buffers[i].desc, base, false);
|
||||
si_emit_shader_pointer(sctx, &sctx->samplers[i].views.desc, base, false);
|
||||
si_emit_shader_pointer(sctx, &sctx->samplers[i].states.desc, base, false);
|
||||
}
|
||||
si_emit_shader_pointer(sctx, &sctx->vertex_buffers, sh_base[PIPE_SHADER_VERTEX], false);
|
||||
}
|
||||
|
||||
/* INIT/DEINIT/UPLOAD */
|
||||
|
||||
void si_init_all_descriptors(struct si_context *sctx)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < SI_NUM_SHADERS; i++) {
|
||||
si_init_buffer_resources(sctx, &sctx->const_buffers[i],
|
||||
SI_NUM_CONST_BUFFERS, i, SI_SGPR_CONST,
|
||||
si_init_buffer_resources(&sctx->const_buffers[i],
|
||||
SI_NUM_CONST_BUFFERS, SI_SGPR_CONST,
|
||||
RADEON_USAGE_READ, RADEON_PRIO_SHADER_BUFFER_RO);
|
||||
si_init_buffer_resources(sctx, &sctx->rw_buffers[i],
|
||||
i == PIPE_SHADER_VERTEX ?
|
||||
SI_NUM_RW_BUFFERS : SI_NUM_RING_BUFFERS,
|
||||
i, SI_SGPR_RW_BUFFERS,
|
||||
si_init_buffer_resources(&sctx->rw_buffers[i],
|
||||
SI_NUM_RW_BUFFERS, SI_SGPR_RW_BUFFERS,
|
||||
RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_RESOURCE_RW);
|
||||
|
||||
si_init_sampler_views(sctx, &sctx->samplers[i].views, i);
|
||||
|
||||
si_init_descriptors(sctx, &sctx->samplers[i].states.desc,
|
||||
si_get_shader_user_data_base(i) + SI_SGPR_SAMPLER * 4,
|
||||
4, SI_NUM_SAMPLER_STATES, si_emit_sampler_states);
|
||||
|
||||
sctx->atoms.s.const_buffers[i] = &sctx->const_buffers[i].desc.atom;
|
||||
sctx->atoms.s.rw_buffers[i] = &sctx->rw_buffers[i].desc.atom;
|
||||
sctx->atoms.s.sampler_views[i] = &sctx->samplers[i].views.desc.atom;
|
||||
sctx->atoms.s.sampler_states[i] = &sctx->samplers[i].states.desc.atom;
|
||||
si_init_descriptors(&sctx->samplers[i].views.desc,
|
||||
SI_SGPR_RESOURCE, 8, SI_NUM_SAMPLER_VIEWS);
|
||||
si_init_descriptors(&sctx->samplers[i].states.desc,
|
||||
SI_SGPR_SAMPLER, 4, SI_NUM_SAMPLER_STATES);
|
||||
}
|
||||
|
||||
si_init_descriptors(sctx, &sctx->vertex_buffers,
|
||||
si_get_shader_user_data_base(PIPE_SHADER_VERTEX) +
|
||||
SI_SGPR_VERTEX_BUFFER*4, 4, SI_NUM_VERTEX_BUFFERS,
|
||||
si_emit_shader_pointer);
|
||||
sctx->atoms.s.vertex_buffers = &sctx->vertex_buffers.atom;
|
||||
si_init_descriptors(&sctx->vertex_buffers, SI_SGPR_VERTEX_BUFFER,
|
||||
4, SI_NUM_VERTEX_BUFFERS);
|
||||
|
||||
/* Set pipe_context functions. */
|
||||
sctx->b.b.set_constant_buffer = si_set_constant_buffer;
|
||||
@@ -1317,6 +1222,32 @@ void si_init_all_descriptors(struct si_context *sctx)
|
||||
sctx->b.b.set_stream_output_targets = si_set_streamout_targets;
|
||||
sctx->b.clear_buffer = si_clear_buffer;
|
||||
sctx->b.invalidate_buffer = si_invalidate_buffer;
|
||||
|
||||
/* Shader user data. */
|
||||
sctx->atoms.s.shader_userdata = &sctx->shader_userdata.atom;
|
||||
sctx->shader_userdata.atom.emit = (void*)si_emit_shader_userdata;
|
||||
|
||||
/* Upper bound, 4 pointers per shader, +1 for vertex buffers, +2 for the VS copy shader. */
|
||||
sctx->shader_userdata.atom.num_dw = (SI_NUM_SHADERS * 4 + 1 + 2) * 4;
|
||||
|
||||
/* Set default and immutable mappings. */
|
||||
si_set_user_data_base(sctx, PIPE_SHADER_VERTEX, R_00B130_SPI_SHADER_USER_DATA_VS_0);
|
||||
si_set_user_data_base(sctx, PIPE_SHADER_GEOMETRY, R_00B230_SPI_SHADER_USER_DATA_GS_0);
|
||||
si_set_user_data_base(sctx, PIPE_SHADER_FRAGMENT, R_00B030_SPI_SHADER_USER_DATA_PS_0);
|
||||
}
|
||||
|
||||
bool si_upload_shader_descriptors(struct si_context *sctx)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < SI_NUM_SHADERS; i++) {
|
||||
if (!si_upload_descriptors(sctx, &sctx->const_buffers[i].desc) ||
|
||||
!si_upload_descriptors(sctx, &sctx->rw_buffers[i].desc) ||
|
||||
!si_upload_descriptors(sctx, &sctx->samplers[i].views.desc) ||
|
||||
!si_upload_descriptors(sctx, &sctx->samplers[i].states.desc))
|
||||
return false;
|
||||
}
|
||||
return si_upload_vertex_buffer_descriptors(sctx);
|
||||
}
|
||||
|
||||
void si_release_all_descriptors(struct si_context *sctx)
|
||||
@@ -1343,4 +1274,5 @@ void si_all_descriptors_begin_new_cs(struct si_context *sctx)
|
||||
si_sampler_states_begin_new_cs(sctx, &sctx->samplers[i].states);
|
||||
}
|
||||
si_vertex_buffers_begin_new_cs(sctx);
|
||||
si_shader_userdata_begin_new_cs(sctx);
|
||||
}
|
||||
|
@@ -125,8 +125,6 @@ struct si_framebuffer {
|
||||
|
||||
#define SI_NUM_ATOMS(sctx) (sizeof((sctx)->atoms)/sizeof((sctx)->atoms.array[0]))
|
||||
|
||||
#define SI_NUM_SHADERS (PIPE_SHADER_GEOMETRY+1)
|
||||
|
||||
struct si_context {
|
||||
struct r600_common_context b;
|
||||
struct blitter_context *blitter;
|
||||
@@ -141,13 +139,6 @@ struct si_context {
|
||||
union {
|
||||
struct {
|
||||
/* The order matters. */
|
||||
struct r600_atom *vertex_buffers;
|
||||
struct r600_atom *const_buffers[SI_NUM_SHADERS];
|
||||
struct r600_atom *rw_buffers[SI_NUM_SHADERS];
|
||||
struct r600_atom *sampler_views[SI_NUM_SHADERS];
|
||||
struct r600_atom *sampler_states[SI_NUM_SHADERS];
|
||||
/* Caches must be flushed after resource descriptors are
|
||||
* updated in memory. */
|
||||
struct r600_atom *cache_flush;
|
||||
struct r600_atom *streamout_begin;
|
||||
struct r600_atom *streamout_enable; /* must be after streamout_begin */
|
||||
@@ -156,6 +147,7 @@ struct si_context {
|
||||
struct r600_atom *db_render_state;
|
||||
struct r600_atom *msaa_config;
|
||||
struct r600_atom *clip_regs;
|
||||
struct r600_atom *shader_userdata;
|
||||
} s;
|
||||
struct r600_atom *array[0];
|
||||
} atoms;
|
||||
@@ -169,6 +161,7 @@ struct si_context {
|
||||
struct si_shader_selector *gs_shader;
|
||||
struct si_shader_selector *vs_shader;
|
||||
struct si_cs_shader_state cs_shader_state;
|
||||
struct si_shader_data shader_userdata;
|
||||
/* shader information */
|
||||
unsigned sprite_coord_enable;
|
||||
bool flatshade;
|
||||
|
@@ -2647,18 +2647,43 @@ void si_shader_apply_scratch_relocs(struct si_context *sctx,
|
||||
}
|
||||
}
|
||||
|
||||
int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader)
|
||||
{
|
||||
const struct radeon_shader_binary *binary = &shader->binary;
|
||||
unsigned code_size = binary->code_size + binary->rodata_size;
|
||||
unsigned char *ptr;
|
||||
|
||||
r600_resource_reference(&shader->bo, NULL);
|
||||
shader->bo = si_resource_create_custom(&sscreen->b.b,
|
||||
PIPE_USAGE_IMMUTABLE,
|
||||
code_size);
|
||||
if (!shader->bo)
|
||||
return -ENOMEM;
|
||||
|
||||
ptr = sscreen->b.ws->buffer_map(shader->bo->cs_buf, NULL,
|
||||
PIPE_TRANSFER_READ_WRITE);
|
||||
util_memcpy_cpu_to_le32(ptr, binary->code, binary->code_size);
|
||||
if (binary->rodata_size > 0) {
|
||||
ptr += binary->code_size;
|
||||
util_memcpy_cpu_to_le32(ptr, binary->rodata,
|
||||
binary->rodata_size);
|
||||
}
|
||||
|
||||
sscreen->b.ws->buffer_unmap(shader->bo->cs_buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int si_shader_binary_read(struct si_screen *sscreen,
|
||||
struct si_shader *shader,
|
||||
const struct radeon_shader_binary *binary)
|
||||
{
|
||||
|
||||
unsigned i;
|
||||
unsigned code_size;
|
||||
unsigned char *ptr;
|
||||
bool dump = r600_can_dump_shader(&sscreen->b,
|
||||
shader->selector ? shader->selector->tokens : NULL);
|
||||
|
||||
si_shader_binary_read_config(sscreen, shader, 0);
|
||||
si_shader_binary_upload(sscreen, shader);
|
||||
|
||||
if (dump) {
|
||||
if (!binary->disassembled) {
|
||||
@@ -2676,26 +2701,6 @@ int si_shader_binary_read(struct si_screen *sscreen,
|
||||
shader->num_sgprs, shader->num_vgprs, binary->code_size,
|
||||
shader->lds_size, shader->scratch_bytes_per_wave);
|
||||
}
|
||||
|
||||
/* copy new shader */
|
||||
code_size = binary->code_size + binary->rodata_size;
|
||||
r600_resource_reference(&shader->bo, NULL);
|
||||
shader->bo = si_resource_create_custom(&sscreen->b.b, PIPE_USAGE_IMMUTABLE,
|
||||
code_size);
|
||||
if (shader->bo == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
ptr = sscreen->b.ws->buffer_map(shader->bo->cs_buf, NULL, PIPE_TRANSFER_READ_WRITE);
|
||||
util_memcpy_cpu_to_le32(ptr, binary->code, binary->code_size);
|
||||
if (binary->rodata_size > 0) {
|
||||
ptr += binary->code_size;
|
||||
util_memcpy_cpu_to_le32(ptr, binary->rodata, binary->rodata_size);
|
||||
}
|
||||
|
||||
sscreen->b.ws->buffer_unmap(shader->bo->cs_buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -189,6 +189,7 @@ int si_compile_llvm(struct si_screen *sscreen, struct si_shader *shader,
|
||||
LLVMTargetMachineRef tm, LLVMModuleRef mod);
|
||||
void si_shader_destroy(struct pipe_context *ctx, struct si_shader *shader);
|
||||
unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index);
|
||||
int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader);
|
||||
int si_shader_binary_read(struct si_screen *sscreen, struct si_shader *shader,
|
||||
const struct radeon_shader_binary *binary);
|
||||
void si_shader_apply_scratch_relocs(struct si_context *sctx,
|
||||
|
@@ -30,6 +30,8 @@
|
||||
#include "si_pm4.h"
|
||||
#include "radeon/r600_pipe_common.h"
|
||||
|
||||
#define SI_NUM_SHADERS (PIPE_SHADER_GEOMETRY+1)
|
||||
|
||||
struct si_screen;
|
||||
struct si_shader;
|
||||
|
||||
@@ -111,6 +113,11 @@ union si_state {
|
||||
struct si_pm4_state *array[0];
|
||||
};
|
||||
|
||||
struct si_shader_data {
|
||||
struct r600_atom atom;
|
||||
uint32_t sh_base[SI_NUM_SHADERS];
|
||||
};
|
||||
|
||||
#define SI_NUM_USER_SAMPLERS 16 /* AKA OpenGL textures units per shader */
|
||||
#define SI_POLY_STIPPLE_SAMPLER SI_NUM_USER_SAMPLERS
|
||||
#define SI_NUM_SAMPLERS (SI_POLY_STIPPLE_SAMPLER + 1)
|
||||
@@ -144,59 +151,48 @@ union si_state {
|
||||
#define SI_NUM_VERTEX_BUFFERS 16
|
||||
|
||||
|
||||
/* This represents resource descriptors in memory, such as buffer resources,
|
||||
/* This represents descriptors in memory, such as buffer resources,
|
||||
* image resources, and sampler states.
|
||||
*/
|
||||
struct si_descriptors {
|
||||
struct r600_atom atom;
|
||||
|
||||
/* The size of one resource descriptor. */
|
||||
/* The list of descriptors in malloc'd memory. */
|
||||
uint32_t *list;
|
||||
/* The size of one descriptor. */
|
||||
unsigned element_dw_size;
|
||||
/* The maximum number of resource descriptors. */
|
||||
/* The maximum number of descriptors. */
|
||||
unsigned num_elements;
|
||||
/* Whether the list has been changed and should be re-uploaded. */
|
||||
bool list_dirty;
|
||||
|
||||
/* The buffer where resource descriptors are stored. */
|
||||
/* The buffer where the descriptors have been uploaded. */
|
||||
struct r600_resource *buffer;
|
||||
unsigned buffer_offset;
|
||||
|
||||
/* The i-th bit is set if that element is dirty (changed but not emitted). */
|
||||
uint64_t dirty_mask;
|
||||
/* The i-th bit is set if that element is enabled (non-NULL resource). */
|
||||
uint64_t enabled_mask;
|
||||
|
||||
/* We can't update descriptors directly because the GPU might be
|
||||
* reading them at the same time, so we have to update them
|
||||
* in a copy-on-write manner. Each such copy is called a context,
|
||||
* which is just another array descriptors in the same buffer. */
|
||||
unsigned current_context_id;
|
||||
/* The size of a context, should be equal to 4*element_dw_size*num_elements. */
|
||||
unsigned context_size;
|
||||
|
||||
/* The shader userdata register where the 64-bit pointer to the descriptor
|
||||
/* The shader userdata offset within a shader where the 64-bit pointer to the descriptor
|
||||
* array will be stored. */
|
||||
unsigned shader_userdata_reg;
|
||||
unsigned shader_userdata_offset;
|
||||
/* Whether the pointer should be re-emitted. */
|
||||
bool pointer_dirty;
|
||||
};
|
||||
|
||||
struct si_sampler_views {
|
||||
struct si_descriptors desc;
|
||||
struct pipe_sampler_view *views[SI_NUM_SAMPLER_VIEWS];
|
||||
uint32_t *desc_data[SI_NUM_SAMPLER_VIEWS];
|
||||
};
|
||||
|
||||
struct si_sampler_states {
|
||||
struct si_descriptors desc;
|
||||
uint32_t *desc_data[SI_NUM_SAMPLER_STATES];
|
||||
void *saved_states[2]; /* saved for u_blitter */
|
||||
};
|
||||
|
||||
struct si_buffer_resources {
|
||||
struct si_descriptors desc;
|
||||
unsigned num_buffers;
|
||||
enum radeon_bo_usage shader_usage; /* READ, WRITE, or READWRITE */
|
||||
enum radeon_bo_priority priority;
|
||||
struct pipe_resource **buffers; /* this has num_buffers elements */
|
||||
uint32_t *desc_storage; /* this has num_buffers*4 elements */
|
||||
uint32_t **desc_data; /* an array of pointers pointing to desc_storage */
|
||||
};
|
||||
|
||||
#define si_pm4_block_idx(member) \
|
||||
@@ -232,13 +228,13 @@ struct si_buffer_resources {
|
||||
/* si_descriptors.c */
|
||||
void si_set_sampler_descriptors(struct si_context *sctx, unsigned shader,
|
||||
unsigned start, unsigned count, void **states);
|
||||
void si_update_vertex_buffers(struct si_context *sctx);
|
||||
void si_set_ring_buffer(struct pipe_context *ctx, uint shader, uint slot,
|
||||
struct pipe_resource *buffer,
|
||||
unsigned stride, unsigned num_records,
|
||||
bool add_tid, bool swizzle,
|
||||
unsigned element_size, unsigned index_stride);
|
||||
void si_init_all_descriptors(struct si_context *sctx);
|
||||
bool si_upload_shader_descriptors(struct si_context *sctx);
|
||||
void si_release_all_descriptors(struct si_context *sctx);
|
||||
void si_all_descriptors_begin_new_cs(struct si_context *sctx);
|
||||
void si_copy_buffer(struct si_context *sctx,
|
||||
@@ -246,6 +242,7 @@ void si_copy_buffer(struct si_context *sctx,
|
||||
uint64_t dst_offset, uint64_t src_offset, unsigned size, bool is_framebuffer);
|
||||
void si_upload_const_buffer(struct si_context *sctx, struct r600_resource **rbuffer,
|
||||
const uint8_t *ptr, unsigned size, uint32_t *const_offset);
|
||||
void si_shader_change_notify(struct si_context *sctx);
|
||||
|
||||
/* si_state.c */
|
||||
struct si_shader_selector;
|
||||
|
@@ -139,6 +139,10 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
|
||||
(info->indirect || info->instance_count > 1))
|
||||
wd_switch_on_eop = true;
|
||||
|
||||
/* USE_OPAQUE doesn't work when WD_SWITCH_ON_EOP is 0. */
|
||||
if (info->count_from_stream_output)
|
||||
wd_switch_on_eop = true;
|
||||
|
||||
/* If the WD switch is false, the IA switch must be false too. */
|
||||
assert(wd_switch_on_eop || !ia_switch_on_eop);
|
||||
}
|
||||
@@ -245,8 +249,7 @@ static void si_emit_draw_packets(struct si_context *sctx,
|
||||
const struct pipe_index_buffer *ib)
|
||||
{
|
||||
struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
|
||||
unsigned sh_base_reg = (sctx->gs_shader ? R_00B330_SPI_SHADER_USER_DATA_ES_0 :
|
||||
R_00B130_SPI_SHADER_USER_DATA_VS_0);
|
||||
unsigned sh_base_reg = sctx->shader_userdata.sh_base[PIPE_SHADER_VERTEX];
|
||||
|
||||
if (info->count_from_stream_output) {
|
||||
struct r600_so_target *t =
|
||||
@@ -536,11 +539,8 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
|
||||
sctx->current_rast_prim = info->mode;
|
||||
|
||||
si_update_shaders(sctx);
|
||||
|
||||
if (sctx->vertex_buffers_dirty) {
|
||||
si_update_vertex_buffers(sctx);
|
||||
sctx->vertex_buffers_dirty = false;
|
||||
}
|
||||
if (!si_upload_shader_descriptors(sctx))
|
||||
return;
|
||||
|
||||
if (info->indexed) {
|
||||
/* Initialize the index buffer struct. */
|
||||
|
@@ -535,6 +535,7 @@ static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
|
||||
{
|
||||
struct si_context *sctx = (struct si_context *)ctx;
|
||||
struct si_shader_selector *sel = state;
|
||||
bool enable_changed = !!sctx->gs_shader != !!sel;
|
||||
|
||||
if (sctx->gs_shader == sel)
|
||||
return;
|
||||
@@ -542,6 +543,9 @@ static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
|
||||
sctx->gs_shader = sel;
|
||||
sctx->clip_regs.dirty = true;
|
||||
sctx->last_rast_prim = -1; /* reset this so that it gets updated */
|
||||
|
||||
if (enable_changed)
|
||||
si_shader_change_notify(sctx);
|
||||
}
|
||||
|
||||
static void si_make_dummy_ps(struct si_context *sctx)
|
||||
@@ -743,7 +747,6 @@ static unsigned si_update_scratch_buffer(struct si_context *sctx,
|
||||
{
|
||||
struct si_shader *shader;
|
||||
uint64_t scratch_va = sctx->scratch_buffer->gpu_address;
|
||||
unsigned char *ptr;
|
||||
|
||||
if (!sel)
|
||||
return 0;
|
||||
@@ -764,12 +767,7 @@ static unsigned si_update_scratch_buffer(struct si_context *sctx,
|
||||
si_shader_apply_scratch_relocs(sctx, shader, scratch_va);
|
||||
|
||||
/* Replace the shader bo with a new bo that has the relocs applied. */
|
||||
r600_resource_reference(&shader->bo, NULL);
|
||||
shader->bo = si_resource_create_custom(&sctx->screen->b.b, PIPE_USAGE_IMMUTABLE,
|
||||
shader->binary.code_size);
|
||||
ptr = sctx->screen->b.ws->buffer_map(shader->bo->cs_buf, NULL, PIPE_TRANSFER_WRITE);
|
||||
util_memcpy_cpu_to_le32(ptr, shader->binary.code, shader->binary.code_size);
|
||||
sctx->screen->b.ws->buffer_unmap(shader->bo->cs_buf);
|
||||
si_shader_binary_upload(sctx->screen, shader);
|
||||
|
||||
/* Update the shader state to use the new shader bo. */
|
||||
si_shader_init_pm4_state(shader);
|
||||
@@ -835,8 +833,15 @@ static void si_update_spi_tmpring_size(struct si_context *sctx)
|
||||
si_pm4_bind_state(sctx, ps, sctx->ps_shader->current->pm4);
|
||||
if (si_update_scratch_buffer(sctx, sctx->gs_shader))
|
||||
si_pm4_bind_state(sctx, gs, sctx->gs_shader->current->pm4);
|
||||
if (si_update_scratch_buffer(sctx, sctx->vs_shader))
|
||||
si_pm4_bind_state(sctx, vs, sctx->vs_shader->current->pm4);
|
||||
|
||||
/* VS can be bound as ES or VS. */
|
||||
if (sctx->gs_shader) {
|
||||
if (si_update_scratch_buffer(sctx, sctx->vs_shader))
|
||||
si_pm4_bind_state(sctx, es, sctx->vs_shader->current->pm4);
|
||||
} else {
|
||||
if (si_update_scratch_buffer(sctx, sctx->vs_shader))
|
||||
si_pm4_bind_state(sctx, vs, sctx->vs_shader->current->pm4);
|
||||
}
|
||||
}
|
||||
|
||||
/* The LLVM shader backend should be reporting aligned scratch_sizes. */
|
||||
|
@@ -31,7 +31,12 @@ extern "C" {
|
||||
PUBLIC bool
|
||||
opencl_dri_event_add_ref(cl_event event)
|
||||
{
|
||||
return clRetainEvent(event) == CL_SUCCESS;
|
||||
/* This should fail if the event hasn't been created by
|
||||
* clEnqueueReleaseGLObjects or clEnqueueReleaseEGLObjects.
|
||||
*
|
||||
* TODO: implement the CL functions
|
||||
*/
|
||||
return false; /*return clRetainEvent(event) == CL_SUCCESS;*/
|
||||
}
|
||||
|
||||
PUBLIC bool
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "CL/cl.h"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
namespace clover {
|
||||
class command_queue;
|
||||
|
@@ -554,7 +554,7 @@ dri2_allocate_textures(struct dri_context *ctx,
|
||||
|
||||
if (drawable->textures[statt]) {
|
||||
templ.format = drawable->textures[statt]->format;
|
||||
templ.bind = drawable->textures[statt]->bind;
|
||||
templ.bind = drawable->textures[statt]->bind & ~PIPE_BIND_SCANOUT;
|
||||
templ.nr_samples = drawable->stvis.samples;
|
||||
|
||||
/* Try to reuse the resource.
|
||||
@@ -1483,7 +1483,7 @@ dri2_init_screen(__DRIscreen * sPriv)
|
||||
}
|
||||
}
|
||||
|
||||
if (pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)) {
|
||||
if (pscreen && pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)) {
|
||||
sPriv->extensions = dri_robust_screen_extensions;
|
||||
screen->has_reset_status_query = true;
|
||||
}
|
||||
|
@@ -244,11 +244,10 @@ dri_make_current(__DRIcontext * cPriv,
|
||||
|
||||
ctx->stapi->make_current(ctx->stapi, ctx->st, &draw->base, &read->base);
|
||||
|
||||
// This is ok to call here. If they are already init, it's a no-op.
|
||||
if (draw->textures[ST_ATTACHMENT_BACK_LEFT] && draw->textures[ST_ATTACHMENT_DEPTH_STENCIL]
|
||||
&& ctx->pp)
|
||||
pp_init_fbos(ctx->pp, draw->textures[ST_ATTACHMENT_BACK_LEFT]->width0,
|
||||
draw->textures[ST_ATTACHMENT_BACK_LEFT]->height0);
|
||||
/* This is ok to call here. If they are already init, it's a no-op. */
|
||||
if (ctx->pp && draw->textures[ST_ATTACHMENT_BACK_LEFT])
|
||||
pp_init_fbos(ctx->pp, draw->textures[ST_ATTACHMENT_BACK_LEFT]->width0,
|
||||
draw->textures[ST_ATTACHMENT_BACK_LEFT]->height0);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
@@ -886,7 +886,7 @@ static struct name_function functions[] = {
|
||||
{ "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
|
||||
{ "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
|
||||
{ "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
|
||||
{ "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore },
|
||||
{ "OSMesaPixelStore", (OSMESAproc) OSMesaPixelStore },
|
||||
{ "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv },
|
||||
{ "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer },
|
||||
{ "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer },
|
||||
|
@@ -49,7 +49,8 @@ vlVdpVideoMixerCreate(VdpDevice device,
|
||||
vlVdpVideoMixer *vmixer = NULL;
|
||||
VdpStatus ret;
|
||||
struct pipe_screen *screen;
|
||||
unsigned max_width, max_height, i;
|
||||
uint32_t max_2d_texture_level;
|
||||
unsigned max_size, i;
|
||||
|
||||
vlVdpDevice *dev = vlGetDataHTAB(device);
|
||||
if (!dev)
|
||||
@@ -134,18 +135,17 @@ vlVdpVideoMixerCreate(VdpDevice device,
|
||||
VDPAU_MSG(VDPAU_WARN, "[VDPAU] Max layers > 4 not supported\n", vmixer->max_layers);
|
||||
goto no_params;
|
||||
}
|
||||
max_width = screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
|
||||
PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_MAX_WIDTH);
|
||||
max_height = screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
|
||||
PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_MAX_HEIGHT);
|
||||
if (vmixer->video_width < 48 ||
|
||||
vmixer->video_width > max_width) {
|
||||
VDPAU_MSG(VDPAU_WARN, "[VDPAU] 48 < %u < %u not valid for width\n", vmixer->video_width, max_width);
|
||||
|
||||
max_2d_texture_level = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
|
||||
max_size = pow(2, max_2d_texture_level-1);
|
||||
if (vmixer->video_width < 48 || vmixer->video_width > max_size) {
|
||||
VDPAU_MSG(VDPAU_WARN, "[VDPAU] 48 < %u < %u not valid for width\n",
|
||||
vmixer->video_width, max_size);
|
||||
goto no_params;
|
||||
}
|
||||
if (vmixer->video_height < 48 ||
|
||||
vmixer->video_height > max_height) {
|
||||
VDPAU_MSG(VDPAU_WARN, "[VDPAU] 48 < %u < %u not valid for height\n", vmixer->video_height, max_height);
|
||||
if (vmixer->video_height < 48 || vmixer->video_height > max_size) {
|
||||
VDPAU_MSG(VDPAU_WARN, "[VDPAU] 48 < %u < %u not valid for height\n",
|
||||
vmixer->video_height, max_size);
|
||||
goto no_params;
|
||||
}
|
||||
vmixer->luma_key_min = 0.f;
|
||||
|
@@ -37,7 +37,11 @@
|
||||
XA_EXPORT void
|
||||
xa_context_flush(struct xa_context *ctx)
|
||||
{
|
||||
ctx->pipe->flush(ctx->pipe, &ctx->last_fence, 0);
|
||||
if (ctx->last_fence) {
|
||||
struct pipe_screen *screen = ctx->xa->screen;
|
||||
screen->fence_reference(screen, &ctx->last_fence, NULL);
|
||||
}
|
||||
ctx->pipe->flush(ctx->pipe, &ctx->last_fence, 0);
|
||||
}
|
||||
|
||||
XA_EXPORT struct xa_context *
|
||||
|
@@ -461,7 +461,7 @@ xa_surface_redefine(struct xa_surface *srf,
|
||||
xa_min(save_height, template->height0), &src_box);
|
||||
pipe->resource_copy_region(pipe, texture,
|
||||
0, 0, 0, 0, srf->tex, 0, &src_box);
|
||||
pipe->flush(pipe, &xa->default_ctx->last_fence, 0);
|
||||
xa_context_flush(xa->default_ctx);
|
||||
}
|
||||
|
||||
pipe_resource_reference(&srf->tex, texture);
|
||||
@@ -535,15 +535,3 @@ xa_surface_format(const struct xa_surface *srf)
|
||||
{
|
||||
return srf->fdesc.xa_format;
|
||||
}
|
||||
|
||||
/*
|
||||
* _mesa_error_no_memory() is expected by NIR to be provided by the
|
||||
* user. Normally this is in mesa st, but other state trackers
|
||||
* must provide their own.
|
||||
*/
|
||||
void _mesa_error_no_memory(const char *caller);
|
||||
void
|
||||
_mesa_error_no_memory(const char *caller)
|
||||
{
|
||||
debug_printf("Mesa error: out of memory in %s", caller);
|
||||
}
|
||||
|
@@ -154,7 +154,7 @@ xa_yuv_planar_blit(struct xa_context *r,
|
||||
box++;
|
||||
}
|
||||
|
||||
r->pipe->flush(r->pipe, &r->last_fence, 0);
|
||||
xa_context_flush(r);
|
||||
|
||||
xa_ctx_sampler_views_destroy(r);
|
||||
xa_ctx_srf_destroy(r);
|
||||
|
@@ -74,6 +74,8 @@ endif # HAVE_LD_VERSION_SCRIPT
|
||||
d3dadapter9_la_LIBADD = \
|
||||
$(top_builddir)/src/gallium/auxiliary/libgalliumvl_stub.la \
|
||||
$(top_builddir)/src/gallium/auxiliary/libgallium.la \
|
||||
$(top_builddir)/src/glsl/libnir.la \
|
||||
$(top_builddir)/src/libglsl_util.la \
|
||||
$(top_builddir)/src/gallium/state_trackers/nine/libninetracker.la \
|
||||
$(top_builddir)/src/util/libmesautil.la \
|
||||
$(top_builddir)/src/gallium/winsys/sw/wrapper/libwsw.la \
|
||||
|
@@ -53,12 +53,6 @@ gallium_dri_la_LIBADD = \
|
||||
$(LIBDRM_LIBS) \
|
||||
$(GALLIUM_COMMON_LIB_DEPS)
|
||||
|
||||
# XXX: Temporary allow duplicated symbols, as the loader pulls in xmlconfig.c
|
||||
# which already provides driParse* and driQuery* amongst others.
|
||||
# Remove this hack as we come up with a cleaner solution.
|
||||
gallium_dri_la_LDFLAGS += \
|
||||
-Wl,--allow-multiple-definition
|
||||
|
||||
EXTRA_gallium_dri_la_DEPENDENCIES = \
|
||||
dri.sym \
|
||||
$(top_srcdir)/src/gallium/targets/dri-vdpau.dyn
|
||||
|
@@ -7,7 +7,7 @@ lib_LTLIBRARIES = lib@OPENCL_LIBNAME@.la
|
||||
lib@OPENCL_LIBNAME@_la_LDFLAGS = \
|
||||
$(LLVM_LDFLAGS) \
|
||||
-no-undefined \
|
||||
-version-number 1:0 \
|
||||
-version-number @OPENCL_VERSION@:0 \
|
||||
$(GC_SECTIONS) \
|
||||
$(LD_NO_UNDEFINED)
|
||||
|
||||
|
@@ -1 +0,0 @@
|
||||
libMesaOpenCL.so
|
1
src/gallium/targets/opencl/mesa.icd.in
Normal file
1
src/gallium/targets/opencl/mesa.icd.in
Normal file
@@ -0,0 +1 @@
|
||||
lib@OPENCL_LIBNAME@.so.@OPENCL_VERSION@
|
@@ -42,7 +42,6 @@ nodist_EXTRA_lib@OSMESA_LIB@_la_SOURCES = dummy.cpp
|
||||
lib@OSMESA_LIB@_la_SOURCES = target.c
|
||||
|
||||
lib@OSMESA_LIB@_la_LDFLAGS = \
|
||||
-module \
|
||||
-no-undefined \
|
||||
-version-number @OSMESA_VERSION@ \
|
||||
$(GC_SECTIONS) \
|
||||
|
@@ -52,6 +52,8 @@ endif
|
||||
|
||||
PIPE_LIBS += \
|
||||
$(top_builddir)/src/gallium/auxiliary/libgallium.la \
|
||||
$(top_builddir)/src/glsl/libnir.la \
|
||||
$(top_builddir)/src/libglsl_util.la \
|
||||
$(top_builddir)/src/util/libmesautil.la \
|
||||
$(top_builddir)/src/gallium/drivers/rbug/librbug.la \
|
||||
$(top_builddir)/src/gallium/drivers/trace/libtrace.la \
|
||||
|
@@ -120,7 +120,11 @@ nouveau_drm_screen_create(int fd)
|
||||
if (!screen)
|
||||
goto err;
|
||||
|
||||
util_hash_table_set(fd_tab, intptr_to_pointer(fd), screen);
|
||||
/* Use dupfd in hash table, to avoid errors if the original fd gets
|
||||
* closed by its owner. The hash key needs to live at least as long as
|
||||
* the screen.
|
||||
*/
|
||||
util_hash_table_set(fd_tab, intptr_to_pointer(dupfd), screen);
|
||||
screen->refcount = 1;
|
||||
pipe_mutex_unlock(nouveau_screen_mutex);
|
||||
return &screen->base;
|
||||
|
@@ -305,14 +305,34 @@ static void radeon_bo_destroy(struct pb_buffer *_buf)
|
||||
if (bo->ptr)
|
||||
os_munmap(bo->ptr, bo->base.size);
|
||||
|
||||
if (mgr->va) {
|
||||
if (bo->rws->va_unmap_working) {
|
||||
struct drm_radeon_gem_va va;
|
||||
|
||||
va.handle = bo->handle;
|
||||
va.vm_id = 0;
|
||||
va.operation = RADEON_VA_UNMAP;
|
||||
va.flags = RADEON_VM_PAGE_READABLE |
|
||||
RADEON_VM_PAGE_WRITEABLE |
|
||||
RADEON_VM_PAGE_SNOOPED;
|
||||
va.offset = bo->va;
|
||||
|
||||
if (drmCommandWriteRead(bo->rws->fd, DRM_RADEON_GEM_VA, &va,
|
||||
sizeof(va)) != 0 &&
|
||||
va.operation == RADEON_VA_RESULT_ERROR) {
|
||||
fprintf(stderr, "radeon: Failed to deallocate virtual address for buffer:\n");
|
||||
fprintf(stderr, "radeon: size : %d bytes\n", bo->base.size);
|
||||
fprintf(stderr, "radeon: va : 0x%016llx\n", (unsigned long long)bo->va);
|
||||
}
|
||||
}
|
||||
|
||||
radeon_bomgr_free_va(mgr, bo->va, bo->base.size);
|
||||
}
|
||||
|
||||
/* Close object. */
|
||||
args.handle = bo->handle;
|
||||
drmIoctl(bo->rws->fd, DRM_IOCTL_GEM_CLOSE, &args);
|
||||
|
||||
if (mgr->va) {
|
||||
radeon_bomgr_free_va(mgr, bo->va, bo->base.size);
|
||||
}
|
||||
|
||||
pipe_mutex_destroy(bo->map_mutex);
|
||||
|
||||
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
||||
|
@@ -57,6 +57,8 @@
|
||||
#define RADEON_INFO_READ_REG 0x24
|
||||
#endif
|
||||
|
||||
#define RADEON_INFO_VA_UNMAP_WORKING 0x25
|
||||
|
||||
static struct util_hash_table *fd_tab = NULL;
|
||||
pipe_static_mutex(fd_tab_mutex);
|
||||
|
||||
@@ -399,6 +401,8 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws)
|
||||
if (!radeon_get_drm_value(ws->fd, RADEON_INFO_IB_VM_MAX_SIZE, NULL,
|
||||
&ib_vm_max_size))
|
||||
ws->info.r600_virtual_address = FALSE;
|
||||
radeon_get_drm_value(ws->fd, RADEON_INFO_VA_UNMAP_WORKING, NULL,
|
||||
&ws->va_unmap_working);
|
||||
}
|
||||
if (ws->gen == DRV_R600 && !debug_get_bool_option("RADEON_VA", FALSE))
|
||||
ws->info.r600_virtual_address = FALSE;
|
||||
@@ -484,6 +488,10 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
||||
if (ws->gen >= DRV_R600) {
|
||||
radeon_surface_manager_free(ws->surf_man);
|
||||
}
|
||||
|
||||
if (ws->fd >= 0)
|
||||
close(ws->fd);
|
||||
|
||||
FREE(rws);
|
||||
}
|
||||
|
||||
@@ -696,7 +704,7 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ws->fd = fd;
|
||||
ws->fd = dup(fd);
|
||||
|
||||
if (!do_winsys_init(ws))
|
||||
goto fail;
|
||||
@@ -712,7 +720,7 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
|
||||
goto fail;
|
||||
|
||||
if (ws->gen >= DRV_R600) {
|
||||
ws->surf_man = radeon_surface_manager_new(fd);
|
||||
ws->surf_man = radeon_surface_manager_new(ws->fd);
|
||||
if (!ws->surf_man)
|
||||
goto fail;
|
||||
}
|
||||
@@ -753,7 +761,7 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
util_hash_table_set(fd_tab, intptr_to_pointer(fd), ws);
|
||||
util_hash_table_set(fd_tab, intptr_to_pointer(ws->fd), ws);
|
||||
|
||||
/* We must unlock the mutex once the winsys is fully initialized, so that
|
||||
* other threads attempting to create the winsys from the same fd will
|
||||
@@ -770,6 +778,9 @@ fail:
|
||||
ws->kman->destroy(ws->kman);
|
||||
if (ws->surf_man)
|
||||
radeon_surface_manager_free(ws->surf_man);
|
||||
if (ws->fd >= 0)
|
||||
close(ws->fd);
|
||||
|
||||
FREE(ws);
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -74,6 +74,7 @@ struct radeon_drm_winsys {
|
||||
enum radeon_generation gen;
|
||||
struct radeon_info info;
|
||||
uint32_t va_start;
|
||||
uint32_t va_unmap_working;
|
||||
uint32_t accel_working2;
|
||||
|
||||
struct pb_manager *kman;
|
||||
|
@@ -52,7 +52,8 @@ libgbm_dri_la_CFLAGS = \
|
||||
$(LIBDRM_CFLAGS)
|
||||
|
||||
libgbm_la_LIBADD += \
|
||||
libgbm_dri.la $(top_builddir)/src/mapi/shared-glapi/libglapi.la $(LIBDRM_LIBS)
|
||||
libgbm_dri.la \
|
||||
$(LIBDRM_LIBS)
|
||||
endif
|
||||
|
||||
TESTS = gbm-symbols-check
|
||||
|
@@ -311,6 +311,14 @@ dri_open_driver(struct gbm_dri_device *dri)
|
||||
if (search_paths == NULL)
|
||||
search_paths = DEFAULT_DRIVER_DIR;
|
||||
|
||||
/* Temporarily work around dri driver libs that need symbols in libglapi
|
||||
* but don't automatically link it in.
|
||||
*/
|
||||
/* XXX: Library name differs on per platforms basis. Update this as
|
||||
* osx/cygwin/windows/bsd gets support for GBM..
|
||||
*/
|
||||
dlopen("libglapi.so.0", RTLD_LAZY | RTLD_GLOBAL);
|
||||
|
||||
dri->driver = NULL;
|
||||
end = search_paths + strlen(search_paths);
|
||||
for (p = search_paths; p < end && dri->driver == NULL; p = next + 1) {
|
||||
|
@@ -89,8 +89,7 @@ tests_general_ir_test_SOURCES = \
|
||||
tests/builtin_variable_test.cpp \
|
||||
tests/invalidate_locations_test.cpp \
|
||||
tests/general_ir_test.cpp \
|
||||
tests/varyings_test.cpp \
|
||||
tests/common.c
|
||||
tests/varyings_test.cpp
|
||||
tests_general_ir_test_CFLAGS = \
|
||||
$(PTHREAD_CFLAGS)
|
||||
tests_general_ir_test_LDADD = \
|
||||
@@ -103,8 +102,7 @@ tests_uniform_initializer_test_SOURCES = \
|
||||
tests/copy_constant_to_storage_tests.cpp \
|
||||
tests/set_uniform_initializer_tests.cpp \
|
||||
tests/uniform_initializer_utils.cpp \
|
||||
tests/uniform_initializer_utils.h \
|
||||
tests/common.c
|
||||
tests/uniform_initializer_utils.h
|
||||
tests_uniform_initializer_test_CFLAGS = \
|
||||
$(PTHREAD_CFLAGS)
|
||||
tests_uniform_initializer_test_LDADD = \
|
||||
@@ -114,8 +112,7 @@ tests_uniform_initializer_test_LDADD = \
|
||||
$(PTHREAD_LIBS)
|
||||
|
||||
tests_sampler_types_test_SOURCES = \
|
||||
tests/sampler_types_test.cpp \
|
||||
tests/common.c
|
||||
tests/sampler_types_test.cpp
|
||||
tests_sampler_types_test_CFLAGS = \
|
||||
$(PTHREAD_CFLAGS)
|
||||
tests_sampler_types_test_LDADD = \
|
||||
@@ -133,8 +130,7 @@ libglcpp_la_SOURCES = \
|
||||
$(LIBGLCPP_FILES)
|
||||
|
||||
glcpp_glcpp_SOURCES = \
|
||||
glcpp/glcpp.c \
|
||||
tests/common.c
|
||||
glcpp/glcpp.c
|
||||
glcpp_glcpp_LDADD = \
|
||||
libglcpp.la \
|
||||
$(top_builddir)/src/libglsl_util.la \
|
||||
@@ -164,7 +160,6 @@ glsl_compiler_LDADD = \
|
||||
|
||||
glsl_test_SOURCES = \
|
||||
standalone_scaffolding.cpp \
|
||||
tests/common.c \
|
||||
test.cpp \
|
||||
test_optpass.cpp \
|
||||
test_optpass.h
|
||||
|
@@ -71,6 +71,7 @@ env.Command('imports.c', '#src/mesa/main/imports.c', Copy('$TARGET', '$SOURCE'))
|
||||
env.Prepend(CPPPATH = ['#src/mesa/program'])
|
||||
env.Command('prog_hash_table.c', '#src/mesa/program/prog_hash_table.c', Copy('$TARGET', '$SOURCE'))
|
||||
env.Command('symbol_table.c', '#src/mesa/program/symbol_table.c', Copy('$TARGET', '$SOURCE'))
|
||||
env.Command('dummy_errors.c', '#src/mesa/program/dummy_errors.c', Copy('$TARGET', '$SOURCE'))
|
||||
|
||||
compiler_objs = env.StaticObject(source_lists['GLSL_COMPILER_CXX_FILES'])
|
||||
|
||||
@@ -78,6 +79,7 @@ mesa_objs = env.StaticObject([
|
||||
'imports.c',
|
||||
'prog_hash_table.c',
|
||||
'symbol_table.c',
|
||||
'dummy_errors.c',
|
||||
])
|
||||
|
||||
compiler_objs += mesa_objs
|
||||
@@ -115,6 +117,6 @@ env.Alias('glsl_compiler', glsl_compiler)
|
||||
|
||||
glcpp = env.Program(
|
||||
target = 'glcpp/glcpp',
|
||||
source = ['glcpp/glcpp.c', 'tests/common.c'] + mesa_objs,
|
||||
source = ['glcpp/glcpp.c'] + mesa_objs,
|
||||
)
|
||||
env.Alias('glcpp', glcpp)
|
||||
|
@@ -225,25 +225,25 @@ _mesa_ast_array_index_to_hir(void *mem_ctx,
|
||||
* values *do* diverge, then the behavior of the operation requiring a
|
||||
* dynamically uniform expression is undefined.
|
||||
*/
|
||||
if (array->type->element_type()->is_sampler()) {
|
||||
if (!state->is_version(130, 100)) {
|
||||
if (state->es_shader) {
|
||||
_mesa_glsl_warning(&loc, state,
|
||||
"sampler arrays indexed with non-constant "
|
||||
"expressions is optional in %s",
|
||||
state->get_version_string());
|
||||
} else {
|
||||
_mesa_glsl_warning(&loc, state,
|
||||
"sampler arrays indexed with non-constant "
|
||||
"expressions will be forbidden in GLSL 1.30 "
|
||||
"and later");
|
||||
}
|
||||
} else if (!state->is_version(400, 0) && !state->ARB_gpu_shader5_enable) {
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"sampler arrays indexed with non-constant "
|
||||
"expressions is forbidden in GLSL 1.30 and "
|
||||
"later");
|
||||
}
|
||||
if (array->type->without_array()->is_sampler()) {
|
||||
if (!state->is_version(400, 0) && !state->ARB_gpu_shader5_enable) {
|
||||
if (state->is_version(130, 300))
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"sampler arrays indexed with non-constant "
|
||||
"expressions are forbidden in GLSL %s "
|
||||
"and later",
|
||||
state->es_shader ? "ES 3.00" : "1.30");
|
||||
else if (state->es_shader)
|
||||
_mesa_glsl_warning(&loc, state,
|
||||
"sampler arrays indexed with non-constant "
|
||||
"expressions will be forbidden in GLSL "
|
||||
"3.00 and later");
|
||||
else
|
||||
_mesa_glsl_warning(&loc, state,
|
||||
"sampler arrays indexed with non-constant "
|
||||
"expressions will be forbidden in GLSL "
|
||||
"1.30 and later");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2086,7 +2086,7 @@ validate_binding_qualifier(struct _mesa_glsl_parse_state *state,
|
||||
* with an array of size N, all elements of the array from binding
|
||||
* through binding + N - 1 must be within this range."
|
||||
*/
|
||||
unsigned limit = ctx->Const.Program[state->stage].MaxTextureImageUnits;
|
||||
unsigned limit = ctx->Const.MaxCombinedTextureImageUnits;
|
||||
|
||||
if (max_index >= limit) {
|
||||
_mesa_glsl_error(loc, state, "layout(binding = %d) for %d samplers "
|
||||
|
@@ -876,9 +876,9 @@ void
|
||||
builtin_variable_generator::generate_gs_special_vars()
|
||||
{
|
||||
add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
|
||||
if (state->ARB_viewport_array_enable)
|
||||
if (state->is_version(410, 0) || state->ARB_viewport_array_enable)
|
||||
add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
|
||||
if (state->ARB_gpu_shader5_enable)
|
||||
if (state->is_version(400, 0) || state->ARB_gpu_shader5_enable)
|
||||
add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, "gl_InvocationID");
|
||||
|
||||
/* Although gl_PrimitiveID appears in tessellation control and tessellation
|
||||
@@ -946,7 +946,7 @@ builtin_variable_generator::generate_fs_special_vars()
|
||||
var->enable_extension_warning("GL_AMD_shader_stencil_export");
|
||||
}
|
||||
|
||||
if (state->ARB_sample_shading_enable) {
|
||||
if (state->is_version(400, 0) || state->ARB_sample_shading_enable) {
|
||||
add_system_value(SYSTEM_VALUE_SAMPLE_ID, int_t, "gl_SampleID");
|
||||
add_system_value(SYSTEM_VALUE_SAMPLE_POS, vec2_t, "gl_SamplePosition");
|
||||
/* From the ARB_sample_shading specification:
|
||||
@@ -959,11 +959,11 @@ builtin_variable_generator::generate_fs_special_vars()
|
||||
add_output(FRAG_RESULT_SAMPLE_MASK, array(int_t, 1), "gl_SampleMask");
|
||||
}
|
||||
|
||||
if (state->ARB_gpu_shader5_enable) {
|
||||
if (state->is_version(400, 0) || state->ARB_gpu_shader5_enable) {
|
||||
add_system_value(SYSTEM_VALUE_SAMPLE_MASK_IN, array(int_t, 1), "gl_SampleMaskIn");
|
||||
}
|
||||
|
||||
if (state->ARB_fragment_layer_viewport_enable) {
|
||||
if (state->is_version(430, 0) || state->ARB_fragment_layer_viewport_enable) {
|
||||
add_input(VARYING_SLOT_LAYER, int_t, "gl_Layer");
|
||||
add_input(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
|
||||
}
|
||||
|
@@ -1074,9 +1074,9 @@ _token_list_equal_ignoring_space (token_list_t *a, token_list_t *b)
|
||||
*/
|
||||
if (node_a->token->type == SPACE
|
||||
&& node_b->token->type == SPACE) {
|
||||
while (node_a->token->type == SPACE)
|
||||
while (node_a && node_a->token->type == SPACE)
|
||||
node_a = node_a->next;
|
||||
while (node_b->token->type == SPACE)
|
||||
while (node_b && node_b->token->type == SPACE)
|
||||
node_b = node_b->next;
|
||||
continue;
|
||||
}
|
||||
|
@@ -63,8 +63,6 @@ update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, unsigned to)
|
||||
case 3: m.w = from; break;
|
||||
default: assert(!"Should not get here.");
|
||||
}
|
||||
|
||||
m.num_components = MAX2(m.num_components, (to + 1));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -95,6 +93,7 @@ ir_assignment::set_lhs(ir_rvalue *lhs)
|
||||
|
||||
write_mask |= (((this->write_mask >> i) & 1) << c);
|
||||
update_rhs_swizzle(rhs_swiz, i, c);
|
||||
rhs_swiz.num_components = swiz->val->type->vector_elements;
|
||||
}
|
||||
|
||||
this->write_mask = write_mask;
|
||||
@@ -114,6 +113,7 @@ ir_assignment::set_lhs(ir_rvalue *lhs)
|
||||
if (write_mask & (1 << i))
|
||||
update_rhs_swizzle(rhs_swiz, i, rhs_chan++);
|
||||
}
|
||||
rhs_swiz.num_components = rhs_chan;
|
||||
this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
|
||||
}
|
||||
|
||||
|
@@ -148,9 +148,11 @@ get_parameter_match_type(const ir_variable *param,
|
||||
if (from_type == to_type)
|
||||
return PARAMETER_EXACT_MATCH;
|
||||
|
||||
/* XXX: When ARB_gpu_shader_fp64 support is added, check for float->double,
|
||||
* and int/uint->double conversions
|
||||
*/
|
||||
if (to_type->base_type == GLSL_TYPE_DOUBLE) {
|
||||
if (from_type->base_type == GLSL_TYPE_FLOAT)
|
||||
return PARAMETER_FLOAT_TO_DOUBLE;
|
||||
return PARAMETER_INT_TO_DOUBLE;
|
||||
}
|
||||
|
||||
if (to_type->base_type == GLSL_TYPE_FLOAT)
|
||||
return PARAMETER_INT_TO_FLOAT;
|
||||
|
@@ -346,6 +346,39 @@ private:
|
||||
bool uses_non_zero_stream;
|
||||
};
|
||||
|
||||
/* Class that finds array derefs and check if indexes are dynamic. */
|
||||
class dynamic_sampler_array_indexing_visitor : public ir_hierarchical_visitor
|
||||
{
|
||||
public:
|
||||
dynamic_sampler_array_indexing_visitor() :
|
||||
dynamic_sampler_array_indexing(false)
|
||||
{
|
||||
}
|
||||
|
||||
ir_visitor_status visit_enter(ir_dereference_array *ir)
|
||||
{
|
||||
if (!ir->variable_referenced())
|
||||
return visit_continue;
|
||||
|
||||
if (!ir->variable_referenced()->type->contains_sampler())
|
||||
return visit_continue;
|
||||
|
||||
if (!ir->array_index->constant_expression_value()) {
|
||||
dynamic_sampler_array_indexing = true;
|
||||
return visit_stop;
|
||||
}
|
||||
return visit_continue;
|
||||
}
|
||||
|
||||
bool uses_dynamic_sampler_array_indexing()
|
||||
{
|
||||
return dynamic_sampler_array_indexing;
|
||||
}
|
||||
|
||||
private:
|
||||
bool dynamic_sampler_array_indexing;
|
||||
};
|
||||
|
||||
} /* anonymous namespace */
|
||||
|
||||
void
|
||||
@@ -2736,6 +2769,40 @@ build_program_resource_list(struct gl_context *ctx,
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* This check is done to make sure we allow only constant expression
|
||||
* indexing and "constant-index-expression" (indexing with an expression
|
||||
* that includes loop induction variable).
|
||||
*/
|
||||
static bool
|
||||
validate_sampler_array_indexing(struct gl_context *ctx,
|
||||
struct gl_shader_program *prog)
|
||||
{
|
||||
dynamic_sampler_array_indexing_visitor v;
|
||||
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
if (prog->_LinkedShaders[i] == NULL)
|
||||
continue;
|
||||
|
||||
bool no_dynamic_indexing =
|
||||
ctx->Const.ShaderCompilerOptions[i].EmitNoIndirectSampler;
|
||||
|
||||
/* Search for array derefs in shader. */
|
||||
v.run(prog->_LinkedShaders[i]->ir);
|
||||
if (v.uses_dynamic_sampler_array_indexing()) {
|
||||
const char *msg = "sampler arrays indexed with non-constant "
|
||||
"expressions is forbidden in GLSL %s %u";
|
||||
/* Backend has indicated that it has no dynamic indexing support. */
|
||||
if (no_dynamic_indexing) {
|
||||
linker_error(prog, msg, prog->IsES ? "ES" : "", prog->Version);
|
||||
return false;
|
||||
} else {
|
||||
linker_warning(prog, msg, prog->IsES ? "ES" : "", prog->Version);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
@@ -2829,8 +2896,11 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
link_intrastage_shaders(mem_ctx, ctx, prog, shader_list[stage],
|
||||
num_shaders[stage]);
|
||||
|
||||
if (!prog->LinkStatus)
|
||||
if (!prog->LinkStatus) {
|
||||
if (sh)
|
||||
ctx->Driver.DeleteShader(ctx, sh);
|
||||
goto done;
|
||||
}
|
||||
|
||||
switch (stage) {
|
||||
case MESA_SHADER_VERTEX:
|
||||
@@ -2843,8 +2913,11 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
validate_fragment_shader_executable(prog, sh);
|
||||
break;
|
||||
}
|
||||
if (!prog->LinkStatus)
|
||||
if (!prog->LinkStatus) {
|
||||
if (sh)
|
||||
ctx->Driver.DeleteShader(ctx, sh);
|
||||
goto done;
|
||||
}
|
||||
|
||||
_mesa_reference_shader(ctx, &prog->_LinkedShaders[stage], sh);
|
||||
}
|
||||
@@ -2948,6 +3021,16 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
lower_const_arrays_to_uniforms(prog->_LinkedShaders[i]->ir);
|
||||
}
|
||||
|
||||
/* Validation for special cases where we allow sampler array indexing
|
||||
* with loop induction variable. This check emits a warning or error
|
||||
* depending if backend can handle dynamic indexing.
|
||||
*/
|
||||
if ((!prog->IsES && prog->Version < 130) ||
|
||||
(prog->IsES && prog->Version < 300)) {
|
||||
if (!validate_sampler_array_indexing(ctx, prog))
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Check and validate stream emissions in geometry shaders */
|
||||
validate_geometry_shader_emissions(ctx, prog);
|
||||
|
||||
|
@@ -100,6 +100,18 @@ public:
|
||||
|
||||
virtual ir_visitor_status visit_enter(ir_dereference_array *ir)
|
||||
{
|
||||
/* Force unroll in case of dynamic indexing with sampler arrays
|
||||
* when EmitNoIndirectSampler is set.
|
||||
*/
|
||||
if (options->EmitNoIndirectSampler) {
|
||||
if ((ir->array->type->is_array() &&
|
||||
ir->array->type->contains_sampler()) &&
|
||||
!ir->array_index->constant_expression_value()) {
|
||||
unsupported_variable_indexing = true;
|
||||
return visit_continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for arrays variably-indexed by a loop induction variable.
|
||||
* Unrolling the loop may convert that access into constant-indexing.
|
||||
*
|
||||
|
@@ -41,12 +41,6 @@
|
||||
|
||||
static int glsl_version = 330;
|
||||
|
||||
extern "C" void
|
||||
_mesa_error_no_memory(const char *caller)
|
||||
{
|
||||
fprintf(stderr, "Mesa error: out of memory in %s", caller);
|
||||
}
|
||||
|
||||
static void
|
||||
initialize_context(struct gl_context *ctx, gl_api api)
|
||||
{
|
||||
|
@@ -580,7 +580,7 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
||||
continue;
|
||||
|
||||
ir_expression *add_expr = floor_expr->operands[0]->as_expression();
|
||||
if (!add_expr)
|
||||
if (!add_expr || add_expr->operation != ir_binop_add)
|
||||
continue;
|
||||
|
||||
for (int j = 0; j < 2; j++) {
|
||||
@@ -589,7 +589,7 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
||||
continue;
|
||||
|
||||
ir_constant *point_five = add_expr->operands[1 - j]->as_constant();
|
||||
if (!point_five->is_value(0.5, 0))
|
||||
if (!point_five || !point_five->is_value(0.5, 0))
|
||||
continue;
|
||||
|
||||
if (abs_expr->operands[0]->equals(sign_expr->operands[0])) {
|
||||
|
@@ -41,15 +41,11 @@ libloader_la_CPPFLAGS += \
|
||||
-I$(top_builddir)/src/mesa/drivers/dri/common/ \
|
||||
-I$(top_srcdir)/src/mesa/ \
|
||||
-I$(top_srcdir)/src/mapi/ \
|
||||
-DUSE_DRICONF \
|
||||
$(EXPAT_CFLAGS)
|
||||
-DUSE_DRICONF
|
||||
|
||||
libloader_la_SOURCES += \
|
||||
$(top_srcdir)/src/mesa/drivers/dri/common/xmlconfig.c
|
||||
libloader_la_LIBADD += \
|
||||
$(top_builddir)/src/mesa/drivers/dri/common/libxmlconfig.la
|
||||
|
||||
libloader_la_LIBADD += \
|
||||
-lm \
|
||||
$(EXPAT_LIBS)
|
||||
endif
|
||||
|
||||
if !HAVE_LIBDRM
|
||||
|
@@ -112,26 +112,36 @@ static void *udev_handle = NULL;
|
||||
static void *
|
||||
udev_dlopen_handle(void)
|
||||
{
|
||||
if (!udev_handle) {
|
||||
udev_handle = dlopen("libudev.so.1", RTLD_LOCAL | RTLD_LAZY);
|
||||
char name[80];
|
||||
unsigned flags = RTLD_NOLOAD | RTLD_LOCAL | RTLD_LAZY;
|
||||
int version;
|
||||
|
||||
if (!udev_handle) {
|
||||
/* libudev.so.1 changed the return types of the two unref functions
|
||||
* from voids to pointers. We don't use those return values, and the
|
||||
* only ABI I've heard that cares about this kind of change (calling
|
||||
* a function with a void * return that actually only returns void)
|
||||
* might be ia64.
|
||||
*/
|
||||
udev_handle = dlopen("libudev.so.0", RTLD_LOCAL | RTLD_LAZY);
|
||||
/* libudev.so.1 changed the return types of the two unref functions
|
||||
* from voids to pointers. We don't use those return values, and the
|
||||
* only ABI I've heard that cares about this kind of change (calling
|
||||
* a function with a void * return that actually only returns void)
|
||||
* might be ia64.
|
||||
*/
|
||||
|
||||
if (!udev_handle) {
|
||||
log_(_LOADER_WARNING, "Couldn't dlopen libudev.so.1 or "
|
||||
"libudev.so.0, driver detection may be broken.\n");
|
||||
}
|
||||
/* First try opening an already linked libudev, then try loading one */
|
||||
do {
|
||||
for (version = 1; version >= 0; version--) {
|
||||
snprintf(name, sizeof(name), "libudev.so.%d", version);
|
||||
udev_handle = dlopen(name, flags);
|
||||
if (udev_handle)
|
||||
return udev_handle;
|
||||
}
|
||||
}
|
||||
|
||||
return udev_handle;
|
||||
if ((flags & RTLD_NOLOAD) == 0)
|
||||
break;
|
||||
|
||||
flags &= ~RTLD_NOLOAD;
|
||||
} while (1);
|
||||
|
||||
log_(_LOADER_WARNING,
|
||||
"Couldn't dlopen libudev.so.1 or "
|
||||
"libudev.so.0, driver detection may be broken.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int dlsym_failed = 0;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user