Compare commits
265 Commits
mesa-12.0.
...
mesa-10.5.
Author | SHA1 | Date | |
---|---|---|---|
|
495bcbc48c | ||
|
95b81ee9e8 | ||
|
07aa6d78bb | ||
|
70816a66d5 | ||
|
f8bb4a814d | ||
|
8c56fc9275 | ||
|
6338bd6f70 | ||
|
7087a507bf | ||
|
93650a80e9 | ||
|
23c0c94ac3 | ||
|
efaf906415 | ||
|
adee8f1ca5 | ||
|
56d13627eb | ||
|
a10c9c6725 | ||
|
2d610edf5c | ||
|
0f7c9815a0 | ||
|
ece96b4954 | ||
|
e692b6428c | ||
|
7d76e89053 | ||
|
60e81b47e5 | ||
|
c04aaa5d99 | ||
|
a642ec0551 | ||
|
c13b16029d | ||
|
58b9e11084 | ||
|
d88de40d7a | ||
|
8cb28bc49d | ||
|
b1cf9cfb16 | ||
|
eba7b7cf68 | ||
|
fe521a083f | ||
|
86b7e91ae9 | ||
|
0a26544985 | ||
|
eb1b41302d | ||
|
b1c045c62f | ||
|
21dd729dcc | ||
|
104dc7447d | ||
|
0475deac26 | ||
|
7f7e74b536 | ||
|
a2624f2d2e | ||
|
a6e1495aa7 | ||
|
005def20f4 | ||
|
4ad41f45b5 | ||
|
907ee1494f | ||
|
b4045dd5e9 | ||
|
f25af5317f | ||
|
1353ba5397 | ||
|
097e70202b | ||
|
5bb7ee4fd6 | ||
|
0024b85cc6 | ||
|
ace7d9afc9 | ||
|
3dc08d4d89 | ||
|
8a3ed2dee7 | ||
|
d47d799b5f | ||
|
f3804a0051 | ||
|
113e2bd732 | ||
|
e63d65b235 | ||
|
4504642ccc | ||
|
be7b998a1f | ||
|
8ee1a1c08b | ||
|
d88fb40505 | ||
|
0d425c413f | ||
|
536003c11e | ||
|
071402cc3b | ||
|
b4c973da03 | ||
|
a27d03dd9f | ||
|
0b06729591 | ||
|
dfe88d4f52 | ||
|
1176e5862a | ||
|
716b5f7cbe | ||
|
cf60503378 | ||
|
adb47b5b27 | ||
|
ea0d1f575c | ||
|
776e47a305 | ||
|
e2dd554651 | ||
|
0f5ec7250d | ||
|
a2785a23e6 | ||
|
2ad5a068fa | ||
|
1dfbc95b76 | ||
|
215f28c695 | ||
|
95633d09e8 | ||
|
33c6a4c018 | ||
|
548fc14d36 | ||
|
c614fef092 | ||
|
8ba18d75d6 | ||
|
597d85c6b7 | ||
|
ef0e335c14 | ||
|
f8966a07d9 | ||
|
ee63b31594 | ||
|
1ebb42a6b2 | ||
|
a968edae6c | ||
|
f44e518364 | ||
|
b2a6b01082 | ||
|
abdae1c4d1 | ||
|
f73954e0a7 | ||
|
65776421fe | ||
|
c4b8bff6e2 | ||
|
b17312cac2 | ||
|
37d925a635 | ||
|
b3bb6b1963 | ||
|
42854fdf2c | ||
|
64bb117f6d | ||
|
b7c44cd5ab | ||
|
a02e05f0fa | ||
|
11e7ae0741 | ||
|
b6ce705dac | ||
|
71367a1bb4 | ||
|
f3b2698f6a | ||
|
88e05a251f | ||
|
64d0f0e3b2 | ||
|
9a3a2479d4 | ||
|
61fc1295af | ||
|
ac46cf31fc | ||
|
c8d962c205 | ||
|
407365e375 | ||
|
712466fb53 | ||
|
ff87ae1e00 | ||
|
5e59f895c4 | ||
|
ebbfa79755 | ||
|
fda3bc1e03 | ||
|
e98909b056 | ||
|
d83d2ea9a6 | ||
|
d6413ed98f | ||
|
3147f0bd25 | ||
|
c2760f0a16 | ||
|
859b4afc97 | ||
|
d33bf8150f | ||
|
8ebda1f144 | ||
|
0410d9b186 | ||
|
af3e6e2858 | ||
|
29810e43da | ||
|
2e0f2ad59c | ||
|
411f975a81 | ||
|
3fa76f3f79 | ||
|
5e572b1cce | ||
|
2beab3c01c | ||
|
d80bc65016 | ||
|
2abba086ca | ||
|
11c0ff60ef | ||
|
0f32ac3920 | ||
|
ce13666feb | ||
|
065a24bd96 | ||
|
1dec8bbb8e | ||
|
af4d1096f7 | ||
|
645d7f464b | ||
|
80c4ba0c83 | ||
|
aca5fdae06 | ||
|
7abc57b669 | ||
|
20ea65beb3 | ||
|
38777e1345 | ||
|
4de2f25083 | ||
|
fbd06fe65c | ||
|
c232d765af | ||
|
0d625e1ae7 | ||
|
e9e182658d | ||
|
82ef4994dd | ||
|
c3fc8b2870 | ||
|
aea510a95f | ||
|
c898d5c931 | ||
|
32a7f119dc | ||
|
578ac079c7 | ||
|
0ea3c150cf | ||
|
b542424ab8 | ||
|
d8ed6aa474 | ||
|
5b1bd4fc9e | ||
|
cddbb3a7ba | ||
|
e4d3bd6855 | ||
|
614e7ebdad | ||
|
7f32fa0dcb | ||
|
a15de1ae1a | ||
|
31fcb21ef5 | ||
|
0cd8e357e3 | ||
|
8b4db9c687 | ||
|
b0400a58db | ||
|
ef1c87ba09 | ||
|
a71223eb59 | ||
|
47a3ae1f20 | ||
|
dbf974636a | ||
|
35909f0e12 | ||
|
b83333ac5b | ||
|
30079d6846 | ||
|
e5eab59b57 | ||
|
57f54b067b | ||
|
e0670715bc | ||
|
8357abf4c3 | ||
|
b0f60c891a | ||
|
73efd2891f | ||
|
73f8e342a7 | ||
|
53d66c0c7c | ||
|
560fb4ee45 | ||
|
446aa309e1 | ||
|
4c45e23938 | ||
|
9267820be6 | ||
|
b730f6e18e | ||
|
f5fbed4831 | ||
|
f7cc5fb2cb | ||
|
0d3e4ed134 | ||
|
97357d475f | ||
|
c899144da6 | ||
|
b973acc093 | ||
|
90411b56f6 | ||
|
19422e433c | ||
|
1b00847bb2 | ||
|
a0264d4076 | ||
|
c7d4987897 | ||
|
c32d835281 | ||
|
54cc3cdff4 | ||
|
c0f425bb81 | ||
|
7c448551eb | ||
|
3e54be2e8a | ||
|
6f52686d77 | ||
|
1527f569e5 | ||
|
dfbaa8a843 | ||
|
9e8446beb1 | ||
|
9e5af14163 | ||
|
ed7272ade9 | ||
|
3592cbb21f | ||
|
5e026a2f63 | ||
|
04dc301669 | ||
|
4952a37697 | ||
|
aac12f4542 | ||
|
760407ff9e | ||
|
3cb2120088 | ||
|
b97e7ad355 | ||
|
bf563d59b2 | ||
|
7f7c35e854 | ||
|
b554a10e82 | ||
|
11cab7b36a | ||
|
80ec8ee3a1 | ||
|
d7fe0d9ce7 | ||
|
afe00ddc20 | ||
|
b9b8c10273 | ||
|
7f72b69c62 | ||
|
9bd832c24c | ||
|
ae275a653a | ||
|
86aaa10ce7 | ||
|
3e513ea65c | ||
|
2f8e96f71d | ||
|
c65ca6c815 | ||
|
4fa129cd9b | ||
|
4c2e35e0aa | ||
|
474f33e690 | ||
|
20471e9423 | ||
|
f0a736160b | ||
|
3a2043fddd | ||
|
39d823fa58 | ||
|
7bcdde5174 | ||
|
f2e513b2c0 | ||
|
c6b0a1638c | ||
|
694d656551 | ||
|
c38068f5c1 | ||
|
88d47387b8 | ||
|
c08e9605c2 | ||
|
fe98850c5f | ||
|
6f14955b71 | ||
|
8ab5a28bd6 | ||
|
4d6bc2c0ff | ||
|
631e76500d | ||
|
28650815ac | ||
|
b9518a41d4 | ||
|
550d7c26e7 | ||
|
716886c338 | ||
|
8898b68a3f | ||
|
93675c7aac | ||
|
6555c00b19 | ||
|
d03de1dd7d | ||
|
b1b7b5b068 |
@@ -31,6 +31,7 @@ endif
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
LOCAL_C_INCLUDES += \
|
LOCAL_C_INCLUDES += \
|
||||||
|
$(MESA_TOP)/src \
|
||||||
$(MESA_TOP)/include
|
$(MESA_TOP)/include
|
||||||
|
|
||||||
MESA_VERSION=$(shell cat $(MESA_TOP)/VERSION)
|
MESA_VERSION=$(shell cat $(MESA_TOP)/VERSION)
|
||||||
@@ -41,6 +42,19 @@ LOCAL_CFLAGS += \
|
|||||||
-DANDROID_VERSION=0x0$(MESA_ANDROID_MAJOR_VERSION)0$(MESA_ANDROID_MINOR_VERSION)
|
-DANDROID_VERSION=0x0$(MESA_ANDROID_MAJOR_VERSION)0$(MESA_ANDROID_MINOR_VERSION)
|
||||||
|
|
||||||
LOCAL_CFLAGS += \
|
LOCAL_CFLAGS += \
|
||||||
|
-DHAVE___BUILTIN_EXPECT \
|
||||||
|
-DHAVE___BUILTIN_FFS \
|
||||||
|
-DHAVE___BUILTIN_FFSLL \
|
||||||
|
-DHAVE_FUNC_ATTRIBUTE_FLATTEN \
|
||||||
|
-DHAVE_FUNC_ATTRIBUTE_UNUSED \
|
||||||
|
-DHAVE_FUNC_ATTRIBUTE_FORMAT \
|
||||||
|
-DHAVE_FUNC_ATTRIBUTE_PACKED \
|
||||||
|
-DHAVE___BUILTIN_CTZ \
|
||||||
|
-DHAVE___BUILTIN_POPCOUNT \
|
||||||
|
-DHAVE___BUILTIN_POPCOUNTLL \
|
||||||
|
-DHAVE___BUILTIN_CLZ \
|
||||||
|
-DHAVE___BUILTIN_CLZLL \
|
||||||
|
-DHAVE___BUILTIN_UNREACHABLE \
|
||||||
-DHAVE_PTHREAD=1 \
|
-DHAVE_PTHREAD=1 \
|
||||||
-fvisibility=hidden \
|
-fvisibility=hidden \
|
||||||
-Wno-sign-compare
|
-Wno-sign-compare
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
SUBDIRS = src
|
SUBDIRS = src
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = \
|
AM_DISTCHECK_CONFIGURE_FLAGS = \
|
||||||
--enable-dri3 \
|
--enable-dri3 \
|
||||||
--enable-gallium-tests \
|
--enable-gallium-tests \
|
||||||
--enable-gbm \
|
--enable-gbm \
|
||||||
@@ -49,6 +49,7 @@ noinst_HEADERS = \
|
|||||||
include/c99 \
|
include/c99 \
|
||||||
include/c11 \
|
include/c11 \
|
||||||
include/D3D9 \
|
include/D3D9 \
|
||||||
|
include/VG \
|
||||||
include/HaikuGL \
|
include/HaikuGL \
|
||||||
include/pci_ids
|
include/pci_ids
|
||||||
|
|
||||||
|
29
bin/.cherry-ignore
Normal file
29
bin/.cherry-ignore
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Cherry-picked without -x
|
||||||
|
# nir: resolve nir.h dependency list (fix make distcheck)
|
||||||
|
556fc4b84df99a1cd4b18c11fb16f7854a948b2a
|
||||||
|
|
||||||
|
# nir: add missing header to the sources list
|
||||||
|
72e602905dd9d86450a936d5a22bf21758844b38
|
||||||
|
|
||||||
|
# configure: rework wayland_scanner handling(fix make distcheck)
|
||||||
|
153539bd9d4445b504110958306f00632222f840
|
||||||
|
|
||||||
|
# auxiliary/vl: bring back the VL code for the dri targets
|
||||||
|
c39dbfdd0f764b1aaa7319b4694e7335692993dd
|
||||||
|
|
||||||
|
# mesa: rename format_info.c to format_info.h
|
||||||
|
3f6c28f2a976e35128b7a4a513cfa60af00301e1
|
||||||
|
# mesa: fix dependency tracking of generated sources
|
||||||
|
d22391cb165af4ed2f9a9e5d6233072a432cc969
|
||||||
|
# mesa: drop Makefile from get_hash.h dependency list
|
||||||
|
2c0f72d5389a9838cc4fbf4cc4f4291aa56c7845
|
||||||
|
# mapi: fix *glapi dependency tracking
|
||||||
|
fe5fddd7e2df74233a2a02ae021418485f39d11c
|
||||||
|
# xmlpool: make sure we ship options.h
|
||||||
|
8d8ca64c28170ec7e9ffa01638bcf8fd30a96088
|
||||||
|
|
||||||
|
# The optimisations mentioned are not available in 10.5
|
||||||
|
627c68308683abbd6e563a09af6013a33938a790 i965/fs: in MAD optimizations, switch last argument to be immediate
|
||||||
|
|
||||||
|
# 10.5 has the compat string implementation, which includes the <string>
|
||||||
|
967825d053f71c5f5fc3ba31eabc0c6004fde4f1 clover: Build fix for FreeBSD.
|
@@ -14,7 +14,7 @@ git log --reverse --grep="cherry picked from commit" origin/master..HEAD |\
|
|||||||
sed -e 's/^[[:space:]]*(cherry picked from commit[[:space:]]*//' -e 's/)//' > already_picked
|
sed -e 's/^[[:space:]]*(cherry picked from commit[[:space:]]*//' -e 's/)//' > already_picked
|
||||||
|
|
||||||
# Grep for commits that were marked as a candidate for the stable tree.
|
# Grep for commits that were marked as a candidate for the stable tree.
|
||||||
git log --reverse --pretty=%H -i --grep='^\([[:space:]]*NOTE: .*[Cc]andidate\|CC:.*mesa-stable\)' HEAD..origin/master |\
|
git log --reverse --pretty=%H -i --grep='^\([[:space:]]*NOTE: .*[Cc]andidate\|CC:.*10\.5.*mesa-stable\)' HEAD..origin/master |\
|
||||||
while read sha
|
while read sha
|
||||||
do
|
do
|
||||||
# Check to see whether the patch is on the ignore list.
|
# Check to see whether the patch is on the ignore list.
|
||||||
|
189
configure.ac
189
configure.ac
@@ -9,7 +9,6 @@ dnl Copyright © 2009-2014 Jon TURNEY
|
|||||||
dnl Copyright © 2011-2012 Benjamin Franzke
|
dnl Copyright © 2011-2012 Benjamin Franzke
|
||||||
dnl Copyright © 2008-2014 David Airlie
|
dnl Copyright © 2008-2014 David Airlie
|
||||||
dnl Copyright © 2009-2013 Brian Paul
|
dnl Copyright © 2009-2013 Brian Paul
|
||||||
dnl Copyright © 2003-2007 Keith Packard, Daniel Stone
|
|
||||||
dnl
|
dnl
|
||||||
dnl Permission is hereby granted, free of charge, to any person obtaining a
|
dnl Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
dnl copy of this software and associated documentation files (the "Software"),
|
dnl copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -79,6 +78,7 @@ XCBDRI2_REQUIRED=1.8
|
|||||||
XCBGLX_REQUIRED=1.8.1
|
XCBGLX_REQUIRED=1.8.1
|
||||||
XSHMFENCE_REQUIRED=1.1
|
XSHMFENCE_REQUIRED=1.1
|
||||||
XVMC_REQUIRED=1.0.6
|
XVMC_REQUIRED=1.0.6
|
||||||
|
PYTHON_MAKO_REQUIRED=0.3.4
|
||||||
|
|
||||||
dnl Check for progs
|
dnl Check for progs
|
||||||
AC_PROG_CPP
|
AC_PROG_CPP
|
||||||
@@ -114,7 +114,19 @@ if test "x$INDENT" != "xcat"; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AX_CHECK_PYTHON_MAKO_MODULE(0.3.4)
|
AX_CHECK_PYTHON_MAKO_MODULE($PYTHON_MAKO_REQUIRED)
|
||||||
|
|
||||||
|
if test -z "$PYTHON2"; then
|
||||||
|
if test ! -f "$srcdir/src/util/format_srgb.c"; then
|
||||||
|
AC_MSG_ERROR([Python not found - unable to generate sources])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test "x$acv_mako_found" = xno; then
|
||||||
|
if test ! -f "$srcdir/src/mesa/main/format_unpack.c"; then
|
||||||
|
AC_MSG_ERROR([Python mako module v$PYTHON_MAKO_REQUIRED or higher not found])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
@@ -597,6 +609,7 @@ if test "x$enable_asm" = xyes; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CHECK_HEADER([xlocale.h], [DEFINES="$DEFINES -DHAVE_XLOCALE_H"])
|
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"])
|
AC_CHECK_FUNC([strtof], [DEFINES="$DEFINES -DHAVE_STRTOF"])
|
||||||
|
|
||||||
dnl Check to see if dlopen is in default libraries (like Solaris, which
|
dnl Check to see if dlopen is in default libraries (like Solaris, which
|
||||||
@@ -935,144 +948,6 @@ fi
|
|||||||
|
|
||||||
AC_SUBST([MESA_LLVM])
|
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
|
# Check for libdrm
|
||||||
PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED],
|
PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED],
|
||||||
[have_libdrm=yes], [have_libdrm=no])
|
[have_libdrm=yes], [have_libdrm=no])
|
||||||
@@ -1572,14 +1447,23 @@ if test -n "$with_gallium_drivers" -a "x$with_gallium_drivers" != xswrast; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x$enable_dri" = xyes -o \
|
||||||
|
"x$enable_xvmc" = xyes -o \
|
||||||
|
"x$enable_vdpau" = xyes -o \
|
||||||
|
"x$enable_omx" = xyes -o \
|
||||||
|
"x$enable_va" = xyes; then
|
||||||
|
need_gallium_vl=yes
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(NEED_GALLIUM_VL, test "x$need_gallium_vl" = xyes)
|
||||||
|
|
||||||
if test "x$enable_xvmc" = xyes -o \
|
if test "x$enable_xvmc" = xyes -o \
|
||||||
"x$enable_vdpau" = xyes -o \
|
"x$enable_vdpau" = xyes -o \
|
||||||
"x$enable_omx" = xyes -o \
|
"x$enable_omx" = xyes -o \
|
||||||
"x$enable_va" = xyes; then
|
"x$enable_va" = xyes; then
|
||||||
PKG_CHECK_MODULES([VL], [x11-xcb xcb xcb-dri2 >= $XCBDRI2_REQUIRED])
|
PKG_CHECK_MODULES([VL], [x11-xcb xcb xcb-dri2 >= $XCBDRI2_REQUIRED])
|
||||||
need_gallium_vl=yes
|
need_gallium_vl_winsys=yes
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(NEED_GALLIUM_VL, test "x$need_gallium_vl" = xyes)
|
AM_CONDITIONAL(NEED_GALLIUM_VL_WINSYS, test "x$need_gallium_vl_winsys" = xyes)
|
||||||
|
|
||||||
if test "x$enable_xvmc" = xyes; then
|
if test "x$enable_xvmc" = xyes; then
|
||||||
PKG_CHECK_MODULES([XVMC], [xvmc >= $XVMC_REQUIRED])
|
PKG_CHECK_MODULES([XVMC], [xvmc >= $XVMC_REQUIRED])
|
||||||
@@ -1730,6 +1614,13 @@ if test "x$with_egl_platforms" != "x" -a "x$enable_egl" != xyes; then
|
|||||||
AC_MSG_ERROR([cannot build egl state tracker without EGL library])
|
AC_MSG_ERROR([cannot build egl state tracker without EGL library])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES([WAYLAND_SCANNER], [wayland_scanner],
|
||||||
|
WAYLAND_SCANNER=`$PKG_CONFIG --variable=wayland_scanner wayland_scanner`,
|
||||||
|
WAYLAND_SCANNER='')
|
||||||
|
if test "x$WAYLAND_SCANNER" = x; then
|
||||||
|
AC_PATH_PROG([WAYLAND_SCANNER], [wayland-scanner])
|
||||||
|
fi
|
||||||
|
|
||||||
# Do per-EGL platform setups and checks
|
# Do per-EGL platform setups and checks
|
||||||
egl_platforms=`IFS=', '; echo $with_egl_platforms`
|
egl_platforms=`IFS=', '; echo $with_egl_platforms`
|
||||||
for plat in $egl_platforms; do
|
for plat in $egl_platforms; do
|
||||||
@@ -1737,9 +1628,9 @@ for plat in $egl_platforms; do
|
|||||||
wayland)
|
wayland)
|
||||||
PKG_CHECK_MODULES([WAYLAND], [wayland-client >= $WAYLAND_REQUIRED wayland-server >= $WAYLAND_REQUIRED])
|
PKG_CHECK_MODULES([WAYLAND], [wayland-client >= $WAYLAND_REQUIRED wayland-server >= $WAYLAND_REQUIRED])
|
||||||
|
|
||||||
WAYLAND_PREFIX=`$PKG_CONFIG --variable=prefix wayland-client`
|
if test "x$WAYLAND_SCANNER" = x; then
|
||||||
AC_PATH_PROG([WAYLAND_SCANNER], [wayland-scanner],,
|
AC_MSG_ERROR([wayland-scanner is needed to compile the wayland egl platform])
|
||||||
[${WAYLAND_PREFIX}/bin$PATH_SEPARATOR$PATH])
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
x11)
|
x11)
|
||||||
@@ -1770,7 +1661,7 @@ done
|
|||||||
# libEGL wants to default to the first platform specified in
|
# libEGL wants to default to the first platform specified in
|
||||||
# ./configure. parse that here.
|
# ./configure. parse that here.
|
||||||
if test "x$egl_platforms" != "x"; then
|
if test "x$egl_platforms" != "x"; then
|
||||||
FIRST_PLATFORM_CAPS=`echo $egl_platforms | sed 's| .*||' | tr 'a-z' 'A-Z'`
|
FIRST_PLATFORM_CAPS=`echo $egl_platforms | sed 's| .*||' | tr '[[a-z]]' '[[A-Z]]'`
|
||||||
EGL_NATIVE_PLATFORM="_EGL_PLATFORM_$FIRST_PLATFORM_CAPS"
|
EGL_NATIVE_PLATFORM="_EGL_PLATFORM_$FIRST_PLATFORM_CAPS"
|
||||||
else
|
else
|
||||||
EGL_NATIVE_PLATFORM="_EGL_INVALID_PLATFORM"
|
EGL_NATIVE_PLATFORM="_EGL_INVALID_PLATFORM"
|
||||||
@@ -2513,12 +2404,6 @@ else
|
|||||||
echo " Gallium: no"
|
echo " Gallium: no"
|
||||||
fi
|
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
|
dnl Libraries
|
||||||
echo ""
|
echo ""
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
<iframe src="../contents.html"></iframe>
|
<iframe src="../contents.html"></iframe>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
|
|
||||||
<h1>Mesa 10.5.0 Release Notes / TBD</h1>
|
<h1>Mesa 10.5.0 Release Notes / March 06, 2015</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Mesa 10.5.0 is a new development release.
|
Mesa 10.5.0 is a new development release.
|
||||||
@@ -31,9 +31,10 @@ because compatibility contexts are not supported.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h2>MD5 checksums</h2>
|
<h2>SHA256 checksums</h2>
|
||||||
<pre>
|
<pre>
|
||||||
TBD.
|
2bb6e2e982ee4d8264d52d638c2a4e3f8a164190336d72d4e34ae1304d87ed91 mesa-10.5.0.tar.gz
|
||||||
|
d7ca9f9044bbdd674377e3eebceef1fae339c8817b9aa435c2053e4fea44e5d3 mesa-10.5.0.tar.xz
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
@@ -55,7 +56,150 @@ Note: some of the new features are only available with certain drivers.
|
|||||||
|
|
||||||
<h2>Bug fixes</h2>
|
<h2>Bug fixes</h2>
|
||||||
|
|
||||||
TBD.
|
<p>This list is likely incomplete.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=10370">Bug 10370</a> - Incorrect pixels read back if draw bitmap texture through Display list</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=60879">Bug 60879</a> - [radeonsi] X11 can't start with acceleration enabled</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=67672">Bug 67672</a> - [llvmpipe] lp_test_arit fails on old CPUs</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=77544">Bug 77544</a> - i965: Try to use LINE instructions to perform MAD with immediate arguments</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=78770">Bug 78770</a> - [SNB bisected]Webglc conformance/textures/texture-size-limit.html fails</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=80568">Bug 80568</a> - [gen4] GPU Crash During Google Chrome Operation</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=82585">Bug 82585</a> - geometry shader with optional out variable segfaults</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=82991">Bug 82991</a> - Inverted bumpmap in webgl applications</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83463">Bug 83463</a> - [swrast] piglit glsl-vs-clamp-1 regression</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83500">Bug 83500</a> - si_dma_copy_tile causes GPU hangs</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83510">Bug 83510</a> - Graphical glitches in Unreal Engine 4</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=83908">Bug 83908</a> - [i965] Incorrect icon colors in Steam Big Picture</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84212">Bug 84212</a> - [BSW]ES3-CTS.shaders.loops.do_while_dynamic_iterations.vector_counter_vertex fails and causes GPU hang</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84651">Bug 84651</a> - Distorted graphics or black window when running Battle.net app on Intel hardware via wine</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=84777">Bug 84777</a> - [BSW]Piglit spec_glsl-1.50_execution_geometry-basic fails</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=85367">Bug 85367</a> - [gen4] GPU hang in glmark-es2</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=85467">Bug 85467</a> - [llvmpipe] piglit gl-1.0-dlist-beginend failure with llvm-3.6.0svn</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=85529">Bug 85529</a> - Surfaces not drawn in Unvanquished</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=85647">Bug 85647</a> - Random radeonsi crashes with mesa 10.3.x</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=85696">Bug 85696</a> - r600g+nine: Bioshock shader failure after 7b1c0cbc90d456384b0950ad21faa3c61a6b43ff</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86089">Bug 86089</a> - [r600g][mesa 10.4.0-dev] shader failure - r600_sb::bc_finalizer::cf_peephole() when starting Second Life</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86618">Bug 86618</a> - [NV96] neg modifiers not working in MIN and MAX operations</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86760">Bug 86760</a> - mesa doesn't build: recipe for target 'r600_llvm.lo' failed</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86764">Bug 86764</a> - [SNB+ Bisected]Piglit glean/pointSprite fails</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86788">Bug 86788</a> - (bisected) 32bit UrbanTerror 4.1 timedemo sse4.1 segfault...</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=86939">Bug 86939</a> - test_vf_float_conversions.cpp:63:12: error: expected primary-expression before ‘union’</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=86958">Bug 86958</a> - lp_bld_misc.cpp:503:40: error: no matching function for call to ‘llvm::EngineBuilder::setMCJITMemoryManager(ShaderMemoryManager*&)’</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=86969">Bug 86969</a> - _drm_intel_gem_bo_references() function takes half the CPU with Witcher2 game</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87076">Bug 87076</a> - Dead Island needs allow_glsl_extension_directive_midshader</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87516">Bug 87516</a> - glProgramBinary violates spec</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87619">Bug 87619</a> - Changes to state such as render targets change fragment shader without marking it dirty.</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87658">Bug 87658</a> - [llvmpipe] SEGV in sse2_has_daz on ancient Pentium4-M</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87694">Bug 87694</a> - [SNB] Crash in brw_begin_transform_feedback</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87886">Bug 87886</a> - constant fps drops with Intel and Radeon</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87887">Bug 87887</a> - [i965 Bisected]ES2-CTS.gtf.GL.cos.cos_float_vert_xvary fails</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=87913">Bug 87913</a> - CPU cacheline size of 0 can be returned by CPUID leaf 0x80000006 in some virtual machines</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88079">Bug 88079</a> - dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0 tests fail due to enabling of GL_RGB and GL_RGBA</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88170">Bug 88170</a> - 32 bits opengl apps crash with latest llvm 3.6 git / mesa git / radeonsi</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88219">Bug 88219</a> - include/c11/threads_posix.h:197: undefined reference to `pthread_mutex_lock'</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88227">Bug 88227</a> - Radeonsi: High GTT usage in Prison Architect large map</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=88335">Bug 88335</a> - format_pack.c:9567:22: error: expected ')'</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88385">Bug 88385</a> - [SNB+ Bisected]Ogles3conform ES3-CTS.gtf.GL3Tests.packed_pixels.packed_pixels core dumped</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88467">Bug 88467</a> - nir.c:140: error: ‘nir_src’ has no member named ‘ssa’</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88478">Bug 88478</a> - #error "<malloc.h> has been replaced by <stdlib.h>"</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88519">Bug 88519</a> - sha1.c:210:22: error: 'grcy_md_hd_t' undeclared (first use in this function)</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88523">Bug 88523</a> - sha1.c:37: error: 'SHA1_CTX' undeclared (first use in this function)</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=88658">Bug 88658</a> - (bisected) Slow video playback on Kabini</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88662">Bug 88662</a> - unaligned access to gl_dlist_node</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88783">Bug 88783</a> - FTBFS: Clover: src/gallium/state_trackers/clover/llvm/invocation.cpp:335:49: error: no matching function for call to 'llvm::TargetLibraryInfo::TargetLibraryInfo(llvm::Triple)</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88792">Bug 88792</a> - [BDW/BSW Bisected]Piglit spec_ARB_pixel_buffer_object_pbo-read-argb8888 fails</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88806">Bug 88806</a> - nir/nir_constant_expressions.c:2754:15: error: controlling expression type 'unsigned int' not compatible with any generic association type</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88841">Bug 88841</a> - [SNB/IVB/HSW/BDW Bisected]Piglit spec_EGL_NOK_texture_from_pixmap_basic fails</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88852">Bug 88852</a> - macros.h(181) : error C2143: syntax error : missing '{' before 'enum [tag]'</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=88930">Bug 88930</a> - [osmesa] osbuffer->textures should be indexed by attachment type</li>
|
||||||
|
|
||||||
|
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=88962">Bug 88962</a> - [osmesa] Crash on postprocessing if z buffer is NULL</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=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=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=86330">Bug 86330</a> - lp_bld_debug.cpp:112: multiple definition of `raw_debug_ostream::write_impl(char const*, unsigned long)'</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h2>Changes</h2>
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
217
docs/relnotes/10.5.1.html
Normal file
217
docs/relnotes/10.5.1.html
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
<!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.5.1 Release Notes / March 13, 2015</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.1 is a bug fix release which fixes bugs found since the 10.5.0 release.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.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>
|
||||||
|
b5b6256a6d46023e16a675257fd11a0f94d7b3e60a76cf112952da3d0fef8e9b mesa-10.5.1.tar.gz
|
||||||
|
ffc51943d15c6812ee7611d053d8980a683fbd6a4986cff567b12cc66637d679 mesa-10.5.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=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=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=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=88246">Bug 88246</a> - Commit 2881b12 causes 43 DrawElements test regressions</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=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=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=89156">Bug 89156</a> - r300g: GL_COMPRESSED_RED_RGTC1 / ATI1N support broken</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=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=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>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
<p>Andrey Sudnik (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965/vec4: Don't lose the saturate modifier in copy propagation.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Chris Forbes (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965/gs: Check newly-generated GS-out VUE map against correct stage</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Daniel Stone (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>egl: Take alpha bits into account when selecting GBM formats</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Emil Velikov (5):</p>
|
||||||
|
<ul>
|
||||||
|
<li>docs: Add sha256 sums for the 10.5.0 release</li>
|
||||||
|
<li>egl/main: no longer export internal function</li>
|
||||||
|
<li>cherry-ignore: ignore a few more commits picked without -x</li>
|
||||||
|
<li>mapi: fix commit 90411b56f6bc817e229d8801ac0adad6d4e3fb7a</li>
|
||||||
|
<li>Update version to 10.5.1</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Frank Henigman (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>intel: fix EGLImage renderbuffer _BaseFormat</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Iago Toral Quiroga (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Fix out-of-bounds accesses into pull_constant_loc array</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ian Romanick (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965/fs/nir: Use emit_math for nir_op_fpow</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ilia Mirkin (3):</p>
|
||||||
|
<ul>
|
||||||
|
<li>freedreno: move fb state copy after checking for size change</li>
|
||||||
|
<li>freedreno/ir3: fix array count returned by TXQ</li>
|
||||||
|
<li>freedreno/ir3: get the # of miplevels from getinfo</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Jason Ekstrand (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>meta/TexSubImage: Stash everything other than PIXEL_TRANSFER/store in meta_begin</li>
|
||||||
|
<li>main/base_tex_format: Properly handle STENCIL_INDEX1/4/16</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Kenneth Graunke (8):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Split Gen4-5 BlitFramebuffer code; prefer BLT over Meta.</li>
|
||||||
|
<li>glsl: Mark array access when copying to a temporary for the ?: operator.</li>
|
||||||
|
<li>i965/fs: Set force_writemask_all on shader_time instructions.</li>
|
||||||
|
<li>i965/fs: Set smear on shader_time diff register.</li>
|
||||||
|
<li>i965/fs: Make emit_shader_time_write return rather than emit.</li>
|
||||||
|
<li>i965/fs: Make get_timestamp() pass back the MOV rather than emitting it.</li>
|
||||||
|
<li>i965/fs: Make emit_shader_time_end() insert before EOT.</li>
|
||||||
|
<li>i965/fs: Don't issue FB writes for bound but unwritten color targets.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Laura Ekstrand (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>main: Fix target checking for CompressedTexSubImage*D.</li>
|
||||||
|
<li>main: Fix target checking for CopyTexSubImage*D.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Marc-Andre Lureau (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>gallium/auxiliary/indices: fix start param</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Marek Olšák (3):</p>
|
||||||
|
<ul>
|
||||||
|
<li>r300g: fix RGTC1 and LATC1 SNORM formats</li>
|
||||||
|
<li>r300g: fix a crash when resolving into an sRGB texture</li>
|
||||||
|
<li>r300g: fix sRGB->sRGB blits</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Matt Turner (12):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965/vec4: Fix implementation of i2b.</li>
|
||||||
|
<li>mesa: Indent break statements and add a missing one.</li>
|
||||||
|
<li>mesa: Free memory allocated for luminance in readpixels.</li>
|
||||||
|
<li>mesa: Correct backwards NULL check.</li>
|
||||||
|
<li>i965: Consider scratch writes to have side effects.</li>
|
||||||
|
<li>i965/fs: Don't use backend_visitor::instructions after creating the CFG.</li>
|
||||||
|
<li>r300g: Use PATH_MAX instead of limiting ourselves to 100 chars.</li>
|
||||||
|
<li>r300g: Check return value of snprintf().</li>
|
||||||
|
<li>i965/fs: Don't propagate cmod to inst with different type.</li>
|
||||||
|
<li>i965: Tell intel_get_memcpy() which direction the memcpy() is going.</li>
|
||||||
|
<li>Revert SHA1 additions.</li>
|
||||||
|
<li>i965: Avoid applying negate to wrong MAD source.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Neil Roberts (4):</p>
|
||||||
|
<ul>
|
||||||
|
<li>meta: In pbo_{Get,}TexSubImage don't repeatedly rebind the source tex</li>
|
||||||
|
<li>Revert "common: Fix PBOs for 1D_ARRAY."</li>
|
||||||
|
<li>meta: Allow GL_UN/PACK_IMAGE_HEIGHT in _mesa_meta_pbo_Get/TexSubImage</li>
|
||||||
|
<li>meta: Fix the y offset for 1D_ARRAY in _mesa_meta_pbo_TexSubImage</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Rob Clark (11):</p>
|
||||||
|
<ul>
|
||||||
|
<li>freedreno/ir3: fix silly typo for binning pass shaders</li>
|
||||||
|
<li>freedreno/a2xx: fix increment in assert</li>
|
||||||
|
<li>freedreno/a4xx: bit of cleanup</li>
|
||||||
|
<li>freedreno: update generated headers</li>
|
||||||
|
<li>freedreno/a4xx: set PC_PRIM_VTX_CNTL.VAROUT properly</li>
|
||||||
|
<li>freedreno: update generated headers</li>
|
||||||
|
<li>freedreno/a4xx: aniso filtering</li>
|
||||||
|
<li>freedreno/ir3: fix up cat6 instruction encodings</li>
|
||||||
|
<li>freedreno/ir3: add support for memory (cat6) instructions</li>
|
||||||
|
<li>freedreno/ir3: handle flat bypass for a4xx</li>
|
||||||
|
<li>freedreno/ir3: fix failed assert in grouping</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Stefan Dösinger (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>r300g: Fix the ATI1N swizzle (RGTC1 and LATC1)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
130
docs/relnotes/10.5.2.html
Normal file
130
docs/relnotes/10.5.2.html
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
<!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.5.2 Release Notes / March 28, 2015</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.2 is a bug fix release which fixes bugs found since the 10.5.1 release.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.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>
|
||||||
|
755220e160a9f22fda0dffd47746f997b6e196d03f8edc390df7793aecaaa541 mesa-10.5.2.tar.gz
|
||||||
|
2f4b6fb77c3e7d6f861558d0884a3073f575e1e673dad8d1b0624e78e9c4dd44 mesa-10.5.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=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=89328">Bug 89328</a> - python required to build Mesa release tarballs</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=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=89680">Bug 89680</a> - Hard link exist in Mesa 10.5.1 sources</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
<p>Anuj Phogat (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>glsl: Generate link error for non-matching gl_FragCoord redeclarations</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Emil Velikov (7):</p>
|
||||||
|
<ul>
|
||||||
|
<li>docs: Add sha256 sums for the 10.5.1 release</li>
|
||||||
|
<li>automake: add missing egl files to the tarball</li>
|
||||||
|
<li>st/egl: don't ship the dri2.c link at the tarball</li>
|
||||||
|
<li>loader: include <sys/stat.h> for non-sysfs builds</li>
|
||||||
|
<li>auxiliary/os: fix the android build - s/drm_munmap/os_munmap/</li>
|
||||||
|
<li>cherry-ignore: add commit non applicable for 10.5</li>
|
||||||
|
<li>Update version to 10.5.2</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Felix Janda (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>c11/threads: Use PTHREAD_MUTEX_RECURSIVE by default</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Francisco Jerez (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Set nr_params to the number of uniform components in the VS/GS path.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ilia Mirkin (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>freedreno/a3xx: use the same layer size for all slices</li>
|
||||||
|
<li>freedreno: fix slice pitch calculations</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Marek Olšák (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>radeonsi: increase coords array size for radeon_llvm_emit_prepare_cube_coords</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Mario Kleiner (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>glx: Handle out-of-sequence swap completion events correctly. (v2)</li>
|
||||||
|
<li>mapi: Make private copies of name strings provided by client.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Rob Clark (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>freedreno: update generated headers</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Samuel Iglesias Gonsalvez (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>glsl: optimize (0 cmp x + y) into (-x cmp y).</li>
|
||||||
|
<li>configure: Introduce new output variable to ax_check_python_mako_module.m4</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Tapani Pälli (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>glsl: fix names in lower_constant_arrays_to_uniforms</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Tom Stellard (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>clover: Return 0 as storage size for local kernel args that are not set v2</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
125
docs/relnotes/10.5.3.html
Normal file
125
docs/relnotes/10.5.3.html
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
<!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.5.3 Release Notes / April 12, 2015</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.3 is a bug fix release which fixes bugs found since the 10.5.2 release.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.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>
|
||||||
|
2371b8e210ccd19f61dd94b6664d612e5a479ba7d431a074512d87633bd6aeb4 mesa-10.5.3.tar.gz
|
||||||
|
8701ee1be4f5c03238f5e63c1a9bd4cc03a2f6c0155ed42a1ae7d58f18912ba2 mesa-10.5.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=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=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=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=89905">Bug 89905</a> - scons build broken on 10.5.2 due to activated vega st</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
<p>Dave Airlie (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>st_glsl_to_tgsi: only do mov copy propagation on temps (v2)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Emil Velikov (5):</p>
|
||||||
|
<ul>
|
||||||
|
<li>docs: Add sha256 sums for the 10.5.2 release</li>
|
||||||
|
<li>xmlpool: don't forget to ship the MOS</li>
|
||||||
|
<li>configure.ac: error out if python/mako is not found when required</li>
|
||||||
|
<li>dist: add the VG depedencies into the tarball</li>
|
||||||
|
<li>Update version to 10.5.3</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Iago Toral Quiroga (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Do not render primitives in non-zero streams then TF is disabled</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ilia Mirkin (7):</p>
|
||||||
|
<ul>
|
||||||
|
<li>st/mesa: update arrays when the current attrib has been updated</li>
|
||||||
|
<li>nv50/ir: take postFactor into account when doing peephole optimizations</li>
|
||||||
|
<li>nv50/ir/gk110: fix offset flag position for TXD opcode</li>
|
||||||
|
<li>freedreno/a3xx: fix 3d texture layout</li>
|
||||||
|
<li>freedreno/a3xx: point size should not be divided by 2</li>
|
||||||
|
<li>nv50: allocate more offset space for occlusion queries</li>
|
||||||
|
<li>nv50,nvc0: limit the y-tiling of 3d textures to the first level's tiling</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Kenneth Graunke (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Fix instanced geometry shaders on Gen8+.</li>
|
||||||
|
<li>i965: Add forgotten multi-stream code to Gen8 SOL state.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Marcin Ślusarz (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>nouveau: synchronize "scratch runout" destruction with the command stream</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Michel Dänzer (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>radeonsi: Cache LLVMTargetMachineRef in context instead of in screen</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Tom Stellard (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>clover: Return CL_BUILD_ERROR for CL_PROGRAM_BUILD_STATUS when compilation fails v2</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ville Syrjälä (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Fix URB size for CHV</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
125
docs/relnotes/10.5.4.html
Normal file
125
docs/relnotes/10.5.4.html
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
<!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.5.4 Release Notes / April 24, 2015</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.4 is a bug fix release which fixes bugs found since the 10.5.3 release.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.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>
|
||||||
|
e1089567fc7bf8d9b2d8badcc9f2fc3b758701c8c0ccfe7af1805549fea53f11 mesa-10.5.4.tar.gz
|
||||||
|
b51e723f3a20d842c88a92d809435b229fc4744ca0dbec0317d9d4a3ac4c6803 mesa-10.5.4.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=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=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=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=89957">Bug 89957</a> - vm protection faults in piglit lest: texsubimage cube_map_array pbo</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
<p>Brian Paul (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>glsl: rewrite glsl_type::record_key_hash() to avoid buffer overflow</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Dave Airlie (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>st/mesa: convert sub image for cube map arrays to 2d arrays for upload</li>
|
||||||
|
<li>st/mesa: align cube map arrays layers</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Emil Velikov (11):</p>
|
||||||
|
<ul>
|
||||||
|
<li>docs: Add 256 sums for the 10.5.3 release</li>
|
||||||
|
<li>radeonsi: remove unused si_dump_key()</li>
|
||||||
|
<li>android: use LOCAL_SHARED_LIBRARIES over TARGET_OUT_HEADERS</li>
|
||||||
|
<li>android: add $(mesa_top)/src include to the whole of mesa</li>
|
||||||
|
<li>android: egl: add libsync_cflags to the build</li>
|
||||||
|
<li>android: dri/common: conditionally include drm_cflags/set __NOT_HAVE_DRM_H</li>
|
||||||
|
<li>android: add HAVE__BUILTIN_* and HAVE_FUNC_ATTRIBUTE_* defines</li>
|
||||||
|
<li>android: add $(mesa_top)/src/mesa/main to the includes list</li>
|
||||||
|
<li>android: dri: link against libmesa_util</li>
|
||||||
|
<li>android: mesa: fix the path of the SSE4_1 optimisations</li>
|
||||||
|
<li>Update version to 10.5.4</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ian Romanick (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>nir: Fix typo in "ushr by 0" algebraic replacement</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Kenneth Graunke (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Fix software primitive restart with indirect draws.</li>
|
||||||
|
<li>drirc: Add "Second Life" quirk (allow_glsl_extension_directive_midshader).</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Kristian Høgsberg (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Rewrite ir_tex to ir_txl with lod 0 for vertex shaders</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Marek Olšák (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>glsl_to_tgsi: fix out-of-bounds constant access and crash for uniforms</li>
|
||||||
|
<li>glsl_to_tgsi: don't use a potentially-undefined immediate for ir_query_levels</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Mathias Froehlich (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Flush batchbuffer containing the query on glQueryCounter.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Mauro Rossi (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>android: mesa: generate the format_{un,}pack.[ch] sources</li>
|
||||||
|
<li>android: add inital NIR build</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
95
docs/relnotes/10.5.5.html
Normal file
95
docs/relnotes/10.5.5.html
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
<!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.5.5 Release Notes / May 11, 2015</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.5 is a bug fix release which fixes bugs found since the 10.5.4 release.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.5 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>
|
||||||
|
c10f00fd792b8290dd51ebcc48a9016c4cafab19ec205423c6fcadfd7f3a59f2 mesa-10.5.5.tar.gz
|
||||||
|
4ac4e4ea3414f1cadb1467f2f173f9e56170d31e8674f7953a46f0549d319f28 mesa-10.5.5.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=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=89455">Bug 89455</a> - [NVC0/Gallium] Unigine Heaven black and white boxes</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=90130">Bug 90130</a> - gl_PrimitiveId seems to reset at 340</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
<p>Boyan Ding (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Add XRGB8888 format to intel_screen_make_configs</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Emil Velikov (3):</p>
|
||||||
|
<ul>
|
||||||
|
<li>docs: Add sha256 sums for the 10.5.4 release</li>
|
||||||
|
<li>r300: do not link against libdrm_intel</li>
|
||||||
|
<li>Update version to 10.5.5</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ilia Mirkin (4):</p>
|
||||||
|
<ul>
|
||||||
|
<li>nvc0/ir: flush denorms to zero in non-compute shaders</li>
|
||||||
|
<li>gk110/ir: fix set with a register dest to not auto-set the abs flag</li>
|
||||||
|
<li>nvc0/ir: fix predicated PFETCH emission</li>
|
||||||
|
<li>nv50/ir: fix asFlow() const helper for OP_JOIN</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Kenneth Graunke (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Make intel_emit_linear_blit handle Gen8+ alignment restrictions.</li>
|
||||||
|
<li>i965: Disallow linear blits that are not cacheline aligned.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Roland Scheidegger (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>draw: fix prim ids when there's no gs</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
147
docs/relnotes/10.5.6.html
Normal file
147
docs/relnotes/10.5.6.html
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<!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.5.6 Release Notes / May 23, 2015</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.6 is a bug fix release which fixes bugs found since the 10.5.5 release.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.6 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>
|
||||||
|
89ff9cb08d0f6e3f34154864c3071253057cd21020759457c8ae27e0f70985d3 mesa-10.5.6.tar.gz
|
||||||
|
66017853bde5f7a6647db3eede30512a091a3491daa1708e0ad8027c328ba595 mesa-10.5.6.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=86792">Bug 86792</a> - [NVC0] Portal 2 Crashes in Wine</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=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>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
<p>Alex Deucher (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>radeonsi: add new bonaire pci id</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Axel Davy (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>egl/wayland: properly destroy wayland objects</li>
|
||||||
|
<li>glx/dri3: Add additional check for gpu offloading case</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Emil Velikov (4):</p>
|
||||||
|
<ul>
|
||||||
|
<li>docs: Add sha256 sums for the 10.5.5 release</li>
|
||||||
|
<li>egl/main: fix EGL_KHR_get_all_proc_addresses</li>
|
||||||
|
<li>targets/osmesa: drop the -module tag from LDFLAGS</li>
|
||||||
|
<li>Update version to 10.5.6</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Francisco Jerez (4):</p>
|
||||||
|
<ul>
|
||||||
|
<li>clover: Refactor event::trigger and ::abort to prevent deadlock and reentrancy issues.</li>
|
||||||
|
<li>clover: Wrap event::_status in a method to prevent unlocked access.</li>
|
||||||
|
<li>clover: Implement locking of the wait_count, _chain and _status members of event.</li>
|
||||||
|
<li>i965: Fix PBO cache coherency issue after _mesa_meta_pbo_GetTexSubImage().</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Fredrik Höglund (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>main: Require that the texture exists in framebuffer_texture</li>
|
||||||
|
<li>mesa: Generate GL_INVALID_VALUE in framebuffer_texture when layer < 0</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ilia Mirkin (7):</p>
|
||||||
|
<ul>
|
||||||
|
<li>nv50/ir: only propagate saturate up if some actual folding took place</li>
|
||||||
|
<li>nv50: keep track of PGRAPH state in nv50_screen</li>
|
||||||
|
<li>nvc0: keep track of PGRAPH state in nvc0_screen</li>
|
||||||
|
<li>nvc0: reset the instanced elements state when doing blit using 3d engine</li>
|
||||||
|
<li>nv50/ir: only enable mul saturate on G200+</li>
|
||||||
|
<li>st/mesa: make sure to create a "clean" bool when doing i2b</li>
|
||||||
|
<li>nvc0: switch mechanism for shader eviction to be a while loop</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Jeremy Huddleston Sequoia (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>swrast: Build fix for darwin</li>
|
||||||
|
<li>darwin: Fix install name of libOSMesa</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Laura Ekstrand (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>main: Fix an error generated by FramebufferTexture</li>
|
||||||
|
<li>main: Complete error conditions for glInvalidate*Framebuffer.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Marta Lofstedt (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>main: glGetIntegeri_v fails for GL_VERTEX_BINDING_STRIDE</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Rob Clark (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>freedreno: enable a306</li>
|
||||||
|
<li>freedreno: fix bug in tile/slot calculation</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Roland Scheidegger (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>draw: (trivial) fix out-of-bounds vector initialization</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Tim Rowley (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>mesa: fix shininess check for ffvertex_prog v2</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Tom Stellard (2):</p>
|
||||||
|
<ul>
|
||||||
|
<li>clover: Add a mutex to guard queue::queued_events</li>
|
||||||
|
<li>clover: Fix a bug with multi-threaded events v2</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
102
docs/relnotes/10.5.7.html
Normal file
102
docs/relnotes/10.5.7.html
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<!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.5.7 Release Notes / June 07, 2015</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.7 is a bug fix release which fixes bugs found since the 10.5.6 release.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Mesa 10.5.7 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=89131">Bug 89131</a> - [Bisected] Graphical corruption in Weston, shows old framebuffer pieces</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Changes</h2>
|
||||||
|
|
||||||
|
<p>Ben Widawsky (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965: Emit 3DSTATE_MULTISAMPLE before WM_HZ_OP (gen8+)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Emil Velikov (4):</p>
|
||||||
|
<ul>
|
||||||
|
<li>docs: Add sha256sums for the 10.5.6 release</li>
|
||||||
|
<li>get-pick-list.sh: Require explicit "10.5" for nominating stable patches</li>
|
||||||
|
<li>cherry-ignore: add clover build fix not applicable for 10.5</li>
|
||||||
|
<li>Update version to 10.5.7</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ilia Mirkin (18):</p>
|
||||||
|
<ul>
|
||||||
|
<li>nvc0/ir: set ftz when sources are floats, not just destinations</li>
|
||||||
|
<li>nv50/ir: guess that the constant offset is the starting slot of array</li>
|
||||||
|
<li>nvc0/ir: LOAD's can't be used for shader inputs</li>
|
||||||
|
<li>nvc0: a geometry shader can have up to 1024 vertices output</li>
|
||||||
|
<li>nv50/ir: avoid messing up arg1 of PFETCH</li>
|
||||||
|
<li>nv30: don't leak fragprog consts</li>
|
||||||
|
<li>nv30: avoid leaking render state and draw shaders</li>
|
||||||
|
<li>nv30: fix clip plane uploads and enable changes</li>
|
||||||
|
<li>nv30/draw: avoid leaving stale pointers in draw state</li>
|
||||||
|
<li>nv30/draw: draw expects constbuf size in bytes, not vec4 units</li>
|
||||||
|
<li>st/mesa: don't leak glsl_to_tgsi object on link failure</li>
|
||||||
|
<li>glsl: avoid leaking linked gl_shader when there's a late linker error</li>
|
||||||
|
<li>nv30/draw: fix indexed draws with swtnl path and a resource index buffer</li>
|
||||||
|
<li>nv30/draw: only use the DMA1 object (GART) if the bo is not in VRAM</li>
|
||||||
|
<li>nv30/draw: allocate vertex buffers in gart</li>
|
||||||
|
<li>nv30/draw: switch varying hookup logic to know about texcoords</li>
|
||||||
|
<li>nv30: falling back to draw path for edgeflag does no good</li>
|
||||||
|
<li>nv30: avoid doing extra work on clear and hitting unexpected states</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Jason Ekstrand (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>i965/fs: Fix implied_mrf_writes for scratch writes</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Marek Olšák (1):</p>
|
||||||
|
<ul>
|
||||||
|
<li>st/dri: fix postprocessing crash when there's no depth buffer</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -177,13 +177,8 @@ mtx_init(mtx_t *mtx, int type)
|
|||||||
&& type != (mtx_try|mtx_recursive))
|
&& type != (mtx_try|mtx_recursive))
|
||||||
return thrd_error;
|
return thrd_error;
|
||||||
pthread_mutexattr_init(&attr);
|
pthread_mutexattr_init(&attr);
|
||||||
if ((type & mtx_recursive) != 0) {
|
if ((type & mtx_recursive) != 0)
|
||||||
#if defined(__linux__) || defined(__linux)
|
|
||||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
|
|
||||||
#else
|
|
||||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||||
#endif
|
|
||||||
}
|
|
||||||
pthread_mutex_init(mtx, &attr);
|
pthread_mutex_init(mtx, &attr);
|
||||||
pthread_mutexattr_destroy(&attr);
|
pthread_mutexattr_destroy(&attr);
|
||||||
return thrd_success;
|
return thrd_success;
|
||||||
|
@@ -85,6 +85,7 @@ CHIPSET(0x6651, BONAIRE_6651, BONAIRE)
|
|||||||
CHIPSET(0x6658, BONAIRE_6658, BONAIRE)
|
CHIPSET(0x6658, BONAIRE_6658, BONAIRE)
|
||||||
CHIPSET(0x665C, BONAIRE_665C, BONAIRE)
|
CHIPSET(0x665C, BONAIRE_665C, BONAIRE)
|
||||||
CHIPSET(0x665D, BONAIRE_665D, BONAIRE)
|
CHIPSET(0x665D, BONAIRE_665D, BONAIRE)
|
||||||
|
CHIPSET(0x665F, BONAIRE_665F, BONAIRE)
|
||||||
|
|
||||||
CHIPSET(0x9830, KABINI_9830, KABINI)
|
CHIPSET(0x9830, KABINI_9830, KABINI)
|
||||||
CHIPSET(0x9831, KABINI_9831, KABINI)
|
CHIPSET(0x9831, KABINI_9831, KABINI)
|
||||||
|
@@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
if BUILD_SHARED
|
if BUILD_SHARED
|
||||||
if HAVE_COMPAT_SYMLINKS
|
if HAVE_COMPAT_SYMLINKS
|
||||||
all-local : .libs/install-mesa-links
|
all-local : .install-mesa-links
|
||||||
|
|
||||||
.libs/install-mesa-links : $(lib_LTLIBRARIES)
|
.install-mesa-links : $(lib_LTLIBRARIES)
|
||||||
$(AM_V_GEN)$(MKDIR_P) $(top_builddir)/$(LIB_DIR); \
|
$(AM_V_GEN)$(MKDIR_P) $(top_builddir)/$(LIB_DIR); \
|
||||||
for f in $(join $(addsuffix .libs/,$(dir $(lib_LTLIBRARIES))),$(notdir $(lib_LTLIBRARIES:%.la=%.$(LIB_EXT)*))); do \
|
for f in $(join $(addsuffix .libs/,$(dir $(lib_LTLIBRARIES))),$(notdir $(lib_LTLIBRARIES:%.la=%.$(LIB_EXT)*))); do \
|
||||||
if test -h .libs/$$f; then \
|
if test -h .libs/$$f; then \
|
||||||
@@ -19,6 +19,7 @@ clean-local:
|
|||||||
for f in $(notdir $(lib_LTLIBRARIES:%.la=.libs/%.$(LIB_EXT)*)); do \
|
for f in $(notdir $(lib_LTLIBRARIES:%.la=.libs/%.$(LIB_EXT)*)); do \
|
||||||
$(RM) $(top_builddir)/$(LIB_DIR)/$$f; \
|
$(RM) $(top_builddir)/$(LIB_DIR)/$$f; \
|
||||||
done;
|
done;
|
||||||
|
$(RM) .install-mesa-links
|
||||||
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@@ -54,8 +54,10 @@ else:
|
|||||||
" | $PYTHON2 -
|
" | $PYTHON2 -
|
||||||
|
|
||||||
if test $? -ne 0 ; then
|
if test $? -ne 0 ; then
|
||||||
AC_MSG_ERROR(mako $1 or later is required.)
|
AC_MSG_RESULT(no)
|
||||||
|
AC_SUBST(acv_mako_found, 'no')
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_SUBST(acv_mako_found, 'yes')
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
@@ -53,7 +53,10 @@ if HAVE_GALLIUM
|
|||||||
SUBDIRS += gallium
|
SUBDIRS += gallium
|
||||||
endif
|
endif
|
||||||
|
|
||||||
EXTRA_DIST = egl/docs getopt hgl SConscript
|
EXTRA_DIST = \
|
||||||
|
egl/drivers/haiku \
|
||||||
|
egl/docs \
|
||||||
|
getopt hgl SConscript
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
-I$(top_srcdir)/include/ \
|
-I$(top_srcdir)/include/ \
|
||||||
|
@@ -40,12 +40,18 @@ LOCAL_C_INCLUDES := \
|
|||||||
$(MESA_TOP)/src/mapi \
|
$(MESA_TOP)/src/mapi \
|
||||||
$(MESA_TOP)/src/egl/main \
|
$(MESA_TOP)/src/egl/main \
|
||||||
$(MESA_TOP)/src/loader \
|
$(MESA_TOP)/src/loader \
|
||||||
$(TARGET_OUT_HEADERS)/libdrm \
|
|
||||||
$(DRM_GRALLOC_TOP)
|
$(DRM_GRALLOC_TOP)
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := \
|
LOCAL_STATIC_LIBRARIES := \
|
||||||
libmesa_loader
|
libmesa_loader
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := libdrm
|
||||||
|
|
||||||
|
ifeq ($(shell echo "$(MESA_ANDROID_VERSION) >= 4.2" | bc),1)
|
||||||
|
LOCAL_SHARED_LIBRARIES += \
|
||||||
|
libsync
|
||||||
|
endif
|
||||||
|
|
||||||
LOCAL_MODULE := libmesa_egl_dri2
|
LOCAL_MODULE := libmesa_egl_dri2
|
||||||
|
|
||||||
include $(MESA_COMMON_MK)
|
include $(MESA_COMMON_MK)
|
||||||
|
@@ -64,3 +64,5 @@ if HAVE_EGL_PLATFORM_DRM
|
|||||||
libegl_dri2_la_SOURCES += platform_drm.c
|
libegl_dri2_la_SOURCES += platform_drm.c
|
||||||
AM_CFLAGS += -DHAVE_DRM_PLATFORM
|
AM_CFLAGS += -DHAVE_DRM_PLATFORM
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
EXTRA_DIST = SConscript
|
||||||
|
@@ -534,7 +534,7 @@ dri2_setup_screen(_EGLDisplay *disp)
|
|||||||
disp->Extensions.KHR_gl_texture_2D_image = EGL_TRUE;
|
disp->Extensions.KHR_gl_texture_2D_image = EGL_TRUE;
|
||||||
disp->Extensions.KHR_gl_texture_cubemap_image = EGL_TRUE;
|
disp->Extensions.KHR_gl_texture_cubemap_image = EGL_TRUE;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_LIBDRM
|
||||||
if (dri2_dpy->image->base.version >= 8 &&
|
if (dri2_dpy->image->base.version >= 8 &&
|
||||||
dri2_dpy->image->createImageFromDmaBufs) {
|
dri2_dpy->image->createImageFromDmaBufs) {
|
||||||
disp->Extensions.EXT_image_dma_buf_import = EGL_TRUE;
|
disp->Extensions.EXT_image_dma_buf_import = EGL_TRUE;
|
||||||
@@ -703,6 +703,8 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
|
|||||||
#ifdef HAVE_WAYLAND_PLATFORM
|
#ifdef HAVE_WAYLAND_PLATFORM
|
||||||
case _EGL_PLATFORM_WAYLAND:
|
case _EGL_PLATFORM_WAYLAND:
|
||||||
wl_drm_destroy(dri2_dpy->wl_drm);
|
wl_drm_destroy(dri2_dpy->wl_drm);
|
||||||
|
wl_registry_destroy(dri2_dpy->wl_registry);
|
||||||
|
wl_event_queue_destroy(dri2_dpy->wl_queue);
|
||||||
if (dri2_dpy->own_device) {
|
if (dri2_dpy->own_device) {
|
||||||
wl_display_disconnect(dri2_dpy->wl_dpy);
|
wl_display_disconnect(dri2_dpy->wl_dpy);
|
||||||
}
|
}
|
||||||
@@ -1335,7 +1337,7 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
|
|||||||
return dri2_create_image_from_dri(disp, dri_image);
|
return dri2_create_image_from_dri(disp, dri_image);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_LIBDRM
|
||||||
static _EGLImage *
|
static _EGLImage *
|
||||||
dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
||||||
EGLClientBuffer buffer, const EGLint *attr_list)
|
EGLClientBuffer buffer, const EGLint *attr_list)
|
||||||
@@ -1571,7 +1573,7 @@ dri2_create_wayland_buffer_from_image(_EGLDriver *drv, _EGLDisplay *dpy,
|
|||||||
return dri2_dpy->vtbl->create_wayland_buffer_from_image(drv, dpy, img);
|
return dri2_dpy->vtbl->create_wayland_buffer_from_image(drv, dpy, img);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_LIBDRM
|
||||||
static EGLBoolean
|
static EGLBoolean
|
||||||
dri2_check_dma_buf_attribs(const _EGLImageAttribs *attrs)
|
dri2_check_dma_buf_attribs(const _EGLImageAttribs *attrs)
|
||||||
{
|
{
|
||||||
@@ -1821,7 +1823,7 @@ dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
|
|||||||
return dri2_create_image_khr_texture(disp, ctx, target, buffer, attr_list);
|
return dri2_create_image_khr_texture(disp, ctx, target, buffer, attr_list);
|
||||||
case EGL_GL_RENDERBUFFER_KHR:
|
case EGL_GL_RENDERBUFFER_KHR:
|
||||||
return dri2_create_image_khr_renderbuffer(disp, ctx, buffer, attr_list);
|
return dri2_create_image_khr_renderbuffer(disp, ctx, buffer, attr_list);
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_LIBDRM
|
||||||
case EGL_DRM_BUFFER_MESA:
|
case EGL_DRM_BUFFER_MESA:
|
||||||
return dri2_create_image_mesa_drm_buffer(disp, ctx, buffer, attr_list);
|
return dri2_create_image_mesa_drm_buffer(disp, ctx, buffer, attr_list);
|
||||||
#endif
|
#endif
|
||||||
@@ -1829,7 +1831,7 @@ dri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
|
|||||||
case EGL_WAYLAND_BUFFER_WL:
|
case EGL_WAYLAND_BUFFER_WL:
|
||||||
return dri2_create_image_wayland_wl_buffer(disp, ctx, buffer, attr_list);
|
return dri2_create_image_wayland_wl_buffer(disp, ctx, buffer, attr_list);
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_LIBDRM
|
||||||
case EGL_LINUX_DMA_BUF_EXT:
|
case EGL_LINUX_DMA_BUF_EXT:
|
||||||
return dri2_create_image_dma_buf(disp, ctx, buffer, attr_list);
|
return dri2_create_image_dma_buf(disp, ctx, buffer, attr_list);
|
||||||
#endif
|
#endif
|
||||||
@@ -1853,7 +1855,7 @@ dri2_destroy_image_khr(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *image)
|
|||||||
return EGL_TRUE;
|
return EGL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_LIBDRM
|
||||||
static _EGLImage *
|
static _EGLImage *
|
||||||
dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
|
dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
|
||||||
const EGLint *attr_list)
|
const EGLint *attr_list)
|
||||||
@@ -2215,7 +2217,7 @@ _eglBuiltInDriverDRI2(const char *args)
|
|||||||
dri2_drv->base.API.CreateImageKHR = dri2_create_image;
|
dri2_drv->base.API.CreateImageKHR = dri2_create_image;
|
||||||
dri2_drv->base.API.DestroyImageKHR = dri2_destroy_image_khr;
|
dri2_drv->base.API.DestroyImageKHR = dri2_destroy_image_khr;
|
||||||
dri2_drv->base.API.CreateWaylandBufferFromImageWL = dri2_create_wayland_buffer_from_image;
|
dri2_drv->base.API.CreateWaylandBufferFromImageWL = dri2_create_wayland_buffer_from_image;
|
||||||
#ifdef HAVE_DRM_PLATFORM
|
#ifdef HAVE_LIBDRM
|
||||||
dri2_drv->base.API.CreateDRMImageMESA = dri2_create_drm_image_mesa;
|
dri2_drv->base.API.CreateDRMImageMESA = dri2_create_drm_image_mesa;
|
||||||
dri2_drv->base.API.ExportDRMImageMESA = dri2_export_drm_image_mesa;
|
dri2_drv->base.API.ExportDRMImageMESA = dri2_export_drm_image_mesa;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -668,15 +668,21 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
|
|||||||
|
|
||||||
for (i = 0; dri2_dpy->driver_configs[i]; i++) {
|
for (i = 0; dri2_dpy->driver_configs[i]; i++) {
|
||||||
EGLint format, attr_list[3];
|
EGLint format, attr_list[3];
|
||||||
unsigned int mask;
|
unsigned int red, alpha;
|
||||||
|
|
||||||
dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
|
dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
|
||||||
__DRI_ATTRIB_RED_MASK, &mask);
|
__DRI_ATTRIB_RED_MASK, &red);
|
||||||
if (mask == 0x3ff00000)
|
dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
|
||||||
|
__DRI_ATTRIB_ALPHA_MASK, &alpha);
|
||||||
|
if (red == 0x3ff00000 && alpha == 0x00000000)
|
||||||
format = GBM_FORMAT_XRGB2101010;
|
format = GBM_FORMAT_XRGB2101010;
|
||||||
else if (mask == 0x00ff0000)
|
else if (red == 0x3ff00000 && alpha == 0xc0000000)
|
||||||
|
format = GBM_FORMAT_ARGB2101010;
|
||||||
|
else if (red == 0x00ff0000 && alpha == 0x00000000)
|
||||||
format = GBM_FORMAT_XRGB8888;
|
format = GBM_FORMAT_XRGB8888;
|
||||||
else if (mask == 0xf800)
|
else if (red == 0x00ff0000 && alpha == 0xff000000)
|
||||||
|
format = GBM_FORMAT_ARGB8888;
|
||||||
|
else if (red == 0xf800)
|
||||||
format = GBM_FORMAT_RGB565;
|
format = GBM_FORMAT_RGB565;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
@@ -292,6 +292,26 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
|
|||||||
struct dri2_egl_display *dri2_dpy =
|
struct dri2_egl_display *dri2_dpy =
|
||||||
dri2_egl_display(dri2_surf->base.Resource.Display);
|
dri2_egl_display(dri2_surf->base.Resource.Display);
|
||||||
int i;
|
int i;
|
||||||
|
unsigned int dri_image_format;
|
||||||
|
|
||||||
|
/* currently supports three WL DRM formats,
|
||||||
|
* WL_DRM_FORMAT_ARGB8888, WL_DRM_FORMAT_XRGB8888,
|
||||||
|
* and WL_DRM_FORMAT_RGB565
|
||||||
|
*/
|
||||||
|
switch (dri2_surf->format) {
|
||||||
|
case WL_DRM_FORMAT_ARGB8888:
|
||||||
|
dri_image_format = __DRI_IMAGE_FORMAT_ARGB8888;
|
||||||
|
break;
|
||||||
|
case WL_DRM_FORMAT_XRGB8888:
|
||||||
|
dri_image_format = __DRI_IMAGE_FORMAT_XRGB8888;
|
||||||
|
break;
|
||||||
|
case WL_DRM_FORMAT_RGB565:
|
||||||
|
dri_image_format = __DRI_IMAGE_FORMAT_RGB565;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* format is not supported */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* We always want to throttle to some event (either a frame callback or
|
/* We always want to throttle to some event (either a frame callback or
|
||||||
* a sync request) after the commit so that we can be sure the
|
* a sync request) after the commit so that we can be sure the
|
||||||
@@ -322,7 +342,7 @@ get_back_bo(struct dri2_egl_surface *dri2_surf)
|
|||||||
dri2_dpy->image->createImage(dri2_dpy->dri_screen,
|
dri2_dpy->image->createImage(dri2_dpy->dri_screen,
|
||||||
dri2_surf->base.Width,
|
dri2_surf->base.Width,
|
||||||
dri2_surf->base.Height,
|
dri2_surf->base.Height,
|
||||||
__DRI_IMAGE_FORMAT_ARGB8888,
|
dri_image_format,
|
||||||
__DRI_IMAGE_USE_SHARE,
|
__DRI_IMAGE_USE_SHARE,
|
||||||
NULL);
|
NULL);
|
||||||
dri2_surf->back->age = 0;
|
dri2_surf->back->age = 0;
|
||||||
@@ -462,11 +482,26 @@ dri2_wl_get_buffers(__DRIdrawable * driDrawable,
|
|||||||
unsigned int *attachments, int count,
|
unsigned int *attachments, int count,
|
||||||
int *out_count, void *loaderPrivate)
|
int *out_count, void *loaderPrivate)
|
||||||
{
|
{
|
||||||
|
struct dri2_egl_surface *dri2_surf = loaderPrivate;
|
||||||
unsigned int *attachments_with_format;
|
unsigned int *attachments_with_format;
|
||||||
__DRIbuffer *buffer;
|
__DRIbuffer *buffer;
|
||||||
const unsigned int format = 32;
|
unsigned int bpp;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
switch (dri2_surf->format) {
|
||||||
|
case WL_DRM_FORMAT_ARGB8888:
|
||||||
|
case WL_DRM_FORMAT_XRGB8888:
|
||||||
|
bpp = 32;
|
||||||
|
break;
|
||||||
|
case WL_DRM_FORMAT_RGB565:
|
||||||
|
bpp = 16;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* format is not supported */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
attachments_with_format = calloc(count, 2 * sizeof(unsigned int));
|
attachments_with_format = calloc(count, 2 * sizeof(unsigned int));
|
||||||
if (!attachments_with_format) {
|
if (!attachments_with_format) {
|
||||||
*out_count = 0;
|
*out_count = 0;
|
||||||
@@ -475,7 +510,7 @@ dri2_wl_get_buffers(__DRIdrawable * driDrawable,
|
|||||||
|
|
||||||
for (i = 0; i < count; ++i) {
|
for (i = 0; i < count; ++i) {
|
||||||
attachments_with_format[2*i] = attachments[i];
|
attachments_with_format[2*i] = attachments[i];
|
||||||
attachments_with_format[2*i + 1] = format;
|
attachments_with_format[2*i + 1] = bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer =
|
buffer =
|
||||||
@@ -993,7 +1028,7 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
|
|||||||
wl_registry_add_listener(dri2_dpy->wl_registry,
|
wl_registry_add_listener(dri2_dpy->wl_registry,
|
||||||
®istry_listener, dri2_dpy);
|
®istry_listener, dri2_dpy);
|
||||||
if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_drm == NULL)
|
if (roundtrip(dri2_dpy) < 0 || dri2_dpy->wl_drm == NULL)
|
||||||
goto cleanup_dpy;
|
goto cleanup_registry;
|
||||||
|
|
||||||
if (roundtrip(dri2_dpy) < 0 || dri2_dpy->fd == -1)
|
if (roundtrip(dri2_dpy) < 0 || dri2_dpy->fd == -1)
|
||||||
goto cleanup_drm;
|
goto cleanup_drm;
|
||||||
@@ -1076,6 +1111,9 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
|
|||||||
cleanup_drm:
|
cleanup_drm:
|
||||||
free(dri2_dpy->device_name);
|
free(dri2_dpy->device_name);
|
||||||
wl_drm_destroy(dri2_dpy->wl_drm);
|
wl_drm_destroy(dri2_dpy->wl_drm);
|
||||||
|
cleanup_registry:
|
||||||
|
wl_registry_destroy(dri2_dpy->wl_registry);
|
||||||
|
wl_event_queue_destroy(dri2_dpy->wl_queue);
|
||||||
cleanup_dpy:
|
cleanup_dpy:
|
||||||
free(dri2_dpy);
|
free(dri2_dpy);
|
||||||
|
|
||||||
|
@@ -1029,8 +1029,9 @@ eglGetProcAddress(const char *procname)
|
|||||||
const char *name;
|
const char *name;
|
||||||
_EGLProc function;
|
_EGLProc function;
|
||||||
} egl_functions[] = {
|
} egl_functions[] = {
|
||||||
/* core functions should not be queryable, but, well... */
|
/* core functions queryable in the presence of
|
||||||
#ifdef _EGL_GET_CORE_ADDRESSES
|
* EGL_KHR_get_all_proc_addresses or EGL 1.5
|
||||||
|
*/
|
||||||
/* alphabetical order */
|
/* alphabetical order */
|
||||||
{ "eglBindAPI", (_EGLProc) eglBindAPI },
|
{ "eglBindAPI", (_EGLProc) eglBindAPI },
|
||||||
{ "eglBindTexImage", (_EGLProc) eglBindTexImage },
|
{ "eglBindTexImage", (_EGLProc) eglBindTexImage },
|
||||||
@@ -1066,7 +1067,6 @@ eglGetProcAddress(const char *procname)
|
|||||||
{ "eglWaitClient", (_EGLProc) eglWaitClient },
|
{ "eglWaitClient", (_EGLProc) eglWaitClient },
|
||||||
{ "eglWaitGL", (_EGLProc) eglWaitGL },
|
{ "eglWaitGL", (_EGLProc) eglWaitGL },
|
||||||
{ "eglWaitNative", (_EGLProc) eglWaitNative },
|
{ "eglWaitNative", (_EGLProc) eglWaitNative },
|
||||||
#endif /* _EGL_GET_CORE_ADDRESSES */
|
|
||||||
#ifdef EGL_MESA_screen_surface
|
#ifdef EGL_MESA_screen_surface
|
||||||
{ "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
|
{ "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
|
||||||
{ "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
|
{ "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
|
||||||
|
@@ -49,7 +49,7 @@ extern _EGLArray *
|
|||||||
_eglCreateArray(const char *name, EGLint init_size);
|
_eglCreateArray(const char *name, EGLint init_size);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglDestroyArray(_EGLArray *array, void (*free_cb)(void *));
|
_eglDestroyArray(_EGLArray *array, void (*free_cb)(void *));
|
||||||
|
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ void *
|
|||||||
_eglFindArray(_EGLArray *array, void *elem);
|
_eglFindArray(_EGLArray *array, void *elem);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLint
|
extern EGLint
|
||||||
_eglFilterArray(_EGLArray *array, void **data, EGLint size,
|
_eglFilterArray(_EGLArray *array, void **data, EGLint size,
|
||||||
_EGLArrayForEach filter, void *filter_data);
|
_EGLArrayForEach filter, void *filter_data);
|
||||||
|
|
||||||
|
@@ -75,7 +75,7 @@ _eglInitConfig(_EGLConfig *conf, _EGLDisplay *dpy, EGLint id)
|
|||||||
*
|
*
|
||||||
* Note that we just save the ptr to the config (we don't copy the config).
|
* Note that we just save the ptr to the config (we don't copy the config).
|
||||||
*/
|
*/
|
||||||
PUBLIC EGLConfig
|
EGLConfig
|
||||||
_eglLinkConfig(_EGLConfig *conf)
|
_eglLinkConfig(_EGLConfig *conf)
|
||||||
{
|
{
|
||||||
_EGLDisplay *dpy = conf->Display;
|
_EGLDisplay *dpy = conf->Display;
|
||||||
|
@@ -162,11 +162,11 @@ _eglGetConfigKey(const _EGLConfig *conf, EGLint key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglInitConfig(_EGLConfig *config, _EGLDisplay *dpy, EGLint id);
|
_eglInitConfig(_EGLConfig *config, _EGLDisplay *dpy, EGLint id);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLConfig
|
extern EGLConfig
|
||||||
_eglLinkConfig(_EGLConfig *conf);
|
_eglLinkConfig(_EGLConfig *conf);
|
||||||
|
|
||||||
|
|
||||||
@@ -184,25 +184,25 @@ _eglGetConfigHandle(_EGLConfig *conf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
|
_eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
|
_eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy,
|
_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy,
|
||||||
const EGLint *attrib_list);
|
const EGLint *attrib_list);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLint
|
extern EGLint
|
||||||
_eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
|
_eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
|
||||||
const _EGLConfig *criteria, EGLBoolean compare_id);
|
const _EGLConfig *criteria, EGLBoolean compare_id);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglFilterConfigArray(_EGLArray *array, EGLConfig *configs,
|
_eglFilterConfigArray(_EGLArray *array, EGLConfig *configs,
|
||||||
EGLint config_size, EGLint *num_configs,
|
EGLint config_size, EGLint *num_configs,
|
||||||
EGLBoolean (*match)(const _EGLConfig *, void *),
|
EGLBoolean (*match)(const _EGLConfig *, void *),
|
||||||
|
@@ -63,7 +63,7 @@ struct _egl_context
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy,
|
_eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy,
|
||||||
_EGLConfig *config, const EGLint *attrib_list);
|
_EGLConfig *config, const EGLint *attrib_list);
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ extern EGLBoolean
|
|||||||
_eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, EGLint attribute, EGLint *value);
|
_eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx, EGLint attribute, EGLint *value);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
|
_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
|
||||||
_EGLContext **old_ctx,
|
_EGLContext **old_ctx,
|
||||||
_EGLSurface **old_draw, _EGLSurface **old_read);
|
_EGLSurface **old_draw, _EGLSurface **old_read);
|
||||||
|
@@ -242,7 +242,7 @@ _eglIsCurrentThreadDummy(void)
|
|||||||
/**
|
/**
|
||||||
* Return the currently bound context of the given API, or NULL.
|
* Return the currently bound context of the given API, or NULL.
|
||||||
*/
|
*/
|
||||||
PUBLIC _EGLContext *
|
_EGLContext *
|
||||||
_eglGetAPIContext(EGLenum api)
|
_eglGetAPIContext(EGLenum api)
|
||||||
{
|
{
|
||||||
_EGLThreadInfo *t = _eglGetCurrentThread();
|
_EGLThreadInfo *t = _eglGetCurrentThread();
|
||||||
|
@@ -90,7 +90,7 @@ _eglConvertApiFromIndex(EGLint idx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PUBLIC _EGLThreadInfo *
|
extern _EGLThreadInfo *
|
||||||
_eglGetCurrentThread(void);
|
_eglGetCurrentThread(void);
|
||||||
|
|
||||||
|
|
||||||
@@ -102,15 +102,15 @@ extern EGLBoolean
|
|||||||
_eglIsCurrentThreadDummy(void);
|
_eglIsCurrentThreadDummy(void);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC _EGLContext *
|
extern _EGLContext *
|
||||||
_eglGetAPIContext(EGLenum api);
|
_eglGetAPIContext(EGLenum api);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC _EGLContext *
|
extern _EGLContext *
|
||||||
_eglGetCurrentContext(void);
|
_eglGetCurrentContext(void);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglError(EGLint errCode, const char *msg);
|
_eglError(EGLint errCode, const char *msg);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -177,11 +177,11 @@ extern _EGLDisplay *
|
|||||||
_eglFindDisplay(_EGLPlatformType plat, void *plat_dpy);
|
_eglFindDisplay(_EGLPlatformType plat, void *plat_dpy);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *dpy);
|
_eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *dpy);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglCleanupDisplay(_EGLDisplay *disp);
|
_eglCleanupDisplay(_EGLDisplay *disp);
|
||||||
|
|
||||||
|
|
||||||
@@ -189,7 +189,7 @@ extern EGLBoolean
|
|||||||
_eglCheckDisplayHandle(EGLDisplay dpy);
|
_eglCheckDisplayHandle(EGLDisplay dpy);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy);
|
_eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy);
|
||||||
|
|
||||||
|
|
||||||
@@ -221,11 +221,11 @@ extern void
|
|||||||
_eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy);
|
_eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglGetResource(_EGLResource *res);
|
_eglGetResource(_EGLResource *res);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglPutResource(_EGLResource *res);
|
_eglPutResource(_EGLResource *res);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -96,7 +96,7 @@ extern _EGLDriver *
|
|||||||
_eglBuiltInDriverGLX(const char *args);
|
_eglBuiltInDriverGLX(const char *args);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC _EGLDriver *
|
extern _EGLDriver *
|
||||||
_eglMain(const char *args);
|
_eglMain(const char *args);
|
||||||
|
|
||||||
|
|
||||||
@@ -113,11 +113,11 @@ _eglUnloadDrivers(void);
|
|||||||
|
|
||||||
|
|
||||||
/* defined in eglfallbacks.c */
|
/* defined in eglfallbacks.c */
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglInitDriverFallbacks(_EGLDriver *drv);
|
_eglInitDriverFallbacks(_EGLDriver *drv);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglSearchPathForEach(EGLBoolean (*callback)(const char *, size_t, void *),
|
_eglSearchPathForEach(EGLBoolean (*callback)(const char *, size_t, void *),
|
||||||
void *callback_data);
|
void *callback_data);
|
||||||
|
|
||||||
|
@@ -80,12 +80,12 @@ struct _egl_image
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLint
|
extern EGLint
|
||||||
_eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
|
_eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *dpy,
|
||||||
const EGLint *attrib_list);
|
const EGLint *attrib_list);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglInitImage(_EGLImage *img, _EGLDisplay *dpy);
|
_eglInitImage(_EGLImage *img, _EGLDisplay *dpy);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -43,15 +43,15 @@
|
|||||||
typedef void (*_EGLLogProc)(EGLint level, const char *msg);
|
typedef void (*_EGLLogProc)(EGLint level, const char *msg);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglSetLogProc(_EGLLogProc logger);
|
_eglSetLogProc(_EGLLogProc logger);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglSetLogLevel(EGLint level);
|
_eglSetLogLevel(EGLint level);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglLog(EGLint level, const char *fmtStr, ...);
|
_eglLog(EGLint level, const char *fmtStr, ...);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -67,11 +67,11 @@ struct _egl_screen
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
PUBLIC void
|
extern void
|
||||||
_eglInitScreen(_EGLScreen *screen, _EGLDisplay *dpy, EGLint num_modes);
|
_eglInitScreen(_EGLScreen *screen, _EGLDisplay *dpy, EGLint num_modes);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLScreenMESA
|
extern EGLScreenMESA
|
||||||
_eglLinkScreen(_EGLScreen *screen);
|
_eglLinkScreen(_EGLScreen *screen);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -78,7 +78,7 @@ struct _egl_surface
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
|
_eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
|
||||||
_EGLConfig *config, const EGLint *attrib_list);
|
_EGLConfig *config, const EGLint *attrib_list);
|
||||||
|
|
||||||
@@ -91,10 +91,10 @@ extern EGLBoolean
|
|||||||
_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value);
|
_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint attribute, EGLint value);
|
||||||
|
|
||||||
|
|
||||||
PUBLIC extern EGLBoolean
|
extern EGLBoolean
|
||||||
_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
|
_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint buffer);
|
||||||
|
|
||||||
PUBLIC extern EGLBoolean
|
extern EGLBoolean
|
||||||
_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer);
|
_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -48,7 +48,7 @@ struct _egl_sync
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
PUBLIC EGLBoolean
|
extern EGLBoolean
|
||||||
_eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
|
_eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
|
||||||
const EGLint *attrib_list);
|
const EGLint *attrib_list);
|
||||||
|
|
||||||
|
@@ -33,8 +33,7 @@ LOCAL_SRC_FILES := \
|
|||||||
$(VL_STUB_SOURCES)
|
$(VL_STUB_SOURCES)
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := \
|
LOCAL_C_INCLUDES := \
|
||||||
$(GALLIUM_TOP)/auxiliary/util \
|
$(GALLIUM_TOP)/auxiliary/util
|
||||||
$(MESA_TOP)/src
|
|
||||||
|
|
||||||
LOCAL_MODULE := libmesa_gallium
|
LOCAL_MODULE := libmesa_gallium
|
||||||
|
|
||||||
|
@@ -53,24 +53,40 @@ libgalliumvl_stub_la_SOURCES = \
|
|||||||
|
|
||||||
if NEED_GALLIUM_VL
|
if NEED_GALLIUM_VL
|
||||||
|
|
||||||
noinst_LTLIBRARIES += libgalliumvl.la
|
COMMON_VL_CFLAGS = \
|
||||||
|
|
||||||
libgalliumvl_la_CFLAGS = \
|
|
||||||
$(AM_CFLAGS) \
|
$(AM_CFLAGS) \
|
||||||
$(VL_CFLAGS) \
|
$(VL_CFLAGS) \
|
||||||
|
$(DRI2PROTO_CFLAGS) \
|
||||||
$(LIBDRM_CFLAGS) \
|
$(LIBDRM_CFLAGS) \
|
||||||
$(GALLIUM_PIPE_LOADER_DEFINES) \
|
$(GALLIUM_PIPE_LOADER_DEFINES) \
|
||||||
-DPIPE_SEARCH_DIR=\"$(libdir)/gallium-pipe\"
|
-DPIPE_SEARCH_DIR=\"$(libdir)/gallium-pipe\"
|
||||||
|
|
||||||
if HAVE_GALLIUM_STATIC_TARGETS
|
if HAVE_GALLIUM_STATIC_TARGETS
|
||||||
libgalliumvl_la_CFLAGS += \
|
COMMON_VL_CFLAGS += \
|
||||||
-DGALLIUM_STATIC_TARGETS=1
|
-DGALLIUM_STATIC_TARGETS=1
|
||||||
|
|
||||||
endif # HAVE_GALLIUM_STATIC_TARGETS
|
endif # HAVE_GALLIUM_STATIC_TARGETS
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES += libgalliumvl.la
|
||||||
|
|
||||||
|
libgalliumvl_la_CFLAGS = \
|
||||||
|
$(COMMON_VL_CFLAGS)
|
||||||
|
|
||||||
libgalliumvl_la_SOURCES = \
|
libgalliumvl_la_SOURCES = \
|
||||||
$(VL_SOURCES)
|
$(VL_SOURCES)
|
||||||
|
|
||||||
|
if NEED_GALLIUM_VL_WINSYS
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES += libgalliumvlwinsys.la
|
||||||
|
|
||||||
|
libgalliumvlwinsys_la_CFLAGS = \
|
||||||
|
$(COMMON_VL_CFLAGS)
|
||||||
|
|
||||||
|
libgalliumvlwinsys_la_SOURCES = \
|
||||||
|
$(VL_WINSYS_SOURCES)
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
|
@@ -334,10 +334,13 @@ VL_SOURCES := \
|
|||||||
vl/vl_video_buffer.h \
|
vl/vl_video_buffer.h \
|
||||||
vl/vl_vlc.h \
|
vl/vl_vlc.h \
|
||||||
vl/vl_winsys.h \
|
vl/vl_winsys.h \
|
||||||
vl/vl_winsys_dri.c \
|
|
||||||
vl/vl_zscan.c \
|
vl/vl_zscan.c \
|
||||||
vl/vl_zscan.h
|
vl/vl_zscan.h
|
||||||
|
|
||||||
|
# XXX: Nuke this as our dri targets no longer depend on VL.
|
||||||
|
VL_WINSYS_SOURCES := \
|
||||||
|
vl/vl_winsys_dri.c
|
||||||
|
|
||||||
VL_STUB_SOURCES := \
|
VL_STUB_SOURCES := \
|
||||||
vl/vl_stubs.c
|
vl/vl_stubs.c
|
||||||
|
|
||||||
|
@@ -182,6 +182,7 @@ boolean draw_init(struct draw_context *draw)
|
|||||||
void draw_new_instance(struct draw_context *draw)
|
void draw_new_instance(struct draw_context *draw)
|
||||||
{
|
{
|
||||||
draw_geometry_shader_new_instance(draw->gs.geometry_shader);
|
draw_geometry_shader_new_instance(draw->gs.geometry_shader);
|
||||||
|
draw_prim_assembler_new_instance(draw->ia);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -2049,7 +2049,7 @@ generate_mask_value(struct draw_gs_llvm_variant *variant,
|
|||||||
|
|
||||||
num_prims = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type),
|
num_prims = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type),
|
||||||
variant->num_prims);
|
variant->num_prims);
|
||||||
for (i = 0; i <= gs_type.length; i++) {
|
for (i = 0; i < gs_type.length; i++) {
|
||||||
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
|
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
|
||||||
mask_val = LLVMBuildInsertElement(builder, mask_val, idx, idx, "");
|
mask_val = LLVMBuildInsertElement(builder, mask_val, idx, idx, "");
|
||||||
}
|
}
|
||||||
|
@@ -189,7 +189,6 @@ draw_prim_assembler_prepare_outputs(struct draw_assembler *ia)
|
|||||||
} else {
|
} else {
|
||||||
ia->primid_slot = -1;
|
ia->primid_slot = -1;
|
||||||
}
|
}
|
||||||
ia->primid = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -233,7 +232,6 @@ draw_prim_assembler_run(struct draw_context *draw,
|
|||||||
asmblr->input_prims = input_prims;
|
asmblr->input_prims = input_prims;
|
||||||
asmblr->input_verts = input_verts;
|
asmblr->input_verts = input_verts;
|
||||||
asmblr->needs_primid = needs_primid(asmblr->draw);
|
asmblr->needs_primid = needs_primid(asmblr->draw);
|
||||||
asmblr->primid = 0;
|
|
||||||
asmblr->num_prims = 0;
|
asmblr->num_prims = 0;
|
||||||
|
|
||||||
output_prims->linear = TRUE;
|
output_prims->linear = TRUE;
|
||||||
@@ -284,3 +282,14 @@ draw_prim_assembler_destroy(struct draw_assembler *ia)
|
|||||||
{
|
{
|
||||||
FREE(ia);
|
FREE(ia);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called at the very begin of the draw call with a new instance
|
||||||
|
* Used to reset state that should persist between primitive restart.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
draw_prim_assembler_new_instance(struct draw_assembler *asmblr)
|
||||||
|
{
|
||||||
|
asmblr->primid = 0;
|
||||||
|
}
|
||||||
|
@@ -70,5 +70,8 @@ draw_prim_assembler_run(struct draw_context *draw,
|
|||||||
void
|
void
|
||||||
draw_prim_assembler_prepare_outputs(struct draw_assembler *ia);
|
draw_prim_assembler_prepare_outputs(struct draw_assembler *ia);
|
||||||
|
|
||||||
|
void
|
||||||
|
draw_prim_assembler_new_instance(struct draw_assembler *ia);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -193,7 +193,7 @@ def lineloop(intype, outtype, inpv, outpv):
|
|||||||
print ' for (i = start, j = 0; j < nr - 2; j+=2, i++) { '
|
print ' for (i = start, j = 0; j < nr - 2; j+=2, i++) { '
|
||||||
do_line( intype, outtype, 'out+j', 'i', 'i+1', inpv, outpv );
|
do_line( intype, outtype, 'out+j', 'i', 'i+1', inpv, outpv );
|
||||||
print ' }'
|
print ' }'
|
||||||
do_line( intype, outtype, 'out+j', 'i', '0', inpv, outpv );
|
do_line( intype, outtype, 'out+j', 'i', 'start', inpv, outpv );
|
||||||
postamble()
|
postamble()
|
||||||
|
|
||||||
def tris(intype, outtype, inpv, outpv):
|
def tris(intype, outtype, inpv, outpv):
|
||||||
@@ -218,7 +218,7 @@ def tristrip(intype, outtype, inpv, outpv):
|
|||||||
def trifan(intype, outtype, inpv, outpv):
|
def trifan(intype, outtype, inpv, outpv):
|
||||||
preamble(intype, outtype, inpv, outpv, prim='trifan')
|
preamble(intype, outtype, inpv, outpv, prim='trifan')
|
||||||
print ' for (i = start, j = 0; j < nr; j+=3, i++) { '
|
print ' for (i = start, j = 0; j < nr; j+=3, i++) { '
|
||||||
do_tri( intype, outtype, 'out+j', '0', 'i+1', 'i+2', inpv, outpv );
|
do_tri( intype, outtype, 'out+j', 'start', 'i+1', 'i+2', inpv, outpv );
|
||||||
print ' }'
|
print ' }'
|
||||||
postamble()
|
postamble()
|
||||||
|
|
||||||
@@ -228,9 +228,9 @@ def polygon(intype, outtype, inpv, outpv):
|
|||||||
preamble(intype, outtype, inpv, outpv, prim='polygon')
|
preamble(intype, outtype, inpv, outpv, prim='polygon')
|
||||||
print ' for (i = start, j = 0; j < nr; j+=3, i++) { '
|
print ' for (i = start, j = 0; j < nr; j+=3, i++) { '
|
||||||
if inpv == FIRST:
|
if inpv == FIRST:
|
||||||
do_tri( intype, outtype, 'out+j', '0', 'i+1', 'i+2', inpv, outpv );
|
do_tri( intype, outtype, 'out+j', 'start', 'i+1', 'i+2', inpv, outpv );
|
||||||
else:
|
else:
|
||||||
do_tri( intype, outtype, 'out+j', 'i+1', 'i+2', '0', inpv, outpv );
|
do_tri( intype, outtype, 'out+j', 'i+1', 'i+2', 'start', inpv, outpv );
|
||||||
print ' }'
|
print ' }'
|
||||||
postamble()
|
postamble()
|
||||||
|
|
||||||
|
@@ -118,7 +118,7 @@ os_get_total_physical_memory(uint64_t *size)
|
|||||||
*size = phys_pages * page_size;
|
*size = phys_pages * page_size;
|
||||||
return (phys_pages > 0 && page_size > 0);
|
return (phys_pages > 0 && page_size > 0);
|
||||||
#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
|
#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
|
||||||
size_t len = sizeof(size);
|
size_t len = sizeof(*size);
|
||||||
int mib[2];
|
int mib[2];
|
||||||
|
|
||||||
mib[0] = CTL_HW;
|
mib[0] = CTL_HW;
|
||||||
@@ -134,7 +134,7 @@ os_get_total_physical_memory(uint64_t *size)
|
|||||||
#error Unsupported *BSD
|
#error Unsupported *BSD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (sysctl(mib, 2, &size, &len, NULL, 0) == 0);
|
return (sysctl(mib, 2, size, &len, NULL, 0) == 0);
|
||||||
#elif defined(PIPE_OS_HAIKU)
|
#elif defined(PIPE_OS_HAIKU)
|
||||||
system_info info;
|
system_info info;
|
||||||
status_t ret;
|
status_t ret;
|
||||||
|
@@ -70,8 +70,8 @@ static INLINE void *os_mmap(void *addr, size_t length, int prot, int flags,
|
|||||||
return __mmap2(addr, length, prot, flags, fd, (size_t) (offset >> 12));
|
return __mmap2(addr, length, prot, flags, fd, (size_t) (offset >> 12));
|
||||||
}
|
}
|
||||||
|
|
||||||
# define drm_munmap(addr, length) \
|
# define os_munmap(addr, length) \
|
||||||
munmap(addr, length)
|
munmap(addr, length)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* assume large file support exists */
|
/* assume large file support exists */
|
||||||
|
@@ -34,10 +34,9 @@ LOCAL_CFLAGS := \
|
|||||||
-Wno-packed-bitfield-compat
|
-Wno-packed-bitfield-compat
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := \
|
LOCAL_C_INCLUDES := \
|
||||||
$(LOCAL_PATH)/ir3 \
|
$(LOCAL_PATH)/ir3
|
||||||
$(TARGET_OUT_HEADERS)/libdrm \
|
|
||||||
$(TARGET_OUT_HEADERS)/freedreno
|
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := libdrm libdrm_freedreno
|
||||||
LOCAL_MODULE := libmesa_pipe_freedreno
|
LOCAL_MODULE := libmesa_pipe_freedreno
|
||||||
|
|
||||||
include $(GALLIUM_COMMON_MK)
|
include $(GALLIUM_COMMON_MK)
|
||||||
|
@@ -13,8 +13,8 @@ The rules-ng-ng source files this header was generated from are:
|
|||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64344 bytes, from 2014-12-12 20:22:26)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64771 bytes, from 2015-03-15 21:55:57)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51270 bytes, from 2015-01-18 23:05:48)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51942 bytes, from 2015-02-24 17:14:02)
|
||||||
|
|
||||||
Copyright (C) 2013-2014 by the following authors:
|
Copyright (C) 2013-2014 by the following authors:
|
||||||
- Rob Clark <robdclark@gmail.com> (robclark)
|
- Rob Clark <robdclark@gmail.com> (robclark)
|
||||||
|
@@ -439,7 +439,8 @@ static int instr_emit_alu(struct ir2_instruction *instr, uint32_t *dwords,
|
|||||||
assert(sdst_reg->flags == dst_reg->flags);
|
assert(sdst_reg->flags == dst_reg->flags);
|
||||||
|
|
||||||
if (src3_reg) {
|
if (src3_reg) {
|
||||||
assert(src3_reg == instr->regs[reg++]);
|
assert(src3_reg == instr->regs[reg]);
|
||||||
|
reg++;
|
||||||
} else {
|
} else {
|
||||||
src3_reg = instr->regs[reg++];
|
src3_reg = instr->regs[reg++];
|
||||||
}
|
}
|
||||||
|
@@ -13,10 +13,10 @@ The rules-ng-ng source files this header was generated from are:
|
|||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64344 bytes, from 2014-12-12 20:22:26)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64771 bytes, from 2015-03-15 21:55:57)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51270 bytes, from 2015-01-18 23:05:48)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51942 bytes, from 2015-02-24 17:14:02)
|
||||||
|
|
||||||
Copyright (C) 2013-2014 by the following authors:
|
Copyright (C) 2013-2015 by the following authors:
|
||||||
- Rob Clark <robdclark@gmail.com> (robclark)
|
- Rob Clark <robdclark@gmail.com> (robclark)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
@@ -130,6 +130,10 @@ enum a3xx_tex_fmt {
|
|||||||
TFMT_I420_Y = 24,
|
TFMT_I420_Y = 24,
|
||||||
TFMT_I420_U = 26,
|
TFMT_I420_U = 26,
|
||||||
TFMT_I420_V = 27,
|
TFMT_I420_V = 27,
|
||||||
|
TFMT_ATC_RGB = 32,
|
||||||
|
TFMT_ATC_RGBA_EXPLICIT = 33,
|
||||||
|
TFMT_ETC1 = 34,
|
||||||
|
TFMT_ATC_RGBA_INTERPOLATED = 35,
|
||||||
TFMT_DXT1 = 36,
|
TFMT_DXT1 = 36,
|
||||||
TFMT_DXT3 = 37,
|
TFMT_DXT3 = 37,
|
||||||
TFMT_DXT5 = 38,
|
TFMT_DXT5 = 38,
|
||||||
@@ -854,6 +858,12 @@ static inline uint32_t A3XX_RB_MODE_CONTROL_RENDER_MODE(enum a3xx_render_mode va
|
|||||||
{
|
{
|
||||||
return ((val) << A3XX_RB_MODE_CONTROL_RENDER_MODE__SHIFT) & A3XX_RB_MODE_CONTROL_RENDER_MODE__MASK;
|
return ((val) << A3XX_RB_MODE_CONTROL_RENDER_MODE__SHIFT) & A3XX_RB_MODE_CONTROL_RENDER_MODE__MASK;
|
||||||
}
|
}
|
||||||
|
#define A3XX_RB_MODE_CONTROL_MRT__MASK 0x00003000
|
||||||
|
#define A3XX_RB_MODE_CONTROL_MRT__SHIFT 12
|
||||||
|
static inline uint32_t A3XX_RB_MODE_CONTROL_MRT(uint32_t val)
|
||||||
|
{
|
||||||
|
return ((val) << A3XX_RB_MODE_CONTROL_MRT__SHIFT) & A3XX_RB_MODE_CONTROL_MRT__MASK;
|
||||||
|
}
|
||||||
#define A3XX_RB_MODE_CONTROL_MARB_CACHE_SPLIT_MODE 0x00008000
|
#define A3XX_RB_MODE_CONTROL_MARB_CACHE_SPLIT_MODE 0x00008000
|
||||||
#define A3XX_RB_MODE_CONTROL_PACKER_TIMER_ENABLE 0x00010000
|
#define A3XX_RB_MODE_CONTROL_PACKER_TIMER_ENABLE 0x00010000
|
||||||
|
|
||||||
@@ -2107,6 +2117,12 @@ static inline uint32_t A3XX_SP_FS_OBJ_OFFSET_REG_SHADEROBJOFFSET(uint32_t val)
|
|||||||
#define REG_A3XX_SP_FS_FLAT_SHAD_MODE_REG_1 0x000022e9
|
#define REG_A3XX_SP_FS_FLAT_SHAD_MODE_REG_1 0x000022e9
|
||||||
|
|
||||||
#define REG_A3XX_SP_FS_OUTPUT_REG 0x000022ec
|
#define REG_A3XX_SP_FS_OUTPUT_REG 0x000022ec
|
||||||
|
#define A3XX_SP_FS_OUTPUT_REG_MRT__MASK 0x00000003
|
||||||
|
#define A3XX_SP_FS_OUTPUT_REG_MRT__SHIFT 0
|
||||||
|
static inline uint32_t A3XX_SP_FS_OUTPUT_REG_MRT(uint32_t val)
|
||||||
|
{
|
||||||
|
return ((val) << A3XX_SP_FS_OUTPUT_REG_MRT__SHIFT) & A3XX_SP_FS_OUTPUT_REG_MRT__MASK;
|
||||||
|
}
|
||||||
#define A3XX_SP_FS_OUTPUT_REG_DEPTH_ENABLE 0x00000080
|
#define A3XX_SP_FS_OUTPUT_REG_DEPTH_ENABLE 0x00000080
|
||||||
#define A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__MASK 0x0000ff00
|
#define A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__MASK 0x0000ff00
|
||||||
#define A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__SHIFT 8
|
#define A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__SHIFT 8
|
||||||
@@ -2661,7 +2677,7 @@ static inline uint32_t A3XX_TEX_CONST_2_SWAP(enum a3xx_color_swap val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define REG_A3XX_TEX_CONST_3 0x00000003
|
#define REG_A3XX_TEX_CONST_3 0x00000003
|
||||||
#define A3XX_TEX_CONST_3_LAYERSZ1__MASK 0x0000000f
|
#define A3XX_TEX_CONST_3_LAYERSZ1__MASK 0x00001fff
|
||||||
#define A3XX_TEX_CONST_3_LAYERSZ1__SHIFT 0
|
#define A3XX_TEX_CONST_3_LAYERSZ1__SHIFT 0
|
||||||
static inline uint32_t A3XX_TEX_CONST_3_LAYERSZ1(uint32_t val)
|
static inline uint32_t A3XX_TEX_CONST_3_LAYERSZ1(uint32_t val)
|
||||||
{
|
{
|
||||||
|
@@ -365,7 +365,10 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit)
|
|||||||
COND(vp->writes_psize, A3XX_VPC_ATTR_PSIZE));
|
COND(vp->writes_psize, A3XX_VPC_ATTR_PSIZE));
|
||||||
OUT_RING(ring, 0x00000000);
|
OUT_RING(ring, 0x00000000);
|
||||||
} else {
|
} else {
|
||||||
uint32_t vinterp[4] = {0}, flatshade[2] = {0};
|
uint32_t vinterp[4], flatshade[2];
|
||||||
|
|
||||||
|
memset(vinterp, 0, sizeof(vinterp));
|
||||||
|
memset(flatshade, 0, sizeof(flatshade));
|
||||||
|
|
||||||
/* figure out VARYING_INTERP / FLAT_SHAD register values: */
|
/* figure out VARYING_INTERP / FLAT_SHAD register values: */
|
||||||
for (j = -1; (j = ir3_next_varying(fp, j)) < (int)fp->inputs_count; ) {
|
for (j = -1; (j = ir3_next_varying(fp, j)) < (int)fp->inputs_count; ) {
|
||||||
|
@@ -50,7 +50,7 @@ fd3_rasterizer_state_create(struct pipe_context *pctx,
|
|||||||
|
|
||||||
if (cso->point_size_per_vertex) {
|
if (cso->point_size_per_vertex) {
|
||||||
psize_min = util_get_min_point_size(cso);
|
psize_min = util_get_min_point_size(cso);
|
||||||
psize_max = 8192;
|
psize_max = 4092;
|
||||||
} else {
|
} else {
|
||||||
/* Force the point size to be as if the vertex output was disabled. */
|
/* Force the point size to be as if the vertex output was disabled. */
|
||||||
psize_min = cso->point_size;
|
psize_min = cso->point_size;
|
||||||
@@ -67,9 +67,9 @@ fd3_rasterizer_state_create(struct pipe_context *pctx,
|
|||||||
*/
|
*/
|
||||||
so->gras_cl_clip_cntl = A3XX_GRAS_CL_CLIP_CNTL_IJ_PERSP_CENTER; /* ??? */
|
so->gras_cl_clip_cntl = A3XX_GRAS_CL_CLIP_CNTL_IJ_PERSP_CENTER; /* ??? */
|
||||||
so->gras_su_point_minmax =
|
so->gras_su_point_minmax =
|
||||||
A3XX_GRAS_SU_POINT_MINMAX_MIN(psize_min/2) |
|
A3XX_GRAS_SU_POINT_MINMAX_MIN(psize_min) |
|
||||||
A3XX_GRAS_SU_POINT_MINMAX_MAX(psize_max/2);
|
A3XX_GRAS_SU_POINT_MINMAX_MAX(psize_max);
|
||||||
so->gras_su_point_size = A3XX_GRAS_SU_POINT_SIZE(cso->point_size/2);
|
so->gras_su_point_size = A3XX_GRAS_SU_POINT_SIZE(cso->point_size);
|
||||||
so->gras_su_poly_offset_scale =
|
so->gras_su_poly_offset_scale =
|
||||||
A3XX_GRAS_SU_POLY_OFFSET_SCALE_VAL(cso->offset_scale);
|
A3XX_GRAS_SU_POLY_OFFSET_SCALE_VAL(cso->offset_scale);
|
||||||
so->gras_su_poly_offset_offset =
|
so->gras_su_poly_offset_offset =
|
||||||
|
@@ -212,6 +212,7 @@ fd3_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
|
|||||||
struct fd_resource *rsc = fd_resource(prsc);
|
struct fd_resource *rsc = fd_resource(prsc);
|
||||||
unsigned lvl = cso->u.tex.first_level;
|
unsigned lvl = cso->u.tex.first_level;
|
||||||
unsigned miplevels = cso->u.tex.last_level - lvl;
|
unsigned miplevels = cso->u.tex.last_level - lvl;
|
||||||
|
uint32_t sz2 = 0;
|
||||||
|
|
||||||
if (!so)
|
if (!so)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -252,8 +253,10 @@ fd3_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
|
|||||||
case PIPE_TEXTURE_3D:
|
case PIPE_TEXTURE_3D:
|
||||||
so->texconst3 =
|
so->texconst3 =
|
||||||
A3XX_TEX_CONST_3_DEPTH(u_minify(prsc->depth0, lvl)) |
|
A3XX_TEX_CONST_3_DEPTH(u_minify(prsc->depth0, lvl)) |
|
||||||
A3XX_TEX_CONST_3_LAYERSZ1(rsc->slices[0].size0) |
|
A3XX_TEX_CONST_3_LAYERSZ1(rsc->slices[lvl].size0);
|
||||||
A3XX_TEX_CONST_3_LAYERSZ2(rsc->slices[0].size0);
|
while (lvl < cso->u.tex.last_level && sz2 != rsc->slices[lvl+1].size0)
|
||||||
|
sz2 = rsc->slices[++lvl].size0;
|
||||||
|
so->texconst3 |= A3XX_TEX_CONST_3_LAYERSZ2(sz2);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
so->texconst3 = 0x00000000;
|
so->texconst3 = 0x00000000;
|
||||||
|
@@ -13,8 +13,8 @@ The rules-ng-ng source files this header was generated from are:
|
|||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64344 bytes, from 2014-12-12 20:22:26)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64771 bytes, from 2015-03-15 21:55:57)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51270 bytes, from 2015-01-18 23:05:48)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51942 bytes, from 2015-02-24 17:14:02)
|
||||||
|
|
||||||
Copyright (C) 2013-2015 by the following authors:
|
Copyright (C) 2013-2015 by the following authors:
|
||||||
- Rob Clark <robdclark@gmail.com> (robclark)
|
- Rob Clark <robdclark@gmail.com> (robclark)
|
||||||
@@ -150,6 +150,7 @@ enum a4xx_depth_format {
|
|||||||
enum a4xx_tex_filter {
|
enum a4xx_tex_filter {
|
||||||
A4XX_TEX_NEAREST = 0,
|
A4XX_TEX_NEAREST = 0,
|
||||||
A4XX_TEX_LINEAR = 1,
|
A4XX_TEX_LINEAR = 1,
|
||||||
|
A4XX_TEX_ANISO = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum a4xx_tex_clamp {
|
enum a4xx_tex_clamp {
|
||||||
@@ -159,6 +160,14 @@ enum a4xx_tex_clamp {
|
|||||||
A4XX_TEX_CLAMP_NONE = 3,
|
A4XX_TEX_CLAMP_NONE = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum a4xx_tex_aniso {
|
||||||
|
A4XX_TEX_ANISO_1 = 0,
|
||||||
|
A4XX_TEX_ANISO_2 = 1,
|
||||||
|
A4XX_TEX_ANISO_4 = 2,
|
||||||
|
A4XX_TEX_ANISO_8 = 3,
|
||||||
|
A4XX_TEX_ANISO_16 = 4,
|
||||||
|
};
|
||||||
|
|
||||||
enum a4xx_tex_swiz {
|
enum a4xx_tex_swiz {
|
||||||
A4XX_TEX_X = 0,
|
A4XX_TEX_X = 0,
|
||||||
A4XX_TEX_Y = 1,
|
A4XX_TEX_Y = 1,
|
||||||
@@ -936,6 +945,10 @@ static inline uint32_t REG_A4XX_RBBM_CLOCK_DELAY_RB_MARB_CCU_L1_REG(uint32_t i0)
|
|||||||
|
|
||||||
#define REG_A4XX_CP_IB2_BUFSZ 0x00000209
|
#define REG_A4XX_CP_IB2_BUFSZ 0x00000209
|
||||||
|
|
||||||
|
#define REG_A4XX_CP_ME_NRT_ADDR 0x0000020c
|
||||||
|
|
||||||
|
#define REG_A4XX_CP_ME_NRT_DATA 0x0000020d
|
||||||
|
|
||||||
#define REG_A4XX_CP_ME_RB_DONE_DATA 0x00000217
|
#define REG_A4XX_CP_ME_RB_DONE_DATA 0x00000217
|
||||||
|
|
||||||
#define REG_A4XX_CP_QUEUE_THRESH2 0x00000219
|
#define REG_A4XX_CP_QUEUE_THRESH2 0x00000219
|
||||||
@@ -946,9 +959,9 @@ static inline uint32_t REG_A4XX_RBBM_CLOCK_DELAY_RB_MARB_CCU_L1_REG(uint32_t i0)
|
|||||||
|
|
||||||
#define REG_A4XX_CP_ROQ_DATA 0x0000021d
|
#define REG_A4XX_CP_ROQ_DATA 0x0000021d
|
||||||
|
|
||||||
#define REG_A4XX_CP_MEQ_ADDR 0x0000021e
|
#define REG_A4XX_CP_MEQ_ADDR 0x0000021e
|
||||||
|
|
||||||
#define REG_A4XX_CP_MEQ_DATA 0x0000021f
|
#define REG_A4XX_CP_MEQ_DATA 0x0000021f
|
||||||
|
|
||||||
#define REG_A4XX_CP_MERCIU_ADDR 0x00000220
|
#define REG_A4XX_CP_MERCIU_ADDR 0x00000220
|
||||||
|
|
||||||
@@ -1424,6 +1437,10 @@ static inline uint32_t REG_A4XX_VSC_PIPE_DATA_LENGTH_REG(uint32_t i0) { return 0
|
|||||||
|
|
||||||
#define REG_A4XX_VFD_PERFCTR_VFD_SEL_7 0x00000e4a
|
#define REG_A4XX_VFD_PERFCTR_VFD_SEL_7 0x00000e4a
|
||||||
|
|
||||||
|
#define REG_A4XX_VGT_CL_INITIATOR 0x000021d0
|
||||||
|
|
||||||
|
#define REG_A4XX_VGT_EVENT_INITIATOR 0x000021d9
|
||||||
|
|
||||||
#define REG_A4XX_VFD_CONTROL_0 0x00002200
|
#define REG_A4XX_VFD_CONTROL_0 0x00002200
|
||||||
#define A4XX_VFD_CONTROL_0_TOTALATTRTOVS__MASK 0x000000ff
|
#define A4XX_VFD_CONTROL_0_TOTALATTRTOVS__MASK 0x000000ff
|
||||||
#define A4XX_VFD_CONTROL_0_TOTALATTRTOVS__SHIFT 0
|
#define A4XX_VFD_CONTROL_0_TOTALATTRTOVS__SHIFT 0
|
||||||
@@ -2041,7 +2058,12 @@ static inline uint32_t A4XX_HLSQ_GS_CONTROL_REG_INSTRLENGTH(uint32_t val)
|
|||||||
#define REG_A4XX_PC_BIN_BASE 0x000021c0
|
#define REG_A4XX_PC_BIN_BASE 0x000021c0
|
||||||
|
|
||||||
#define REG_A4XX_PC_PRIM_VTX_CNTL 0x000021c4
|
#define REG_A4XX_PC_PRIM_VTX_CNTL 0x000021c4
|
||||||
#define A4XX_PC_PRIM_VTX_CNTL_VAROUT 0x00000001
|
#define A4XX_PC_PRIM_VTX_CNTL_VAROUT__MASK 0x0000000f
|
||||||
|
#define A4XX_PC_PRIM_VTX_CNTL_VAROUT__SHIFT 0
|
||||||
|
static inline uint32_t A4XX_PC_PRIM_VTX_CNTL_VAROUT(uint32_t val)
|
||||||
|
{
|
||||||
|
return ((val) << A4XX_PC_PRIM_VTX_CNTL_VAROUT__SHIFT) & A4XX_PC_PRIM_VTX_CNTL_VAROUT__MASK;
|
||||||
|
}
|
||||||
#define A4XX_PC_PRIM_VTX_CNTL_PROVOKING_VTX_LAST 0x02000000
|
#define A4XX_PC_PRIM_VTX_CNTL_PROVOKING_VTX_LAST 0x02000000
|
||||||
#define A4XX_PC_PRIM_VTX_CNTL_PSIZE 0x04000000
|
#define A4XX_PC_PRIM_VTX_CNTL_PSIZE 0x04000000
|
||||||
|
|
||||||
@@ -2166,6 +2188,12 @@ static inline uint32_t A4XX_TEX_SAMP_0_WRAP_R(enum a4xx_tex_clamp val)
|
|||||||
{
|
{
|
||||||
return ((val) << A4XX_TEX_SAMP_0_WRAP_R__SHIFT) & A4XX_TEX_SAMP_0_WRAP_R__MASK;
|
return ((val) << A4XX_TEX_SAMP_0_WRAP_R__SHIFT) & A4XX_TEX_SAMP_0_WRAP_R__MASK;
|
||||||
}
|
}
|
||||||
|
#define A4XX_TEX_SAMP_0_ANISO__MASK 0x0001c000
|
||||||
|
#define A4XX_TEX_SAMP_0_ANISO__SHIFT 14
|
||||||
|
static inline uint32_t A4XX_TEX_SAMP_0_ANISO(enum a4xx_tex_aniso val)
|
||||||
|
{
|
||||||
|
return ((val) << A4XX_TEX_SAMP_0_ANISO__SHIFT) & A4XX_TEX_SAMP_0_ANISO__MASK;
|
||||||
|
}
|
||||||
|
|
||||||
#define REG_A4XX_TEX_SAMP_1 0x00000001
|
#define REG_A4XX_TEX_SAMP_1 0x00000001
|
||||||
#define A4XX_TEX_SAMP_1_COMPARE_FUNC__MASK 0x0000000e
|
#define A4XX_TEX_SAMP_1_COMPARE_FUNC__MASK 0x0000000e
|
||||||
|
@@ -100,6 +100,9 @@ fixup_shader_state(struct fd_context *ctx, struct ir3_shader_key *key)
|
|||||||
if (last_key->alpha != key->alpha)
|
if (last_key->alpha != key->alpha)
|
||||||
ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
|
ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
|
||||||
|
|
||||||
|
if (last_key->rasterflat != key->rasterflat)
|
||||||
|
ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
|
||||||
|
|
||||||
fd4_ctx->last_key = *key;
|
fd4_ctx->last_key = *key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,6 +121,7 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info)
|
|||||||
.binning_pass = true,
|
.binning_pass = true,
|
||||||
.color_two_side = ctx->rasterizer ? ctx->rasterizer->light_twoside : false,
|
.color_two_side = ctx->rasterizer ? ctx->rasterizer->light_twoside : false,
|
||||||
.alpha = util_format_is_alpha(pipe_surface_format(pfb->cbufs[0])),
|
.alpha = util_format_is_alpha(pipe_surface_format(pfb->cbufs[0])),
|
||||||
|
.rasterflat = ctx->rasterizer && ctx->rasterizer->flatshade,
|
||||||
// TODO set .half_precision based on render target format,
|
// TODO set .half_precision based on render target format,
|
||||||
// ie. float16 and smaller use half, float32 use full..
|
// ie. float16 and smaller use half, float32 use full..
|
||||||
.half_precision = !!(fd_mesa_debug & FD_DBG_FRAGHALF),
|
.half_precision = !!(fd_mesa_debug & FD_DBG_FRAGHALF),
|
||||||
@@ -130,7 +134,6 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info)
|
|||||||
.fsaturate_r = fd4_ctx->fsaturate_r,
|
.fsaturate_r = fd4_ctx->fsaturate_r,
|
||||||
},
|
},
|
||||||
.format = fd4_emit_format(pfb->cbufs[0]),
|
.format = fd4_emit_format(pfb->cbufs[0]),
|
||||||
.rasterflat = ctx->rasterizer && ctx->rasterizer->flatshade,
|
|
||||||
};
|
};
|
||||||
unsigned dirty;
|
unsigned dirty;
|
||||||
|
|
||||||
|
@@ -425,13 +425,9 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
|||||||
OUT_PKT0(ring, REG_A4XX_GRAS_SU_POLY_OFFSET_SCALE, 2);
|
OUT_PKT0(ring, REG_A4XX_GRAS_SU_POLY_OFFSET_SCALE, 2);
|
||||||
OUT_RING(ring, rasterizer->gras_su_poly_offset_scale);
|
OUT_RING(ring, rasterizer->gras_su_poly_offset_scale);
|
||||||
OUT_RING(ring, rasterizer->gras_su_poly_offset_offset);
|
OUT_RING(ring, rasterizer->gras_su_poly_offset_offset);
|
||||||
}
|
|
||||||
|
|
||||||
if (dirty & (FD_DIRTY_RASTERIZER | FD_DIRTY_PROG)) {
|
|
||||||
uint32_t val = fd4_rasterizer_stateobj(ctx->rasterizer)
|
|
||||||
->gras_cl_clip_cntl;
|
|
||||||
OUT_PKT0(ring, REG_A4XX_GRAS_CL_CLIP_CNTL, 1);
|
OUT_PKT0(ring, REG_A4XX_GRAS_CL_CLIP_CNTL, 1);
|
||||||
OUT_RING(ring, val);
|
OUT_RING(ring, rasterizer->gras_cl_clip_cntl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: since primitive_restart is not actually part of any
|
/* NOTE: since primitive_restart is not actually part of any
|
||||||
@@ -444,7 +440,12 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
|||||||
->pc_prim_vtx_cntl;
|
->pc_prim_vtx_cntl;
|
||||||
|
|
||||||
val |= COND(vp->writes_psize, A4XX_PC_PRIM_VTX_CNTL_PSIZE);
|
val |= COND(vp->writes_psize, A4XX_PC_PRIM_VTX_CNTL_PSIZE);
|
||||||
val |= COND(fp->total_in > 0, A4XX_PC_PRIM_VTX_CNTL_VAROUT);
|
if (fp->total_in > 0) {
|
||||||
|
uint32_t varout = align(fp->total_in, 16) / 16;
|
||||||
|
if (varout > 1)
|
||||||
|
varout = align(varout, 2);
|
||||||
|
val |= A4XX_PC_PRIM_VTX_CNTL_VAROUT(varout);
|
||||||
|
}
|
||||||
|
|
||||||
OUT_PKT0(ring, REG_A4XX_PC_PRIM_VTX_CNTL, 2);
|
OUT_PKT0(ring, REG_A4XX_PC_PRIM_VTX_CNTL, 2);
|
||||||
OUT_RING(ring, val);
|
OUT_RING(ring, val);
|
||||||
|
@@ -55,7 +55,6 @@ struct fd4_emit {
|
|||||||
struct ir3_shader_key key;
|
struct ir3_shader_key key;
|
||||||
enum a4xx_color_fmt format;
|
enum a4xx_color_fmt format;
|
||||||
uint32_t dirty;
|
uint32_t dirty;
|
||||||
bool rasterflat;
|
|
||||||
|
|
||||||
/* cached to avoid repeated lookups of same variants: */
|
/* cached to avoid repeated lookups of same variants: */
|
||||||
struct ir3_shader_variant *vp, *fp;
|
struct ir3_shader_variant *vp, *fp;
|
||||||
|
@@ -375,7 +375,7 @@ fd4_emit_tile_mem2gmem(struct fd_context *ctx, struct fd_tile *tile)
|
|||||||
|
|
||||||
OUT_PKT0(ring, REG_A4XX_PC_PRIM_VTX_CNTL, 1);
|
OUT_PKT0(ring, REG_A4XX_PC_PRIM_VTX_CNTL, 1);
|
||||||
OUT_RING(ring, A4XX_PC_PRIM_VTX_CNTL_PROVOKING_VTX_LAST |
|
OUT_RING(ring, A4XX_PC_PRIM_VTX_CNTL_PROVOKING_VTX_LAST |
|
||||||
A4XX_PC_PRIM_VTX_CNTL_VAROUT);
|
A4XX_PC_PRIM_VTX_CNTL_VAROUT(1));
|
||||||
|
|
||||||
OUT_PKT0(ring, REG_A4XX_VFD_INDEX_OFFSET, 2);
|
OUT_PKT0(ring, REG_A4XX_VFD_INDEX_OFFSET, 2);
|
||||||
OUT_RING(ring, 0); /* VFD_INDEX_OFFSET */
|
OUT_RING(ring, 0); /* VFD_INDEX_OFFSET */
|
||||||
@@ -436,13 +436,6 @@ fd4_emit_sysmem_prep(struct fd_context *ctx)
|
|||||||
{
|
{
|
||||||
struct pipe_framebuffer_state *pfb = &ctx->framebuffer;
|
struct pipe_framebuffer_state *pfb = &ctx->framebuffer;
|
||||||
struct fd_ringbuffer *ring = ctx->ring;
|
struct fd_ringbuffer *ring = ctx->ring;
|
||||||
uint32_t pitch = 0;
|
|
||||||
|
|
||||||
if (pfb->cbufs[0]) {
|
|
||||||
struct pipe_surface *psurf = pfb->cbufs[0];
|
|
||||||
unsigned lvl = psurf->u.tex.level;
|
|
||||||
pitch = fd_resource(psurf->texture)->slices[lvl].pitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
fd4_emit_restore(ctx);
|
fd4_emit_restore(ctx);
|
||||||
|
|
||||||
|
@@ -420,8 +420,28 @@ fd4_program_emit(struct fd_ringbuffer *ring, struct fd4_emit *emit)
|
|||||||
COND(s[VS].v->writes_psize, A4XX_VPC_ATTR_PSIZE));
|
COND(s[VS].v->writes_psize, A4XX_VPC_ATTR_PSIZE));
|
||||||
OUT_RING(ring, 0x00000000);
|
OUT_RING(ring, 0x00000000);
|
||||||
} else {
|
} else {
|
||||||
uint32_t vinterp[8] = {0}, flatshade[2] = {0};
|
uint32_t vinterp[8], flatshade[2];
|
||||||
|
|
||||||
|
memset(vinterp, 0, sizeof(vinterp));
|
||||||
|
memset(flatshade, 0, sizeof(flatshade));
|
||||||
|
|
||||||
|
/* TODO: looks like we need to do int varyings in the frag
|
||||||
|
* shader on a4xx (no flatshad reg?):
|
||||||
|
*
|
||||||
|
* (sy)(ss)nop
|
||||||
|
* (sy)ldlv.u32 r0.x,l[r0.x], 1
|
||||||
|
* ldlv.u32 r0.y,l[r0.x+1], 1
|
||||||
|
* (ss)bary.f (ei)r63.x, 0, r0.x
|
||||||
|
* (ss)(rpt1)cov.s32f16 hr0.x, (r)r0.x
|
||||||
|
* (rpt5)nop
|
||||||
|
* sam (f16)(xyzw)hr0.x, hr0.x, s#0, t#0
|
||||||
|
*
|
||||||
|
* for now, don't set FLAT on vinterp[], since that
|
||||||
|
* at least works well enough for pure float impl (ie.
|
||||||
|
* pre glsl130).. we'll have to do a bit more work to
|
||||||
|
* handle this properly:
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
/* figure out VARYING_INTERP / FLAT_SHAD register values: */
|
/* figure out VARYING_INTERP / FLAT_SHAD register values: */
|
||||||
for (j = -1; (j = ir3_next_varying(s[FS].v, j)) < (int)s[FS].v->inputs_count; ) {
|
for (j = -1; (j = ir3_next_varying(s[FS].v, j)) < (int)s[FS].v->inputs_count; ) {
|
||||||
uint32_t interp = s[FS].v->inputs[j].interpolate;
|
uint32_t interp = s[FS].v->inputs[j].interpolate;
|
||||||
@@ -443,25 +463,7 @@ fd4_program_emit(struct fd_ringbuffer *ring, struct fd4_emit *emit)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/* HACK: looks like we need to do int varyings in the frag
|
|
||||||
* shader on a4xx (no flatshad reg?):
|
|
||||||
*
|
|
||||||
* (sy)(ss)nop
|
|
||||||
* (sy)ldlv.u32 r0.x,l[r0.x], 1
|
|
||||||
* ldlv.u32 r0.y,l[r0.x+1], 1
|
|
||||||
* (ss)bary.f (ei)r63.x, 0, r0.x
|
|
||||||
* (ss)(rpt1)cov.s32f16 hr0.x, (r)r0.x
|
|
||||||
* (rpt5)nop
|
|
||||||
* sam (f16)(xyzw)hr0.x, hr0.x, s#0, t#0
|
|
||||||
*
|
|
||||||
* for now, don't set FLAT on vinterp[], since that
|
|
||||||
* at least works well enough for pure float impl (ie.
|
|
||||||
* pre glsl130).. we'll have to do a bit more work to
|
|
||||||
* handle this properly:
|
|
||||||
*/
|
|
||||||
for (i = 0; i < ARRAY_SIZE(vinterp); i++)
|
|
||||||
vinterp[i] = 0;
|
|
||||||
|
|
||||||
OUT_PKT0(ring, REG_A4XX_VPC_ATTR, 2);
|
OUT_PKT0(ring, REG_A4XX_VPC_ATTR, 2);
|
||||||
OUT_RING(ring, A4XX_VPC_ATTR_TOTALATTR(s[FS].v->total_in) |
|
OUT_RING(ring, A4XX_VPC_ATTR_TOTALATTR(s[FS].v->total_in) |
|
||||||
|
@@ -68,13 +68,13 @@ tex_clamp(unsigned wrap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static enum a4xx_tex_filter
|
static enum a4xx_tex_filter
|
||||||
tex_filter(unsigned filter)
|
tex_filter(unsigned filter, bool aniso)
|
||||||
{
|
{
|
||||||
switch (filter) {
|
switch (filter) {
|
||||||
case PIPE_TEX_FILTER_NEAREST:
|
case PIPE_TEX_FILTER_NEAREST:
|
||||||
return A4XX_TEX_NEAREST;
|
return A4XX_TEX_NEAREST;
|
||||||
case PIPE_TEX_FILTER_LINEAR:
|
case PIPE_TEX_FILTER_LINEAR:
|
||||||
return A4XX_TEX_LINEAR;
|
return aniso ? A4XX_TEX_ANISO : A4XX_TEX_LINEAR;
|
||||||
default:
|
default:
|
||||||
DBG("invalid filter: %u", filter);
|
DBG("invalid filter: %u", filter);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -86,6 +86,7 @@ fd4_sampler_state_create(struct pipe_context *pctx,
|
|||||||
const struct pipe_sampler_state *cso)
|
const struct pipe_sampler_state *cso)
|
||||||
{
|
{
|
||||||
struct fd4_sampler_stateobj *so = CALLOC_STRUCT(fd4_sampler_stateobj);
|
struct fd4_sampler_stateobj *so = CALLOC_STRUCT(fd4_sampler_stateobj);
|
||||||
|
unsigned aniso = util_last_bit(MIN2(cso->max_anisotropy >> 1, 8));
|
||||||
bool miplinear = false;
|
bool miplinear = false;
|
||||||
|
|
||||||
if (!so)
|
if (!so)
|
||||||
@@ -98,8 +99,9 @@ fd4_sampler_state_create(struct pipe_context *pctx,
|
|||||||
|
|
||||||
so->texsamp0 =
|
so->texsamp0 =
|
||||||
COND(miplinear, A4XX_TEX_SAMP_0_MIPFILTER_LINEAR_NEAR) |
|
COND(miplinear, A4XX_TEX_SAMP_0_MIPFILTER_LINEAR_NEAR) |
|
||||||
A4XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter)) |
|
A4XX_TEX_SAMP_0_XY_MAG(tex_filter(cso->mag_img_filter, aniso)) |
|
||||||
A4XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter)) |
|
A4XX_TEX_SAMP_0_XY_MIN(tex_filter(cso->min_img_filter, aniso)) |
|
||||||
|
A4XX_TEX_SAMP_0_ANISO(aniso) |
|
||||||
A4XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s)) |
|
A4XX_TEX_SAMP_0_WRAP_S(tex_clamp(cso->wrap_s)) |
|
||||||
A4XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t)) |
|
A4XX_TEX_SAMP_0_WRAP_T(tex_clamp(cso->wrap_t)) |
|
||||||
A4XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r));
|
A4XX_TEX_SAMP_0_WRAP_R(tex_clamp(cso->wrap_r));
|
||||||
|
@@ -13,8 +13,8 @@ The rules-ng-ng source files this header was generated from are:
|
|||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64344 bytes, from 2014-12-12 20:22:26)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64771 bytes, from 2015-03-15 21:55:57)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51270 bytes, from 2015-01-18 23:05:48)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51942 bytes, from 2015-02-24 17:14:02)
|
||||||
|
|
||||||
Copyright (C) 2013-2014 by the following authors:
|
Copyright (C) 2013-2014 by the following authors:
|
||||||
- Rob Clark <robdclark@gmail.com> (robclark)
|
- Rob Clark <robdclark@gmail.com> (robclark)
|
||||||
|
@@ -13,8 +13,8 @@ The rules-ng-ng source files this header was generated from are:
|
|||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml ( 32901 bytes, from 2014-06-02 15:21:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml ( 10551 bytes, from 2014-11-13 22:44:30)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml ( 15085 bytes, from 2014-12-20 21:49:41)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64344 bytes, from 2014-12-12 20:22:26)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml ( 64771 bytes, from 2015-03-15 21:55:57)
|
||||||
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51270 bytes, from 2015-01-18 23:05:48)
|
- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml ( 51942 bytes, from 2015-02-24 17:14:02)
|
||||||
|
|
||||||
Copyright (C) 2013-2014 by the following authors:
|
Copyright (C) 2013-2014 by the following authors:
|
||||||
- Rob Clark <robdclark@gmail.com> (robclark)
|
- Rob Clark <robdclark@gmail.com> (robclark)
|
||||||
|
@@ -293,7 +293,7 @@ struct fd_context {
|
|||||||
*/
|
*/
|
||||||
struct fd_gmem_stateobj gmem;
|
struct fd_gmem_stateobj gmem;
|
||||||
struct fd_vsc_pipe pipe[8];
|
struct fd_vsc_pipe pipe[8];
|
||||||
struct fd_tile tile[64];
|
struct fd_tile tile[256];
|
||||||
|
|
||||||
/* which state objects need to be re-emit'd: */
|
/* which state objects need to be re-emit'd: */
|
||||||
enum {
|
enum {
|
||||||
|
@@ -91,6 +91,7 @@ calculate_tiles(struct fd_context *ctx)
|
|||||||
uint32_t i, j, t, xoff, yoff;
|
uint32_t i, j, t, xoff, yoff;
|
||||||
uint32_t tpp_x, tpp_y;
|
uint32_t tpp_x, tpp_y;
|
||||||
bool has_zs = !!(ctx->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL));
|
bool has_zs = !!(ctx->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL));
|
||||||
|
int tile_n[ARRAY_SIZE(ctx->pipe)];
|
||||||
|
|
||||||
if (pfb->cbufs[0])
|
if (pfb->cbufs[0])
|
||||||
cpp = util_format_get_blocksize(pfb->cbufs[0]->format);
|
cpp = util_format_get_blocksize(pfb->cbufs[0]->format);
|
||||||
@@ -213,6 +214,7 @@ calculate_tiles(struct fd_context *ctx)
|
|||||||
/* configure tiles: */
|
/* configure tiles: */
|
||||||
t = 0;
|
t = 0;
|
||||||
yoff = miny;
|
yoff = miny;
|
||||||
|
memset(tile_n, 0, sizeof(tile_n));
|
||||||
for (i = 0; i < nbins_y; i++) {
|
for (i = 0; i < nbins_y; i++) {
|
||||||
uint32_t bw, bh;
|
uint32_t bw, bh;
|
||||||
|
|
||||||
@@ -223,20 +225,17 @@ calculate_tiles(struct fd_context *ctx)
|
|||||||
|
|
||||||
for (j = 0; j < nbins_x; j++) {
|
for (j = 0; j < nbins_x; j++) {
|
||||||
struct fd_tile *tile = &ctx->tile[t];
|
struct fd_tile *tile = &ctx->tile[t];
|
||||||
uint32_t n, p;
|
uint32_t p;
|
||||||
|
|
||||||
assert(t < ARRAY_SIZE(ctx->tile));
|
assert(t < ARRAY_SIZE(ctx->tile));
|
||||||
|
|
||||||
/* pipe number: */
|
/* pipe number: */
|
||||||
p = ((i / tpp_y) * div_round_up(nbins_x, tpp_x)) + (j / tpp_x);
|
p = ((i / tpp_y) * div_round_up(nbins_x, tpp_x)) + (j / tpp_x);
|
||||||
|
|
||||||
/* slot number: */
|
|
||||||
n = ((i % tpp_y) * tpp_x) + (j % tpp_x);
|
|
||||||
|
|
||||||
/* clip bin width: */
|
/* clip bin width: */
|
||||||
bw = MIN2(bin_w, minx + width - xoff);
|
bw = MIN2(bin_w, minx + width - xoff);
|
||||||
|
|
||||||
tile->n = n;
|
tile->n = tile_n[p]++;
|
||||||
tile->p = p;
|
tile->p = p;
|
||||||
tile->bin_w = bw;
|
tile->bin_w = bw;
|
||||||
tile->bin_h = bh;
|
tile->bin_h = bh;
|
||||||
|
@@ -213,9 +213,22 @@ setup_slices(struct fd_resource *rsc, uint32_t alignment)
|
|||||||
for (level = 0; level <= prsc->last_level; level++) {
|
for (level = 0; level <= prsc->last_level; level++) {
|
||||||
struct fd_resource_slice *slice = fd_resource_slice(rsc, level);
|
struct fd_resource_slice *slice = fd_resource_slice(rsc, level);
|
||||||
|
|
||||||
slice->pitch = align(width, 32);
|
slice->pitch = width = align(width, 32);
|
||||||
slice->offset = size;
|
slice->offset = size;
|
||||||
slice->size0 = align(slice->pitch * height * rsc->cpp, alignment);
|
/* 1d array and 2d array textures must all have the same layer size
|
||||||
|
* for each miplevel on a3xx. 3d textures can have different layer
|
||||||
|
* sizes for high levels, but the hw auto-sizer is buggy (or at least
|
||||||
|
* different than what this code does), so as soon as the layer size
|
||||||
|
* range gets into range, we stop reducing it.
|
||||||
|
*/
|
||||||
|
if (prsc->target == PIPE_TEXTURE_3D && (
|
||||||
|
level == 1 ||
|
||||||
|
(level > 1 && rsc->slices[level - 1].size0 > 0xf000)))
|
||||||
|
slice->size0 = align(slice->pitch * height * rsc->cpp, alignment);
|
||||||
|
else if (level == 0 || rsc->layer_first || alignment == 1)
|
||||||
|
slice->size0 = align(slice->pitch * height * rsc->cpp, alignment);
|
||||||
|
else
|
||||||
|
slice->size0 = rsc->slices[level - 1].size0;
|
||||||
|
|
||||||
size += slice->size0 * depth * layers_in_level;
|
size += slice->size0 * depth * layers_in_level;
|
||||||
|
|
||||||
|
@@ -314,7 +314,7 @@ fd_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
|
|||||||
case PIPE_CAPF_MAX_LINE_WIDTH_AA:
|
case PIPE_CAPF_MAX_LINE_WIDTH_AA:
|
||||||
case PIPE_CAPF_MAX_POINT_WIDTH:
|
case PIPE_CAPF_MAX_POINT_WIDTH:
|
||||||
case PIPE_CAPF_MAX_POINT_WIDTH_AA:
|
case PIPE_CAPF_MAX_POINT_WIDTH_AA:
|
||||||
return 8192.0f;
|
return 4092.0f;
|
||||||
case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
|
case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
|
||||||
return 16.0f;
|
return 16.0f;
|
||||||
case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
|
case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
|
||||||
@@ -531,6 +531,7 @@ fd_screen_create(struct fd_device *dev)
|
|||||||
case 220:
|
case 220:
|
||||||
fd2_screen_init(pscreen);
|
fd2_screen_init(pscreen);
|
||||||
break;
|
break;
|
||||||
|
case 307:
|
||||||
case 320:
|
case 320:
|
||||||
case 330:
|
case 330:
|
||||||
fd3_screen_init(pscreen);
|
fd3_screen_init(pscreen);
|
||||||
|
@@ -123,12 +123,12 @@ fd_set_framebuffer_state(struct pipe_context *pctx,
|
|||||||
|
|
||||||
fd_context_render(pctx);
|
fd_context_render(pctx);
|
||||||
|
|
||||||
util_copy_framebuffer_state(cso, framebuffer);
|
|
||||||
|
|
||||||
if ((cso->width != framebuffer->width) ||
|
if ((cso->width != framebuffer->width) ||
|
||||||
(cso->height != framebuffer->height))
|
(cso->height != framebuffer->height))
|
||||||
ctx->needs_rb_fbd = true;
|
ctx->needs_rb_fbd = true;
|
||||||
|
|
||||||
|
util_copy_framebuffer_state(cso, framebuffer);
|
||||||
|
|
||||||
ctx->dirty |= FD_DIRTY_FRAMEBUFFER;
|
ctx->dirty |= FD_DIRTY_FRAMEBUFFER;
|
||||||
|
|
||||||
ctx->disabled_scissor.minx = 0;
|
ctx->disabled_scissor.minx = 0;
|
||||||
|
@@ -448,117 +448,114 @@ static void print_instr_cat5(instr_t *instr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t u2i(uint32_t val, int nbits)
|
|
||||||
{
|
|
||||||
return ((val >> (nbits-1)) * ~((1 << nbits) - 1)) | val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_instr_cat6(instr_t *instr)
|
static void print_instr_cat6(instr_t *instr)
|
||||||
{
|
{
|
||||||
instr_cat6_t *cat6 = &instr->cat6;
|
instr_cat6_t *cat6 = &instr->cat6;
|
||||||
|
char sd = 0, ss = 0; /* dst/src address space */
|
||||||
|
bool full = type_size(cat6->type) == 32;
|
||||||
|
bool nodst = false;
|
||||||
|
|
||||||
printf(".%s ", type[cat6->type]);
|
printf(".%s ", type[cat6->type]);
|
||||||
|
|
||||||
switch (cat6->opc) {
|
switch (cat6->opc) {
|
||||||
|
case OPC_STG:
|
||||||
|
sd = 'g';
|
||||||
|
break;
|
||||||
|
case OPC_STP:
|
||||||
|
sd = 'p';
|
||||||
|
break;
|
||||||
|
case OPC_STL:
|
||||||
|
case OPC_STLW:
|
||||||
|
sd = 'l';
|
||||||
|
break;
|
||||||
|
|
||||||
case OPC_LDG:
|
case OPC_LDG:
|
||||||
|
ss = 'g';
|
||||||
|
break;
|
||||||
case OPC_LDP:
|
case OPC_LDP:
|
||||||
|
ss = 'p';
|
||||||
|
break;
|
||||||
case OPC_LDL:
|
case OPC_LDL:
|
||||||
case OPC_LDLW:
|
case OPC_LDLW:
|
||||||
case OPC_LDLV:
|
case OPC_LDLV:
|
||||||
/* load instructions: */
|
ss = 'l';
|
||||||
print_reg_dst((reg_t)(cat6->a.dst), type_size(cat6->type) == 32, false);
|
|
||||||
printf(",");
|
|
||||||
switch (cat6->opc) {
|
|
||||||
case OPC_LDG:
|
|
||||||
printf("g");
|
|
||||||
break;
|
|
||||||
case OPC_LDP:
|
|
||||||
printf("p");
|
|
||||||
break;
|
|
||||||
case OPC_LDL:
|
|
||||||
case OPC_LDLW:
|
|
||||||
case OPC_LDLV:
|
|
||||||
printf("l");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("[");
|
|
||||||
print_reg_src((reg_t)(cat6->a.src), true,
|
|
||||||
false, false, false, false, false, false);
|
|
||||||
if (cat6->a.off)
|
|
||||||
printf("%+d", cat6->a.off);
|
|
||||||
printf("]");
|
|
||||||
break;
|
break;
|
||||||
case OPC_PREFETCH:
|
|
||||||
/* similar to load instructions: */
|
|
||||||
printf("g[");
|
|
||||||
print_reg_src((reg_t)(cat6->a.src), true,
|
|
||||||
false, false, false, false, false, false);
|
|
||||||
if (cat6->a.off)
|
|
||||||
printf("%+d", cat6->a.off);
|
|
||||||
printf("]");
|
|
||||||
break;
|
|
||||||
case OPC_STG:
|
|
||||||
case OPC_STP:
|
|
||||||
case OPC_STL:
|
|
||||||
case OPC_STLW:
|
|
||||||
/* store instructions: */
|
|
||||||
switch (cat6->opc) {
|
|
||||||
case OPC_STG:
|
|
||||||
printf("g");
|
|
||||||
break;
|
|
||||||
case OPC_STP:
|
|
||||||
printf("p");
|
|
||||||
break;
|
|
||||||
case OPC_STL:
|
|
||||||
case OPC_STLW:
|
|
||||||
printf("l");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("[");
|
|
||||||
print_reg_dst((reg_t)(cat6->b.dst), true, false);
|
|
||||||
if (cat6->b.off || cat6->b.off_hi)
|
|
||||||
printf("%+d", u2i((cat6->b.off_hi << 8) | cat6->b.off, 13));
|
|
||||||
printf("]");
|
|
||||||
printf(",");
|
|
||||||
print_reg_src((reg_t)(cat6->b.src), type_size(cat6->type) == 32,
|
|
||||||
false, false, false, false, false, false);
|
|
||||||
|
|
||||||
|
case OPC_L2G:
|
||||||
|
ss = 'l';
|
||||||
|
sd = 'g';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPC_G2L:
|
||||||
|
ss = 'g';
|
||||||
|
sd = 'l';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPC_PREFETCH:
|
||||||
|
ss = 'g';
|
||||||
|
nodst = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case OPC_STI:
|
case OPC_STI:
|
||||||
/* sti has same encoding as other store instructions, but
|
full = false; // XXX or inverts??
|
||||||
* slightly different syntax:
|
|
||||||
*/
|
|
||||||
print_reg_dst((reg_t)(cat6->b.dst), false /* XXX is it always half? */, false);
|
|
||||||
if (cat6->b.off || cat6->b.off_hi)
|
|
||||||
printf("%+d", u2i((cat6->b.off_hi << 8) | cat6->b.off, 13));
|
|
||||||
printf(",");
|
|
||||||
print_reg_src((reg_t)(cat6->b.src), type_size(cat6->type) == 32,
|
|
||||||
false, false, false, false, false, false);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(", %d", cat6->iim_val);
|
if (cat6->has_off) {
|
||||||
|
if (!nodst) {
|
||||||
|
if (sd)
|
||||||
|
printf("%c[", sd);
|
||||||
|
print_reg_dst((reg_t)(cat6->a.dst), full, false);
|
||||||
|
if (sd)
|
||||||
|
printf("]");
|
||||||
|
printf(", ");
|
||||||
|
}
|
||||||
|
if (ss)
|
||||||
|
printf("%c[", ss);
|
||||||
|
print_reg_src((reg_t)(cat6->a.src1), true,
|
||||||
|
false, false, cat6->a.src1_im, false, false, false);
|
||||||
|
printf("%+d", cat6->a.off);
|
||||||
|
if (ss)
|
||||||
|
printf("]");
|
||||||
|
printf(", ");
|
||||||
|
print_reg_src((reg_t)(cat6->a.src2), full,
|
||||||
|
false, false, cat6->a.src2_im, false, false, false);
|
||||||
|
} else {
|
||||||
|
if (!nodst) {
|
||||||
|
if (sd)
|
||||||
|
printf("%c[", sd);
|
||||||
|
print_reg_dst((reg_t)(cat6->b.dst), full, false);
|
||||||
|
if (sd)
|
||||||
|
printf("]");
|
||||||
|
printf(", ");
|
||||||
|
}
|
||||||
|
if (ss)
|
||||||
|
printf("%c[", ss);
|
||||||
|
print_reg_src((reg_t)(cat6->b.src1), true,
|
||||||
|
false, false, cat6->b.src1_im, false, false, false);
|
||||||
|
if (ss)
|
||||||
|
printf("]");
|
||||||
|
printf(", ");
|
||||||
|
print_reg_src((reg_t)(cat6->b.src2), full,
|
||||||
|
false, false, cat6->b.src2_im, false, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (debug & PRINT_VERBOSE) {
|
if (debug & PRINT_VERBOSE) {
|
||||||
switch (cat6->opc) {
|
switch (cat6->opc) {
|
||||||
case OPC_LDG:
|
case OPC_LDG:
|
||||||
case OPC_LDP:
|
case OPC_LDP:
|
||||||
/* load instructions: */
|
/* load instructions: */
|
||||||
if (cat6->a.dummy1|cat6->a.dummy2|cat6->a.dummy3)
|
if (cat6->a.dummy2|cat6->a.dummy3)
|
||||||
printf("\t{6: %x,%x,%x}", cat6->a.dummy1, cat6->a.dummy2, cat6->a.dummy3);
|
printf("\t{6: %x,%x}", cat6->a.dummy2, cat6->a.dummy3);
|
||||||
if ((cat6->a.must_be_one1 != 1) || (cat6->a.must_be_one2 != 1))
|
|
||||||
printf("{?? %d,%d ??}", cat6->a.must_be_one1, cat6->a.must_be_one2);
|
|
||||||
break;
|
break;
|
||||||
case OPC_STG:
|
case OPC_STG:
|
||||||
case OPC_STP:
|
case OPC_STP:
|
||||||
case OPC_STI:
|
case OPC_STI:
|
||||||
/* store instructions: */
|
/* store instructions: */
|
||||||
if (cat6->b.dummy1|cat6->b.dummy2)
|
if (cat6->b.dummy2|cat6->b.dummy2)
|
||||||
printf("\t{6: %x,%x}", cat6->b.dummy1, cat6->b.dummy2);
|
printf("\t{6: %x,%x}", cat6->b.dummy2, cat6->b.dummy3);
|
||||||
if ((cat6->b.must_be_one1 != 1) || (cat6->b.must_be_one2 != 1) ||
|
if (cat6->b.ignore0)
|
||||||
(cat6->b.must_be_zero1 != 0))
|
printf("\t{?? %x}", cat6->b.ignore0);
|
||||||
printf("{?? %d,%d,%d ??}", cat6->b.must_be_one1, cat6->b.must_be_one2,
|
|
||||||
cat6->b.must_be_zero1);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -572,15 +572,15 @@ typedef struct PACKED {
|
|||||||
uint32_t opc_cat : 3;
|
uint32_t opc_cat : 3;
|
||||||
} instr_cat5_t;
|
} instr_cat5_t;
|
||||||
|
|
||||||
/* used for load instructions: */
|
/* [src1 + off], src2: */
|
||||||
typedef struct PACKED {
|
typedef struct PACKED {
|
||||||
/* dword0: */
|
/* dword0: */
|
||||||
uint32_t must_be_one1 : 1;
|
uint32_t mustbe1 : 1;
|
||||||
int16_t off : 13;
|
int32_t off : 13;
|
||||||
uint32_t src : 8;
|
uint32_t src1 : 8;
|
||||||
uint32_t dummy1 : 1;
|
uint32_t src1_im : 1;
|
||||||
uint32_t must_be_one2 : 1;
|
uint32_t src2_im : 1;
|
||||||
int32_t iim_val : 8;
|
uint32_t src2 : 8;
|
||||||
|
|
||||||
/* dword1: */
|
/* dword1: */
|
||||||
uint32_t dst : 8;
|
uint32_t dst : 8;
|
||||||
@@ -593,35 +593,38 @@ typedef struct PACKED {
|
|||||||
uint32_t opc_cat : 3;
|
uint32_t opc_cat : 3;
|
||||||
} instr_cat6a_t;
|
} instr_cat6a_t;
|
||||||
|
|
||||||
/* used for store instructions: */
|
/* [src1], src2: */
|
||||||
typedef struct PACKED {
|
typedef struct PACKED {
|
||||||
/* dword0: */
|
/* dword0: */
|
||||||
uint32_t must_be_zero1 : 1;
|
uint32_t mustbe0 : 1;
|
||||||
uint32_t src : 8;
|
uint32_t src1 : 8;
|
||||||
uint32_t off_hi : 5; /* high bits of 'off'... ugly! */
|
uint32_t ignore0 : 13;
|
||||||
uint32_t dummy1 : 9;
|
uint32_t src1_im : 1;
|
||||||
uint32_t must_be_one1 : 1;
|
uint32_t src2_im : 1;
|
||||||
int32_t iim_val : 8;
|
uint32_t src2 : 8;
|
||||||
|
|
||||||
/* dword1: */
|
/* dword1: */
|
||||||
uint16_t off : 8;
|
|
||||||
uint32_t must_be_one2 : 1;
|
|
||||||
uint32_t dst : 8;
|
uint32_t dst : 8;
|
||||||
|
uint32_t dummy2 : 9;
|
||||||
uint32_t type : 3;
|
uint32_t type : 3;
|
||||||
uint32_t dummy2 : 2;
|
uint32_t dummy3 : 2;
|
||||||
uint32_t opc : 5;
|
uint32_t opc : 5;
|
||||||
uint32_t jmp_tgt : 1;
|
uint32_t jmp_tgt : 1;
|
||||||
uint32_t sync : 1;
|
uint32_t sync : 1;
|
||||||
uint32_t opc_cat : 3;
|
uint32_t opc_cat : 3;
|
||||||
} instr_cat6b_t;
|
} instr_cat6b_t;
|
||||||
|
|
||||||
|
/* I think some of the other cat6 instructions use additional
|
||||||
|
* sub-encodings..
|
||||||
|
*/
|
||||||
|
|
||||||
typedef union PACKED {
|
typedef union PACKED {
|
||||||
instr_cat6a_t a;
|
instr_cat6a_t a;
|
||||||
instr_cat6b_t b;
|
instr_cat6b_t b;
|
||||||
struct PACKED {
|
struct PACKED {
|
||||||
/* dword0: */
|
/* dword0: */
|
||||||
uint32_t pad1 : 24;
|
uint32_t has_off : 1;
|
||||||
int32_t iim_val : 8;
|
uint32_t pad1 : 31;
|
||||||
|
|
||||||
/* dword1: */
|
/* dword1: */
|
||||||
uint32_t pad2 : 17;
|
uint32_t pad2 : 17;
|
||||||
|
@@ -113,6 +113,8 @@ static uint32_t reg(struct ir3_register *reg, struct ir3_info *info,
|
|||||||
|
|
||||||
if (reg->flags & IR3_REG_CONST) {
|
if (reg->flags & IR3_REG_CONST) {
|
||||||
info->max_const = MAX2(info->max_const, max);
|
info->max_const = MAX2(info->max_const, max);
|
||||||
|
} else if (val.num == 63) {
|
||||||
|
/* ignore writes to dummy register r63.x */
|
||||||
} else if ((max != REG_A0) && (max != REG_P0)) {
|
} else if ((max != REG_A0) && (max != REG_P0)) {
|
||||||
if (reg->flags & IR3_REG_HALF) {
|
if (reg->flags & IR3_REG_HALF) {
|
||||||
info->max_half_reg = MAX2(info->max_half_reg, max);
|
info->max_half_reg = MAX2(info->max_half_reg, max);
|
||||||
@@ -474,58 +476,40 @@ static int emit_cat5(struct ir3_instruction *instr, void *ptr,
|
|||||||
static int emit_cat6(struct ir3_instruction *instr, void *ptr,
|
static int emit_cat6(struct ir3_instruction *instr, void *ptr,
|
||||||
struct ir3_info *info)
|
struct ir3_info *info)
|
||||||
{
|
{
|
||||||
struct ir3_register *dst = instr->regs[0];
|
struct ir3_register *dst = instr->regs[0];
|
||||||
struct ir3_register *src = instr->regs[1];
|
struct ir3_register *src1 = instr->regs[1];
|
||||||
|
struct ir3_register *src2 = (instr->regs_count >= 3) ? instr->regs[2] : NULL;
|
||||||
instr_cat6_t *cat6 = ptr;
|
instr_cat6_t *cat6 = ptr;
|
||||||
|
|
||||||
iassert(instr->regs_count == 2);
|
iassert(instr->regs_count >= 2);
|
||||||
|
|
||||||
switch (instr->opc) {
|
if (instr->cat6.offset) {
|
||||||
/* load instructions: */
|
|
||||||
case OPC_LDG:
|
|
||||||
case OPC_LDP:
|
|
||||||
case OPC_LDL:
|
|
||||||
case OPC_LDLW:
|
|
||||||
case OPC_LDLV:
|
|
||||||
case OPC_PREFETCH: {
|
|
||||||
instr_cat6a_t *cat6a = ptr;
|
instr_cat6a_t *cat6a = ptr;
|
||||||
|
|
||||||
iassert(!((dst->flags ^ type_flags(instr->cat6.type)) & IR3_REG_HALF));
|
cat6->has_off = true;
|
||||||
|
|
||||||
cat6a->must_be_one1 = 1;
|
|
||||||
cat6a->must_be_one2 = 1;
|
|
||||||
cat6a->off = instr->cat6.offset;
|
|
||||||
cat6a->src = reg(src, info, instr->repeat, 0);
|
|
||||||
cat6a->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF);
|
cat6a->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF);
|
||||||
break;
|
cat6a->src1 = reg(src1, info, instr->repeat, IR3_REG_IMMED);
|
||||||
}
|
cat6a->src1_im = !!(src1->flags & IR3_REG_IMMED);
|
||||||
/* store instructions: */
|
if (src2) {
|
||||||
case OPC_STG:
|
cat6a->src2 = reg(src2, info, instr->repeat, IR3_REG_IMMED);
|
||||||
case OPC_STP:
|
cat6a->src2_im = !!(src2->flags & IR3_REG_IMMED);
|
||||||
case OPC_STL:
|
}
|
||||||
case OPC_STLW:
|
cat6a->off = instr->cat6.offset;
|
||||||
case OPC_STI: {
|
} else {
|
||||||
instr_cat6b_t *cat6b = ptr;
|
instr_cat6b_t *cat6b = ptr;
|
||||||
uint32_t src_flags = type_flags(instr->cat6.type);
|
|
||||||
uint32_t dst_flags = (instr->opc == OPC_STI) ? IR3_REG_HALF : 0;
|
|
||||||
|
|
||||||
iassert(!((src->flags ^ src_flags) & IR3_REG_HALF));
|
cat6->has_off = false;
|
||||||
|
|
||||||
cat6b->must_be_one1 = 1;
|
cat6b->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF);
|
||||||
cat6b->must_be_one2 = 1;
|
cat6b->src1 = reg(src1, info, instr->repeat, IR3_REG_IMMED);
|
||||||
cat6b->src = reg(src, info, instr->repeat, src_flags);
|
cat6b->src1_im = !!(src1->flags & IR3_REG_IMMED);
|
||||||
cat6b->off_hi = instr->cat6.offset >> 8;
|
if (src2) {
|
||||||
cat6b->off = instr->cat6.offset;
|
cat6b->src2 = reg(src2, info, instr->repeat, IR3_REG_IMMED);
|
||||||
cat6b->dst = reg(dst, info, instr->repeat, IR3_REG_R | dst_flags);
|
cat6b->src2_im = !!(src2->flags & IR3_REG_IMMED);
|
||||||
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
// TODO
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cat6->iim_val = instr->cat6.iim_val;
|
|
||||||
cat6->type = instr->cat6.type;
|
cat6->type = instr->cat6.type;
|
||||||
cat6->opc = instr->opc;
|
cat6->opc = instr->opc;
|
||||||
cat6->jmp_tgt = !!(instr->flags & IR3_INSTR_JP);
|
cat6->jmp_tgt = !!(instr->flags & IR3_INSTR_JP);
|
||||||
|
@@ -420,8 +420,19 @@ static inline bool is_tex(struct ir3_instruction *instr)
|
|||||||
return (instr->category == 5);
|
return (instr->category == 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool is_mem(struct ir3_instruction *instr)
|
||||||
|
{
|
||||||
|
return (instr->category == 6);
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool is_input(struct ir3_instruction *instr)
|
static inline bool is_input(struct ir3_instruction *instr)
|
||||||
{
|
{
|
||||||
|
/* in some cases, ldlv is used to fetch varying without
|
||||||
|
* interpolation.. fortunately inloc is the first src
|
||||||
|
* register in either case
|
||||||
|
*/
|
||||||
|
if (is_mem(instr) && (instr->opc == OPC_LDLV))
|
||||||
|
return true;
|
||||||
return (instr->category == 2) && (instr->opc == OPC_BARY_F);
|
return (instr->category == 2) && (instr->opc == OPC_BARY_F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -102,6 +102,11 @@ struct ir3_compile_context {
|
|||||||
/* for calculating input/output positions/linkages: */
|
/* for calculating input/output positions/linkages: */
|
||||||
unsigned next_inloc;
|
unsigned next_inloc;
|
||||||
|
|
||||||
|
/* a4xx (at least patchlevel 0) cannot seem to flat-interpolate
|
||||||
|
* so we need to use ldlv.u32 to load the varying directly:
|
||||||
|
*/
|
||||||
|
bool flat_bypass;
|
||||||
|
|
||||||
unsigned num_internal_temps;
|
unsigned num_internal_temps;
|
||||||
struct tgsi_src_register internal_temps[8];
|
struct tgsi_src_register internal_temps[8];
|
||||||
|
|
||||||
@@ -198,9 +203,13 @@ compile_init(struct ir3_compile_context *ctx, struct ir3_shader_variant *so,
|
|||||||
} else if (ir3_shader_gpuid(so->shader) >= 400) {
|
} else if (ir3_shader_gpuid(so->shader) >= 400) {
|
||||||
/* a4xx seems to have *no* sam.p */
|
/* a4xx seems to have *no* sam.p */
|
||||||
lconfig.lower_TXP = ~0; /* lower all txp */
|
lconfig.lower_TXP = ~0; /* lower all txp */
|
||||||
|
/* need special handling for "flat" */
|
||||||
|
ctx->flat_bypass = true;
|
||||||
} else {
|
} else {
|
||||||
/* a3xx just needs to avoid sam.p for 3d tex */
|
/* a3xx just needs to avoid sam.p for 3d tex */
|
||||||
lconfig.lower_TXP = (1 << TGSI_TEXTURE_3D);
|
lconfig.lower_TXP = (1 << TGSI_TEXTURE_3D);
|
||||||
|
/* no special handling for "flat" */
|
||||||
|
ctx->flat_bypass = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->tokens = tgsi_transform_lowering(&lconfig, tokens, &ctx->info);
|
ctx->tokens = tgsi_transform_lowering(&lconfig, tokens, &ctx->info);
|
||||||
@@ -1537,6 +1546,7 @@ trans_txq(const struct instr_translater *t,
|
|||||||
struct tgsi_dst_register *dst = &inst->Dst[0].Register;
|
struct tgsi_dst_register *dst = &inst->Dst[0].Register;
|
||||||
struct tgsi_src_register *level = &inst->Src[0].Register;
|
struct tgsi_src_register *level = &inst->Src[0].Register;
|
||||||
struct tgsi_src_register *samp = &inst->Src[1].Register;
|
struct tgsi_src_register *samp = &inst->Src[1].Register;
|
||||||
|
const struct target_info *tgt = &tex_targets[inst->Texture.Texture];
|
||||||
struct tex_info tinf;
|
struct tex_info tinf;
|
||||||
|
|
||||||
memset(&tinf, 0, sizeof(tinf));
|
memset(&tinf, 0, sizeof(tinf));
|
||||||
@@ -1550,8 +1560,67 @@ trans_txq(const struct instr_translater *t,
|
|||||||
instr->cat5.tex = samp->Index;
|
instr->cat5.tex = samp->Index;
|
||||||
instr->flags |= tinf.flags;
|
instr->flags |= tinf.flags;
|
||||||
|
|
||||||
add_dst_reg_wrmask(ctx, instr, dst, 0, dst->WriteMask);
|
if (tgt->array && (dst->WriteMask & (1 << tgt->dims))) {
|
||||||
add_src_reg_wrmask(ctx, instr, level, level->SwizzleX, 0x1);
|
/* Array size actually ends up in .w rather than .z. This doesn't
|
||||||
|
* matter for miplevel 0, but for higher mips the value in z is
|
||||||
|
* minified whereas w stays. Also, the value in TEX_CONST_3_DEPTH is
|
||||||
|
* returned, which means that we have to add 1 to it for arrays.
|
||||||
|
*/
|
||||||
|
struct tgsi_dst_register tmp_dst;
|
||||||
|
struct tgsi_src_register *tmp_src;
|
||||||
|
type_t type_mov = get_utype(ctx);
|
||||||
|
|
||||||
|
tmp_src = get_internal_temp(ctx, &tmp_dst);
|
||||||
|
add_dst_reg_wrmask(ctx, instr, &tmp_dst, 0,
|
||||||
|
dst->WriteMask | TGSI_WRITEMASK_W);
|
||||||
|
add_src_reg_wrmask(ctx, instr, level, level->SwizzleX, 0x1);
|
||||||
|
|
||||||
|
if (dst->WriteMask & TGSI_WRITEMASK_X) {
|
||||||
|
instr = instr_create(ctx, 1, 0);
|
||||||
|
instr->cat1.src_type = type_mov;
|
||||||
|
instr->cat1.dst_type = type_mov;
|
||||||
|
add_dst_reg(ctx, instr, dst, 0);
|
||||||
|
add_src_reg(ctx, instr, tmp_src, src_swiz(tmp_src, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tgt->dims == 2) {
|
||||||
|
if (dst->WriteMask & TGSI_WRITEMASK_Y) {
|
||||||
|
instr = instr_create(ctx, 1, 0);
|
||||||
|
instr->cat1.src_type = type_mov;
|
||||||
|
instr->cat1.dst_type = type_mov;
|
||||||
|
add_dst_reg(ctx, instr, dst, 1);
|
||||||
|
add_src_reg(ctx, instr, tmp_src, src_swiz(tmp_src, 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
instr = instr_create(ctx, 2, OPC_ADD_U);
|
||||||
|
add_dst_reg(ctx, instr, dst, tgt->dims);
|
||||||
|
add_src_reg(ctx, instr, tmp_src, src_swiz(tmp_src, 3));
|
||||||
|
ir3_reg_create(instr, 0, IR3_REG_IMMED)->iim_val = 1;
|
||||||
|
} else {
|
||||||
|
add_dst_reg_wrmask(ctx, instr, dst, 0, dst->WriteMask);
|
||||||
|
add_src_reg_wrmask(ctx, instr, level, level->SwizzleX, 0x1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dst->WriteMask & TGSI_WRITEMASK_W) {
|
||||||
|
/* The # of levels comes from getinfo.z. We need to add 1 to it, since
|
||||||
|
* the value in TEX_CONST_0 is zero-based.
|
||||||
|
*/
|
||||||
|
struct tgsi_dst_register tmp_dst;
|
||||||
|
struct tgsi_src_register *tmp_src;
|
||||||
|
|
||||||
|
tmp_src = get_internal_temp(ctx, &tmp_dst);
|
||||||
|
instr = instr_create(ctx, 5, OPC_GETINFO);
|
||||||
|
instr->cat5.type = get_utype(ctx);
|
||||||
|
instr->cat5.samp = samp->Index;
|
||||||
|
instr->cat5.tex = samp->Index;
|
||||||
|
add_dst_reg_wrmask(ctx, instr, &tmp_dst, 0, TGSI_WRITEMASK_Z);
|
||||||
|
|
||||||
|
instr = instr_create(ctx, 2, OPC_ADD_U);
|
||||||
|
add_dst_reg(ctx, instr, dst, 3);
|
||||||
|
add_src_reg(ctx, instr, tmp_src, src_swiz(tmp_src, 2));
|
||||||
|
ir3_reg_create(instr, 0, IR3_REG_IMMED)->iim_val = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DDX/DDY */
|
/* DDX/DDY */
|
||||||
@@ -2718,11 +2787,23 @@ decl_semantic(const struct tgsi_declaration_semantic *sem)
|
|||||||
|
|
||||||
static struct ir3_instruction *
|
static struct ir3_instruction *
|
||||||
decl_in_frag_bary(struct ir3_compile_context *ctx, unsigned regid,
|
decl_in_frag_bary(struct ir3_compile_context *ctx, unsigned regid,
|
||||||
unsigned j, unsigned inloc)
|
unsigned j, unsigned inloc, bool use_ldlv)
|
||||||
{
|
{
|
||||||
struct ir3_instruction *instr;
|
struct ir3_instruction *instr;
|
||||||
struct ir3_register *src;
|
struct ir3_register *src;
|
||||||
|
|
||||||
|
if (use_ldlv) {
|
||||||
|
/* ldlv.u32 dst, l[#inloc], 1 */
|
||||||
|
instr = instr_create(ctx, 6, OPC_LDLV);
|
||||||
|
instr->cat6.type = TYPE_U32;
|
||||||
|
instr->cat6.iim_val = 1;
|
||||||
|
ir3_reg_create(instr, regid, 0); /* dummy dst */
|
||||||
|
ir3_reg_create(instr, 0, IR3_REG_IMMED)->iim_val = inloc;
|
||||||
|
ir3_reg_create(instr, 0, IR3_REG_IMMED)->iim_val = 1;
|
||||||
|
|
||||||
|
return instr;
|
||||||
|
}
|
||||||
|
|
||||||
/* bary.f dst, #inloc, r0.x */
|
/* bary.f dst, #inloc, r0.x */
|
||||||
instr = instr_create(ctx, 2, OPC_BARY_F);
|
instr = instr_create(ctx, 2, OPC_BARY_F);
|
||||||
ir3_reg_create(instr, regid, 0); /* dummy dst */
|
ir3_reg_create(instr, regid, 0); /* dummy dst */
|
||||||
@@ -2916,9 +2997,31 @@ decl_in(struct ir3_compile_context *ctx, struct tgsi_full_declaration *decl)
|
|||||||
so->frag_face = true;
|
so->frag_face = true;
|
||||||
instr = decl_in_frag_face(ctx, r + j, j);
|
instr = decl_in_frag_face(ctx, r + j, j);
|
||||||
} else {
|
} else {
|
||||||
|
bool use_ldlv = false;
|
||||||
|
|
||||||
|
/* I don't believe it is valid to not have Interp
|
||||||
|
* on a normal frag shader input, and various parts
|
||||||
|
* that that handle flat/smooth shading make this
|
||||||
|
* assumption as well.
|
||||||
|
*/
|
||||||
|
compile_assert(ctx, decl->Declaration.Interpolate);
|
||||||
|
|
||||||
|
if (ctx->flat_bypass) {
|
||||||
|
switch (decl->Interp.Interpolate) {
|
||||||
|
case TGSI_INTERPOLATE_COLOR:
|
||||||
|
if (!ctx->so->key.rasterflat)
|
||||||
|
break;
|
||||||
|
/* fallthrough */
|
||||||
|
case TGSI_INTERPOLATE_CONSTANT:
|
||||||
|
use_ldlv = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
so->inputs[n].bary = true;
|
so->inputs[n].bary = true;
|
||||||
|
|
||||||
instr = decl_in_frag_bary(ctx, r + j, j,
|
instr = decl_in_frag_bary(ctx, r + j, j,
|
||||||
so->inputs[n].inloc + j - 8);
|
so->inputs[n].inloc + j - 8, use_ldlv);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
instr = create_input(ctx->block, NULL, (i * 4) + j);
|
instr = create_input(ctx->block, NULL, (i * 4) + j);
|
||||||
@@ -3220,7 +3323,7 @@ ir3_compile_shader(struct ir3_shader_variant *so,
|
|||||||
if (key.binning_pass) {
|
if (key.binning_pass) {
|
||||||
for (i = 0, j = 0; i < so->outputs_count; i++) {
|
for (i = 0, j = 0; i < so->outputs_count; i++) {
|
||||||
unsigned name = sem2name(so->outputs[i].semantic);
|
unsigned name = sem2name(so->outputs[i].semantic);
|
||||||
unsigned idx = sem2name(so->outputs[i].semantic);
|
unsigned idx = sem2idx(so->outputs[i].semantic);
|
||||||
|
|
||||||
/* throw away everything but first position/psize */
|
/* throw away everything but first position/psize */
|
||||||
if ((idx == 0) && ((name == TGSI_SEMANTIC_POSITION) ||
|
if ((idx == 0) && ((name == TGSI_SEMANTIC_POSITION) ||
|
||||||
|
@@ -67,7 +67,7 @@ int ir3_delayslots(struct ir3_instruction *assigner,
|
|||||||
return 6;
|
return 6;
|
||||||
|
|
||||||
/* handled via sync flags: */
|
/* handled via sync flags: */
|
||||||
if (is_sfu(assigner) || is_tex(assigner))
|
if (is_sfu(assigner) || is_tex(assigner) || is_mem(assigner))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* assigner must be alu: */
|
/* assigner must be alu: */
|
||||||
|
@@ -50,50 +50,7 @@ static bool check_stop(struct ir3_instruction *instr)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bleh.. we need to do the same group_n() thing for both inputs/outputs
|
static struct ir3_instruction * create_mov(struct ir3_instruction *instr)
|
||||||
* (where we have a simple instr[] array), and fanin nodes (where we have
|
|
||||||
* an extra indirection via reg->instr).
|
|
||||||
*/
|
|
||||||
struct group_ops {
|
|
||||||
struct ir3_instruction *(*get)(void *arr, int idx);
|
|
||||||
void (*set)(void *arr, int idx, struct ir3_instruction *instr);
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct ir3_instruction *arr_get(void *arr, int idx)
|
|
||||||
{
|
|
||||||
return ((struct ir3_instruction **)arr)[idx];
|
|
||||||
}
|
|
||||||
static void arr_set_out(void *arr, int idx, struct ir3_instruction *instr)
|
|
||||||
{
|
|
||||||
((struct ir3_instruction **)arr)[idx] = instr;
|
|
||||||
}
|
|
||||||
static void arr_set_in(void *arr, int idx, struct ir3_instruction *instr)
|
|
||||||
{
|
|
||||||
debug_printf("cannot insert mov before input!\n");
|
|
||||||
debug_assert(0);
|
|
||||||
}
|
|
||||||
static struct group_ops arr_ops_out = { arr_get, arr_set_out };
|
|
||||||
static struct group_ops arr_ops_in = { arr_get, arr_set_in };
|
|
||||||
|
|
||||||
static struct ir3_instruction *instr_get(void *arr, int idx)
|
|
||||||
{
|
|
||||||
return ssa(((struct ir3_instruction *)arr)->regs[idx+1]);
|
|
||||||
}
|
|
||||||
static void instr_set(void *arr, int idx, struct ir3_instruction *instr)
|
|
||||||
{
|
|
||||||
((struct ir3_instruction *)arr)->regs[idx+1]->instr = instr;
|
|
||||||
}
|
|
||||||
static struct group_ops instr_ops = { instr_get, instr_set };
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static bool conflicts(struct ir3_instruction *a, struct ir3_instruction *b)
|
|
||||||
{
|
|
||||||
return (a && b) && (a != b);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct ir3_instruction *
|
|
||||||
create_mov(struct ir3_instruction *instr)
|
|
||||||
{
|
{
|
||||||
struct ir3_instruction *mov;
|
struct ir3_instruction *mov;
|
||||||
|
|
||||||
@@ -106,6 +63,67 @@ create_mov(struct ir3_instruction *instr)
|
|||||||
return mov;
|
return mov;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* bleh.. we need to do the same group_n() thing for both inputs/outputs
|
||||||
|
* (where we have a simple instr[] array), and fanin nodes (where we have
|
||||||
|
* an extra indirection via reg->instr).
|
||||||
|
*/
|
||||||
|
struct group_ops {
|
||||||
|
struct ir3_instruction *(*get)(void *arr, int idx);
|
||||||
|
void (*insert_mov)(void *arr, int idx, struct ir3_instruction *instr);
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ir3_instruction *arr_get(void *arr, int idx)
|
||||||
|
{
|
||||||
|
return ((struct ir3_instruction **)arr)[idx];
|
||||||
|
}
|
||||||
|
static void arr_insert_mov_out(void *arr, int idx, struct ir3_instruction *instr)
|
||||||
|
{
|
||||||
|
((struct ir3_instruction **)arr)[idx] = create_mov(instr);
|
||||||
|
}
|
||||||
|
static void arr_insert_mov_in(void *arr, int idx, struct ir3_instruction *instr)
|
||||||
|
{
|
||||||
|
/* so, we can't insert a mov in front of a meta:in.. and the downstream
|
||||||
|
* instruction already has a pointer to 'instr'. So we cheat a bit and
|
||||||
|
* morph the meta:in instruction into a mov and insert a new meta:in
|
||||||
|
* in front.
|
||||||
|
*/
|
||||||
|
struct ir3_instruction *in;
|
||||||
|
|
||||||
|
debug_assert(instr->regs_count == 1);
|
||||||
|
|
||||||
|
in = ir3_instr_create(instr->block, -1, OPC_META_INPUT);
|
||||||
|
in->inout.block = instr->block;
|
||||||
|
ir3_reg_create(in, instr->regs[0]->num, 0);
|
||||||
|
|
||||||
|
/* create src reg for meta:in and fixup to now be a mov: */
|
||||||
|
ir3_reg_create(instr, 0, IR3_REG_SSA)->instr = in;
|
||||||
|
instr->category = 1;
|
||||||
|
instr->opc = 0;
|
||||||
|
instr->cat1.src_type = TYPE_F32;
|
||||||
|
instr->cat1.dst_type = TYPE_F32;
|
||||||
|
|
||||||
|
((struct ir3_instruction **)arr)[idx] = in;
|
||||||
|
}
|
||||||
|
static struct group_ops arr_ops_out = { arr_get, arr_insert_mov_out };
|
||||||
|
static struct group_ops arr_ops_in = { arr_get, arr_insert_mov_in };
|
||||||
|
|
||||||
|
static struct ir3_instruction *instr_get(void *arr, int idx)
|
||||||
|
{
|
||||||
|
return ssa(((struct ir3_instruction *)arr)->regs[idx+1]);
|
||||||
|
}
|
||||||
|
static void instr_insert_mov(void *arr, int idx, struct ir3_instruction *instr)
|
||||||
|
{
|
||||||
|
((struct ir3_instruction *)arr)->regs[idx+1]->instr = create_mov(instr);
|
||||||
|
}
|
||||||
|
static struct group_ops instr_ops = { instr_get, instr_insert_mov };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static bool conflicts(struct ir3_instruction *a, struct ir3_instruction *b)
|
||||||
|
{
|
||||||
|
return (a && b) && (a != b);
|
||||||
|
}
|
||||||
|
|
||||||
static void group_n(struct group_ops *ops, void *arr, unsigned n)
|
static void group_n(struct group_ops *ops, void *arr, unsigned n)
|
||||||
{
|
{
|
||||||
unsigned i, j;
|
unsigned i, j;
|
||||||
@@ -135,8 +153,7 @@ restart:
|
|||||||
conflict = true;
|
conflict = true;
|
||||||
|
|
||||||
if (conflict) {
|
if (conflict) {
|
||||||
instr = create_mov(instr);
|
ops->insert_mov(arr, i, instr);
|
||||||
ops->set(arr, i, instr);
|
|
||||||
/* inserting the mov may have caused a conflict
|
/* inserting the mov may have caused a conflict
|
||||||
* against the previous:
|
* against the previous:
|
||||||
*/
|
*/
|
||||||
|
@@ -168,6 +168,8 @@ static void legalize(struct ir3_legalize_ctx *ctx)
|
|||||||
*/
|
*/
|
||||||
ctx->has_samp = true;
|
ctx->has_samp = true;
|
||||||
regmask_set(&needs_sy, n->regs[0]);
|
regmask_set(&needs_sy, n->regs[0]);
|
||||||
|
} else if (is_mem(n)) {
|
||||||
|
regmask_set(&needs_sy, n->regs[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* both tex/sfu appear to not always immediately consume
|
/* both tex/sfu appear to not always immediately consume
|
||||||
@@ -185,8 +187,44 @@ static void legalize(struct ir3_legalize_ctx *ctx)
|
|||||||
last_input = n;
|
last_input = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_input)
|
if (last_input) {
|
||||||
|
/* special hack.. if using ldlv to bypass interpolation,
|
||||||
|
* we need to insert a dummy bary.f on which we can set
|
||||||
|
* the (ei) flag:
|
||||||
|
*/
|
||||||
|
if (is_mem(last_input) && (last_input->opc == OPC_LDLV)) {
|
||||||
|
int i, cnt;
|
||||||
|
|
||||||
|
/* note that ir3_instr_create() inserts into
|
||||||
|
* shader->instrs[] and increments the count..
|
||||||
|
* so we need to bump up the cnt initially (to
|
||||||
|
* avoid it clobbering the last real instr) and
|
||||||
|
* restore it after.
|
||||||
|
*/
|
||||||
|
cnt = ++shader->instrs_count;
|
||||||
|
|
||||||
|
/* inserting instructions would be a bit nicer if list.. */
|
||||||
|
for (i = cnt - 2; i >= 0; i--) {
|
||||||
|
if (shader->instrs[i] == last_input) {
|
||||||
|
|
||||||
|
/* (ss)bary.f (ei)r63.x, 0, r0.x */
|
||||||
|
last_input = ir3_instr_create(block, 2, OPC_BARY_F);
|
||||||
|
last_input->flags |= IR3_INSTR_SS;
|
||||||
|
ir3_reg_create(last_input, regid(63, 0), 0);
|
||||||
|
ir3_reg_create(last_input, 0, IR3_REG_IMMED)->iim_val = 0;
|
||||||
|
ir3_reg_create(last_input, regid(0, 0), 0);
|
||||||
|
|
||||||
|
shader->instrs[i + 1] = last_input;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
shader->instrs[i + 1] = shader->instrs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
shader->instrs_count = cnt;
|
||||||
|
}
|
||||||
last_input->regs[0]->flags |= IR3_REG_EI;
|
last_input->regs[0]->flags |= IR3_REG_EI;
|
||||||
|
}
|
||||||
|
|
||||||
if (last_rel)
|
if (last_rel)
|
||||||
last_rel->flags |= IR3_INSTR_UL;
|
last_rel->flags |= IR3_INSTR_UL;
|
||||||
|
@@ -246,6 +246,7 @@ ir3_shader_variant(struct ir3_shader *shader, struct ir3_shader_key key)
|
|||||||
key.color_two_side = false;
|
key.color_two_side = false;
|
||||||
key.half_precision = false;
|
key.half_precision = false;
|
||||||
key.alpha = false;
|
key.alpha = false;
|
||||||
|
key.rasterflat = false;
|
||||||
if (key.has_per_samp) {
|
if (key.has_per_samp) {
|
||||||
key.fsaturate_s = 0;
|
key.fsaturate_s = 0;
|
||||||
key.fsaturate_t = 0;
|
key.fsaturate_t = 0;
|
||||||
|
@@ -77,6 +77,10 @@ struct ir3_shader_key {
|
|||||||
* let's start with this and see how it goes:
|
* let's start with this and see how it goes:
|
||||||
*/
|
*/
|
||||||
unsigned alpha : 1;
|
unsigned alpha : 1;
|
||||||
|
/* used when shader needs to handle flat varyings (a4xx),
|
||||||
|
* for TGSI_INTERPOLATE_COLOR:
|
||||||
|
*/
|
||||||
|
unsigned rasterflat : 1;
|
||||||
};
|
};
|
||||||
uint32_t global;
|
uint32_t global;
|
||||||
};
|
};
|
||||||
|
@@ -36,9 +36,7 @@ LOCAL_SRC_FILES := \
|
|||||||
$(NVC0_CODEGEN_SOURCES) \
|
$(NVC0_CODEGEN_SOURCES) \
|
||||||
$(NVC0_C_SOURCES)
|
$(NVC0_C_SOURCES)
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := \
|
LOCAL_SHARED_LIBRARIES := libdrm libdrm_nouveau
|
||||||
$(TARGET_OUT_HEADERS)/libdrm
|
|
||||||
|
|
||||||
LOCAL_MODULE := libmesa_pipe_nouveau
|
LOCAL_MODULE := libmesa_pipe_nouveau
|
||||||
|
|
||||||
include external/stlport/libstlport.mk
|
include external/stlport/libstlport.mk
|
||||||
|
@@ -903,7 +903,7 @@ CodeEmitterGK110::emitSET(const CmpInstruction *i)
|
|||||||
code[0] |= 0x1c;
|
code[0] |= 0x1c;
|
||||||
} else {
|
} else {
|
||||||
switch (i->sType) {
|
switch (i->sType) {
|
||||||
case TYPE_F32: op2 = 0x000; op1 = 0x820; break;
|
case TYPE_F32: op2 = 0x000; op1 = 0x800; break;
|
||||||
case TYPE_F64: op2 = 0x080; op1 = 0x900; break;
|
case TYPE_F64: op2 = 0x080; op1 = 0x900; break;
|
||||||
default:
|
default:
|
||||||
op2 = 0x1a8;
|
op2 = 0x1a8;
|
||||||
@@ -1116,6 +1116,7 @@ CodeEmitterGK110::emitTEX(const TexInstruction *i)
|
|||||||
if (i->tex.useOffsets == 1) {
|
if (i->tex.useOffsets == 1) {
|
||||||
switch (i->op) {
|
switch (i->op) {
|
||||||
case OP_TXF: code[1] |= 0x200; break;
|
case OP_TXF: code[1] |= 0x200; break;
|
||||||
|
case OP_TXD: code[1] |= 0x00400000; break;
|
||||||
default: code[1] |= 0x800; break;
|
default: code[1] |= 0x800; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1264,8 +1265,10 @@ CodeEmitterGK110::emitPFETCH(const Instruction *i)
|
|||||||
|
|
||||||
emitPredicate(i);
|
emitPredicate(i);
|
||||||
|
|
||||||
|
const int src1 = (i->predSrc == 1) ? 2 : 1; // if predSrc == 1, !srcExists(2)
|
||||||
|
|
||||||
defId(i->def(0), 2);
|
defId(i->def(0), 2);
|
||||||
srcId(i->src(1), 10);
|
srcId(i, src1, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -1441,8 +1441,10 @@ CodeEmitterNVC0::emitPFETCH(const Instruction *i)
|
|||||||
|
|
||||||
emitPredicate(i);
|
emitPredicate(i);
|
||||||
|
|
||||||
|
const int src1 = (i->predSrc == 1) ? 2 : 1; // if predSrc == 1, !srcExists(2)
|
||||||
|
|
||||||
defId(i->def(0), 14);
|
defId(i->def(0), 14);
|
||||||
srcId(i->src(1), 20);
|
srcId(i, src1, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -1270,18 +1270,20 @@ Converter::srcToSym(tgsi::Instruction::SrcRegister src, int c)
|
|||||||
{
|
{
|
||||||
const int swz = src.getSwizzle(c);
|
const int swz = src.getSwizzle(c);
|
||||||
|
|
||||||
|
/* TODO: Use Array ID when it's available for the index */
|
||||||
return makeSym(src.getFile(),
|
return makeSym(src.getFile(),
|
||||||
src.is2D() ? src.getIndex(1) : 0,
|
src.is2D() ? src.getIndex(1) : 0,
|
||||||
src.isIndirect(0) ? -1 : src.getIndex(0), swz,
|
src.getIndex(0), swz,
|
||||||
src.getIndex(0) * 16 + swz * 4);
|
src.getIndex(0) * 16 + swz * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol *
|
Symbol *
|
||||||
Converter::dstToSym(tgsi::Instruction::DstRegister dst, int c)
|
Converter::dstToSym(tgsi::Instruction::DstRegister dst, int c)
|
||||||
{
|
{
|
||||||
|
/* TODO: Use Array ID when it's available for the index */
|
||||||
return makeSym(dst.getFile(),
|
return makeSym(dst.getFile(),
|
||||||
dst.is2D() ? dst.getIndex(1) : 0,
|
dst.is2D() ? dst.getIndex(1) : 0,
|
||||||
dst.isIndirect(0) ? -1 : dst.getIndex(0), c,
|
dst.getIndex(0), c,
|
||||||
dst.getIndex(0) * 16 + c * 4);
|
dst.getIndex(0) * 16 + c * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -302,7 +302,7 @@ FlowInstruction *Instruction::asFlow()
|
|||||||
|
|
||||||
const FlowInstruction *Instruction::asFlow() const
|
const FlowInstruction *Instruction::asFlow() const
|
||||||
{
|
{
|
||||||
if (op >= OP_BRA && op <= OP_JOINAT)
|
if (op >= OP_BRA && op <= OP_JOIN)
|
||||||
return static_cast<const FlowInstruction *>(this);
|
return static_cast<const FlowInstruction *>(this);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@@ -240,6 +240,7 @@ GM107LoweringPass::visit(Instruction *i)
|
|||||||
Value *ptr = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
Value *ptr = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
||||||
i->getIndirect(0, 0), bld.mkImm(4));
|
i->getIndirect(0, 0), bld.mkImm(4));
|
||||||
i->setIndirect(0, 0, ptr);
|
i->setIndirect(0, 0, ptr);
|
||||||
|
i->op = OP_VFETCH;
|
||||||
} else {
|
} else {
|
||||||
i->op = OP_VFETCH;
|
i->op = OP_VFETCH;
|
||||||
assert(prog->getType() != Program::TYPE_FRAGMENT); // INTERP
|
assert(prog->getType() != Program::TYPE_FRAGMENT); // INTERP
|
||||||
|
@@ -73,6 +73,25 @@ NVC0LegalizeSSA::handleRCPRSQ(Instruction *i)
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
NVC0LegalizeSSA::handleFTZ(Instruction *i)
|
||||||
|
{
|
||||||
|
// Only want to flush float inputs
|
||||||
|
assert(i->sType == TYPE_F32);
|
||||||
|
|
||||||
|
// If we're already flushing denorms (and NaN's) to zero, no need for this.
|
||||||
|
if (i->dnz)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Only certain classes of operations can flush
|
||||||
|
OpClass cls = prog->getTarget()->getOpClass(i->op);
|
||||||
|
if (cls != OPCLASS_ARITH && cls != OPCLASS_COMPARE &&
|
||||||
|
cls != OPCLASS_CONVERT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
i->ftz = true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
NVC0LegalizeSSA::visit(Function *fn)
|
NVC0LegalizeSSA::visit(Function *fn)
|
||||||
{
|
{
|
||||||
@@ -86,8 +105,11 @@ NVC0LegalizeSSA::visit(BasicBlock *bb)
|
|||||||
Instruction *next;
|
Instruction *next;
|
||||||
for (Instruction *i = bb->getEntry(); i; i = next) {
|
for (Instruction *i = bb->getEntry(); i; i = next) {
|
||||||
next = i->next;
|
next = i->next;
|
||||||
if (i->dType == TYPE_F32)
|
if (i->sType == TYPE_F32) {
|
||||||
|
if (prog->getType() != Program::TYPE_COMPUTE)
|
||||||
|
handleFTZ(i);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
switch (i->op) {
|
switch (i->op) {
|
||||||
case OP_DIV:
|
case OP_DIV:
|
||||||
case OP_MOD:
|
case OP_MOD:
|
||||||
@@ -1692,6 +1714,7 @@ NVC0LoweringPass::visit(Instruction *i)
|
|||||||
Value *ptr = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
Value *ptr = bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
|
||||||
i->getIndirect(0, 0), bld.mkImm(4));
|
i->getIndirect(0, 0), bld.mkImm(4));
|
||||||
i->setIndirect(0, 0, ptr);
|
i->setIndirect(0, 0, ptr);
|
||||||
|
i->op = OP_VFETCH;
|
||||||
} else {
|
} else {
|
||||||
i->op = OP_VFETCH;
|
i->op = OP_VFETCH;
|
||||||
assert(prog->getType() != Program::TYPE_FRAGMENT); // INTERP
|
assert(prog->getType() != Program::TYPE_FRAGMENT); // INTERP
|
||||||
|
@@ -36,6 +36,7 @@ private:
|
|||||||
// we want to insert calls to the builtin library only after optimization
|
// we want to insert calls to the builtin library only after optimization
|
||||||
void handleDIV(Instruction *); // integer division, modulus
|
void handleDIV(Instruction *); // integer division, modulus
|
||||||
void handleRCPRSQ(Instruction *); // double precision float recip/rsqrt
|
void handleRCPRSQ(Instruction *); // double precision float recip/rsqrt
|
||||||
|
void handleFTZ(Instruction *);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BuildUtil bld;
|
BuildUtil bld;
|
||||||
|
@@ -207,6 +207,9 @@ LoadPropagation::visit(BasicBlock *bb)
|
|||||||
if (i->op == OP_CALL) // calls have args as sources, they must be in regs
|
if (i->op == OP_CALL) // calls have args as sources, they must be in regs
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (i->op == OP_PFETCH) // pfetch expects arg1 to be a reg
|
||||||
|
continue;
|
||||||
|
|
||||||
if (i->srcExists(1))
|
if (i->srcExists(1))
|
||||||
checkSwapSrc01(i);
|
checkSwapSrc01(i);
|
||||||
|
|
||||||
@@ -422,7 +425,9 @@ ConstantFolding::expr(Instruction *i,
|
|||||||
b->data.f32 = 0.0f;
|
b->data.f32 = 0.0f;
|
||||||
}
|
}
|
||||||
switch (i->dType) {
|
switch (i->dType) {
|
||||||
case TYPE_F32: res.data.f32 = a->data.f32 * b->data.f32; break;
|
case TYPE_F32:
|
||||||
|
res.data.f32 = a->data.f32 * b->data.f32 * exp2f(i->postFactor);
|
||||||
|
break;
|
||||||
case TYPE_F64: res.data.f64 = a->data.f64 * b->data.f64; break;
|
case TYPE_F64: res.data.f64 = a->data.f64 * b->data.f64; break;
|
||||||
case TYPE_S32:
|
case TYPE_S32:
|
||||||
if (i->subOp == NV50_IR_SUBOP_MUL_HIGH) {
|
if (i->subOp == NV50_IR_SUBOP_MUL_HIGH) {
|
||||||
@@ -543,6 +548,11 @@ ConstantFolding::expr(Instruction *i,
|
|||||||
case OP_POPCNT:
|
case OP_POPCNT:
|
||||||
res.data.u32 = util_bitcount(a->data.u32 & b->data.u32);
|
res.data.u32 = util_bitcount(a->data.u32 & b->data.u32);
|
||||||
break;
|
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:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -550,13 +560,16 @@ ConstantFolding::expr(Instruction *i,
|
|||||||
|
|
||||||
i->src(0).mod = Modifier(0);
|
i->src(0).mod = Modifier(0);
|
||||||
i->src(1).mod = Modifier(0);
|
i->src(1).mod = Modifier(0);
|
||||||
|
i->postFactor = 0;
|
||||||
|
|
||||||
i->setSrc(0, new_ImmediateValue(i->bb->getProgram(), res.data.u32));
|
i->setSrc(0, new_ImmediateValue(i->bb->getProgram(), res.data.u32));
|
||||||
i->setSrc(1, NULL);
|
i->setSrc(1, NULL);
|
||||||
|
|
||||||
i->getSrc(0)->reg.data = res.data;
|
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;
|
i->op = OP_ADD;
|
||||||
|
|
||||||
i->setSrc(1, i->getSrc(0));
|
i->setSrc(1, i->getSrc(0));
|
||||||
@@ -571,8 +584,14 @@ ConstantFolding::expr(Instruction *i,
|
|||||||
bld.setPosition(i, false);
|
bld.setPosition(i, false);
|
||||||
i->setSrc(1, bld.loadImm(NULL, res.data.u32));
|
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() */
|
i->op = i->saturate ? OP_SAT : OP_MOV; /* SAT handled by unary() */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
i->subOp = 0;
|
i->subOp = 0;
|
||||||
}
|
}
|
||||||
@@ -653,7 +672,7 @@ ConstantFolding::tryCollapseChainedMULs(Instruction *mul2,
|
|||||||
Instruction *insn;
|
Instruction *insn;
|
||||||
Instruction *mul1 = NULL; // mul1 before mul2
|
Instruction *mul1 = NULL; // mul1 before mul2
|
||||||
int e = 0;
|
int e = 0;
|
||||||
float f = imm2.reg.data.f32;
|
float f = imm2.reg.data.f32 * exp2f(mul2->postFactor);
|
||||||
ImmediateValue imm1;
|
ImmediateValue imm1;
|
||||||
|
|
||||||
assert(mul2->op == OP_MUL && mul2->dType == TYPE_F32);
|
assert(mul2->op == OP_MUL && mul2->dType == TYPE_F32);
|
||||||
@@ -673,6 +692,7 @@ ConstantFolding::tryCollapseChainedMULs(Instruction *mul2,
|
|||||||
mul1->setSrc(s1, bld.loadImm(NULL, f * imm1.reg.data.f32));
|
mul1->setSrc(s1, bld.loadImm(NULL, f * imm1.reg.data.f32));
|
||||||
mul1->src(s1).mod = Modifier(0);
|
mul1->src(s1).mod = Modifier(0);
|
||||||
mul2->def(0).replace(mul1->getDef(0), false);
|
mul2->def(0).replace(mul1->getDef(0), false);
|
||||||
|
mul1->saturate = mul2->saturate;
|
||||||
} else
|
} else
|
||||||
if (prog->getTarget()->isPostMultiplySupported(OP_MUL, f, e)) {
|
if (prog->getTarget()->isPostMultiplySupported(OP_MUL, f, e)) {
|
||||||
// c = mul a, b
|
// c = mul a, b
|
||||||
@@ -681,8 +701,8 @@ ConstantFolding::tryCollapseChainedMULs(Instruction *mul2,
|
|||||||
mul2->def(0).replace(mul1->getDef(0), false);
|
mul2->def(0).replace(mul1->getDef(0), false);
|
||||||
if (f < 0)
|
if (f < 0)
|
||||||
mul1->src(0).mod *= Modifier(NV50_IR_MOD_NEG);
|
mul1->src(0).mod *= Modifier(NV50_IR_MOD_NEG);
|
||||||
|
mul1->saturate = mul2->saturate;
|
||||||
}
|
}
|
||||||
mul1->saturate = mul2->saturate;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -753,9 +773,10 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
|
|||||||
i->op = OP_MOV;
|
i->op = OP_MOV;
|
||||||
i->setSrc(0, new_ImmediateValue(prog, 0u));
|
i->setSrc(0, new_ImmediateValue(prog, 0u));
|
||||||
i->src(0).mod = Modifier(0);
|
i->src(0).mod = Modifier(0);
|
||||||
|
i->postFactor = 0;
|
||||||
i->setSrc(1, NULL);
|
i->setSrc(1, NULL);
|
||||||
} else
|
} else
|
||||||
if (imm0.isInteger(1) || imm0.isInteger(-1)) {
|
if (!i->postFactor && (imm0.isInteger(1) || imm0.isInteger(-1))) {
|
||||||
if (imm0.isNegative())
|
if (imm0.isNegative())
|
||||||
i->src(t).mod = i->src(t).mod ^ Modifier(NV50_IR_MOD_NEG);
|
i->src(t).mod = i->src(t).mod ^ Modifier(NV50_IR_MOD_NEG);
|
||||||
i->op = i->src(t).mod.getOp();
|
i->op = i->src(t).mod.getOp();
|
||||||
@@ -768,7 +789,7 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
|
|||||||
i->src(0).mod = 0;
|
i->src(0).mod = 0;
|
||||||
i->setSrc(1, NULL);
|
i->setSrc(1, NULL);
|
||||||
} else
|
} else
|
||||||
if (imm0.isInteger(2) || imm0.isInteger(-2)) {
|
if (!i->postFactor && (imm0.isInteger(2) || imm0.isInteger(-2))) {
|
||||||
if (imm0.isNegative())
|
if (imm0.isNegative())
|
||||||
i->src(t).mod = i->src(t).mod ^ Modifier(NV50_IR_MOD_NEG);
|
i->src(t).mod = i->src(t).mod ^ Modifier(NV50_IR_MOD_NEG);
|
||||||
i->op = OP_ADD;
|
i->op = OP_ADD;
|
||||||
|
@@ -84,7 +84,7 @@ static const struct opProperties _initProps[] =
|
|||||||
// neg abs not sat c[] s[], a[], imm
|
// neg abs not sat c[] s[], a[], imm
|
||||||
{ OP_ADD, 0x3, 0x0, 0x0, 0x8, 0x2, 0x1, 0x1, 0x2 },
|
{ OP_ADD, 0x3, 0x0, 0x0, 0x8, 0x2, 0x1, 0x1, 0x2 },
|
||||||
{ OP_SUB, 0x3, 0x0, 0x0, 0x8, 0x2, 0x1, 0x1, 0x2 },
|
{ OP_SUB, 0x3, 0x0, 0x0, 0x8, 0x2, 0x1, 0x1, 0x2 },
|
||||||
{ OP_MUL, 0x3, 0x0, 0x0, 0x8, 0x2, 0x1, 0x1, 0x2 },
|
{ OP_MUL, 0x3, 0x0, 0x0, 0x0, 0x2, 0x1, 0x1, 0x2 },
|
||||||
{ OP_MAX, 0x3, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 },
|
{ OP_MAX, 0x3, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 },
|
||||||
{ OP_MIN, 0x3, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 },
|
{ OP_MIN, 0x3, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 },
|
||||||
{ OP_MAD, 0x7, 0x0, 0x0, 0x8, 0x6, 0x1, 0x1, 0x0 }, // special constraint
|
{ OP_MAD, 0x7, 0x0, 0x0, 0x8, 0x6, 0x1, 0x1, 0x0 }, // special constraint
|
||||||
@@ -188,6 +188,9 @@ void TargetNV50::initOpInfo()
|
|||||||
if (prop->mSat & 8)
|
if (prop->mSat & 8)
|
||||||
opInfo[prop->op].dstMods = NV50_IR_MOD_SAT;
|
opInfo[prop->op].dstMods = NV50_IR_MOD_SAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (chipset >= 0xa0)
|
||||||
|
opInfo[OP_MUL].dstMods = NV50_IR_MOD_SAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
|
@@ -846,17 +846,28 @@ nouveau_scratch_bo_alloc(struct nouveau_context *nv, struct nouveau_bo **pbo,
|
|||||||
4096, size, NULL, pbo);
|
4096, size, NULL, pbo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
nouveau_scratch_unref_bos(void *d)
|
||||||
|
{
|
||||||
|
struct runout *b = d;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < b->nr; ++i)
|
||||||
|
nouveau_bo_ref(NULL, &b->bo[i]);
|
||||||
|
|
||||||
|
FREE(b);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nouveau_scratch_runout_release(struct nouveau_context *nv)
|
nouveau_scratch_runout_release(struct nouveau_context *nv)
|
||||||
{
|
{
|
||||||
if (!nv->scratch.nr_runout)
|
if (!nv->scratch.runout)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!nouveau_fence_work(nv->screen->fence.current, nouveau_scratch_unref_bos,
|
||||||
|
nv->scratch.runout))
|
||||||
return;
|
return;
|
||||||
do {
|
|
||||||
--nv->scratch.nr_runout;
|
|
||||||
nouveau_bo_ref(NULL, &nv->scratch.runout[nv->scratch.nr_runout]);
|
|
||||||
} while (nv->scratch.nr_runout);
|
|
||||||
|
|
||||||
FREE(nv->scratch.runout);
|
|
||||||
nv->scratch.end = 0;
|
nv->scratch.end = 0;
|
||||||
nv->scratch.runout = NULL;
|
nv->scratch.runout = NULL;
|
||||||
}
|
}
|
||||||
@@ -868,21 +879,26 @@ static INLINE boolean
|
|||||||
nouveau_scratch_runout(struct nouveau_context *nv, unsigned size)
|
nouveau_scratch_runout(struct nouveau_context *nv, unsigned size)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
const unsigned n = nv->scratch.nr_runout++;
|
unsigned n;
|
||||||
|
|
||||||
nv->scratch.runout = REALLOC(nv->scratch.runout,
|
if (nv->scratch.runout)
|
||||||
(n + 0) * sizeof(*nv->scratch.runout),
|
n = nv->scratch.runout->nr;
|
||||||
(n + 1) * sizeof(*nv->scratch.runout));
|
else
|
||||||
nv->scratch.runout[n] = NULL;
|
n = 0;
|
||||||
|
nv->scratch.runout = REALLOC(nv->scratch.runout, n == 0 ? 0 :
|
||||||
|
(sizeof(*nv->scratch.runout) + (n + 0) * sizeof(void *)),
|
||||||
|
sizeof(*nv->scratch.runout) + (n + 1) * sizeof(void *));
|
||||||
|
nv->scratch.runout->nr = n + 1;
|
||||||
|
nv->scratch.runout->bo[n] = NULL;
|
||||||
|
|
||||||
ret = nouveau_scratch_bo_alloc(nv, &nv->scratch.runout[n], size);
|
ret = nouveau_scratch_bo_alloc(nv, &nv->scratch.runout->bo[n], size);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ret = nouveau_bo_map(nv->scratch.runout[n], 0, NULL);
|
ret = nouveau_bo_map(nv->scratch.runout->bo[n], 0, NULL);
|
||||||
if (ret)
|
if (ret)
|
||||||
nouveau_bo_ref(NULL, &nv->scratch.runout[--nv->scratch.nr_runout]);
|
nouveau_bo_ref(NULL, &nv->scratch.runout->bo[--nv->scratch.runout->nr]);
|
||||||
}
|
}
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
nv->scratch.current = nv->scratch.runout[n];
|
nv->scratch.current = nv->scratch.runout->bo[n];
|
||||||
nv->scratch.offset = 0;
|
nv->scratch.offset = 0;
|
||||||
nv->scratch.end = size;
|
nv->scratch.end = size;
|
||||||
nv->scratch.map = nv->scratch.current->map;
|
nv->scratch.map = nv->scratch.current->map;
|
||||||
|
@@ -40,8 +40,10 @@ struct nouveau_context {
|
|||||||
unsigned end;
|
unsigned end;
|
||||||
struct nouveau_bo *bo[NOUVEAU_MAX_SCRATCH_BUFS];
|
struct nouveau_bo *bo[NOUVEAU_MAX_SCRATCH_BUFS];
|
||||||
struct nouveau_bo *current;
|
struct nouveau_bo *current;
|
||||||
struct nouveau_bo **runout;
|
struct runout {
|
||||||
unsigned nr_runout;
|
unsigned nr;
|
||||||
|
struct nouveau_bo *bo[0];
|
||||||
|
} *runout;
|
||||||
unsigned bo_size;
|
unsigned bo_size;
|
||||||
} scratch;
|
} scratch;
|
||||||
|
|
||||||
@@ -71,7 +73,7 @@ static INLINE void
|
|||||||
nouveau_scratch_done(struct nouveau_context *nv)
|
nouveau_scratch_done(struct nouveau_context *nv)
|
||||||
{
|
{
|
||||||
nv->scratch.wrap = nv->scratch.id;
|
nv->scratch.wrap = nv->scratch.id;
|
||||||
if (unlikely(nv->scratch.nr_runout))
|
if (unlikely(nv->scratch.runout))
|
||||||
nouveau_scratch_runout_release(nv);
|
nouveau_scratch_runout_release(nv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -58,7 +58,7 @@ nv30_clear(struct pipe_context *pipe, unsigned buffers,
|
|||||||
struct pipe_framebuffer_state *fb = &nv30->framebuffer;
|
struct pipe_framebuffer_state *fb = &nv30->framebuffer;
|
||||||
uint32_t colr = 0, zeta = 0, mode = 0;
|
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;
|
return;
|
||||||
|
|
||||||
if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) {
|
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);
|
nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info);
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
nv30_state_validate(struct nv30_context *nv30, boolean hwtnl);
|
nv30_state_validate(struct nv30_context *nv30, uint32_t mask, boolean hwtnl);
|
||||||
|
|
||||||
void
|
void
|
||||||
nv30_state_release(struct nv30_context *nv30);
|
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_render *r = nv30_render(render);
|
||||||
struct nv30_context *nv30 = r->nv30;
|
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) {
|
if (r->offset + r->length >= render->max_vertex_buffer_bytes) {
|
||||||
pipe_resource_reference(&r->buffer, NULL);
|
pipe_resource_reference(&r->buffer, NULL);
|
||||||
r->buffer = pipe_buffer_create(&nv30->screen->base.base,
|
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);
|
render->max_vertex_buffer_bytes);
|
||||||
if (!r->buffer)
|
if (!r->buffer)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -91,10 +91,14 @@ static void *
|
|||||||
nv30_render_map_vertices(struct vbuf_render *render)
|
nv30_render_map_vertices(struct vbuf_render *render)
|
||||||
{
|
{
|
||||||
struct nv30_render *r = nv30_render(render);
|
struct nv30_render *r = nv30_render(render);
|
||||||
char *map = pipe_buffer_map(&r->nv30->base.pipe, r->buffer,
|
char *map = pipe_buffer_map_range(
|
||||||
PIPE_TRANSFER_WRITE |
|
&r->nv30->base.pipe, r->buffer,
|
||||||
PIPE_TRANSFER_UNSYNCHRONIZED, &r->transfer);
|
r->offset, r->length,
|
||||||
return map + r->offset;
|
PIPE_TRANSFER_WRITE |
|
||||||
|
PIPE_TRANSFER_DISCARD_RANGE,
|
||||||
|
&r->transfer);
|
||||||
|
assert(map);
|
||||||
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -103,6 +107,7 @@ nv30_render_unmap_vertices(struct vbuf_render *render,
|
|||||||
{
|
{
|
||||||
struct nv30_render *r = nv30_render(render);
|
struct nv30_render *r = nv30_render(render);
|
||||||
pipe_buffer_unmap(&r->nv30->base.pipe, r->transfer);
|
pipe_buffer_unmap(&r->nv30->base.pipe, r->transfer);
|
||||||
|
r->transfer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -126,10 +131,10 @@ nv30_render_draw_elements(struct vbuf_render *render,
|
|||||||
for (i = 0; i < r->vertex_info.num_attribs; i++) {
|
for (i = 0; i < r->vertex_info.num_attribs; i++) {
|
||||||
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
||||||
nv04_resource(r->buffer), r->offset + r->vtxptr[i],
|
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;
|
return;
|
||||||
|
|
||||||
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
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++) {
|
for (i = 0; i < r->vertex_info.num_attribs; i++) {
|
||||||
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
||||||
nv04_resource(r->buffer), r->offset + r->vtxptr[i],
|
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;
|
return;
|
||||||
|
|
||||||
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
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_BCOLOR ] = { EMIT_4F, INTERP_LINEAR , 1, 3, 0x00000004 },
|
||||||
[TGSI_SEMANTIC_FOG ] = { EMIT_4F, INTERP_PERSPECTIVE, 5, 5, 0x00000010 },
|
[TGSI_SEMANTIC_FOG ] = { EMIT_4F, INTERP_PERSPECTIVE, 5, 5, 0x00000010 },
|
||||||
[TGSI_SEMANTIC_PSIZE ] = { EMIT_1F_PSIZE, INTERP_POS , 6, 6, 0x00000020 },
|
[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
|
static boolean
|
||||||
vroute_add(struct nv30_render *r, uint attrib, uint sem, uint *idx)
|
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 nv30_fragprog *fp = r->nv30->fragprog.program;
|
||||||
struct vertex_info *vinfo = &r->vertex_info;
|
struct vertex_info *vinfo = &r->vertex_info;
|
||||||
enum pipe_format format;
|
enum pipe_format format;
|
||||||
uint emit = EMIT_OMIT;
|
uint emit = EMIT_OMIT;
|
||||||
uint result = *idx;
|
uint result = *idx;
|
||||||
|
|
||||||
if (sem == TGSI_SEMANTIC_GENERIC && result >= 8) {
|
if (sem == TGSI_SEMANTIC_GENERIC) {
|
||||||
for (result = 0; result < 8; result++) {
|
uint num_texcoords = (screen->eng3d->oclass < NV40_3D_CLASS) ? 8 : 10;
|
||||||
if (fp->texcoord[result] == *idx) {
|
for (result = 0; result < num_texcoords; result++) {
|
||||||
|
if (fp->texcoord[result] == *idx + 8) {
|
||||||
|
sem = TGSI_SEMANTIC_TEXCOORD;
|
||||||
emit = vroute[sem].emit;
|
emit = vroute[sem].emit;
|
||||||
break;
|
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);
|
draw_emit_vertex_attr(vinfo, emit, vroute[sem].interp, attrib);
|
||||||
format = draw_translate_vinfo_format(emit);
|
format = draw_translate_vinfo_format(emit);
|
||||||
|
|
||||||
r->vtxfmt[attrib] = nv30_vtxfmt(pscreen, format)->hw;
|
r->vtxfmt[attrib] = nv30_vtxfmt(&screen->base.base, format)->hw;
|
||||||
r->vtxptr[attrib] = vinfo->size | NV30_3D_VTXBUF_DMA1;
|
r->vtxptr[attrib] = vinfo->size;
|
||||||
vinfo->size += draw_translate_vinfo_size(emit);
|
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][0] = 0x001f38d8;
|
||||||
r->vtxprog[attrib][1] = 0x0080001b | (attrib << 9);
|
r->vtxprog[attrib][1] = 0x0080001b | (attrib << 9);
|
||||||
r->vtxprog[attrib][2] = 0x0836106c;
|
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;
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,7 +325,7 @@ nv30_render_validate(struct nv30_context *nv30)
|
|||||||
|
|
||||||
while (pntc && attrib < 16) {
|
while (pntc && attrib < 16) {
|
||||||
uint index = ffs(pntc) - 1; pntc &= ~(1 << index);
|
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_attribs |= (1 << attrib++);
|
||||||
vp_results |= index;
|
vp_results |= index;
|
||||||
}
|
}
|
||||||
@@ -398,17 +410,17 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
|||||||
if (nv30->vertprog.constbuf) {
|
if (nv30->vertprog.constbuf) {
|
||||||
void *map = nv04_resource(nv30->vertprog.constbuf)->data;
|
void *map = nv04_resource(nv30->vertprog.constbuf)->data;
|
||||||
draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0,
|
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++) {
|
for (i = 0; i < nv30->num_vtxbufs; i++) {
|
||||||
const void *map = nv30->vtxbuf[i].user_buffer;
|
const void *map = nv30->vtxbuf[i].user_buffer;
|
||||||
if (!map) {
|
if (!map) {
|
||||||
if (!nv30->vtxbuf[i].buffer) {
|
if (nv30->vtxbuf[i].buffer)
|
||||||
continue;
|
map = pipe_buffer_map(pipe, nv30->vtxbuf[i].buffer,
|
||||||
}
|
|
||||||
map = pipe_buffer_map(pipe, nv30->vtxbuf[i].buffer,
|
|
||||||
PIPE_TRANSFER_UNSYNCHRONIZED |
|
PIPE_TRANSFER_UNSYNCHRONIZED |
|
||||||
PIPE_TRANSFER_READ, &transfer[i]);
|
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) {
|
if (info->indexed) {
|
||||||
const void *map = nv30->idxbuf.user_buffer;
|
const void *map = nv30->idxbuf.user_buffer;
|
||||||
if (!map)
|
if (!map)
|
||||||
pipe_buffer_map(pipe, nv30->idxbuf.buffer,
|
map = pipe_buffer_map(pipe, nv30->idxbuf.buffer,
|
||||||
PIPE_TRANSFER_UNSYNCHRONIZED |
|
PIPE_TRANSFER_UNSYNCHRONIZED |
|
||||||
PIPE_TRANSFER_READ, &transferi);
|
PIPE_TRANSFER_READ, &transferi);
|
||||||
draw_set_indexes(draw,
|
draw_set_indexes(draw,
|
||||||
(ubyte *) map + nv30->idxbuf.offset,
|
(ubyte *) map + nv30->idxbuf.offset,
|
||||||
nv30->idxbuf.index_size, ~0);
|
nv30->idxbuf.index_size, ~0);
|
||||||
@@ -444,6 +456,12 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
|||||||
static void
|
static void
|
||||||
nv30_render_destroy(struct vbuf_render *render)
|
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);
|
FREE(render);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "draw/draw_context.h"
|
||||||
#include "tgsi/tgsi_parse.h"
|
#include "tgsi/tgsi_parse.h"
|
||||||
|
|
||||||
#include "nv_object.xml.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);
|
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((void *)fp->pipe.tokens);
|
||||||
FREE(fp->insn);
|
FREE(fp->insn);
|
||||||
|
FREE(fp->consts);
|
||||||
FREE(fp);
|
FREE(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -272,15 +272,13 @@ nv30_validate_clip(struct nv30_context *nv30)
|
|||||||
uint32_t clpd_enable = 0;
|
uint32_t clpd_enable = 0;
|
||||||
|
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
if (nv30->rast->pipe.clip_plane_enable & (1 << i)) {
|
if (nv30->dirty & NV30_NEW_CLIP) {
|
||||||
if (nv30->dirty & NV30_NEW_CLIP) {
|
BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 5);
|
||||||
BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 5);
|
PUSH_DATA (push, i);
|
||||||
PUSH_DATA (push, i);
|
PUSH_DATAp(push, nv30->clip.ucp[i], 4);
|
||||||
PUSH_DATAp(push, nv30->clip.ucp[i], 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
clpd_enable |= 1 << (1 + 4*i);
|
|
||||||
}
|
}
|
||||||
|
if (nv30->rast->pipe.clip_plane_enable & (1 << i))
|
||||||
|
clpd_enable |= 2 << (4*i);
|
||||||
}
|
}
|
||||||
|
|
||||||
BEGIN_NV04(push, NV30_3D(VP_CLIP_PLANES_ENABLE), 1);
|
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_stipple, NV30_NEW_STIPPLE },
|
||||||
{ nv30_validate_scissor, NV30_NEW_SCISSOR | NV30_NEW_RASTERIZER },
|
{ nv30_validate_scissor, NV30_NEW_SCISSOR | NV30_NEW_RASTERIZER },
|
||||||
{ nv30_validate_viewport, NV30_NEW_VIEWPORT },
|
{ 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_fragprog_validate, NV30_NEW_FRAGPROG | NV30_NEW_FRAGCONST },
|
||||||
{ nv30_vertprog_validate, NV30_NEW_VERTPROG | NV30_NEW_VERTCONST |
|
{ nv30_vertprog_validate, NV30_NEW_VERTPROG | NV30_NEW_VERTCONST |
|
||||||
NV30_NEW_FRAGPROG | NV30_NEW_RASTERIZER },
|
NV30_NEW_FRAGPROG | NV30_NEW_RASTERIZER },
|
||||||
@@ -456,7 +454,7 @@ nv30_state_context_switch(struct nv30_context *nv30)
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean
|
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_screen *screen = &nv30->screen->base;
|
||||||
struct nouveau_pushbuf *push = nv30->base.pushbuf;
|
struct nouveau_pushbuf *push = nv30->base.pushbuf;
|
||||||
@@ -481,14 +479,16 @@ nv30_state_validate(struct nv30_context *nv30, boolean hwtnl)
|
|||||||
else
|
else
|
||||||
validate = swtnl_validate_list;
|
validate = swtnl_validate_list;
|
||||||
|
|
||||||
if (nv30->dirty) {
|
mask &= nv30->dirty;
|
||||||
|
|
||||||
|
if (mask) {
|
||||||
while (validate->func) {
|
while (validate->func) {
|
||||||
if (nv30->dirty & validate->mask)
|
if (mask & validate->mask)
|
||||||
validate->func(nv30);
|
validate->func(nv30);
|
||||||
validate++;
|
validate++;
|
||||||
}
|
}
|
||||||
|
|
||||||
nv30->dirty = 0;
|
nv30->dirty &= ~mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
nouveau_pushbuf_bufctx(push, bctx);
|
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)))
|
if (nv30->vbo_user && !(nv30->dirty & (NV30_NEW_VERTEX | NV30_NEW_ARRAYS)))
|
||||||
nv30_update_user_vbufs(nv30);
|
nv30_update_user_vbufs(nv30);
|
||||||
|
|
||||||
nv30_state_validate(nv30, TRUE);
|
nv30_state_validate(nv30, ~0, TRUE);
|
||||||
if (nv30->draw_flags) {
|
if (nv30->draw_flags) {
|
||||||
nv30_render_vbo(pipe, info);
|
nv30_render_vbo(pipe, info);
|
||||||
return;
|
return;
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "draw/draw_context.h"
|
||||||
#include "util/u_dynarray.h"
|
#include "util/u_dynarray.h"
|
||||||
#include "tgsi/tgsi_parse.h"
|
#include "tgsi/tgsi_parse.h"
|
||||||
|
|
||||||
@@ -237,6 +238,10 @@ nv30_vp_state_delete(struct pipe_context *pipe, void *hwcso)
|
|||||||
|
|
||||||
if (vp->translated)
|
if (vp->translated)
|
||||||
nv30_vertprog_destroy(vp);
|
nv30_vertprog_destroy(vp);
|
||||||
|
|
||||||
|
if (vp->draw)
|
||||||
|
draw_delete_vertex_shader(nv30_context(pipe)->draw, vp->draw);
|
||||||
|
|
||||||
FREE((void *)vp->pipe.tokens);
|
FREE((void *)vp->pipe.tokens);
|
||||||
FREE(vp);
|
FREE(vp);
|
||||||
}
|
}
|
||||||
|
@@ -873,9 +873,8 @@ nvfx_vertprog_parse_decl_output(struct nvfx_vpc *vpc,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TGSI_SEMANTIC_EDGEFLAG:
|
case TGSI_SEMANTIC_EDGEFLAG:
|
||||||
/* not really an error just a fallback */
|
vpc->r_result[idx] = nvfx_reg(NVFXSR_NONE, 0);
|
||||||
NOUVEAU_ERR("cannot handle edgeflag output\n");
|
return TRUE;
|
||||||
return FALSE;
|
|
||||||
default:
|
default:
|
||||||
NOUVEAU_ERR("bad output semantic\n");
|
NOUVEAU_ERR("bad output semantic\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@@ -138,8 +138,11 @@ nv50_destroy(struct pipe_context *pipe)
|
|||||||
{
|
{
|
||||||
struct nv50_context *nv50 = nv50_context(pipe);
|
struct nv50_context *nv50 = nv50_context(pipe);
|
||||||
|
|
||||||
if (nv50_context_screen(nv50)->cur_ctx == nv50)
|
if (nv50->screen->cur_ctx == nv50) {
|
||||||
nv50_context_screen(nv50)->cur_ctx = NULL;
|
nv50->screen->cur_ctx = NULL;
|
||||||
|
/* Save off the state in case another context gets created */
|
||||||
|
nv50->screen->save_state = nv50->state;
|
||||||
|
}
|
||||||
nouveau_pushbuf_bufctx(nv50->base.pushbuf, NULL);
|
nouveau_pushbuf_bufctx(nv50->base.pushbuf, NULL);
|
||||||
nouveau_pushbuf_kick(nv50->base.pushbuf, nv50->base.pushbuf->channel);
|
nouveau_pushbuf_kick(nv50->base.pushbuf, nv50->base.pushbuf->channel);
|
||||||
|
|
||||||
@@ -290,6 +293,10 @@ nv50_create(struct pipe_screen *pscreen, void *priv)
|
|||||||
pipe->get_sample_position = nv50_context_get_sample_position;
|
pipe->get_sample_position = nv50_context_get_sample_position;
|
||||||
|
|
||||||
if (!screen->cur_ctx) {
|
if (!screen->cur_ctx) {
|
||||||
|
/* Restore the last context's state here, normally handled during
|
||||||
|
* context switch
|
||||||
|
*/
|
||||||
|
nv50->state = screen->save_state;
|
||||||
screen->cur_ctx = nv50;
|
screen->cur_ctx = nv50;
|
||||||
nouveau_pushbuf_bufctx(screen->base.pushbuf, nv50->bufctx);
|
nouveau_pushbuf_bufctx(screen->base.pushbuf, nv50->bufctx);
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user