Compare commits
497 Commits
mesa-23.0.
...
7.9
Author | SHA1 | Date | |
---|---|---|---|
|
5078cb6858 | ||
|
025d348dc1 | ||
|
2bf24ffaff | ||
|
02e7aa6cea | ||
|
55bf1244e3 | ||
|
70d5758479 | ||
|
72b8f19fa6 | ||
|
e004ac273d | ||
|
9cbc705e83 | ||
|
858db8cd4e | ||
|
d8802cd242 | ||
|
7c4cc8d2b9 | ||
|
a6a5772250 | ||
|
9bcc214159 | ||
|
e03abf70cd | ||
|
0c6fbf66cd | ||
|
14b9e91d01 | ||
|
ff7e6622fc | ||
|
bde5310339 | ||
|
4f362e0494 | ||
|
5408ccb09f | ||
|
203624128c | ||
|
ea95bf7d89 | ||
|
b8050add56 | ||
|
4633054b8b | ||
|
897e464a5d | ||
|
0140b830af | ||
|
9e2c9cdf48 | ||
|
e3dcb53e6e | ||
|
6b46754bc0 | ||
|
7397c034ac | ||
|
39149172c8 | ||
|
c8bd053d3a | ||
|
7272f8fb18 | ||
|
c91d217ff7 | ||
|
e2baddb653 | ||
|
20c7067257 | ||
|
ca76f4f6aa | ||
|
c7305375d1 | ||
|
dea5e972ff | ||
|
c198d29fbe | ||
|
90292b8001 | ||
|
6ea13078fb | ||
|
48d44713f9 | ||
|
351814a21c | ||
|
a6909b6bd3 | ||
|
7e9d853665 | ||
|
ca5cf9bf66 | ||
|
dfae3ffa0f | ||
|
2b41289691 | ||
|
42c3e00bdb | ||
|
0ebbfa4335 | ||
|
fc5889a528 | ||
|
a5b6d8ec4d | ||
|
6eb1f39b55 | ||
|
5e987d0849 | ||
|
9fe29f34f3 | ||
|
24a9d95ec7 | ||
|
38c93ba921 | ||
|
1156006e4a | ||
|
7be5744b5b | ||
|
c73bedd191 | ||
|
bf66888a81 | ||
|
808ba96f3e | ||
|
cf2076f89d | ||
|
e1e829689d | ||
|
3df97ee70c | ||
|
7d6d3d6133 | ||
|
a068f7a2df | ||
|
d72c16a0d3 | ||
|
2eb4816939 | ||
|
8cf57be878 | ||
|
bf50184f42 | ||
|
4d2a725196 | ||
|
bcfa054b29 | ||
|
499936406b | ||
|
56c63dba48 | ||
|
9c8d677a16 | ||
|
f8d1b4fd26 | ||
|
3eda10aebf | ||
|
215ec57e69 | ||
|
33aee8177e | ||
|
c9d5d6ebc6 | ||
|
e63f8638cd | ||
|
ae775f3f37 | ||
|
bd0457346f | ||
|
161e36c0f7 | ||
|
4996e4a845 | ||
|
b093c9939e | ||
|
87a02b952b | ||
|
1bac4815a8 | ||
|
ffd9033227 | ||
|
439c298595 | ||
|
cd42dda3a5 | ||
|
c2b76d966e | ||
|
a28050de4f | ||
|
9c122ce963 | ||
|
f0eff3061c | ||
|
5a79a6dc04 | ||
|
652ceece0e | ||
|
e39aa1966b | ||
|
ba764ae5b1 | ||
|
3959f9f7c8 | ||
|
fa5c4b988a | ||
|
0a218b00e7 | ||
|
8198e26969 | ||
|
1b641f1b32 | ||
|
8a9e6a57d0 | ||
|
279c03b98f | ||
|
edfe056747 | ||
|
8ad9670866 | ||
|
09cb5815ae | ||
|
d1424f0185 | ||
|
7e43495053 | ||
|
246716c8f6 | ||
|
8159bef77f | ||
|
d8392a2ca8 | ||
|
ac270e43e6 | ||
|
fc09445c87 | ||
|
0f3a9643c6 | ||
|
59422a1716 | ||
|
231e72cdbd | ||
|
da623c9c44 | ||
|
175f3c9674 | ||
|
4e4a9d4050 | ||
|
f7993b66a6 | ||
|
7f1a7a26e0 | ||
|
cdcc5da9fe | ||
|
5afd1d6ac2 | ||
|
c9954dab04 | ||
|
e33d9b48c4 | ||
|
f5bef74066 | ||
|
5e8523895a | ||
|
ccc11aacbb | ||
|
9acbde11f5 | ||
|
6c6894eac7 | ||
|
41d4af17a1 | ||
|
bf3932aad6 | ||
|
2b1150170a | ||
|
a46bc59b27 | ||
|
1f34edbbde | ||
|
427d574920 | ||
|
13711c8a5a | ||
|
3ddf406530 | ||
|
a246791c20 | ||
|
b481b8059d | ||
|
6fc2c15dbd | ||
|
f5819379ed | ||
|
dbc19fe94c | ||
|
6292060193 | ||
|
378910ab97 | ||
|
2925a5a1f5 | ||
|
b632543289 | ||
|
9e15c878bb | ||
|
ab6c7bbf4e | ||
|
e4c1bcacef | ||
|
179edc673b | ||
|
48e81e3b9e | ||
|
1785904c5c | ||
|
28d47fed61 | ||
|
df033be3f7 | ||
|
ef2f4b5469 | ||
|
8d1e0de5f7 | ||
|
5f9c50053c | ||
|
7757980139 | ||
|
dab59f70e6 | ||
|
4200c6bae4 | ||
|
67aeab0b77 | ||
|
f912245ed1 | ||
|
42a9472dc6 | ||
|
234144b48d | ||
|
3d90628138 | ||
|
d0f0a6920b | ||
|
110c49fddd | ||
|
c438a09b4c | ||
|
0ab166d556 | ||
|
b50658c804 | ||
|
3c8dd6a8de | ||
|
801e26a02a | ||
|
247774085c | ||
|
d5d573b592 | ||
|
54c2846f23 | ||
|
8941450010 | ||
|
0ff45dd5d7 | ||
|
4e7cdca57a | ||
|
69cc356832 | ||
|
0d98ceb4bf | ||
|
40390b80e9 | ||
|
7ffeced927 | ||
|
b8c16ee7b1 | ||
|
f5435ec3a9 | ||
|
a3740ba31e | ||
|
166da97889 | ||
|
2fb170c90f | ||
|
4f2f3440d0 | ||
|
760288bec1 | ||
|
84e7dd0114 | ||
|
9d1c6dd79b | ||
|
47552b2c66 | ||
|
edfe057f94 | ||
|
a4cda571f0 | ||
|
ecb68d51aa | ||
|
be1f4cfd96 | ||
|
7b6b66d617 | ||
|
2b4277dcf3 | ||
|
585fa612c9 | ||
|
b8e73354d9 | ||
|
154d0a3e7e | ||
|
7c0ff4a5df | ||
|
d192179605 | ||
|
b2cd388b79 | ||
|
bb2cd98e51 | ||
|
d9d4f22e65 | ||
|
d347b90b94 | ||
|
23a868930c | ||
|
1e88b3461a | ||
|
573c78803d | ||
|
5650cc462d | ||
|
54a596e34a | ||
|
2127692542 | ||
|
0795cb71fc | ||
|
cefccebd89 | ||
|
927c752dd6 | ||
|
0b4287a687 | ||
|
69d19cb84b | ||
|
0ab2bb8270 | ||
|
1e2e387a15 | ||
|
dcc7a8a80a | ||
|
0a8ad737e7 | ||
|
4b19941399 | ||
|
1cfd517b15 | ||
|
a0d5da96b5 | ||
|
50ec3c74e3 | ||
|
d595657e5a | ||
|
c055239bae | ||
|
6b96b002c8 | ||
|
ce8f4f266e | ||
|
e0dbd44a00 | ||
|
67b7a3844a | ||
|
69cc62b907 | ||
|
8c8c1b2c99 | ||
|
9b8e56a502 | ||
|
5a8d1d5b72 | ||
|
029252a448 | ||
|
4b30da86a7 | ||
|
da5d6c42c0 | ||
|
0c56721cfc | ||
|
6333f1d224 | ||
|
639e65e054 | ||
|
8454f931d6 | ||
|
0da1c7b90f | ||
|
6e5907c390 | ||
|
4c1db8c7a4 | ||
|
edd9b9350e | ||
|
5c71690096 | ||
|
44df2b0844 | ||
|
5b28db24ff | ||
|
2f4af9e37b | ||
|
34e0da8e73 | ||
|
1ee289960f | ||
|
22ba37aae2 | ||
|
3b200dd3c5 | ||
|
5f05ade503 | ||
|
9ef05d27a6 | ||
|
1d63a77177 | ||
|
554dbaa8a0 | ||
|
1c089271fd | ||
|
2c57c020a3 | ||
|
2f398485f2 | ||
|
e5ad6c3366 | ||
|
1c15fb4414 | ||
|
a138a59966 | ||
|
6fc544dd50 | ||
|
42e9750975 | ||
|
72a3bddb24 | ||
|
e8bc8d6a5c | ||
|
dc4956922d | ||
|
b486197013 | ||
|
2cb8522523 | ||
|
564a6a15fe | ||
|
7d280a3bbe | ||
|
988a35c7f7 | ||
|
4e7548aafc | ||
|
277655d7fa | ||
|
d42db5b738 | ||
|
62f2b7e759 | ||
|
44ba61c518 | ||
|
1c746ba9d4 | ||
|
c9661d695b | ||
|
aa7bf2d88e | ||
|
9d644e7b95 | ||
|
54047fcd8d | ||
|
bcdd93e3a7 | ||
|
75065b0b55 | ||
|
8ae23176d6 | ||
|
7d0c0d32b5 | ||
|
e5c78c2003 | ||
|
930c168df6 | ||
|
5551faf649 | ||
|
80ff25b628 | ||
|
7c8715ef0a | ||
|
06fa5d81da | ||
|
b86bf31b05 | ||
|
68afe8f685 | ||
|
0d060d9933 | ||
|
aa5574e78f | ||
|
5105e3d415 | ||
|
feacfc4a93 | ||
|
b6ae3d7b23 | ||
|
3db8f85446 | ||
|
3e4ed38791 | ||
|
acee46d9a1 | ||
|
97805cfedd | ||
|
9b1ac4d127 | ||
|
78ccca5a69 | ||
|
2fe82c281d | ||
|
773e8fadc8 | ||
|
7f2d1280e7 | ||
|
075640e37e | ||
|
fb7a095785 | ||
|
f245bb4c9c | ||
|
cc71f76be2 | ||
|
47887b1efe | ||
|
764f9974e5 | ||
|
aa2b751abb | ||
|
6f5c6e5cc5 | ||
|
e5b2a8d350 | ||
|
da580c734f | ||
|
db7de707a3 | ||
|
bce3917192 | ||
|
2eac388bfe | ||
|
6730630804 | ||
|
d5618c55ec | ||
|
ee6417f97f | ||
|
14bae5cdf2 | ||
|
799e6d4d15 | ||
|
6936fbc039 | ||
|
0a060c8fb0 | ||
|
34c518be52 | ||
|
2b4a05e74a | ||
|
7afce798ee | ||
|
ab502d0d6b | ||
|
548a50caae | ||
|
11e290daa4 | ||
|
889cb2539b | ||
|
242facde45 | ||
|
73be0dfe03 | ||
|
0b300a4e3d | ||
|
586797d7a8 | ||
|
9b646b1fd3 | ||
|
dc8e22e4f0 | ||
|
21078eef10 | ||
|
968a9ec76e | ||
|
2cdfda8851 | ||
|
09d89dc95b | ||
|
15ad34f012 | ||
|
094fe2aa23 | ||
|
ba889a2b3e | ||
|
71cc467f4c | ||
|
d6e2b707ba | ||
|
0ab9d8d94b | ||
|
759e9fb737 | ||
|
4af00f1a5e | ||
|
1c8795075f | ||
|
5d43c78d03 | ||
|
9f076a0848 | ||
|
9bab8ca4f8 | ||
|
f6eb5d991c | ||
|
f282d72678 | ||
|
e1918fd5d5 | ||
|
fcf5819945 | ||
|
c584318a21 | ||
|
b24238c49a | ||
|
5d3a4317e8 | ||
|
836b44b2c8 | ||
|
83854a9c84 | ||
|
b4824096b0 | ||
|
71bdc82c19 | ||
|
aaf7f78dfa | ||
|
5c7a7d0b09 | ||
|
f736d85a5a | ||
|
40dc275431 | ||
|
3dd52d51ce | ||
|
e00bb8732c | ||
|
11215cd535 | ||
|
6831cf67d1 | ||
|
ece465219f | ||
|
0dc83cc437 | ||
|
922d7e1025 | ||
|
4afb1c8451 | ||
|
ad52c2b773 | ||
|
364b6e0709 | ||
|
32c1dc76af | ||
|
f9ad343cf7 | ||
|
76469d710c | ||
|
6eec2dbfc8 | ||
|
a4f126beaf | ||
|
0d5400519e | ||
|
36722d7673 | ||
|
3c26f3883a | ||
|
1975d851e8 | ||
|
f4f1e0d108 | ||
|
cda661fd1c | ||
|
1ab0d45c9f | ||
|
269dd51162 | ||
|
f60c28e083 | ||
|
aebd78f607 | ||
|
0391eaf088 | ||
|
7436872dce | ||
|
7a297bd926 | ||
|
6c3a8aeb27 | ||
|
5c3be43cd2 | ||
|
5906b9ac51 | ||
|
89ed679a9e | ||
|
7d154de048 | ||
|
2a7ed4ba96 | ||
|
8ad0396108 | ||
|
61653b488d | ||
|
7e62335f35 | ||
|
b8a60c84aa | ||
|
9f221e738d | ||
|
5c78e931c2 | ||
|
361084ac4b | ||
|
9409b544cc | ||
|
7261c3973d | ||
|
bb4c9e0969 | ||
|
aa05753059 | ||
|
09085ada5d | ||
|
77cc2a4e17 | ||
|
96085dc41a | ||
|
a128b62a35 | ||
|
b756100892 | ||
|
3ad0279344 | ||
|
97cfa1240c | ||
|
6b0c280660 | ||
|
b437c9102f | ||
|
4ec818ea4a | ||
|
80a6cbfea3 | ||
|
ec2031563a | ||
|
b7d4f08f4e | ||
|
2fc2b89680 | ||
|
b29289a61c | ||
|
728829ab63 | ||
|
9753ee3f3e | ||
|
2db5398449 | ||
|
ee8a96707a | ||
|
22dcee8da2 | ||
|
1b622bfbee | ||
|
2bb2efd7b2 | ||
|
a19f0fb50b | ||
|
8df8bb43c7 | ||
|
d2b6502c93 | ||
|
e68ec2212f | ||
|
c0f82e619c | ||
|
7f95c59509 | ||
|
6f310f379b | ||
|
f279480df2 | ||
|
d382c51a23 | ||
|
cdb3f23d8a | ||
|
8f4c99a9af | ||
|
5285100502 | ||
|
56dc7ca916 | ||
|
902dfdaa86 | ||
|
c98ce41de3 | ||
|
3cdfc62523 | ||
|
2606105cc5 | ||
|
141dbbfc78 | ||
|
e678c3f4e1 | ||
|
1b90889eb4 | ||
|
a9fceb6979 | ||
|
febd353bcd | ||
|
0f1faa9c7b | ||
|
b247620854 | ||
|
d36344f900 | ||
|
202c1279c6 | ||
|
f6e811a7d0 | ||
|
bd009df1cc | ||
|
d6df0cdcca | ||
|
52f6be0688 | ||
|
b73cfde5ce | ||
|
d7500ac4df | ||
|
83917660f1 | ||
|
69f67f5ded | ||
|
a42527be33 | ||
|
d169a67ad1 | ||
|
be16a35438 | ||
|
d46b7c9f6f | ||
|
5d02503467 | ||
|
e3b89388ff | ||
|
d6538baa3b | ||
|
16a023ad7d | ||
|
029eb8e764 | ||
|
71b4054a6c | ||
|
8e8a42ffc5 | ||
|
fd4c6bd135 | ||
|
5d4409e0e5 | ||
|
26e63a431d |
23
Makefile
23
Makefile
@@ -180,7 +180,7 @@ ultrix-gcc:
|
||||
|
||||
# Rules for making release tarballs
|
||||
|
||||
VERSION=7.9-devel
|
||||
VERSION=7.9.2
|
||||
DIRECTORY = Mesa-$(VERSION)
|
||||
LIB_NAME = MesaLib-$(VERSION)
|
||||
GLUT_NAME = MesaGLUT-$(VERSION)
|
||||
@@ -329,6 +329,8 @@ GALLIUM_FILES = \
|
||||
$(DIRECTORY)/src/gallium/Makefile.template \
|
||||
$(DIRECTORY)/src/gallium/SConscript \
|
||||
$(DIRECTORY)/src/gallium/targets/Makefile.dri \
|
||||
$(DIRECTORY)/src/gallium/targets/Makefile.xorg \
|
||||
$(DIRECTORY)/src/gallium/targets/SConscript.dri \
|
||||
$(DIRECTORY)/src/gallium/*/Makefile \
|
||||
$(DIRECTORY)/src/gallium/*/SConscript \
|
||||
$(DIRECTORY)/src/gallium/*/*/Makefile \
|
||||
@@ -342,25 +344,34 @@ GALLIUM_FILES = \
|
||||
$(DIRECTORY)/src/gallium/*/*/*/*.[ch] \
|
||||
$(DIRECTORY)/src/gallium/*/*/*/*.py
|
||||
|
||||
APPLE_DRI_FILES = \
|
||||
$(DIRECTORY)/src/glx/apple/Makefile \
|
||||
$(DIRECTORY)/src/glx/apple/*.[ch] \
|
||||
$(DIRECTORY)/src/glx/apple/*.tcl \
|
||||
$(DIRECTORY)/src/glx/apple/apple_exports.list \
|
||||
$(DIRECTORY)/src/glx/apple/GL_aliases \
|
||||
$(DIRECTORY)/src/glx/apple/GL_extensions \
|
||||
$(DIRECTORY)/src/glx/apple/GL_noop \
|
||||
$(DIRECTORY)/src/glx/apple/GL_promoted \
|
||||
$(DIRECTORY)/src/glx/apple/specs/*.spec \
|
||||
$(DIRECTORY)/src/glx/apple/specs/*.tm
|
||||
|
||||
DRI_FILES = \
|
||||
$(DIRECTORY)/include/GL/internal/dri_interface.h \
|
||||
$(DIRECTORY)/include/GL/internal/glcore.h \
|
||||
$(DIRECTORY)/include/GL/internal/sarea.h \
|
||||
$(DIRECTORY)/src/glx/Makefile \
|
||||
$(DIRECTORY)/src/glx/Makefile \
|
||||
$(DIRECTORY)/src/glx/*.[ch] \
|
||||
$(APPLE_DRI_FILES) \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/Makefile.template \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/dri.pc.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.po \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*.cpp \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/*/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/server/*.[ch]
|
||||
$(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile
|
||||
|
||||
SGI_GLU_FILES = \
|
||||
$(DIRECTORY)/src/glu/Makefile \
|
||||
|
@@ -34,9 +34,6 @@ LLVM_LIBS = @LLVM_LIBS@
|
||||
GLW_CFLAGS = @GLW_CFLAGS@
|
||||
GLUT_CFLAGS = @GLUT_CFLAGS@
|
||||
|
||||
TALLOC_LIBS = @TALLOC_LIBS@
|
||||
TALLOC_CFLAGS = @TALLOC_CFLAGS@
|
||||
|
||||
# dlopen
|
||||
DLOPEN_LIBS = @DLOPEN_LIBS@
|
||||
|
||||
@@ -53,7 +50,7 @@ MKDEP_OPTIONS = @MKDEP_OPTIONS@
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
# Python and flags (generally only needed by the developers)
|
||||
PYTHON2 = python
|
||||
PYTHON2 = @PYTHON2@
|
||||
PYTHON_FLAGS = -t -O -O
|
||||
|
||||
# Library names (base name)
|
||||
|
@@ -31,21 +31,23 @@ CXXFLAGS = -ggdb3 -Os -Wall -fno-strict-aliasing \
|
||||
-I$(INSTALL_DIR)/include -I$(X11_DIR)/include $(OPT_FLAGS) $(PIC_FLAGS) $(ARCH_FLAGS) $(ASM_FLAGS) $(DEFINES)
|
||||
|
||||
# Library names (actual file names)
|
||||
GL_LIB_NAME = libGL.dylib
|
||||
GLU_LIB_NAME = libGLU.dylib
|
||||
GLUT_LIB_NAME = libglut.dylib
|
||||
GLW_LIB_NAME = libGLw.dylib
|
||||
OSMESA_LIB_NAME = libOSMesa.dylib
|
||||
GL_LIB_NAME = lib$(GL_LIB).dylib
|
||||
GLU_LIB_NAME = lib$(GLU_LIB).dylib
|
||||
GLUT_LIB_NAME = lib$(GLUT_LIB).dylib
|
||||
GLW_LIB_NAME = lib$(GLW_LIB).dylib
|
||||
OSMESA_LIB_NAME = lib$(OSMESA_LIB).dylib
|
||||
VG_LIB_NAME = lib$(VG_LIB).dylib
|
||||
|
||||
# globs used to install the lib and all symlinks
|
||||
GL_LIB_GLOB = libGL.*dylib
|
||||
GLU_LIB_GLOB = libGLU.*dylib
|
||||
GLUT_LIB_GLOB = libglut.*dylib
|
||||
GLW_LIB_GLOB = libGLw.*dylib
|
||||
OSMESA_LIB_GLOB = libOSMesa.*dylib
|
||||
GL_LIB_GLOB = lib$(GL_LIB).*dylib
|
||||
GLU_LIB_GLOB = lib$(GLU_LIB).*dylib
|
||||
GLUT_LIB_GLOB = lib$(GLUT_LIB).*dylib
|
||||
GLW_LIB_GLOB = lib$(GLW_LIB).*dylib
|
||||
OSMESA_LIB_GLOB = lib$(OSMESA_LIB).*dylib
|
||||
VG_LIB_GLOB = lib$(VG_LIB).*dylib
|
||||
|
||||
GL_LIB_DEPS = -L$(INSTALL_DIR)/$(LIB_DIR) -L$(X11_DIR)/$(LIB_DIR) -lX11 -lXext -lm -lpthread
|
||||
OSMESA_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB)
|
||||
OSMESA_LIB_DEPS =
|
||||
GLU_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB)
|
||||
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L$(INSTALL_DIR)/$(LIB_DIR) -L$(X11_DIR)/$(LIB_DIR) -lX11 -lXmu -lXi -lXext
|
||||
GLW_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -L$(INSTALL_DIR)/$(LIB_DIR) -L$(X11_DIR)/$(LIB_DIR) -lX11 -lXt
|
||||
@@ -57,3 +59,5 @@ GLU_DIRS = sgi
|
||||
DRIVER_DIRS = osmesa
|
||||
#DRIVER_DIRS = dri
|
||||
DRI_DIRS = swrast
|
||||
GALLIUM_DRIVERS_DIRS = softpipe trace rbug noop identity galahad failover
|
||||
#GALLIUM_DRIVERS_DIRS += llvmpipe
|
||||
|
@@ -82,9 +82,6 @@ GLESv1_CM_LIB_GLOB = $(GLESv1_CM_LIB_NAME)*
|
||||
GLESv2_LIB_GLOB = $(GLESv2_LIB_NAME)*
|
||||
VG_LIB_GLOB = $(VG_LIB_NAME)*
|
||||
|
||||
TALLOC_LIBS = `pkg-config --libs talloc`
|
||||
TALLOC_CFLAGS = `pkg-config --cflags talloc`
|
||||
|
||||
# Optional assembly language optimization files for libGL
|
||||
MESA_ASM_SOURCES =
|
||||
|
||||
@@ -119,7 +116,7 @@ EGL_CLIENT_APIS = $(GL_LIB)
|
||||
|
||||
# Library dependencies
|
||||
#EXTRA_LIB_PATH ?=
|
||||
GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread $(TALLOC_LIBS)
|
||||
GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread
|
||||
EGL_LIB_DEPS = $(EXTRA_LIB_PATH) -ldl -lpthread
|
||||
OSMESA_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(TOP)/$(LIB_DIR) -l$(GL_LIB)
|
||||
GLU_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -lm
|
||||
|
@@ -45,7 +45,7 @@ EXTRA_LIB_PATH=-L/usr/X11R6/lib
|
||||
|
||||
LIBDRM_CFLAGS = $(shell pkg-config --cflags libdrm)
|
||||
LIBDRM_LIB = $(shell pkg-config --libs libdrm)
|
||||
DRI_LIB_DEPS = $(EXTRA_LIB_PATH) -lm -lpthread -lexpat -ldl -ltalloc $(LIBDRM_LIB)
|
||||
DRI_LIB_DEPS = $(EXTRA_LIB_PATH) -lm -lpthread -lexpat -ldl $(LIBDRM_LIB)
|
||||
GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lXxf86vm -lXdamage -lXfixes \
|
||||
-lm -lpthread -ldl $(LIBDRM_LIB)
|
||||
|
||||
|
@@ -41,4 +41,4 @@ else
|
||||
endif
|
||||
|
||||
LD = g++
|
||||
GL_LIB_DEPS = $(LLVM_LDFLAGS) $(LLVM_LIBS) $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread -ltalloc -lstdc++ -ludis86
|
||||
GL_LIB_DEPS = $(LLVM_LDFLAGS) $(LLVM_LIBS) $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread -lstdc++ -ludis86
|
||||
|
62
configure.ac
62
configure.ac
@@ -30,6 +30,7 @@ AC_PROG_CPP
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_CHECK_PROGS([MAKE], [gmake make])
|
||||
AC_CHECK_PROGS([PYTHON2], [python2 python])
|
||||
AC_PATH_PROG([MKDEP], [makedepend])
|
||||
AC_PATH_PROG([SED], [sed])
|
||||
|
||||
@@ -493,10 +494,6 @@ xxlib|xdri|xosmesa)
|
||||
;;
|
||||
esac
|
||||
|
||||
PKG_CHECK_MODULES([TALLOC], [talloc])
|
||||
AC_SUBST([TALLOC_LIBS])
|
||||
AC_SUBST([TALLOC_CFLAGS])
|
||||
|
||||
dnl
|
||||
dnl Driver specific build directories
|
||||
dnl
|
||||
@@ -608,8 +605,8 @@ xlib)
|
||||
GL_PC_LIB_PRIV="$GL_LIB_DEPS"
|
||||
GL_PC_CFLAGS="$X11_INCLUDES"
|
||||
fi
|
||||
GL_LIB_DEPS="$GL_LIB_DEPS $SELINUX_LIBS -lm -lpthread $TALLOC_LIBS"
|
||||
GL_PC_LIB_PRIV="$GL_PC_LIB_PRIV $SELINUX_LIBS -lm -lpthread $TALLOC_LIBS"
|
||||
GL_LIB_DEPS="$GL_LIB_DEPS $SELINUX_LIBS -lm -lpthread"
|
||||
GL_PC_LIB_PRIV="$GL_PC_LIB_PRIV $SELINUX_LIBS -lm -lpthread"
|
||||
|
||||
# if static, move the external libraries to the programs
|
||||
# and empty the libraries for libGL
|
||||
@@ -692,6 +689,11 @@ AC_SUBST([GLESv2_PC_LIB_PRIV])
|
||||
|
||||
AC_SUBST([HAVE_XF86VIDMODE])
|
||||
|
||||
PKG_CHECK_MODULES([LIBDRM_RADEON],
|
||||
[libdrm_radeon libdrm >= $LIBDRM_RADEON_REQUIRED],
|
||||
HAVE_LIBDRM_RADEON=yes,
|
||||
HAVE_LIBDRM_RADEON=no)
|
||||
|
||||
dnl
|
||||
dnl More X11 setup
|
||||
dnl
|
||||
@@ -896,7 +898,7 @@ if test "$mesa_driver" = dri; then
|
||||
[AC_MSG_ERROR([Expat required for DRI.])])
|
||||
|
||||
# put all the necessary libs together
|
||||
DRI_LIB_DEPS="$SELINUX_LIBS $LIBDRM_LIBS $EXPAT_LIB -lm -lpthread $DLOPEN_LIBS $TALLOC_LIBS"
|
||||
DRI_LIB_DEPS="$SELINUX_LIBS $LIBDRM_LIBS $EXPAT_LIB -lm -lpthread $DLOPEN_LIBS"
|
||||
fi
|
||||
AC_SUBST([DRI_DIRS])
|
||||
AC_SUBST([EXPAT_INCLUDES])
|
||||
@@ -910,12 +912,7 @@ esac
|
||||
|
||||
case $DRI_DIRS in
|
||||
*radeon*|*r200*|*r300*|*r600*)
|
||||
PKG_CHECK_MODULES([LIBDRM_RADEON],
|
||||
[libdrm_radeon libdrm >= $LIBDRM_RADEON_REQUIRED],
|
||||
HAVE_LIBDRM_RADEON=yes,
|
||||
HAVE_LIBDRM_RADEON=no)
|
||||
|
||||
if test "$HAVE_LIBDRM_RADEON" = yes; then
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
RADEON_CFLAGS="-DHAVE_LIBDRM_RADEON=1 $LIBDRM_RADEON_CFLAGS"
|
||||
RADEON_LDFLAGS=$LIBDRM_RADEON_LIBS
|
||||
fi
|
||||
@@ -974,12 +971,12 @@ case "$DRIVER_DIRS" in
|
||||
*osmesa*)
|
||||
# only link libraries with osmesa if shared
|
||||
if test "$enable_static" = no; then
|
||||
OSMESA_LIB_DEPS="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS $TALLOC_LIBS"
|
||||
OSMESA_LIB_DEPS="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS"
|
||||
else
|
||||
OSMESA_LIB_DEPS=""
|
||||
fi
|
||||
OSMESA_MESA_DEPS=""
|
||||
OSMESA_PC_LIB_PRIV="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS $TALLOC_LIBS"
|
||||
OSMESA_PC_LIB_PRIV="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS"
|
||||
;;
|
||||
esac
|
||||
AC_SUBST([OSMESA_LIB_DEPS])
|
||||
@@ -1363,7 +1360,7 @@ fi
|
||||
AC_ARG_WITH([egl-platforms],
|
||||
[AS_HELP_STRING([--with-egl-platforms@<:@=DIRS...@:>@],
|
||||
[comma delimited native platforms libEGL supports, e.g.
|
||||
"x11,kms" @<:@default=auto@:>@])],
|
||||
"x11,drm" @<:@default=auto@:>@])],
|
||||
[with_egl_platforms="$withval"],
|
||||
[with_egl_platforms=yes])
|
||||
AC_ARG_WITH([egl-displays],
|
||||
@@ -1376,6 +1373,9 @@ case "$with_egl_platforms" in
|
||||
yes)
|
||||
if test "x$enable_egl" = xyes && test "x$mesa_driver" != xosmesa; then
|
||||
EGL_PLATFORMS="x11"
|
||||
if test "$mesa_driver" = dri; then
|
||||
EGL_PLATFORMS="$EGL_PLATFORMS drm"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -1518,18 +1518,28 @@ elif test "x$enable_gallium_i965" = xauto; then
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl Gallium Radeon configuration
|
||||
dnl Gallium Radeon r300g configuration
|
||||
dnl
|
||||
AC_ARG_ENABLE([gallium-radeon],
|
||||
[AS_HELP_STRING([--enable-gallium-radeon],
|
||||
[build gallium radeon @<:@default=disabled@:>@])],
|
||||
[enable_gallium_radeon="$enableval"],
|
||||
[enable_gallium_radeon=auto])
|
||||
if test "x$enable_gallium_radeon" = xauto; then
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
gallium_check_st "radeon/drm" "dri-r300"
|
||||
else
|
||||
AC_MSG_WARN([libdrm_radeon is missing, not building gallium-radeon (r300)])
|
||||
fi
|
||||
fi
|
||||
if test "x$enable_gallium_radeon" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
gallium_check_st "radeon/drm" "dri-r300" "xorg-radeon"
|
||||
elif test "x$enable_gallium_radeon" = xauto; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
|
||||
gallium_check_st "radeon/drm" "dri-r300" "xorg-radeon"
|
||||
else
|
||||
AC_MSG_ERROR([libdrm_radeon is missing, cannot build gallium-radeon (r300)])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl
|
||||
@@ -1541,8 +1551,12 @@ AC_ARG_ENABLE([gallium-r600],
|
||||
[enable_gallium_r600="$enableval"],
|
||||
[enable_gallium_r600=auto])
|
||||
if test "x$enable_gallium_r600" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r600"
|
||||
gallium_check_st "r600/drm" "dri-r600"
|
||||
if test "x$HAVE_LIBDRM_RADEON" = xyes; then
|
||||
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r600"
|
||||
gallium_check_st "r600/drm" "dri-r600"
|
||||
else
|
||||
AC_MSG_ERROR([libdrm_radeon is missing, cannot build gallium-r600])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl
|
||||
@@ -1670,6 +1684,8 @@ echo ""
|
||||
echo " CFLAGS: $cflags"
|
||||
echo " CXXFLAGS: $cxxflags"
|
||||
echo " Macros: $defines"
|
||||
echo ""
|
||||
echo " PYTHON2: $PYTHON2"
|
||||
|
||||
echo ""
|
||||
echo " Run '${MAKE-make}' to build Mesa"
|
||||
|
@@ -145,7 +145,7 @@ Make sure the values in src/mesa/main/version.h are correct.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Update the docs/news.html file and docs/download.html files.
|
||||
Update docs/news.html.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -208,10 +208,11 @@ sftp USERNAME,mesa3d@web.sourceforge.net
|
||||
|
||||
<p>
|
||||
Make an announcement on the mailing lists:
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>,
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
|
||||
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>,
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
|
||||
and
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
|
||||
</p>
|
||||
|
||||
|
||||
|
@@ -72,13 +72,13 @@ drivers will be installed to <code>${libdir}/egl</code>.</p>
|
||||
<li><code>--with-egl-platforms</code>
|
||||
|
||||
<p>List the platforms (window systems) to support. Its argument is a comma
|
||||
seprated string such as <code>--with-egl-platforms=x11,kms</code>. It decides
|
||||
seprated string such as <code>--with-egl-platforms=x11,drm</code>. It decides
|
||||
the platforms a driver may support. The first listed platform is also used by
|
||||
the main library to decide the native platform: the platform the EGL native
|
||||
types such as <code>EGLNativeDisplayType</code> or
|
||||
<code>EGLNativeWindowType</code> defined for.</p>
|
||||
|
||||
<p>The available platforms are <code>x11</code>, <code>kms</code>,
|
||||
<p>The available platforms are <code>x11</code>, <code>drm</code>,
|
||||
<code>fbdev</code>, and <code>gdi</code>. The <code>gdi</code> platform can
|
||||
only be built with SCons.</p>
|
||||
|
||||
|
@@ -9,16 +9,38 @@
|
||||
<H1>Environment Variables</H1>
|
||||
|
||||
<p>
|
||||
Mesa supports the following environment variables:
|
||||
Normally, no environment variables need to be set. Most of the environment
|
||||
variables used by Mesa/Gallium are for debugging purposes, but they can
|
||||
sometimes be useful for debugging end-user issues.
|
||||
</p>
|
||||
|
||||
|
||||
<H2>LibGL environment variables</H2>
|
||||
|
||||
<ul>
|
||||
<li>LIBGL_DEBUG - If defined debug information will be printed to stderr.
|
||||
If set to 'verbose' additional information will be printed.
|
||||
<li>LIBGL_DRIVERS_PATH - colon-separated list of paths to search for DRI drivers
|
||||
<li>LIBGL_ALWAYS_INDIRECT - forces an indirect rendering context/connection.
|
||||
<li>LIBGL_ALWAYS_SOFTWARE - if set, always use software rendering
|
||||
<li>LIBGL_NO_DRAWARRAYS - if set do not use DrawArrays GLX protocol (for debugging)
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
<H2>Core Mesa environment variables</H2>
|
||||
|
||||
<ul>
|
||||
<li>MESA_NO_ASM - if set, disables all assembly language optimizations
|
||||
<li>MESA_NO_MMX - if set, disables Intel MMX optimizations
|
||||
<li>MESA_NO_3DNOW - if set, disables AMD 3DNow! optimizations
|
||||
<li>MESA_NO_SSE - if set, disables Intel SSE optimizations
|
||||
<li>MESA_DEBUG - if set, error messages are printed to stderr.
|
||||
If the value of MESA_DEBUG is "FP" floating point arithmetic errors will
|
||||
generate exceptions.
|
||||
<li>MESA_DEBUG - if set, error messages are printed to stderr. For example,
|
||||
if the application generates a GL_INVALID_ENUM error, a corresponding error
|
||||
message indicating where the error occured, and possibly why, will be
|
||||
printed to stderr.<br>
|
||||
If the value of MESA_DEBUG is 'FP' floating point arithmetic errors will
|
||||
generate exceptions.
|
||||
<li>MESA_NO_DITHER - if set, disables dithering, overriding glEnable(GL_DITHER)
|
||||
<li>MESA_TEX_PROG - if set, implement conventional texture env modes with
|
||||
fragment programs (intended for developers only)
|
||||
@@ -28,11 +50,14 @@ Setting this variable automatically sets the MESA_TEX_PROG variable as well.
|
||||
<li>MESA_EXTENSION_OVERRIDE - can be used to enable/disable extensions.
|
||||
A value such as "GL_EXT_foo -GL_EXT_bar" will enable the GL_EXT_foo extension
|
||||
and disable the GL_EXT_bar extension.
|
||||
<li>MESA_GLSL - <a href="shading.html#envvars">shading language options</a>
|
||||
<li>MESA_GLSL - <a href="shading.html#envvars">shading language compiler options</a>
|
||||
</ul>
|
||||
|
||||
|
||||
<H2>Mesa Xlib driver environment variables</H2>
|
||||
|
||||
<p>
|
||||
The following are only applicable to the Xlib software driver.
|
||||
The following are only applicable to the Mesa Xlib software driver.
|
||||
See the <A HREF="xlibdriver.html">Xlib software driver page</A> for details.
|
||||
</p>
|
||||
<ul>
|
||||
@@ -51,9 +76,8 @@ See the <A HREF="xlibdriver.html">Xlib software driver page</A> for details.
|
||||
</ul>
|
||||
|
||||
|
||||
<p>
|
||||
These environment variables are for the Intel i945/i965 drivers:
|
||||
</p>
|
||||
<h2>i945/i965 driver environment variables (non-Gallium)</h2>
|
||||
|
||||
<ul>
|
||||
<li>INTEL_STRICT_CONFORMANCE - if set to 1, enable sw fallbacks to improve
|
||||
OpenGL conformance. If set to 2, always use software rendering.
|
||||
@@ -62,17 +86,71 @@ These environment variables are for the Intel i945/i965 drivers:
|
||||
</ul>
|
||||
|
||||
|
||||
<p>
|
||||
These environment variables are for the Radeon R300 driver:
|
||||
</p>
|
||||
<h2>Radeon R300 driver environment variables (non-Gallium)</h2>
|
||||
|
||||
<ul>
|
||||
<li>R300_NO_TCL - if set, disable hardware-accelerated Transform/Clip/Lighting.
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>EGL environment variables</h2>
|
||||
|
||||
<p>
|
||||
Mesa EGL supports different sets of environment variables. See the
|
||||
<a href="egl.html">Mesa EGL</a> page for the details.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>Gallium environment variables</h2>
|
||||
|
||||
<ul>
|
||||
<li>GALLIUM_PRINT_OPTIONS - if non-zero, print all the Gallium environment
|
||||
variables which are used, and their current values.
|
||||
<li>GALLIUM_NOSSE - if non-zero, do not use SSE runtime code generation for
|
||||
shader execution
|
||||
<li>GALLIUM_NOPPC - if non-zero, do not use PPC runtime code generation for
|
||||
shader execution
|
||||
<li>GALLIUM_DUMP_CPU - if non-zero, print information about the CPU on start-up
|
||||
<li>TGSI_PRINT_SANITY - if set, do extra sanity checking on TGSI shaders and
|
||||
print any errors to stderr.
|
||||
<LI>DRAW_FSE - ???
|
||||
<LI>DRAW_NO_FSE - ???
|
||||
<li>DRAW_USE_LLVM - if set to zero, the draw module will not use LLVM to execute
|
||||
shaders, vertex fetch, etc.
|
||||
</ul>
|
||||
|
||||
<h3>Softpipe driver environment variables</h3>
|
||||
<ul>
|
||||
<li>SOFTPIPE_DUMP_FS - if set, the softpipe driver will print fragment shaders
|
||||
to stderr
|
||||
<li>SOFTPIPE_DUMP_GS - if set, the softpipe driver will print geometry shaders
|
||||
to stderr
|
||||
<li>SOFTPIPE_NO_RAST - if set, rasterization is no-op'd. For profiling purposes.
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>LLVMpipe driver environment variables</h3>
|
||||
<ul>
|
||||
<li>LP_NO_RAST - if set LLVMpipe will no-op rasterization
|
||||
<li>LP_DEBUG - a comma-separated list of debug options is acceptec. See the
|
||||
source code for details.
|
||||
<li>LP_PERF - a comma-separated list of options to selectively no-op various
|
||||
parts of the driver. See the source code for details.
|
||||
<li>LP_NUM_THREADS - an integer indicating how many threads to use for rendering.
|
||||
Zero turns of threading completely. The default value is the number of CPU
|
||||
cores present.
|
||||
</ul>
|
||||
|
||||
|
||||
<p>
|
||||
Other Gallium drivers have their own environment variables. These may change
|
||||
frequently so the source code should be consulted for details.
|
||||
</p>
|
||||
|
||||
|
||||
<br>
|
||||
<br>
|
||||
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@@ -9,6 +9,9 @@
|
||||
<center><h1>Mesa fbdev/DRI Drivers</h1></center>
|
||||
<br>
|
||||
|
||||
<h1><center>NOTE: this information is obsolete and will be removed at
|
||||
a future date</center></h1>
|
||||
|
||||
<h1>1. Introduction</h1>
|
||||
|
||||
<p>
|
||||
@@ -22,7 +25,7 @@ Contributors to this project include Jon Smirl, Keith Whitwell and Dave Airlie.
|
||||
|
||||
<p>
|
||||
Applications in the fbdev/DRI environment use
|
||||
the <a href="http://www.nabble.com/file/p15480666/MiniGXL.html"> MiniGLX</a> interface to choose pixel
|
||||
the MiniGLX interface to choose pixel
|
||||
formats, create rendering contexts, etc. It's a subset of the GLX and
|
||||
Xlib interfaces allowing some degree of application portability between
|
||||
the X and X-less environments.
|
||||
@@ -315,8 +318,7 @@ It means that the sample_server process is not running.
|
||||
<h1>5.0 Programming Information</h1>
|
||||
|
||||
<p>
|
||||
OpenGL/Mesa is interfaced to fbdev via the <a href="http://www.nabble.com/file/p15480666/MiniGLX.html">MiniGLX</a>
|
||||
interface.
|
||||
OpenGL/Mesa is interfaced to fbdev via the MiniGLX interface.
|
||||
MiniGLX is a subset of Xlib and GLX API functions which provides just
|
||||
enough functionality to setup OpenGL rendering and respond to simple
|
||||
input events.
|
||||
@@ -332,7 +334,7 @@ This allows some degree of flexibility for software development and testing.
|
||||
However, the MiniGLX API is not binary-compatible with full Xlib/GLX.
|
||||
Some of the structures are different and some macros/functions work
|
||||
differently.
|
||||
See the <code>GL/miniglx.h</code> header file for details.
|
||||
See the GL/miniglx.h header file for details.
|
||||
</p>
|
||||
|
||||
|
||||
|
@@ -11,6 +11,22 @@
|
||||
<H1>News</H1>
|
||||
|
||||
|
||||
<h2>October 4, 2010</h2>
|
||||
|
||||
<p>
|
||||
<a href="relnotes-7.9.html">Mesa 7.9</a> (final) is released. This is a new
|
||||
development release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>September 27, 2010</h2>
|
||||
|
||||
<p>
|
||||
<a href="relnotes-7.9.html">Mesa 7.9.0-rc1</a> is released. This is a
|
||||
release candidate for the 7.9 development release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>June 16, 2010</h2>
|
||||
|
||||
<p>
|
||||
@@ -1277,7 +1293,6 @@ grateful.
|
||||
<p>
|
||||
</p><h2>March 18, 1999</h2>
|
||||
<p>The new webpages are now online. Enjoy, and let me know if you find any errors.
|
||||
For an eye-candy free version you can use <a href="http://www.mesa3d.org/txt/">http://www.mesa3d.org/txt/</a>.</p>
|
||||
<p>
|
||||
</p><h2>February 16, 1999</h2>
|
||||
<p><a href="http://www.sgi.com/">SGI</a> releases its <a href="http://www.sgi.com/software/opensource/glx/">GLX
|
||||
|
@@ -26,7 +26,15 @@ for DRI hardware acceleration.
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
tbd
|
||||
c89b63d253605ed40e8ac370d25a833c MesaLib-7.8.2.tar.gz
|
||||
6be2d343a0089bfd395ce02aaf8adb57 MesaLib-7.8.2.tar.bz2
|
||||
a04ad3b06ac5ff3969a003fa7bbf7d5b MesaLib-7.8.2.zip
|
||||
7c213f92efeb471f0331670d5079d4c0 MesaDemos-7.8.2.tar.gz
|
||||
757d9e2e06f48b1a52848be9b0307ced MesaDemos-7.8.2.tar.bz2
|
||||
8d0e5cfe68b8ebf90265d350ae2c48b1 MesaDemos-7.8.2.zip
|
||||
b74482e3f44f35ed395c4aada4fd8240 MesaGLUT-7.8.2.tar.gz
|
||||
a471807b65e49c325808ba4551be93ed MesaGLUT-7.8.2.tar.bz2
|
||||
9f190268c42be582ef66e47365ee61e3 MesaGLUT-7.8.2.zip
|
||||
</pre>
|
||||
|
||||
|
||||
@@ -44,10 +52,95 @@ tbd
|
||||
<ul>
|
||||
<li>Fixed Gallium glDrawPixels(GL_DEPTH_COMPONENT).
|
||||
<li>Fixed Gallium Cell driver to buildable, runable state
|
||||
<li>Fixed bad error checking for glFramebufferRenderbuffer(attachment=GL_DEPTH_STENCIL_ATTACHMENT).
|
||||
<li>Fixed incorrect Z coordinate handling in "meta" glDraw/CopyPixels.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">Bug
|
||||
#23670</a>.</li>
|
||||
|
||||
<li>Assorted i965 driver fixes.
|
||||
Including but not limited to:
|
||||
<ul>
|
||||
<li>Fix scissoring when width or height is
|
||||
0. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27643">Bug
|
||||
#27643</a>.
|
||||
<li>Fix bit allocation for number of color regions for
|
||||
ARB_draw_buffers.</li>
|
||||
<li>Set the correct provoking vertex for clipped first-mode
|
||||
trifans. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24470">Bug
|
||||
#24470</a>.</li>
|
||||
<li>Use <code>R16G16B16A16_FLOAT</code> for 3-component half-float.</li>
|
||||
<li>Fix assertion for surface tile offset usage on Ironlake.</li>
|
||||
<li>Fix cube map layouts on Ironlake.</li>
|
||||
<li>When an RB gets a new region, clear the old from the state
|
||||
cache. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24119">Bug
|
||||
#24119</a>.</li>
|
||||
<li>Reject shaders with uninlined function calls instead of hanging.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Assorted i915 driver fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Fixed texture LOD clamping in i915 driver.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=24846">Bug
|
||||
#24846</a>.</li>
|
||||
<li>Fix off-by-one for drawing rectangle.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27408">Bug
|
||||
#27408</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Fixed hangs in etracer on 830 and 845
|
||||
chipsets. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=26557">Bug
|
||||
#26557</a>.</li>
|
||||
<li>Fixed tiling of small textures on all Intel drivers.</li>
|
||||
<li>Fixed crash in Savage driver when using <code>_mesa_CopyTexImage2D</code>.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27652">Bug
|
||||
#27652</a>.</li>
|
||||
|
||||
<li>Assorted GLX fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Fixed <code>__glXInitializeVisualConfigFromTags</code>'s handling of
|
||||
unrecognized fbconfig tags.</li>
|
||||
<li>Fixed regression with <code>GLX_USE_GL</code>.
|
||||
<li>Fixed config chooser logic for 'mask' matching.</li>
|
||||
<li>Report swap events correctly in direct rendered case (DRI2)</li>
|
||||
<li>Fixed build with dri2proto which doesn't define
|
||||
<code>X_DRI2SwapInterval</code>.</li>
|
||||
<li>Get <code>GLX_SCREEN</code> first in <code>__glXQueryContextInfo</code>.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=14245">Bug
|
||||
#14245</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Assorted GLSL fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Change variable declared assertion into conditional in GLSL
|
||||
compiler. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27921">Bug
|
||||
#27921</a>.</li>
|
||||
<li>Fix instruction indexing
|
||||
bugs. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27566">Bug
|
||||
#27566</a>.</li>
|
||||
<li>Updated uniform location / offset encoding to be more like
|
||||
other implementations.</li>
|
||||
<li>Don't overwrite a driver's shader infolog with generic failure
|
||||
message.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Fixed OSMesa build for 16 and 32-bit color channel depth.
|
||||
<li>Fixed OSMesa build with hidden symbol visibility. libOSMesa no longer links to libGL.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28305">Bug
|
||||
#28305</a>.
|
||||
<li>Fixed handling of multiple render targets in fixed-function
|
||||
texture envrionmnent programs.</li>
|
||||
<li>Fixed conversion errors in <code>signed_rgba8888[rev]</code> texel
|
||||
fetch.</li>
|
||||
<li>Don't set srcLevel on <code>GL_TEXTURE_RECTANGLE_ARB</code> targets.</li>
|
||||
<li>Various build fixes for OpenBSD.</li>
|
||||
<li>Various build fixes for OS X.</li>
|
||||
<li>Various build fixes for GCC 3.3.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<p>None.</p>
|
||||
</body>
|
||||
</html>
|
||||
|
89
docs/relnotes-7.8.3.html
Normal file
89
docs/relnotes-7.8.3.html
Normal file
@@ -0,0 +1,89 @@
|
||||
<HTML>
|
||||
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.8.3 Release Notes / (date tbd)</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.8.3 is a bug fix release which fixes bugs found since the 7.8.2 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.8.3 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
See the <a href="install.html">Compiling/Installing page</a> for prerequisites
|
||||
for DRI hardware acceleration.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
x MesaLib-7.8.3.tar.gz
|
||||
x MesaLib-7.8.3.tar.bz2
|
||||
x MesaLib-7.8.3.zip
|
||||
x MesaDemos-7.8.3.tar.gz
|
||||
x MesaDemos-7.8.3.tar.bz2
|
||||
x MesaDemos-7.8.3.zip
|
||||
x MesaGLUT-7.8.3.tar.gz
|
||||
x MesaGLUT-7.8.3.tar.bz2
|
||||
x MesaGLUT-7.8.3.zip
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None.</p>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<ul>
|
||||
<li>The radeon driver should use less memory when searching for a valid mip
|
||||
image.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<ul>
|
||||
<li>Fix unsupported FB with D24S8 (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">29116</a>)</li>
|
||||
<li>Fix ReadPixels crash when reading depth/stencil from an FBO</li>
|
||||
<li>Fixed a bug rendering to 16-bit buffers using swrast.</li>
|
||||
<li>Fixed a state tracker/TGSI bug that caused crashes when using Windows'
|
||||
memory debugging features.</li>
|
||||
<li>Fixed an issue rendering to 32-bit channels with swrast (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=29487">29487</a>)</li>
|
||||
<li>GLSL: fix indirect <TT>gl_TextureMatrix</TT> addressing (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28967">28967</a>)</li>
|
||||
<li>GLSL: fix for bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27216">27216</a></li>
|
||||
<li>GLSL: fix zw fragcoord entries in some cases (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=29183">29183</a>)</li>
|
||||
<li>Fix texture env generation in some cases (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28169">28169</a>)</li>
|
||||
<li>osmesa: a fix for calling <TT>OSMesaMakeCurrent</TT> twice was applied (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=10966">10966</a></li>
|
||||
<li>A bug was fixed which could cause Mesa to ignore the
|
||||
<TT>MESA_EXTENSION_OVERRIDE</TT> environment variable.</li>
|
||||
<li>A bug related to specular highlights on backfaces was fixed.</li>
|
||||
<li>A radeon-specific issue with <TT>glCopyTex(Sub)Image</TT> was
|
||||
corrected.</li>
|
||||
<li>radeon/wine: flush command stream in more cases, fixing wine d3d9
|
||||
tests.</li>
|
||||
<li>r600: fix sin+cos normalization.</li>
|
||||
<li>r600: (properly) ignore <TT>GL_COORD_REPLACE</TT> when point sprites are
|
||||
disabled.</li>
|
||||
<li>radeon: avoid flushing when the context is not current.</li>
|
||||
<li>r300c: a bug affecting unaligned BOs was fixed.</li>
|
||||
<li>r300c: a hardlock caused by ARB_half_float_vertex incorrectly advertised on some chipsets.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
406
docs/relnotes-7.9.1.html
Normal file
406
docs/relnotes-7.9.1.html
Normal file
@@ -0,0 +1,406 @@
|
||||
<HTML>
|
||||
|
||||
<head>
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
<link rel="stylesheet" type="text/css" href="mesa.css">
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
</head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.9.1 Release Notes / January 7, 2011</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.9.1 is a bug fix release which fixes bugs found since the 7.9 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.9.1 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
See the <a href="install.html">Compiling/Installing page</a> for prerequisites
|
||||
for DRI hardware acceleration.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
78422843ea875ad4eac35b9b8584032b MesaLib-7.9.1.tar.gz
|
||||
07dc6cfb5928840b8b9df5bd1b3ae434 MesaLib-7.9.1.tar.bz2
|
||||
c8eaea5b3c3d6dee784bd8c2db91c80f MesaLib-7.9.1.zip
|
||||
ee9ecae4ca56fbb2d14dc15e3a0a7640 MesaGLUT-7.9.1.tar.gz
|
||||
41fc477d524e7dc5c84da8ef22422bea MesaGLUT-7.9.1.tar.bz2
|
||||
90b287229afdf19317aa989d19462e7a MesaGLUT-7.9.1.zip
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None.</p>
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<p>This list is likely incomplete.</p>
|
||||
<ul>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28800">Bug 28800</a> - [r300c, r300g] Texture corruption with World of Warcraft</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29420">Bug 29420</a> - Amnesia / HPL2 RendererFeatTest - not rendering correctly</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29946">Bug 29946</a> - [swrast] piglit valgrind glsl-array-bounds-04 fails</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30261">Bug 30261</a> - [GLSL 1.20] allowing inconsistent invariant declaration between two vertex shaders</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30632">Bug 30632</a> - [softpipe] state_tracker/st_manager.c:489: st_context_notify_invalid_framebuffer: Assertion `stfb && stfb->iface == stfbi' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30694">Bug 30694</a> - wincopy will crash on Gallium drivers when going to front buffer</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30787">Bug 30787</a> - Invalid asm shader does not generate draw-time error when used with GLSL shader</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30993">Bug 30993</a> - getFramebufferAttachmentParameteriv wrongly generates error</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31101">Bug 31101</a> - [glsl2] abort() in ir_validate::visit_enter(ir_assignment *ir)</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31193">Bug 31193</a> - [regression] aa43176e break water reflections</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31194">Bug 31194</a> - The mesa meta save/restore code doesn't ref the current GLSL program</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31371">Bug 31371</a> - glslparsertest: ir.cpp:358: ir_constant::ir_constant(const glsl_type*, const ir_constant_data*): Assertion `(type->base_type >= 0) && (type->base_type <= 3)' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31439">Bug 31439</a> - Crash in glBufferSubData() with size == 0</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31495">Bug 31495</a> - [i965 gles2c bisected] OpenGL ES 2.0 conformance GL2Tests_GetBIFD_input.run regressed</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31514">Bug 31514</a> - isBuffer returns true for unbound buffers</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31560">Bug 31560</a> - [tdfx] tdfx_tex.c:702: error: ‘const struct gl_color_table’ has no member named ‘Format’</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31617">Bug 31617</a> - Radeon/Compiz: 'failed to attach dri2 front buffer', error case not handled</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31648">Bug 31648</a> - [GLSL] array-struct-array gets assertion: `(size >= 1) && (size <= 4)' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31650">Bug 31650</a> - [GLSL] varying gl_TexCoord fails to be re-declared to different size in the second shader</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31673">Bug 31673</a> - GL_FRAGMENT_PRECISION_HIGH preprocessor macro undefined in GLSL ES</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31690">Bug 31690</a> - i915 shader compiler fails to flatten if in Aquarium webgl demo.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31832">Bug 31832</a> - [i915] Bad renderbuffer format: 21</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31841">Bug 31841</a> - [drm:radeon_cs_ioctl] *ERROR* Invalid command stream !</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31894">Bug 31894</a> - Writing to gl_PointSize with GLES2 corrupts other varyings</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31909">Bug 31909</a> - [i965] brw_fs.cpp:1461: void fs_visitor::emit_bool_to_cond_code(ir_rvalue*): Assertion `expr->operands[i]->type->is_scalar()' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31934">Bug 31934</a> - [gallium] Mapping empty buffer object causes SIGSEGV</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31983">Bug 31983</a> - [i915 gles2] "if (expression with builtin/varying variables) discard" breaks linkage</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31985">Bug 31985</a> - [GLSL 1.20] initialized uniform array considered as "unsized"</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31987">Bug 31987</a> - [gles2] if input a wrong pname(GL_NONE) to glGetBoolean, it will not case GL_INVALID_ENUM</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32035">Bug 32035</a> - [GLSL bisected] comparing unsized array gets segfault</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32070">Bug 32070</a> - llvmpipe renders stencil demo incorrectly</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32273">Bug 32273</a> - assertion fails when starting vdrift 2010 release with shaders enabled</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32287">Bug 32287</a> - [bisected GLSL] float-int failure</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32311">Bug 32311</a> - [965 bisected] Array look-ups broken on GM45</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32520">Bug 32520</a> - [gles2] glBlendFunc(GL_ZERO, GL_DST_COLOR) will result in GL_INVALID_ENUM</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32825">Bug 32825</a> - egl_glx driver completely broken in 7.9 branch [fix in master]</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<p>The full set of changes can be viewed by using the following GIT command:</p>
|
||||
|
||||
<pre>
|
||||
git log mesa-7.9..mesa-7.9.1
|
||||
</pre>
|
||||
|
||||
<p>Alex Deucher (5):
|
||||
<ul>
|
||||
<li>r100: revalidate after radeon_update_renderbuffers</li>
|
||||
<li>r600c: add missing radeon_prepare_render() call on evergreen</li>
|
||||
<li>r600c: properly align mipmaps to group size</li>
|
||||
<li>gallium/egl: fix r300 vs r600 loading</li>
|
||||
<li>r600c: fix some opcodes on evergreen</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Aras Pranckevicius (2):
|
||||
<ul>
|
||||
<li>glsl: fix crash in loop analysis when some controls can't be determined</li>
|
||||
<li>glsl: fix matrix type check in ir_algebraic</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Brian Paul (27):
|
||||
<ul>
|
||||
<li>swrast: fix choose_depth_texture_level() to respect mipmap filtering state</li>
|
||||
<li>st/mesa: replace assertion w/ conditional in framebuffer invalidation</li>
|
||||
<li>egl/i965: include inline_wrapper_sw_helper.h</li>
|
||||
<li>mesa: Add missing else in do_row_3D</li>
|
||||
<li>mesa: add missing formats in _mesa_format_to_type_and_comps()</li>
|
||||
<li>mesa: handle more pixel types in mipmap generation code</li>
|
||||
<li>mesa: make glIsBuffer() return false for never bound buffers</li>
|
||||
<li>mesa: fix glDeleteBuffers() regression</li>
|
||||
<li>swrast: init alpha value to 1.0 in opt_sample_rgb_2d()</li>
|
||||
<li>meta: Mask Stencil.Clear against stencilMax in _mesa_meta_Clear</li>
|
||||
<li>st/mesa: fix mapping of zero-sized buffer objects</li>
|
||||
<li>mesa: check for posix_memalign() errors</li>
|
||||
<li>llvmpipe: fix broken stencil writemask</li>
|
||||
<li>mesa: fix GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME query</li>
|
||||
<li>mesa: return GL_FRAMEBUFFER_DEFAULT as FBO attachment type</li>
|
||||
<li>mesa: make glGet*(GL_NONE) generate GL_INVALID_ENUM</li>
|
||||
<li>mesa: test for cube map completeness in glGenerateMipmap()</li>
|
||||
<li>tnl: Initialize gl_program_machine memory in run_vp.</li>
|
||||
<li>tnl: a better way to initialize the gl_program_machine memory</li>
|
||||
<li>mesa, st/mesa: disable GL_ARB_geometry_shader4</li>
|
||||
<li>glsl: fix off by one in register index assertion</li>
|
||||
<li>st/mesa: fix mipmap generation bug</li>
|
||||
<li>glsl: new glsl_strtod() wrapper to fix decimal point interpretation</li>
|
||||
<li>mesa: no-op glBufferSubData() on size==0</li>
|
||||
<li>tdfx: s/Format/_BaseFormat/</li>
|
||||
<li>st/mesa: fix renderbuffer pointer check in st_Clear()</li>
|
||||
<li>mesa: Bump the number of bits in the register index.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Chad Versace (5):
|
||||
<ul>
|
||||
<li>glsl: Fix lexer rule for ^=</li>
|
||||
<li>glsl: Fix ast-to-hir for ARB_fragment_coord_conventions</li>
|
||||
<li>glsl: Fix ir_expression::constant_expression_value()</li>
|
||||
<li>glsl: Fix erroneous cast in ast_jump_statement::hir()</li>
|
||||
<li>glsl: Fix linker bug in cross_validate_globals()</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Chia-I Wu (10):
|
||||
<ul>
|
||||
<li>targets/egl: Fix linking with libdrm.</li>
|
||||
<li>st/vega: Fix version check in context creation.</li>
|
||||
<li>st/egl: Do not finish a fence that is NULL.</li>
|
||||
<li>egl: Fix a false negative check in _eglCheckMakeCurrent.</li>
|
||||
<li>st/mesa: Unreference the sampler view in st_bind_surface.</li>
|
||||
<li>egl_dri2: Fix __DRI_DRI2 version 1 support.</li>
|
||||
<li>st/vega: Do not wait NULL fences.</li>
|
||||
<li>mesa: Do not advertise GL_OES_texture_3D.</li>
|
||||
<li>egl_glx: Fix borken driver.</li>
|
||||
<li>egl: Check extensions.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Daniel Lichtenberger (1):
|
||||
<ul>
|
||||
<li>radeon: fix potential segfault in renderbuffer update</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Daniel Vetter (1):
|
||||
<ul>
|
||||
<li>r200: revalidate after radeon_update_renderbuffers</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Dave Airlie (1):
|
||||
<ul>
|
||||
<li>r300g: fixup rs690 tiling stride alignment calculations.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Eric Anholt (13):
|
||||
<ul>
|
||||
<li>intel: Allow CopyTexSubImage to InternalFormat 3/4 textures, like RGB/RGBA.</li>
|
||||
<li>glsl: Free the loop state context when we free the loop state.</li>
|
||||
<li>i965: Allow OPCODE_SWZ to put immediates in the first arg.</li>
|
||||
<li>i965: Add support for rendering to SARGB8 FBOs.</li>
|
||||
<li>glsl: Add a helper constructor for expressions that works out result type.</li>
|
||||
<li>glsl: Fix structure and array comparisions.</li>
|
||||
<li>glsl: Quiet unreachable no-return-from-function warning.</li>
|
||||
<li>glsl: Mark the array access for whole-array comparisons.</li>
|
||||
<li>glsl: Fix flipped return of has_value() for array constants.</li>
|
||||
<li>mesa: Add getters for the rest of the supported draw buffers.</li>
|
||||
<li>mesa: Add getters for ARB_copy_buffer's attachment points.</li>
|
||||
<li>i965: Correct the dp_read message descriptor setup on g4x.</li>
|
||||
<li>glsl: Correct the marking of InputsRead/OutputsWritten on in/out matrices.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Fabian Bieler (1):
|
||||
<ul>
|
||||
<li>glsl: fix lowering conditional returns in subroutines</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Francisco Jerez (3):
|
||||
<ul>
|
||||
<li>meta: Don't leak alpha function/reference value changes.</li>
|
||||
<li>meta: Fix incorrect rendering of the bitmap alpha component.</li>
|
||||
<li>meta: Don't try to disable cube maps if the driver doesn't expose the extension.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Henri Verbeet (2):
|
||||
<ul>
|
||||
<li>r600: Evergreen has two extra frac_bits for the sampler LOD state.</li>
|
||||
<li>st/mesa: Handle wrapped depth buffers in st_copy_texsubimage().</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Ian Romanick (33):
|
||||
<ul>
|
||||
<li>Add 7.9 md5sums</li>
|
||||
<li>docs: Import 7.8.x release notes from 7.8 branch.</li>
|
||||
<li>docs: download.html does not need to be updated for each release</li>
|
||||
<li>docs: Update mailing lines from sf.net to freedesktop.org</li>
|
||||
<li>docs: added news item for 7.9 release</li>
|
||||
<li>mesa: Validate assembly shaders when GLSL shaders are used</li>
|
||||
<li>linker: Reject shaders that have unresolved function calls</li>
|
||||
<li>mesa: Refactor validation of shader targets</li>
|
||||
<li>glsl: Slightly change the semantic of _LinkedShaders</li>
|
||||
<li>linker: Improve handling of unread/unwritten shader inputs/outputs</li>
|
||||
<li>glsl: Commit lexer files changed by previous cherry picking</li>
|
||||
<li>mesa: Make metaops use program refcounts instead of names.</li>
|
||||
<li>glsl: Fix incorrect gl_type of sampler2DArray and sampler1DArrayShadow</li>
|
||||
<li>mesa: Allow query of MAX_SAMPLES with EXT_framebuffer_multisample</li>
|
||||
<li>glsl: better handling of linker failures</li>
|
||||
<li>mesa: Fix glGet of ES2's GL_MAX_*_VECTORS properties.</li>
|
||||
<li>i915: Disallow alpha, red, RG, and sRGB as render targets</li>
|
||||
<li>glsl/linker: Free any IR discarded by optimization passes.</li>
|
||||
<li>glsl: Add an optimization pass to simplify discards.</li>
|
||||
<li>glsl: Add a lowering pass to move discards out of if-statements.</li>
|
||||
<li>i915: Correctly generate unconditional KIL instructions</li>
|
||||
<li>glsl: Add unary ir_expression constructor</li>
|
||||
<li>glsl: Ensure that equality comparisons don't return a NULL IR tree</li>
|
||||
<li>glcpp: Commit changes in generated files cause by previous commit</li>
|
||||
<li>glsl: Inherrit type of declared variable from initializer</li>
|
||||
<li>glsl: Inherrit type of declared variable from initializer after processing assignment</li>
|
||||
<li>linker: Ensure that unsized arrays have a size after linking</li>
|
||||
<li>linker: Fix regressions caused by previous commit</li>
|
||||
<li>linker: Allow built-in arrays to have different sizes between shader stages</li>
|
||||
<li>ir_to_mesa: Don't generate swizzles for record derefs of non-scalar/vectors</li>
|
||||
<li>Refresh autogenerated file builtin_function.cpp.</li>
|
||||
<li>docs: Initial set of release notes for 7.9.1</li>
|
||||
<li>mesa: set version string to 7.9.1</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Julien Cristau (1):
|
||||
<ul>
|
||||
<li>Makefile: don't include the same files twice in the tarball</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Kenneth Graunke (19):
|
||||
<ul>
|
||||
<li>glcpp: Return NEWLINE token for newlines inside multi-line comments.</li>
|
||||
<li>generate_builtins.py: Output large strings as arrays of characters.</li>
|
||||
<li>glsl: Fix constant component count in vector constructor emitting.</li>
|
||||
<li>ir_dead_functions: Actually free dead functions and signatures.</li>
|
||||
<li>glcpp: Define GL_FRAGMENT_PRECISION_HIGH if GLSL version >= 1.30.</li>
|
||||
<li>glsl: Unconditionally define GL_FRAGMENT_PRECISION_HIGH in ES2 shaders.</li>
|
||||
<li>glsl: Fix constant expression handling for <, >, <=, >= on vectors.</li>
|
||||
<li>glsl: Use do_common_optimization in the standalone compiler.</li>
|
||||
<li>glsl: Don't inline function prototypes.</li>
|
||||
<li>glsl: Add a virtual as_discard() method.</li>
|
||||
<li>glsl: Remove "discard" support from lower_jumps.</li>
|
||||
<li>glsl: Refactor get_num_operands.</li>
|
||||
<li>glcpp: Don't emit SPACE tokens in conditional_tokens production.</li>
|
||||
<li>glsl: Clean up code by adding a new is_break() function.</li>
|
||||
<li>glsl: Consider the "else" branch when looking for loop breaks.</li>
|
||||
<li>Remove OES_compressed_paletted_texture from the ES2 extension list.</li>
|
||||
<li>glsl/builtins: Compute the correct value for smoothstep(vec, vec, vec).</li>
|
||||
<li>Fix build on systems where "python" is python 3.</li>
|
||||
<li>i965: Internally enable GL_NV_blend_square on ES2.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Kristian Høgsberg (1):
|
||||
<ul>
|
||||
<li>i965: Don't write mrf assignment for pointsize output</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Luca Barbieri (1):
|
||||
<ul>
|
||||
<li>glsl: Unroll loops with conditional breaks anywhere (not just the end)</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Marek Olšák (17):
|
||||
<ul>
|
||||
<li>r300g: fix microtiling for 16-bits-per-channel formats</li>
|
||||
<li>r300g: fix texture border for 16-bits-per-channel formats</li>
|
||||
<li>r300g: add a default channel ordering of texture border for unhandled formats</li>
|
||||
<li>r300g: fix texture border color for all texture formats</li>
|
||||
<li>r300g: fix rendering with no vertex elements</li>
|
||||
<li>r300/compiler: fix rc_rewrite_depth_out for it to work with any instruction</li>
|
||||
<li>r300g: fix texture border color once again</li>
|
||||
<li>r300g: fix texture swizzling with compressed textures on r400-r500</li>
|
||||
<li>r300g: disable ARB_texture_swizzle if S3TC is enabled on r3xx-only</li>
|
||||
<li>mesa, st/mesa: fix gl_FragCoord with FBOs in Gallium</li>
|
||||
<li>st/mesa: initialize key in st_vp_varient</li>
|
||||
<li>r300/compiler: fix swizzle lowering with a presubtract source operand</li>
|
||||
<li>r300g: fix rendering with a vertex attrib having a zero stride</li>
|
||||
<li>ir_to_mesa: Add support for conditional discards.</li>
|
||||
<li>r300g: finally fix the texture corruption on r3xx-r4xx</li>
|
||||
<li>mesa: fix texel store functions for some float formats</li>
|
||||
<li>r300/compiler: disable the rename_regs pass for loops</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Mario Kleiner (1):
|
||||
<ul>
|
||||
<li>mesa/r300classic: Fix dri2Invalidate/radeon_prepare_render for page flipping.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Peter Clifton (1):
|
||||
<ul>
|
||||
<li>intel: Fix emit_linear_blit to use DWORD aligned width blits</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Robert Hooker (2):
|
||||
<ul>
|
||||
<li>intel: Add a new B43 pci id.</li>
|
||||
<li>egl_dri2: Add missing intel chip ids.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Roland Scheidegger (1):
|
||||
<ul>
|
||||
<li>r200: fix r200 large points</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Thomas Hellstrom (17):
|
||||
<ul>
|
||||
<li>st/xorg: Don't try to use option values before processing options</li>
|
||||
<li>xorg/vmwgfx: Make vmwarectrl work also on 64-bit servers</li>
|
||||
<li>st/xorg: Add a customizer option to get rid of annoying cursor update flicker</li>
|
||||
<li>xorg/vmwgfx: Don't hide HW cursors when updating them</li>
|
||||
<li>st/xorg: Don't try to remove invalid fbs</li>
|
||||
<li>st/xorg: Fix typo</li>
|
||||
<li>st/xorg, xorg/vmwgfx: Be a bit more frendly towards cross-compiling environments</li>
|
||||
<li>st/xorg: Fix compilation errors for Xservers compiled without Composite</li>
|
||||
<li>st/xorg: Don't use deprecated x*alloc / xfree functions</li>
|
||||
<li>xorg/vmwgfx: Don't use deprecated x*alloc / xfree functions</li>
|
||||
<li>st/xorg: Fix compilation for Xservers >= 1.10</li>
|
||||
<li>mesa: Make sure we have the talloc cflags when using the talloc headers</li>
|
||||
<li>egl: Add an include for size_t</li>
|
||||
<li>mesa: Add talloc includes for gles</li>
|
||||
<li>st/egl: Fix build for include files in nonstandard places</li>
|
||||
<li>svga/drm: Optionally resolve calls to powf during link-time</li>
|
||||
<li>gallium/targets: Trivial crosscompiling fix</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Tom Stellard (7):
|
||||
<ul>
|
||||
<li>r300/compiler: Make sure presubtract sources use supported swizzles</li>
|
||||
<li>r300/compiler: Fix register allocator's handling of loops</li>
|
||||
<li>r300/compiler: Fix instruction scheduling within IF blocks</li>
|
||||
<li>r300/compiler: Use zero as the register index for unused sources</li>
|
||||
<li>r300/compiler: Ignore alpha dest register when replicating the result</li>
|
||||
<li>r300/compiler: Use correct swizzles for all presubtract sources</li>
|
||||
<li>r300/compiler: Don't allow presubtract sources to be remapped twice</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Vinson Lee (1):
|
||||
<ul>
|
||||
<li>glsl: Fix 'control reaches end of non-void function' warning.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>richard (1):
|
||||
<ul>
|
||||
<li>r600c : inline vertex format is not updated in an app, switch to use vfetch constants. For the 7.9 and 7.10 branches as well.</li>
|
||||
</ul></p>
|
||||
|
||||
</body>
|
||||
</html>
|
336
docs/relnotes-7.9.2.html
Normal file
336
docs/relnotes-7.9.2.html
Normal file
@@ -0,0 +1,336 @@
|
||||
<HTML>
|
||||
|
||||
<head>
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
<link rel="stylesheet" type="text/css" href="mesa.css">
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
</head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.9.2 Release Notes / March 2, 2011</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.9.2 is a bug fix release which fixes bugs found since the 7.9.1 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.9.2 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
See the <a href="install.html">Compiling/Installing page</a> for prerequisites
|
||||
for DRI hardware acceleration.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
eb4ab8c1a03386def3ea34b1358e9cda MesaLib-7.9.2.tar.gz
|
||||
8f6d1474912787ce13bd35f3bae9938a MesaLib-7.9.2.tar.bz2
|
||||
427a81dd43ac97603768dc5c6af3df26 MesaLib-7.9.2.zip
|
||||
aacb8f4db997e346db40c6066942140a MesaGLUT-7.9.2.tar.gz
|
||||
18abe6cff4fad8ad4752c7b7ab548e5d MesaGLUT-7.9.2.tar.bz2
|
||||
3189e5732d636c71baf3d8bc23ce7b11 MesaGLUT-7.9.2.zip
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None.</p>
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<p>This list is likely incomplete.</p>
|
||||
<ul>
|
||||
<li>Fix an off-by-one bug in a vsplit assertion.</li>
|
||||
<li>Fix incorrect handling of <tt>layout</tt> qualifier
|
||||
with <tt>in</tt>, <tt>out</tt>, <tt>attribute</tt>, and <tt>varying</tt>.</li>
|
||||
|
||||
<li>Fix an i965 GPU hang in GLSL shaders that contain an unconditional <tt>discard</tt> statement.</li>
|
||||
|
||||
<li>Fix an i965 shader bug where the negative absolute value was generated instead of the absolute value of a negation.</li>
|
||||
|
||||
<li>Fix numerous issues handling precision qualifiers in GLSL ES.</li>
|
||||
|
||||
<li>Fixed a few GLX protocol encoder bugs (Julien Cristau)</li>
|
||||
|
||||
<li>Assorted Gallium llvmpipe driver bug fixes</li>
|
||||
|
||||
<li>Assorted Mesa/Gallium state tracker bug fixes</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26795">Bug 26795</a> - gl_FragCoord off by one in Gallium drivers.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29164">Bug 29164</a> - [GLSL 1.20] invariant variable shouldn't be used before declaration</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29823">Bug 29823</a> - GetUniform[if]v busted</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29927">Bug 29927</a> - [glsl2] fail to compile shader with constructor for array of struct type</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30156">Bug 30156</a> - [i965] After updating to Mesa 7.9, Civilization IV starts to show garbage</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31923">Bug 31923</a> - [GLSL 1.20] allowing inconsistent centroid declaration between two vertex shaders</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=31925">Bug 31925</a> - [GLSL 1.20] "#pragma STDGL invariant(all)" fail</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32214">Bug 32214</a> - [gles2]no link error happens when missing vertex shader or frag shader</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32375">Bug 32375</a> - [gl gles2] Not able to get the attribute by function glGetVertexAttribfv</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32541">Bug 32541</a> - Segmentation Fault while running an HDR (high dynamic range) rendering demo</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32569">Bug 32569</a> - [gles2] glGetShaderPrecisionFormat not implemented yet</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32695">Bug 32695</a> - [glsl] SIGSEGV glcpp/glcpp-parse.y:833</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32831">Bug 32831</a> - [glsl] division by zero crashes GLSL compiler</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=32910">Bug 32910</a> - Keywords 'in' and 'out' not handled properly for GLSL 1.20 shaders</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33219">Bug 33219</a> -[GLSL bisected] implicit sized array triggers segfault in ir_to_mesa_visitor::copy_propagate</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33306">Bug 33306</a> - GLSL integer division by zero crashes GLSL compiler</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33308">Bug 33308</a> -[glsl] ast_to_hir.cpp:3016: virtual ir_rvalue* ast_jump_statement::hir(exec_list*, _mesa_glsl_parse_state*): Assertion `ret != __null' failed.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33316">Bug 33316</a> - uniform array will be allocate one line more and initialize it when it was freed will abort</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33386">Bug 33386</a> - Dubious assembler in read_rgba_span_x86.S</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33388">Bug 33388</a> - Dubious assembler in xform4.S</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33433">Bug 33433</a> - Error in x86-64 API dispatch code.</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33507">Bug 33507</a> - [glsl] GLSL preprocessor modulus by zero crash</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33508">Bug 33508</a> - [glsl] GLSL compiler modulus by zero crash</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=33916">Bug 33916</a> - Compiler accepts reserved operators % and %=</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=34047">Bug 34047</a> - Assert in _tnl_import_array() when using GLfixed vertex datatypes with GLESv2</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=34114">Bug 34114</a> - Sun Studio build fails due to standard library functions not being in global namespace</li>
|
||||
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=34198">Bug 34198</a> - [GLSL] implicit sized array with index 0 used gets assertion</li>
|
||||
|
||||
<li><a href="https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/691653">Ubuntu bug 691653</a> - compiz crashes when using alt-tab (the radeon driver kills it) </li>
|
||||
|
||||
<li><a href="https://bugs.meego.com/show_bug.cgi?id=13005">Meego bug 13005</a> - Graphics GLSL issue lead to camera preview fail on Pinetrail</li>
|
||||
|
||||
<!-- <li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=">Bug </a> - </li> -->
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<p>The full set of changes can be viewed by using the following GIT command:</p>
|
||||
|
||||
<pre>
|
||||
git log mesa-7.9.1..mesa-7.9.2
|
||||
</pre>
|
||||
|
||||
<p>Alberto Milone (1):
|
||||
<ul>
|
||||
<li>r600c: add evergreen ARL support.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Brian Paul (19):
|
||||
<ul>
|
||||
<li>draw: Fix an off-by-one bug in a vsplit assertion.</li>
|
||||
<li>mesa: fix a few format table mistakes, assertions</li>
|
||||
<li>mesa: fix num_draw_buffers==0 in fixed-function fragment program generation</li>
|
||||
<li>mesa: don't assert in GetIntegerIndexed, etc</li>
|
||||
<li>mesa: check for dummy renderbuffer in _mesa_FramebufferRenderbufferEXT()</li>
|
||||
<li>llvmpipe: make sure binning is active when we begin/end a query</li>
|
||||
<li>st/mesa: fix incorrect fragcoord.x translation</li>
|
||||
<li>softpipe: fix off-by-one error in setup_fragcoord_coeff()</li>
|
||||
<li>cso: fix loop bound in cso_set_vertex_samplers()</li>
|
||||
<li>st/mesa: set renderbuffer _BaseFormat in a few places</li>
|
||||
<li>st/mesa: fix the default case in st_format_datatype()</li>
|
||||
<li>st/mesa: need to translate clear color according to surface's base format</li>
|
||||
<li>docs: update 7.9.2 release notes with Brian's cherry-picks</li>
|
||||
<li>docs: add links to 7.9.1 and 7.9.2 release notes</li>
|
||||
<li>mesa: include compiler.h for ASSERT macro</li>
|
||||
<li>glsl: add ir_shader case in switch stmt to silence warning</li>
|
||||
<li>glsl2: fix signed/unsigned comparison warning</li>
|
||||
<li>mesa: implement glGetShaderPrecisionFormat()</li>
|
||||
<li>docs: updated environment variable list</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Bryce Harrington (1):
|
||||
<ul>
|
||||
<li>r300g: Null pointer check for buffer deref in gallium winsys</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Chad Versace (14):
|
||||
<ul>
|
||||
<li>glsl: At link-time, check that globals have matching centroid qualifiers</li>
|
||||
<li>glcpp: Fix segfault when validating macro redefinitions</li>
|
||||
<li>glsl: Fix parser rule for type_specifier</li>
|
||||
<li>glsl: Change default value of ast_type_specifier::precision</li>
|
||||
<li>glsl: Add semantic checks for precision qualifiers</li>
|
||||
<li>glsl: Add support for default precision statements</li>
|
||||
<li>glsl: Remove redundant semantic check in parser</li>
|
||||
<li>glsl: Fix semantic checks on precision qualifiers</li>
|
||||
<li>glsl: Fix segfault due to missing printf argument</li>
|
||||
<li>glsl: Mark 'in' variables at global scope as read-only</li>
|
||||
<li>glcpp: Raise error when modulus is zero</li>
|
||||
<li>glsl: Set operators '%' and '%=' to be reserved when GLSL < 1.30</li>
|
||||
<li>glsl: Reinstate constant-folding for division by zero</li>
|
||||
<li>tnl: Add support for datatype GL_FIXED in vertex arrays</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Chia-I Wu (1):
|
||||
<ul>
|
||||
<li>mesa: Add glDepthRangef and glClearDepthf to APIspec.xml.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Chris Wilson (1):
|
||||
<ul>
|
||||
<li>intel: Check for unsupported texture when finishing using as a render target</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Cyril Brulebois (1):
|
||||
<ul>
|
||||
<li>Point to bugs.freedesktop.org rather than bugzilla.freedesktop.org</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Dave Airlie (2):
|
||||
<ul>
|
||||
<li>radeon/r200: fix fbo-clearmipmap + gen-teximage</li>
|
||||
<li>radeon: avoid segfault on 3D textures.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Dimitry Andric (4):
|
||||
<ul>
|
||||
<li>mesa: s/movzx/movzbl/</li>
|
||||
<li>mesa: s/movzxw/movzwl/ in read_rgba_span_x86.S</li>
|
||||
<li>glapi: adding @ char before type specifier in glapi_x86.S</li>
|
||||
<li>glapi: add @GOTPCREL relocation type</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Eric Anholt (11):
|
||||
<ul>
|
||||
<li>i965: Avoid double-negation of immediate values in the VS.</li>
|
||||
<li>docs: Add a relnote for the Civ IV on i965.</li>
|
||||
<li>i965/vs: When MOVing to produce ABS, strip negate of the operand.</li>
|
||||
<li>glsl: Fix the lowering of variable array indexing to not lose write_masks.</li>
|
||||
<li>intel: Make renderbuffer tiling choice match texture tiling choice.</li>
|
||||
<li>glapi: Add entrypoints and enums for GL_ARB_ES2_compatibility.</li>
|
||||
<li>mesa: Add extension enable bit for GL_ARB_ES2_compatibility.</li>
|
||||
<li>mesa: Add actual support for glReleaseShaderCompiler from ES2.</li>
|
||||
<li>mesa: Add support for glDepthRangef and glClearDepthf.</li>
|
||||
<li>mesa: Add getters for ARB_ES2_compatibility MAX_*_VECTORS.</li>
|
||||
<li>mesa: Add getter for GL_SHADER_COMPILER with ARB_ES2_compatibility.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Ian Romanick (42):
|
||||
<ul>
|
||||
<li>docs: Add 7.9.1 md5sums</li>
|
||||
<li>glsl: Support the 'invariant(all)' pragma</li>
|
||||
<li>glcpp: Generate an error for division by zero</li>
|
||||
<li>glsl: Add version_string containing properly formatted GLSL version</li>
|
||||
<li>glsl & glcpp: Refresh autogenerated lexer and parser files.</li>
|
||||
<li>glsl: Disallow 'in' and 'out' on globals in GLSL 1.20</li>
|
||||
<li>glsl: Track variable usage, use that to enforce semantics</li>
|
||||
<li>glsl: Allow 'in' and 'out' when 'layout' is also available</li>
|
||||
<li>docs: Initial set of release notes for 7.9.2</li>
|
||||
<li>mesa: bump version to 7.9.2-devel</li>
|
||||
<li>docs: Update 7.9.2 release notes</li>
|
||||
<li>i965: Make OPCODE_KIL_NV do its work in a temp, not the null reg!</li>
|
||||
<li>glsl: Refresh autogenerated lexer and parser files.</li>
|
||||
<li>glsl: Don't assert when the value returned by a function has no rvalue</li>
|
||||
<li>linker: Set sizes for non-global arrays as well</li>
|
||||
<li>linker: Propagate max_array_access while linking functions</li>
|
||||
<li>docs: Update 7.9.2 release notes</li>
|
||||
<li>Use C-style system headers in C++ code to avoid issues with std:: namespace</li>
|
||||
<li>mesa: glGetUniform only returns a single element of an array</li>
|
||||
<li>linker: Generate link errors when ES shaders are missing stages</li>
|
||||
<li>mesa: Fix error checks in GetVertexAttrib functions</li>
|
||||
<li>docs: Update 7.9.2 release notes</li>
|
||||
<li>mesa: Remove unsupported OES extensions</li>
|
||||
<li>glapi: Regenerate for GL_ARB_ES2_compatibility.</li>
|
||||
<li>mesa: Connect glGetShaderPrecisionFormat into the dispatch table</li>
|
||||
<li>i965: Set correct values for range/precision of fragment shader types</li>
|
||||
<li>i915: Set correct values for range/precision of fragment shader types</li>
|
||||
<li>intel: Fix typeos from 3d028024 and 790ff232</li>
|
||||
<li>glsl: Ensure that all GLSL versions are supported in the stand-alone compiler</li>
|
||||
<li>glsl: Reject shader versions not supported by the implementation</li>
|
||||
<li>mesa: Initial size for secondary color array is 3</li>
|
||||
<li>glcpp: Regenerate files from recent cherry picks</li>
|
||||
<li>glsl: Finish out the reduce/reduce error fixes</li>
|
||||
<li>glsl: Regenerate compiler files from cherry picks</li>
|
||||
<li>linker: Fix off-by-one error implicit array sizing</li>
|
||||
<li>i915: Only mark a register as available if all components are written</li>
|
||||
<li>i915: Calculate partial result to temp register first</li>
|
||||
<li>i915: Force lowering of all types of indirect array accesses in the FS</li>
|
||||
<li>docs: Update 7.9.2 release notes for recent cherry picks</li>
|
||||
<li>docs: Clean up bug fixes list</li>
|
||||
<li>intel: Remove driver date and related bits from renderer string</li>
|
||||
<li>mesa: set version string to 7.9.2 (final)</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Jian Zhao (1):
|
||||
<ul>
|
||||
<li>mesa: fix an error in uniform arrays in row calculating.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Julien Cristau (3):
|
||||
<ul>
|
||||
<li>glx: fix request lengths</li>
|
||||
<li>glx: fix GLXChangeDrawableAttributesSGIX request</li>
|
||||
<li>glx: fix length of GLXGetFBConfigsSGIX</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Keith Packard (1):
|
||||
<ul>
|
||||
<li>glsl: Eliminate reduce/reduce conflicts in glsl grammar</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Kenneth Graunke (12):
|
||||
<ul>
|
||||
<li>glsl: Expose a public glsl_type::void_type const pointer.</li>
|
||||
<li>glsl: Don't bother unsetting a destructor that was never set.</li>
|
||||
<li>glsl, i965: Remove unnecessary talloc includes.</li>
|
||||
<li>glcpp: Remove use of talloc reference counting.</li>
|
||||
<li>ralloc: Add a fake implementation of ralloc based on talloc.</li>
|
||||
<li>Convert everything from the talloc API to the ralloc API.</li>
|
||||
<li>ralloc: a new MIT-licensed recursive memory allocator.</li>
|
||||
<li>Remove talloc from the make and automake build systems.</li>
|
||||
<li>Remove talloc from the SCons build system.</li>
|
||||
<li>Remove the talloc sources from the Mesa repository.</li>
|
||||
<li>glsl: Fix use of uninitialized values in _mesa_glsl_parse_state ctor.</li>
|
||||
<li>glsl: Use reralloc instead of plain realloc.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Marek Olšák (3):
|
||||
<ul>
|
||||
<li>docs: fix messed up names with special characters in relnotes-7.9.1</li>
|
||||
<li>mesa: fix texture3D mipmap generation for UNSIGNED_BYTE_3_3_2</li>
|
||||
<li>st/dri: Track drawable context bindings</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Paulo Zanoni (1):
|
||||
<ul>
|
||||
<li>dri_util: fail driCreateNewScreen if InitScreen is NULL</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Sam Hocevar (2):
|
||||
<ul>
|
||||
<li>docs: add glsl info</li>
|
||||
<li>docs: fix glsl_compiler name</li>
|
||||
</ul></p>
|
||||
|
||||
<p>Vinson Lee (1):
|
||||
<ul>
|
||||
<li>ralloc: Add missing va_end following va_copy.</li>
|
||||
</ul></p>
|
||||
|
||||
<p>nobled (1):
|
||||
<ul>
|
||||
<li>glx: Put null check before use</li>
|
||||
</ul></p>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -8,7 +8,7 @@
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.9 Release Notes / date TBD</H1>
|
||||
<H1>Mesa 7.9 Release Notes / October 4, 2010</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.9 is a new development release.
|
||||
@@ -28,7 +28,12 @@ for DRI hardware acceleration.
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
tbd
|
||||
ed65ab425b25895c7f473d0a5e6e64f8 MesaLib-7.9.tar.gz
|
||||
82c740c49d572baa6da2b1a1eee90bca MesaLib-7.9.tar.bz2
|
||||
cd2b6ecec759b0457475e94bbb38fedb MesaLib-7.9.zip
|
||||
7b54af9fb9b1f6a1a65db2520f50848f MesaGLUT-7.9.tar.gz
|
||||
20d07419d1929f833fdb36bced290ad5 MesaGLUT-7.9.tar.bz2
|
||||
62a7edecd7c92675cd6029b05217eb0a MesaGLUT-7.9.zip
|
||||
</pre>
|
||||
|
||||
|
||||
@@ -37,16 +42,85 @@ tbd
|
||||
<li>New, improved GLSL compiler written by Intel.
|
||||
See the <a href="shading.html"> Shading Language</a> page for
|
||||
more information.
|
||||
<li>GL_EXT_timer_query extension (i965 driver only)
|
||||
<li>New, very experimental Gallium driver for R600-R700 Radeons.
|
||||
<li>Support for AMD Evergreen-based Radeons (HD 5xxx)
|
||||
<li>GL_EXT_timer_query extension (i965 driver and softpipe only)
|
||||
<li>GL_EXT_framebuffer_multisample extension (intel drivers, MAX_SAMPLES = 1)
|
||||
<li>GL_ARB_texture_swizzle extension (alias of GL_EXT_texture_swizzle)
|
||||
<li>GL_ARB_draw_elements_base_vertex, GL_ARB_fragment_program_shadow
|
||||
and GL_EXT_draw_buffers2 in Gallium drivers
|
||||
<li>GL_ARB_draw_elements_base_vertex, GL_ARB_fragment_program_shadow,
|
||||
GL_ARB_window_pos, GL_EXT_gpu_program_parameters,
|
||||
GL_ATI_texture_env_combine3, GL_MESA_pack_invert, and GL_OES_EGL_image
|
||||
extensions in Gallium drivers
|
||||
<li>GL_ARB_depth_clamp and GL_NV_depth_clamp extensions (in nv50 and r600
|
||||
Gallium drivers)
|
||||
<li>GL_ARB_half_float_vertex extension (in nvfx, r300, r600, softpipe,
|
||||
and llvmpipe Gallium drivers)
|
||||
<li>GL_EXT_draw_buffers2 (in nv50, r600, softpipe, and llvmpipe Gallium
|
||||
drivers)
|
||||
<li>GL_EXT_texture_swizzle (in nvfx, r300, r600, softpipe, and llvmpipe
|
||||
Gallium drivers)
|
||||
<li>GL_ATI_texture_mirror_once (in nvfx, nv50, r300, r600, softpipe, and
|
||||
llvmpipe Gallium drivers)
|
||||
<li>GL_NV_conditional_render (in r300 Gallium driver)
|
||||
<li>Initial "signs of life" support for Sandybridge hardware in i965 DRI
|
||||
driver.
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<p>This list is likely incomplete.</p>
|
||||
<ul>
|
||||
<li>Massive improvements to the Gallium driver for R300-R500 Radeons; this
|
||||
driver is now considered stable for use as a DRI (OpenGL) driver.
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=10908">Bug 10908</a> - GLSL: gl_FogParamaters gl_Fog built-in uniform not functioning</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=13753">Bug 13753</a> - Numerous bugs in GLSL uniform handling</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=16854">Bug 16854</a> - GLSL function call at global scope causes SEGV</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=16856">Bug 16856</a> - GLSL indexing of unsized array results in assertion failure</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=18659">Bug 18659</a> - Crash in shader/slang/slang_codegen.c _slang_gen_function_call_name()</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=19089">Bug 19089</a> - [GLSL] glsl1/shadow2D() cases fail</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=22622">Bug 22622</a> - [GM965 GLSL] noise*() cause GPU lockup</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=23743">Bug 23743</a> - For loop from 0 to 0 not optimized out</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=24553">Bug 24553</a> - shader compilation times explode when using more () pairs</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25664">Bug 25664</a> - [GLSL] re-declaring an empty array fails to compile</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25769">Bug 25769</a> - [GLSL] "float" can be implicitly converted to "int"</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25808">Bug 25808</a> - [GLSL] const variable is modified successfully</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25826">Bug 25826</a> - [GLSL] declaring an unsized array then re-declaring with a size fails</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25827">Bug 25827</a> - [GLSL] vector constructor accepts too many arguments successfully</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25829">Bug 25829</a> - [GLSL] allowing non-void function without returning value</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25830">Bug 25830</a> - [GLSL] allowing non-constant-expression as const declaration initializer</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25877">Bug 25877</a> - [GLSL 1.10] implicit conversion from "int" to "float" should not be allowed</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25878">Bug 25878</a> - [GLSL] sampler is converted to int successfully</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25994">Bug 25994</a> - [GM45][GLSL] 'return' statement in vertex shader unsupported</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=25999">Bug 25999</a> - [GLSL] embedded structure constructor fails to compile</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26000">Bug 26000</a> - [GLSL] allowing different parameter qualifier between the function definition and declaration</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26001">Bug 26001</a> - [GLSL 1.10] constructing matrix from matrix succeeds</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26224">Bug 26224</a> - [GLSL] Cannot get location of a uniform struct member</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=26990">Bug 26990</a> - [GLSL] variable declaration in "while" fails to compile</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27004">Bug 27004</a> - [GLSL] allowing macro redefinition</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27060">Bug 27060</a> - [965] piglit glsl-fs-raytrace failure due to lack of function calls.</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27216">Bug 27216</a> - Assignment with a function call in an if statement causes an assertion failure</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27261">Bug 27261</a> - GLSL Compiler fails on the following vertex shader</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27265">Bug 27265</a> - GLSL Compiler doesnt link the attached vertex shader</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27388">Bug 27388</a> - [i965] piglit glsl-vs-arrays failure</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27403">Bug 27403</a> - GLSL struct causing "Invalid src register file ..." error</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=27914">Bug 27914</a> - GLSL compiler uses MUL+ADD where it could use MAD</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28055">Bug 28055</a> - glsl-texcoord-array fails GLSL compilation</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28374">Bug 28374</a> - SIGSEGV shader/slang/slang_typeinfo.c:534</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28748">Bug 28748</a> - [i965] uninlined function calls support</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28833">Bug 28833</a> - piglit/shaders/glsl-texcoord-array fail</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28834">Bug 28834</a> - Add support for system fpclassify to GL_OES_query_matrix function for OpenBSD / NetBSD</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28837">Bug 28837</a> - varying vec4 index support</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28845">Bug 28845</a> - The GLU tesselator code has some warnings</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28889">Bug 28889</a> - [regression] wine game crash</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28894">Bug 28894</a> - slang build fails if absolute path contains spaces</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28913">Bug 28913</a> - [GLSL] allowing two version statements</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28931">Bug 28931</a> - Floating Point Exception in Warzone2100 Trunk version</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28966">Bug 28966</a> - [r300g] Dynamic branching 3 demo does not run</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=28967">Bug 28967</a> - slang/slang_emit.c:350: storage_to_src_reg: Assertion `index >= 0' failed.</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29013">Bug 29013</a> - [r300g] translate_rgb_op: unknown opcode ILLEGAL OPCODE</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29020">Bug 29020</a> - [r300g] Wine d3d9 tests hardlock</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=29910">Bug 29910</a> - Mesa advertises bogus GL_ARB_shading_language_120</li>
|
||||
<li><a href="https://bugs.freedesktop.org/show_bug.cgi?id=30196">Bug 30196</a> - [GLSL] gl_TextureMatrix{Inverse,Transpose,InverseTranspose} unsupported</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
@@ -13,7 +13,10 @@ The release notes summarize what's new or changed in each Mesa release.
|
||||
</p>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="relnotes-7.9.2.html">7.9.2 release notes</A>
|
||||
<LI><A HREF="relnotes-7.9.1.html">7.9.1 release notes</A>
|
||||
<LI><A HREF="relnotes-7.9.html">7.9 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.3.html">7.8.3 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.2.html">7.8.2 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.1.html">7.8.1 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.html">7.8 release notes</A>
|
||||
|
@@ -167,7 +167,7 @@ Here's an example of using the compiler to compile a vertex shader and
|
||||
emit GL_ARB_vertex_program-style instructions:
|
||||
</p>
|
||||
<pre>
|
||||
src/glsl/glslcompiler --dump-ast myshader.vert
|
||||
src/glsl/glsl_compiler --dump-ast myshader.vert
|
||||
</pre>
|
||||
|
||||
Options include
|
||||
|
@@ -23,6 +23,7 @@ each directory.
|
||||
<ul>
|
||||
<li><b>docs</b> - EGL documentation
|
||||
<li><b>drivers</b> - EGL drivers
|
||||
<li><b>glsl</b> - the GLSL compiler
|
||||
<li><b>main</b> - main EGL library implementation. This is where all
|
||||
the EGL API functions are implemented, like eglCreateContext().
|
||||
</ul>
|
||||
|
@@ -805,7 +805,7 @@ typedef struct __DRIimageExtensionRec __DRIimageExtension;
|
||||
struct __DRIimageExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*createImageFromName)(__DRIcontext *context,
|
||||
__DRIimage *(*createImageFromName)(__DRIscreen *screen,
|
||||
int width, int height, int format,
|
||||
int name, int pitch,
|
||||
void *loaderPrivate);
|
||||
@@ -841,7 +841,7 @@ typedef struct __DRIimageLookupExtensionRec __DRIimageLookupExtension;
|
||||
struct __DRIimageLookupExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*lookupEGLImage)(__DRIcontext *context, void *image,
|
||||
__DRIimage *(*lookupEGLImage)(__DRIscreen *screen, void *image,
|
||||
void *loaderPrivate);
|
||||
};
|
||||
|
||||
|
@@ -370,10 +370,9 @@ dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_lookup_egl_image(__DRIcontext *context, void *image, void *data)
|
||||
dri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data)
|
||||
{
|
||||
struct dri2_egl_context *dri2_ctx = data;
|
||||
_EGLDisplay *disp = dri2_ctx->base.Resource.Display;
|
||||
_EGLDisplay *disp = data;
|
||||
struct dri2_egl_image *dri2_img;
|
||||
_EGLImage *img;
|
||||
|
||||
@@ -728,7 +727,7 @@ dri2_create_screen(_EGLDisplay *disp)
|
||||
dri2_dpy = disp->DriverData;
|
||||
dri2_dpy->dri_screen =
|
||||
dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, dri2_dpy->extensions,
|
||||
&dri2_dpy->driver_configs, dri2_dpy);
|
||||
&dri2_dpy->driver_configs, disp);
|
||||
|
||||
if (dri2_dpy->dri_screen == NULL) {
|
||||
_eglLog(_EGL_WARNING, "DRI2: failed to create dri screen");
|
||||
@@ -742,7 +741,7 @@ dri2_create_screen(_EGLDisplay *disp)
|
||||
if (dri2_dpy->dri2->base.version >= 2)
|
||||
api_mask = dri2_dpy->dri2->getAPIMask(dri2_dpy->dri_screen);
|
||||
else
|
||||
api_mask = __DRI_API_OPENGL;
|
||||
api_mask = 1 << __DRI_API_OPENGL;
|
||||
|
||||
disp->ClientAPIsMask = 0;
|
||||
if (api_mask & (1 <<__DRI_API_OPENGL))
|
||||
@@ -889,10 +888,20 @@ const int i915_chip_ids[] = {
|
||||
0x29b2, /* PCI_CHIP_Q35_G */
|
||||
0x29c2, /* PCI_CHIP_G33_G */
|
||||
0x29d2, /* PCI_CHIP_Q33_G */
|
||||
0xa001, /* PCI_CHIP_IGD_G */
|
||||
0xa011, /* Pineview */
|
||||
};
|
||||
|
||||
const int i965_chip_ids[] = {
|
||||
0x0042, /* PCI_CHIP_ILD_G */
|
||||
0x0046, /* PCI_CHIP_ILM_G */
|
||||
0x0102, /* PCI_CHIP_SANDYBRIDGE_GT1 */
|
||||
0x0106, /* PCI_CHIP_SANDYBRIDGE_M_GT1 */
|
||||
0x010a, /* PCI_CHIP_SANDYBRIDGE_S */
|
||||
0x0112, /* PCI_CHIP_SANDYBRIDGE_GT2 */
|
||||
0x0116, /* PCI_CHIP_SANDYBRIDGE_M_GT2 */
|
||||
0x0122, /* PCI_CHIP_SANDYBRIDGE_GT2_PLUS */
|
||||
0x0126, /* PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS */
|
||||
0x29a2, /* PCI_CHIP_I965_G */
|
||||
0x2992, /* PCI_CHIP_I965_Q */
|
||||
0x2982, /* PCI_CHIP_I965_G_1 */
|
||||
@@ -904,6 +913,8 @@ const int i965_chip_ids[] = {
|
||||
0x2e12, /* PCI_CHIP_Q45_G */
|
||||
0x2e22, /* PCI_CHIP_G45_G */
|
||||
0x2e32, /* PCI_CHIP_G41_G */
|
||||
0x2e42, /* PCI_CHIP_B43_G */
|
||||
0x2e92, /* PCI_CHIP_B43_G1 */
|
||||
};
|
||||
|
||||
const struct dri2_driver_map driver_map[] = {
|
||||
@@ -1509,7 +1520,6 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
EGLClientBuffer buffer, const EGLint *attr_list)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img;
|
||||
unsigned int attachments[1];
|
||||
xcb_drawable_t drawable;
|
||||
@@ -1577,7 +1587,7 @@ dri2_create_image_khr_pixmap(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
|
||||
stride = buffers[0].pitch / buffers[0].cpp;
|
||||
dri2_img->dri_image =
|
||||
dri2_dpy->image->createImageFromName(dri2_ctx->dri_context,
|
||||
dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
buffers_reply->width,
|
||||
buffers_reply->height,
|
||||
format,
|
||||
@@ -1628,7 +1638,6 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
EGLClientBuffer buffer, const EGLint *attr_list)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img;
|
||||
EGLint width, height, format, name, stride, pitch, i, err;
|
||||
|
||||
@@ -1697,7 +1706,7 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
}
|
||||
|
||||
dri2_img->dri_image =
|
||||
dri2_dpy->image->createImageFromName(dri2_ctx->dri_context,
|
||||
dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
width,
|
||||
height,
|
||||
format,
|
||||
|
@@ -142,7 +142,6 @@ static const struct {
|
||||
{ GLX_STENCIL_SIZE, EGL_STENCIL_SIZE },
|
||||
{ GLX_SAMPLE_BUFFERS, EGL_SAMPLE_BUFFERS },
|
||||
{ GLX_SAMPLES, EGL_SAMPLES },
|
||||
{ GLX_RENDER_TYPE, EGL_RENDERABLE_TYPE },
|
||||
{ GLX_X_RENDERABLE, EGL_NATIVE_RENDERABLE },
|
||||
{ GLX_X_VISUAL_TYPE, EGL_NATIVE_VISUAL_TYPE },
|
||||
{ GLX_CONFIG_CAVEAT, EGL_CONFIG_CAVEAT },
|
||||
@@ -218,6 +217,16 @@ convert_fbconfig(Display *dpy, GLXFBConfig fbconfig,
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_SURFACE_TYPE, surface_type);
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT);
|
||||
|
||||
glXGetFBConfigAttrib(dpy, fbconfig, GLX_TRANSPARENT_TYPE, &val);
|
||||
if (val == GLX_NONE) {
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_TYPE, EGL_NONE);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_RED_VALUE, 0);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_GREEN_VALUE, 0);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_TRANSPARENT_BLUE_VALUE, 0);
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
@@ -294,6 +303,7 @@ convert_visual(Display *dpy, XVisualInfo *vinfo,
|
||||
surface_type |= EGL_PIXMAP_BIT;
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_SURFACE_TYPE, surface_type);
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT);
|
||||
|
||||
_eglSetConfigKey(&GLX_conf->Base, EGL_NATIVE_RENDERABLE, EGL_TRUE);
|
||||
|
||||
|
@@ -57,7 +57,7 @@ EGL_NATIVE_PLATFORM=_EGL_INVALID_PLATFORM
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),x11)
|
||||
EGL_NATIVE_PLATFORM=_EGL_PLATFORM_X11
|
||||
endif
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),kms)
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),drm)
|
||||
EGL_NATIVE_PLATFORM=_EGL_PLATFORM_DRM
|
||||
endif
|
||||
ifeq ($(firstword $(EGL_PLATFORMS)),fbdev)
|
||||
|
@@ -402,10 +402,15 @@ eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
|
||||
_EGLContext *context;
|
||||
EGLContext ret;
|
||||
|
||||
if (config)
|
||||
_EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv);
|
||||
else
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
|
||||
|
||||
if (!config) {
|
||||
/* config may be NULL if surfaceless */
|
||||
if (!disp->Extensions.KHR_surfaceless_gles1 &&
|
||||
!disp->Extensions.KHR_surfaceless_gles2 &&
|
||||
!disp->Extensions.KHR_surfaceless_opengl)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
|
||||
}
|
||||
|
||||
if (!share && share_list != EGL_NO_CONTEXT)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
|
||||
@@ -459,9 +464,19 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
|
||||
|
||||
if (!context && ctx != EGL_NO_CONTEXT)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
|
||||
if ((!draw_surf && draw != EGL_NO_SURFACE) ||
|
||||
(!read_surf && read != EGL_NO_SURFACE))
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
if (!draw_surf || !read_surf) {
|
||||
/* surfaces may be NULL if surfaceless */
|
||||
if (!disp->Extensions.KHR_surfaceless_gles1 &&
|
||||
!disp->Extensions.KHR_surfaceless_gles2 &&
|
||||
!disp->Extensions.KHR_surfaceless_opengl)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
|
||||
if ((!draw_surf && draw != EGL_NO_SURFACE) ||
|
||||
(!read_surf && read != EGL_NO_SURFACE))
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
if (draw_surf || read_surf)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
|
||||
}
|
||||
|
||||
ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
|
||||
|
||||
@@ -1276,6 +1291,8 @@ eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
|
||||
EGLImageKHR ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
|
||||
if (!disp->Extensions.KHR_image_base)
|
||||
RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
|
||||
if (!context && ctx != EGL_NO_CONTEXT)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
|
||||
|
||||
@@ -1296,6 +1313,8 @@ eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
|
||||
if (!disp->Extensions.KHR_image_base)
|
||||
RETURN_EGL_EVAL(disp, EGL_FALSE);
|
||||
if (!img)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
|
||||
|
||||
@@ -1321,6 +1340,8 @@ eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
|
||||
EGLSyncKHR ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
|
||||
if (!disp->Extensions.KHR_reusable_sync)
|
||||
RETURN_EGL_EVAL(disp, EGL_NO_SYNC_KHR);
|
||||
|
||||
sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
|
||||
ret = (sync) ? _eglLinkSync(sync, disp) : EGL_NO_SYNC_KHR;
|
||||
@@ -1338,6 +1359,8 @@ eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
|
||||
_eglUnlinkSync(s);
|
||||
ret = drv->API.DestroySyncKHR(drv, disp, s);
|
||||
|
||||
@@ -1354,6 +1377,7 @@ eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR t
|
||||
EGLint ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
@@ -1369,6 +1393,7 @@ eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
@@ -1384,6 +1409,7 @@ eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *v
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.KHR_reusable_sync);
|
||||
ret = drv->API.GetSyncAttribKHR(drv, disp, s, attribute, value);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
@@ -1407,14 +1433,14 @@ eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
|
||||
|
||||
_EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
|
||||
|
||||
if (!disp->Extensions.NOK_swap_region)
|
||||
RETURN_EGL_EVAL(disp, EGL_FALSE);
|
||||
|
||||
/* surface must be bound to current context in EGL 1.4 */
|
||||
if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
|
||||
|
||||
if (drv->API.SwapBuffersRegionNOK)
|
||||
ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
|
||||
else
|
||||
ret = drv->API.SwapBuffers(drv, disp, surf);
|
||||
ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
}
|
||||
@@ -1433,6 +1459,8 @@ eglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
|
||||
EGLImageKHR ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
|
||||
if (!disp->Extensions.MESA_drm_image)
|
||||
RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
|
||||
|
||||
img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
|
||||
ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR;
|
||||
@@ -1450,6 +1478,8 @@ eglExportDRMImageMESA(EGLDisplay dpy, EGLImageKHR image,
|
||||
EGLBoolean ret;
|
||||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
|
||||
assert(disp->Extensions.MESA_drm_image);
|
||||
|
||||
if (!img)
|
||||
RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
|
||||
|
||||
|
@@ -272,10 +272,6 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
|
||||
if (!surfaceless && (draw == NULL || read == NULL))
|
||||
return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
|
||||
|
||||
/* context stealing from another thread is not allowed */
|
||||
if (ctx->Binding && ctx->Binding != t)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
|
||||
/*
|
||||
* The spec says
|
||||
*
|
||||
@@ -283,16 +279,23 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
|
||||
* bound to contexts in another thread, an EGL_BAD_ACCESS error is
|
||||
* generated."
|
||||
*
|
||||
* But it also says
|
||||
* and
|
||||
*
|
||||
* "at most one context may be bound to a particular surface at a given
|
||||
* time"
|
||||
*
|
||||
* The latter is more restrictive so we can check only the latter case.
|
||||
*/
|
||||
if ((draw && draw->CurrentContext && draw->CurrentContext != ctx) ||
|
||||
(read && read->CurrentContext && read->CurrentContext != ctx))
|
||||
if (ctx->Binding && ctx->Binding != t)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
if (draw && draw->CurrentContext && draw->CurrentContext != ctx) {
|
||||
if (draw->CurrentContext->Binding != t ||
|
||||
draw->CurrentContext->ClientAPI != ctx->ClientAPI)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
}
|
||||
if (read && read->CurrentContext && read->CurrentContext != ctx) {
|
||||
if (read->CurrentContext->Binding != t ||
|
||||
read->CurrentContext->ClientAPI != ctx->ClientAPI)
|
||||
return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
|
||||
}
|
||||
|
||||
/* simply require the configs to be equal */
|
||||
if ((draw && draw->Config != ctx->Config) ||
|
||||
|
@@ -27,7 +27,7 @@ _eglGetNativePlatformFromEnv(void)
|
||||
} egl_platforms[_EGL_NUM_PLATFORMS] = {
|
||||
{ _EGL_PLATFORM_WINDOWS, "gdi" },
|
||||
{ _EGL_PLATFORM_X11, "x11" },
|
||||
{ _EGL_PLATFORM_DRM, "kms" },
|
||||
{ _EGL_PLATFORM_DRM, "drm" },
|
||||
{ _EGL_PLATFORM_FBDEV, "fbdev" }
|
||||
};
|
||||
_EGLPlatformType plat = _EGL_INVALID_PLATFORM;
|
||||
|
@@ -4,7 +4,7 @@
|
||||
|
||||
#include "egltypedefs.h"
|
||||
#include "eglapi.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/**
|
||||
* Define an inline driver typecast function.
|
||||
|
@@ -206,16 +206,16 @@ include ../Makefile.template
|
||||
|
||||
|
||||
indices/u_indices_gen.c: indices/u_indices_gen.py
|
||||
python $< > $@
|
||||
$(PYTHON2) $< > $@
|
||||
|
||||
indices/u_unfilled_gen.c: indices/u_unfilled_gen.py
|
||||
python $< > $@
|
||||
$(PYTHON2) $< > $@
|
||||
|
||||
util/u_format_srgb.c: util/u_format_srgb.py
|
||||
python $< > $@
|
||||
$(PYTHON2) $< > $@
|
||||
|
||||
util/u_format_table.c: util/u_format_table.py util/u_format_pack.py util/u_format_parse.py util/u_format.csv
|
||||
python util/u_format_table.py util/u_format.csv > $@
|
||||
$(PYTHON2) util/u_format_table.py util/u_format.csv > $@
|
||||
|
||||
util/u_half.c: util/u_half.py
|
||||
python util/u_half.py > $@
|
||||
$(PYTHON2) util/u_half.py > $@
|
||||
|
@@ -595,7 +595,7 @@ enum pipe_error cso_set_vertex_samplers(struct cso_context *ctx,
|
||||
error = temp;
|
||||
}
|
||||
|
||||
for ( ; i < ctx->nr_samplers; i++) {
|
||||
for ( ; i < ctx->nr_vertex_samplers; i++) {
|
||||
temp = cso_single_vertex_sampler( ctx, i, NULL );
|
||||
if (temp != PIPE_OK)
|
||||
error = temp;
|
||||
|
@@ -263,6 +263,8 @@ do_clip_tri( struct draw_stage *stage,
|
||||
clipmask &= ~(1<<plane_idx);
|
||||
|
||||
assert(n < MAX_CLIPPED_VERTICES);
|
||||
if (n >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
inlist[n] = inlist[0]; /* prevent rotation of vertices */
|
||||
|
||||
for (i = 1; i <= n; i++) {
|
||||
@@ -272,16 +274,22 @@ do_clip_tri( struct draw_stage *stage,
|
||||
|
||||
if (!IS_NEGATIVE(dp_prev)) {
|
||||
assert(outcount < MAX_CLIPPED_VERTICES);
|
||||
if (outcount >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
outlist[outcount++] = vert_prev;
|
||||
}
|
||||
|
||||
if (DIFFERENT_SIGNS(dp, dp_prev)) {
|
||||
struct vertex_header *new_vert;
|
||||
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES+1);
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
new_vert = clipper->stage.tmp[tmpnr++];
|
||||
|
||||
assert(outcount < MAX_CLIPPED_VERTICES);
|
||||
if (outcount >= MAX_CLIPPED_VERTICES)
|
||||
return;
|
||||
outlist[outcount++] = new_vert;
|
||||
|
||||
if (IS_NEGATIVE(dp)) {
|
||||
@@ -321,27 +329,32 @@ do_clip_tri( struct draw_stage *stage,
|
||||
|
||||
/* If flat-shading, copy provoking vertex color to polygon vertex[0]
|
||||
*/
|
||||
if (clipper->flat) {
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
if (inlist[0] != header->v[0]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[0]);
|
||||
if (n >= 3) {
|
||||
if (clipper->flat) {
|
||||
if (stage->draw->rasterizer->flatshade_first) {
|
||||
if (inlist[0] != header->v[0]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[0]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (inlist[0] != header->v[2]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
if (tmpnr >= MAX_CLIPPED_VERTICES + 1)
|
||||
return;
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (inlist[0] != header->v[2]) {
|
||||
assert(tmpnr < MAX_CLIPPED_VERTICES + 1);
|
||||
inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
|
||||
copy_colors(stage, inlist[0], header->v[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Emit the polygon as triangles to the setup stage:
|
||||
*/
|
||||
if (n >= 3)
|
||||
|
||||
/* Emit the polygon as triangles to the setup stage:
|
||||
*/
|
||||
emit_poly( stage, inlist, n, header );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -258,9 +258,10 @@ vsplit_segment_fan_linear(struct vsplit_frontend *vsplit, unsigned flags,
|
||||
boolean use_spoken = ((flags & DRAW_SPLIT_BEFORE) != 0);
|
||||
unsigned nr = 0, i;
|
||||
|
||||
assert(icount + !!use_spoken <= vsplit->segment_size);
|
||||
assert(icount <= vsplit->segment_size);
|
||||
|
||||
if (use_spoken) {
|
||||
/* replace istart by i0 */
|
||||
vsplit->fetch_elts[nr++] = i0;
|
||||
for (i = 1 ; i < icount; i++)
|
||||
vsplit->fetch_elts[nr++] = istart + i;
|
||||
|
@@ -76,11 +76,15 @@ lp_build_broadcast_scalar(struct lp_build_context *bld,
|
||||
}
|
||||
else {
|
||||
LLVMValueRef res;
|
||||
/* The shuffle vector is always made of int32 elements */
|
||||
struct lp_type i32_vec_type = lp_type_int_vec(32);
|
||||
i32_vec_type.length = type.length;
|
||||
|
||||
#if HAVE_LLVM >= 0x207
|
||||
res = LLVMBuildInsertElement(bld->builder, bld->undef, scalar,
|
||||
LLVMConstInt(LLVMInt32Type(), 0, 0), "");
|
||||
res = LLVMBuildShuffleVector(bld->builder, res, bld->undef,
|
||||
lp_build_const_int_vec(type, 0), "");
|
||||
lp_build_const_int_vec(i32_vec_type, 0), "");
|
||||
#else
|
||||
/* XXX: The above path provokes a bug in LLVM 2.6 */
|
||||
unsigned i;
|
||||
|
@@ -605,8 +605,10 @@ tgsi_check_soa_dependencies(const struct tgsi_full_instruction *inst)
|
||||
for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
|
||||
if ((inst->Src[i].Register.File ==
|
||||
inst->Dst[0].Register.File) &&
|
||||
(inst->Src[i].Register.Index ==
|
||||
inst->Dst[0].Register.Index)) {
|
||||
((inst->Src[i].Register.Index ==
|
||||
inst->Dst[0].Register.Index) ||
|
||||
inst->Src[i].Register.Indirect ||
|
||||
inst->Dst[0].Register.Indirect)) {
|
||||
/* loop over dest channels */
|
||||
uint channelsWritten = 0x0;
|
||||
FOR_EACH_ENABLED_CHANNEL(*inst, chan) {
|
||||
|
@@ -2703,8 +2703,7 @@ static void aos_to_soa( struct x86_function *func,
|
||||
struct x86_reg aos_input = x86_make_reg( file_REG32, reg_BX );
|
||||
struct x86_reg num_inputs = x86_make_reg( file_REG32, reg_CX );
|
||||
struct x86_reg stride = x86_make_reg( file_REG32, reg_DX );
|
||||
int inner_loop;
|
||||
|
||||
int loop_top, loop_exit_fixup;
|
||||
|
||||
/* Save EBX */
|
||||
x86_push( func, x86_make_reg( file_REG32, reg_BX ) );
|
||||
@@ -2717,8 +2716,11 @@ static void aos_to_soa( struct x86_function *func,
|
||||
x86_mov( func, num_inputs, x86_fn_arg( func, arg_num ) );
|
||||
x86_mov( func, stride, x86_fn_arg( func, arg_stride ) );
|
||||
|
||||
/* do */
|
||||
inner_loop = x86_get_label( func );
|
||||
/* while (num_inputs != 0) */
|
||||
loop_top = x86_get_label( func );
|
||||
x86_cmp_imm( func, num_inputs, 0 );
|
||||
loop_exit_fixup = x86_jcc_forward( func, cc_E );
|
||||
|
||||
{
|
||||
x86_push( func, aos_input );
|
||||
sse_movlps( func, make_xmm( 0 ), x86_make_disp( aos_input, 0 ) );
|
||||
@@ -2750,9 +2752,10 @@ static void aos_to_soa( struct x86_function *func,
|
||||
x86_lea( func, aos_input, x86_make_disp(aos_input, 16) );
|
||||
x86_lea( func, soa_input, x86_make_disp(soa_input, 64) );
|
||||
}
|
||||
/* while --num_inputs */
|
||||
/* --num_inputs */
|
||||
x86_dec( func, num_inputs );
|
||||
x86_jcc( func, cc_NE, inner_loop );
|
||||
x86_jmp( func, loop_top );
|
||||
x86_fixup_fwd_jump( func, loop_exit_fixup );
|
||||
|
||||
/* Restore EBX */
|
||||
x86_pop( func, x86_make_reg( file_REG32, reg_BX ) );
|
||||
@@ -2827,31 +2830,52 @@ static void soa_to_aos( struct x86_function *func,
|
||||
* Check if the instructions dst register is the same as any src
|
||||
* register and warn if there's a posible SOA dependency.
|
||||
*/
|
||||
static void
|
||||
static boolean
|
||||
check_soa_dependencies(const struct tgsi_full_instruction *inst)
|
||||
{
|
||||
switch (inst->Instruction.Opcode) {
|
||||
uint opcode = inst->Instruction.Opcode;
|
||||
|
||||
/* XXX: we only handle src/dst aliasing in a few opcodes currently.
|
||||
* Need to use an additional temporay to hold the result in the
|
||||
* cases where the code is too opaque to fix.
|
||||
*/
|
||||
|
||||
switch (opcode) {
|
||||
case TGSI_OPCODE_ADD:
|
||||
case TGSI_OPCODE_MOV:
|
||||
case TGSI_OPCODE_MUL:
|
||||
case TGSI_OPCODE_RCP:
|
||||
case TGSI_OPCODE_RSQ:
|
||||
case TGSI_OPCODE_EXP:
|
||||
case TGSI_OPCODE_LOG:
|
||||
case TGSI_OPCODE_DP3:
|
||||
case TGSI_OPCODE_DP4:
|
||||
case TGSI_OPCODE_DP2A:
|
||||
case TGSI_OPCODE_EX2:
|
||||
case TGSI_OPCODE_LG2:
|
||||
case TGSI_OPCODE_POW:
|
||||
case TGSI_OPCODE_XPD:
|
||||
case TGSI_OPCODE_DPH:
|
||||
case TGSI_OPCODE_COS:
|
||||
case TGSI_OPCODE_SIN:
|
||||
case TGSI_OPCODE_TEX:
|
||||
case TGSI_OPCODE_TXB:
|
||||
case TGSI_OPCODE_TXP:
|
||||
case TGSI_OPCODE_NRM:
|
||||
case TGSI_OPCODE_NRM4:
|
||||
case TGSI_OPCODE_DP2:
|
||||
/* OK - these opcodes correctly handle SOA dependencies */
|
||||
break;
|
||||
return TRUE;
|
||||
default:
|
||||
if (tgsi_check_soa_dependencies(inst)) {
|
||||
uint opcode = inst->Instruction.Opcode;
|
||||
if (!tgsi_check_soa_dependencies(inst))
|
||||
return TRUE;
|
||||
|
||||
/* XXX: we only handle src/dst aliasing in a few opcodes
|
||||
* currently. Need to use an additional temporay to hold
|
||||
* the result in the cases where the code is too opaque to
|
||||
* fix.
|
||||
*/
|
||||
if (opcode != TGSI_OPCODE_MOV) {
|
||||
debug_printf("Warning: src/dst aliasing in instruction"
|
||||
" is not handled:\n");
|
||||
tgsi_dump_instruction(inst, 1);
|
||||
}
|
||||
}
|
||||
debug_printf("Warning: src/dst aliasing in instruction"
|
||||
" is not handled:\n");
|
||||
debug_printf("Warning: ");
|
||||
tgsi_dump_instruction(inst, 1);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2951,7 +2975,8 @@ tgsi_emit_sse2(
|
||||
tgsi_get_processor_name(proc));
|
||||
}
|
||||
|
||||
check_soa_dependencies(&parse.FullToken.FullInstruction);
|
||||
if (ok)
|
||||
ok = check_soa_dependencies(&parse.FullToken.FullInstruction);
|
||||
break;
|
||||
|
||||
case TGSI_TOKEN_TYPE_IMMEDIATE:
|
||||
|
@@ -262,19 +262,20 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst,
|
||||
case TGSI_OPCODE_TXL:
|
||||
case TGSI_OPCODE_TXP:
|
||||
if (src_idx == 0) {
|
||||
/* Note that the SHADOW variants use the Z component too */
|
||||
switch (inst->Texture.Texture) {
|
||||
case TGSI_TEXTURE_1D:
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
read_mask = TGSI_WRITEMASK_X;
|
||||
break;
|
||||
|
||||
case TGSI_TEXTURE_SHADOW1D:
|
||||
read_mask = TGSI_WRITEMASK_XZ;
|
||||
break;
|
||||
case TGSI_TEXTURE_2D:
|
||||
case TGSI_TEXTURE_RECT:
|
||||
case TGSI_TEXTURE_SHADOW2D:
|
||||
case TGSI_TEXTURE_SHADOWRECT:
|
||||
read_mask = TGSI_WRITEMASK_XY;
|
||||
break;
|
||||
|
||||
case TGSI_TEXTURE_SHADOW2D:
|
||||
case TGSI_TEXTURE_SHADOWRECT:
|
||||
case TGSI_TEXTURE_3D:
|
||||
case TGSI_TEXTURE_CUBE:
|
||||
read_mask = TGSI_WRITEMASK_XYZ;
|
||||
|
@@ -29,6 +29,8 @@
|
||||
#define PIPE_ATOMIC_ASM_MSVC_X86
|
||||
#elif (defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86))
|
||||
#define PIPE_ATOMIC_ASM_GCC_X86
|
||||
#elif (defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86_64))
|
||||
#define PIPE_ATOMIC_ASM_GCC_X86_64
|
||||
#elif defined(PIPE_CC_GCC) && (PIPE_CC_GCC_VERSION >= 401)
|
||||
#define PIPE_ATOMIC_GCC_INTRINSIC
|
||||
#else
|
||||
@@ -36,6 +38,51 @@
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(PIPE_ATOMIC_ASM_GCC_X86_64)
|
||||
#define PIPE_ATOMIC "GCC x86_64 assembly"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define p_atomic_set(_v, _i) (*(_v) = (_i))
|
||||
#define p_atomic_read(_v) (*(_v))
|
||||
|
||||
static INLINE boolean
|
||||
p_atomic_dec_zero(int32_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__("lock; decl %0; sete %1":"+m"(*v), "=qm"(c)
|
||||
::"memory");
|
||||
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
p_atomic_inc(int32_t *v)
|
||||
{
|
||||
__asm__ __volatile__("lock; incl %0":"+m"(*v));
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
p_atomic_dec(int32_t *v)
|
||||
{
|
||||
__asm__ __volatile__("lock; decl %0":"+m"(*v));
|
||||
}
|
||||
|
||||
static INLINE int32_t
|
||||
p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new)
|
||||
{
|
||||
return __sync_val_compare_and_swap(v, old, _new);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* PIPE_ATOMIC_ASM_GCC_X86_64 */
|
||||
|
||||
|
||||
#if defined(PIPE_ATOMIC_ASM_GCC_X86)
|
||||
|
||||
|
@@ -268,7 +268,7 @@ void util_blitter_destroy(struct blitter_context *blitter)
|
||||
pipe->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
|
||||
}
|
||||
|
||||
for (i = 0; i <= PIPE_MAX_COLOR_BUFS && ctx->fs_col[i]; i++)
|
||||
for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++)
|
||||
if (ctx->fs_col[i])
|
||||
pipe->delete_fs_state(pipe, ctx->fs_col[i]);
|
||||
|
||||
@@ -741,8 +741,6 @@ void util_blitter_copy_region(struct blitter_context *blitter,
|
||||
if (dst == src) {
|
||||
assert(!is_overlap(srcx, srcx + width, srcy, srcy + height,
|
||||
dstx, dstx + width, dsty, dsty + height));
|
||||
} else {
|
||||
assert(dst->format == src->format);
|
||||
}
|
||||
assert(src->target < PIPE_MAX_TEXTURE_TYPES);
|
||||
|
||||
|
@@ -82,6 +82,7 @@ util_check_caps_out(struct pipe_screen *screen, const unsigned *list, int *out)
|
||||
*out = i - 3;
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case UTIL_CAPS_CHECK_UNIMPLEMENTED:
|
||||
*out = i - 1;
|
||||
return FALSE;
|
||||
|
@@ -394,7 +394,7 @@ util_pack_color(const float rgba[4], enum pipe_format format, union util_color *
|
||||
return;
|
||||
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
||||
{
|
||||
uc->ub = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
|
||||
uc->us = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
|
||||
}
|
||||
return;
|
||||
case PIPE_FORMAT_A8_UNORM:
|
||||
|
@@ -46,6 +46,8 @@
|
||||
do { \
|
||||
(elem)->next->prev = (elem)->prev; \
|
||||
(elem)->prev->next = (elem)->next; \
|
||||
(elem)->next = elem; \
|
||||
(elem)->prev = elem; \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
@@ -332,7 +332,7 @@ util_clear_depth_stencil(struct pipe_context *pipe,
|
||||
uint32_t *row = (uint32_t *)dst_map;
|
||||
for (j = 0; j < width; j++) {
|
||||
uint32_t tmp = *row & dst_mask;
|
||||
*row++ = tmp & (zstencil & ~dst_mask);
|
||||
*row++ = tmp | (zstencil & ~dst_mask);
|
||||
}
|
||||
dst_map += dst_stride;
|
||||
}
|
||||
|
@@ -70,7 +70,7 @@ PROGS_DEPS := ../../auxiliary/libgallium.a
|
||||
include ../../Makefile.template
|
||||
|
||||
lp_tile_soa.c: lp_tile_soa.py ../../auxiliary/util/u_format_parse.py ../../auxiliary/util/u_format_pack.py ../../auxiliary/util/u_format.csv
|
||||
python lp_tile_soa.py ../../auxiliary/util/u_format.csv > $@
|
||||
$(PYTHON2) $(PYTHON_FLAGS) lp_tile_soa.py ../../auxiliary/util/u_format.csv > $@
|
||||
|
||||
LDFLAGS += $(LLVM_LDFLAGS)
|
||||
LIBS += -L../../auxiliary/ -lgallium libllvmpipe.a $(LLVM_LIBS) $(GL_LIB_DEPS)
|
||||
|
@@ -262,7 +262,7 @@ lp_build_stencil_op_single(struct lp_build_context *bld,
|
||||
LLVMValueRef writemask = lp_build_const_int_vec(type, stencil->writemask);
|
||||
mask = LLVMBuildAnd(bld->builder, mask, writemask, "");
|
||||
/* res = (res & mask) | (stencilVals & ~mask) */
|
||||
res = lp_build_select_bitwise(bld, writemask, res, stencilVals);
|
||||
res = lp_build_select_bitwise(bld, mask, res, stencilVals);
|
||||
}
|
||||
else {
|
||||
/* res = mask ? res : stencilVals */
|
||||
|
@@ -155,12 +155,9 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
|
||||
draw_install_aapoint_stage(llvmpipe->draw, &llvmpipe->pipe);
|
||||
draw_install_pstipple_stage(llvmpipe->draw, &llvmpipe->pipe);
|
||||
|
||||
/* convert points and lines into triangles:
|
||||
* (otherwise, draw points and lines natively)
|
||||
*/
|
||||
draw_wide_point_sprites(llvmpipe->draw, FALSE);
|
||||
draw_enable_point_sprites(llvmpipe->draw, FALSE);
|
||||
draw_wide_point_threshold(llvmpipe->draw, 10000.0);
|
||||
/* convert points/sprites into triangles. Draw non-AA lines natively */
|
||||
draw_wide_point_sprites(llvmpipe->draw, TRUE);
|
||||
draw_enable_point_sprites(llvmpipe->draw, TRUE);
|
||||
draw_wide_line_threshold(llvmpipe->draw, 10000.0);
|
||||
|
||||
#if USE_DRAW_STAGE_PSTIPPLE
|
||||
|
@@ -92,8 +92,9 @@ llvmpipe_get_query_result(struct pipe_context *pipe,
|
||||
int i;
|
||||
|
||||
if (!pq->fence) {
|
||||
assert(0); /* query not in issued state */
|
||||
return FALSE;
|
||||
/* no fence because there was no scene, so results is zero */
|
||||
*result = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!lp_fence_signalled(pq->fence)) {
|
||||
|
@@ -975,6 +975,8 @@ lp_setup_begin_query(struct lp_setup_context *setup,
|
||||
{
|
||||
/* init the query to its beginning state */
|
||||
assert(setup->active_query == NULL);
|
||||
|
||||
set_scene_state(setup, SETUP_ACTIVE, "begin_query");
|
||||
|
||||
if (setup->scene) {
|
||||
if (!lp_scene_bin_everywhere(setup->scene,
|
||||
@@ -1004,6 +1006,8 @@ lp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
|
||||
{
|
||||
union lp_rast_cmd_arg dummy = { 0 };
|
||||
|
||||
set_scene_state(setup, SETUP_ACTIVE, "end_query");
|
||||
|
||||
assert(setup->active_query == pq);
|
||||
setup->active_query = NULL;
|
||||
|
||||
|
@@ -292,6 +292,7 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
float x2diff;
|
||||
float y2diff;
|
||||
float dx, dy;
|
||||
float area;
|
||||
|
||||
boolean draw_start;
|
||||
boolean draw_end;
|
||||
@@ -311,6 +312,18 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
|
||||
dx = v1[0][0] - v2[0][0];
|
||||
dy = v1[0][1] - v2[0][1];
|
||||
area = (dx * dx + dy * dy);
|
||||
if (area == 0) {
|
||||
LP_COUNT(nr_culled_tris);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
info.oneoverarea = 1.0f / area;
|
||||
info.dx = dx;
|
||||
info.dy = dy;
|
||||
info.v1 = v1;
|
||||
info.v2 = v2;
|
||||
|
||||
|
||||
/* X-MAJOR LINE */
|
||||
if (fabsf(dx) >= fabsf(dy)) {
|
||||
@@ -573,12 +586,6 @@ try_setup_line( struct lp_setup_context *setup,
|
||||
line->plane[3].dcdx = y[3] - y[0];
|
||||
|
||||
|
||||
info.oneoverarea = 1.0f / (dx * dx + dy * dy);
|
||||
info.dx = dx;
|
||||
info.dy = dy;
|
||||
info.v1 = v1;
|
||||
info.v2 = v2;
|
||||
|
||||
/* Setup parameter interpolants:
|
||||
*/
|
||||
setup_line_coefficients( setup, line, &info);
|
||||
|
@@ -447,8 +447,10 @@ do_triangle_ccw(struct lp_setup_context *setup,
|
||||
static INLINE uint32_t
|
||||
floor_pot(uint32_t n)
|
||||
{
|
||||
assert(n);
|
||||
#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86)
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
__asm__("bsr %1,%0"
|
||||
: "=r" (n)
|
||||
: "rm" (n));
|
||||
|
@@ -39,5 +39,6 @@ EXTRA_OBJECTS = \
|
||||
|
||||
include ../../Makefile.template
|
||||
|
||||
.PHONY: $(COMPILER_ARCHIVE)
|
||||
$(COMPILER_ARCHIVE):
|
||||
$(MAKE) -C $(TOP)/src/mesa/drivers/dri/r300/compiler
|
||||
|
@@ -263,10 +263,6 @@ static void r300_clear(struct pipe_context* pipe,
|
||||
zstex->hiz_in_use[fb->zsbuf->level])) {
|
||||
r300->hyperz_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
/* XXX this flush "fixes" a hardlock in the cubestorm xscreensaver */
|
||||
if (r300->flush_counter == 0)
|
||||
pipe->flush(pipe, 0, NULL);
|
||||
}
|
||||
|
||||
/* Clear a region of a color surface to a constant value. */
|
||||
|
@@ -424,4 +424,5 @@ void r300_parse_chipset(struct r300_capabilities* caps)
|
||||
}
|
||||
|
||||
caps->is_rv350 = caps->family >= CHIP_FAMILY_RV350;
|
||||
caps->dxtc_swizzle = caps->is_r400 || caps->is_r500;
|
||||
}
|
||||
|
@@ -79,6 +79,8 @@ struct r300_capabilities {
|
||||
boolean is_r500;
|
||||
/* Whether or not the second pixel pipe is accessed with the high bit */
|
||||
boolean high_second_pipe;
|
||||
/* DXTC texture swizzling. */
|
||||
boolean dxtc_swizzle;
|
||||
};
|
||||
|
||||
/* Enumerations for legibility and telling which card we're running on. */
|
||||
|
@@ -79,6 +79,9 @@ static void r300_release_referenced_objects(struct r300_context *r300)
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* The dummy VBO. */
|
||||
pipe_resource_reference(&r300->dummy_vb, NULL);
|
||||
|
||||
/* The SWTCL VBO. */
|
||||
pipe_resource_reference(&r300->vbo, NULL);
|
||||
|
||||
@@ -488,6 +491,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
rtempl.target = PIPE_TEXTURE_2D;
|
||||
rtempl.format = PIPE_FORMAT_I8_UNORM;
|
||||
rtempl.bind = PIPE_BIND_SAMPLER_VIEW;
|
||||
rtempl.usage = PIPE_USAGE_IMMUTABLE;
|
||||
rtempl.width0 = 1;
|
||||
rtempl.height0 = 1;
|
||||
rtempl.depth0 = 1;
|
||||
@@ -501,6 +505,19 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
pipe_resource_reference(&tex, NULL);
|
||||
}
|
||||
|
||||
{
|
||||
struct pipe_resource vb = {};
|
||||
vb.target = PIPE_BUFFER;
|
||||
vb.format = PIPE_FORMAT_R8_UNORM;
|
||||
vb.bind = PIPE_BIND_VERTEX_BUFFER;
|
||||
vb.usage = PIPE_USAGE_IMMUTABLE;
|
||||
vb.width0 = sizeof(float) * 16;
|
||||
vb.height0 = 1;
|
||||
vb.depth0 = 1;
|
||||
|
||||
r300->dummy_vb = screen->resource_create(screen, &vb);
|
||||
}
|
||||
|
||||
return &r300->context;
|
||||
|
||||
fail:
|
||||
|
@@ -162,7 +162,6 @@ struct r300_sampler_state {
|
||||
|
||||
uint32_t filter0; /* R300_TX_FILTER0: 0x4400 */
|
||||
uint32_t filter1; /* R300_TX_FILTER1: 0x4440 */
|
||||
uint32_t border_color; /* R300_TX_BORDER_COLOR: 0x45c0 */
|
||||
|
||||
/* Min/max LOD must be clamped to [0, last_level], thus
|
||||
* it's dependent on a currently bound texture */
|
||||
@@ -457,6 +456,7 @@ struct r300_context {
|
||||
size_t draw_vbo_size;
|
||||
/* Whether the VBO must not be flushed. */
|
||||
boolean draw_vbo_locked;
|
||||
boolean draw_first_emitted;
|
||||
|
||||
/* Accelerated blit support. */
|
||||
struct blitter_context* blitter;
|
||||
@@ -470,6 +470,10 @@ struct r300_context {
|
||||
* dummy texture there. */
|
||||
struct r300_sampler_view *texkill_sampler;
|
||||
|
||||
/* When no vertex buffer is set, this one is used instead to prevent
|
||||
* hardlocks. */
|
||||
struct pipe_resource *dummy_vb;
|
||||
|
||||
/* The currently active query. */
|
||||
struct r300_query *query_current;
|
||||
/* The saved query for blitter operations. */
|
||||
|
@@ -475,6 +475,11 @@ void r300_emit_fb_state_pipelined(struct r300_context *r300,
|
||||
for (i = 0; i < fb->nr_cbufs; i++) {
|
||||
OUT_CS(r300_surface(fb->cbufs[i])->format);
|
||||
}
|
||||
for (; i < 1; i++) {
|
||||
OUT_CS(R300_US_OUT_FMT_C4_8 |
|
||||
R300_C0_SEL_B | R300_C1_SEL_G |
|
||||
R300_C2_SEL_R | R300_C3_SEL_A);
|
||||
}
|
||||
for (; i < 4; i++) {
|
||||
OUT_CS(R300_US_OUT_FMT_UNUSED);
|
||||
}
|
||||
|
@@ -158,7 +158,7 @@ static void r300_render_condition(struct pipe_context *pipe,
|
||||
uint mode)
|
||||
{
|
||||
struct r300_context *r300 = r300_context(pipe);
|
||||
uint64_t result;
|
||||
uint64_t result = 0;
|
||||
boolean wait;
|
||||
|
||||
if (query) {
|
||||
@@ -167,9 +167,9 @@ static void r300_render_condition(struct pipe_context *pipe,
|
||||
|
||||
if (!r300_get_query_result(pipe, query, wait, &result)) {
|
||||
r300->skip_rendering = FALSE;
|
||||
} else {
|
||||
r300->skip_rendering = result == 0;
|
||||
}
|
||||
|
||||
r300->skip_rendering = result == 0;
|
||||
} else {
|
||||
r300->skip_rendering = FALSE;
|
||||
}
|
||||
|
@@ -1520,11 +1520,11 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
# define R300_TX_TRI_PERF_3_8 (3<<15)
|
||||
# define R300_ANISO_THRESHOLD_MASK (7<<17)
|
||||
|
||||
# define R400_DXTC_SWIZZLE_ENABLE (1<<21)
|
||||
# define R500_MACRO_SWITCH (1<<22)
|
||||
# define R500_TX_MAX_ANISO(x) ((x) << 23)
|
||||
# define R500_TX_MAX_ANISO_MASK (63 << 23)
|
||||
# define R500_TX_ANISO_HIGH_QUALITY (1 << 30)
|
||||
|
||||
# define R500_BORDER_FIX (1<<31)
|
||||
|
||||
#define R300_TX_FORMAT0_0 0x4480
|
||||
|
@@ -676,9 +676,6 @@ static void r300_draw_vbo(struct pipe_context* pipe,
|
||||
{
|
||||
struct r300_context* r300 = r300_context(pipe);
|
||||
|
||||
if (!r300->velems->count || !r300->vertex_buffer_count)
|
||||
return;
|
||||
|
||||
if (info->indexed && r300->index_buffer.buffer) {
|
||||
unsigned offset;
|
||||
|
||||
@@ -753,6 +750,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
|
||||
draw_set_mapped_index_buffer(r300->draw, indices);
|
||||
|
||||
r300->draw_vbo_locked = TRUE;
|
||||
r300->draw_first_emitted = FALSE;
|
||||
draw_vbo(r300->draw, info);
|
||||
draw_flush(r300->draw);
|
||||
r300->draw_vbo_locked = FALSE;
|
||||
@@ -907,10 +905,17 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
|
||||
|
||||
DBG(r300, DBG_DRAW, "r300: render_draw_arrays (count: %d)\n", count);
|
||||
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
if (r300->draw_first_emitted) {
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 6, 0, 0))
|
||||
return;
|
||||
} else {
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
}
|
||||
|
||||
/* Uncomment to dump all VBOs rendered through this interface.
|
||||
* Slow and noisy!
|
||||
@@ -937,6 +942,8 @@ static void r300_render_draw_arrays(struct vbuf_render* render,
|
||||
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (count << 16) |
|
||||
r300render->hwprim);
|
||||
END_CS;
|
||||
|
||||
r300->draw_first_emitted = TRUE;
|
||||
}
|
||||
|
||||
static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
@@ -955,10 +962,17 @@ static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
CS_LOCALS(r300);
|
||||
DBG(r300, DBG_DRAW, "r300: render_draw_elements (count: %d)\n", count);
|
||||
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
if (r300->draw_first_emitted) {
|
||||
if (!r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 256, 0, 0))
|
||||
return;
|
||||
} else {
|
||||
if (!r300_emit_states(r300,
|
||||
PREP_FIRST_DRAW | PREP_EMIT_AOS_SWTCL | PREP_INDEXED,
|
||||
NULL, 0, 0))
|
||||
return;
|
||||
}
|
||||
|
||||
/* Below we manage the CS space manually because there may be more
|
||||
* indices than it can fit in CS. */
|
||||
@@ -999,6 +1013,8 @@ static void r300_render_draw_elements(struct vbuf_render* render,
|
||||
end_cs_dwords = r300_get_num_cs_end_dwords(r300);
|
||||
}
|
||||
}
|
||||
|
||||
r300->draw_first_emitted = TRUE;
|
||||
}
|
||||
|
||||
static void r300_render_destroy(struct vbuf_render* render)
|
||||
|
@@ -114,8 +114,9 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
||||
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
|
||||
case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
|
||||
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
|
||||
case PIPE_CAP_TEXTURE_SWIZZLE:
|
||||
return 1;
|
||||
case PIPE_CAP_TEXTURE_SWIZZLE:
|
||||
return util_format_s3tc_enabled ? r300screen->caps.dxtc_swizzle : 1;
|
||||
|
||||
/* Unsupported features (boolean caps). */
|
||||
case PIPE_CAP_TIMER_QUERY:
|
||||
@@ -203,7 +204,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
|
||||
case PIPE_SHADER_CAP_MAX_PREDS:
|
||||
return is_r500 ? 1 : 0;
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case PIPE_SHADER_VERTEX:
|
||||
@@ -230,7 +231,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e
|
||||
case PIPE_SHADER_CAP_MAX_PREDS:
|
||||
return is_r500 ? 4 : 0; /* XXX guessed. */
|
||||
case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
|
||||
return 1;
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -1171,7 +1171,6 @@ static void*
|
||||
struct r300_sampler_state* sampler = CALLOC_STRUCT(r300_sampler_state);
|
||||
boolean is_r500 = r300->screen->caps.is_r500;
|
||||
int lod_bias;
|
||||
union util_color uc;
|
||||
|
||||
sampler->state = *state;
|
||||
|
||||
@@ -1228,9 +1227,6 @@ static void*
|
||||
sampler->filter1 |= r500_anisotropy(state->max_anisotropy);
|
||||
}
|
||||
|
||||
util_pack_color(state->border_color, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
sampler->border_color = uc.ui;
|
||||
|
||||
/* R500-specific fixups and optimizations */
|
||||
if (r300->screen->caps.is_r500) {
|
||||
sampler->filter1 |= R500_BORDER_FIX;
|
||||
@@ -1317,29 +1313,27 @@ static void r300_set_fragment_sampler_views(struct pipe_context* pipe,
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (&state->sampler_views[i]->base != views[i]) {
|
||||
pipe_sampler_view_reference(
|
||||
(struct pipe_sampler_view**)&state->sampler_views[i],
|
||||
views[i]);
|
||||
pipe_sampler_view_reference(
|
||||
(struct pipe_sampler_view**)&state->sampler_views[i],
|
||||
views[i]);
|
||||
|
||||
if (!views[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* A new sampler view (= texture)... */
|
||||
dirty_tex = TRUE;
|
||||
|
||||
/* Set the texrect factor in the fragment shader.
|
||||
* Needed for RECT and NPOT fallback. */
|
||||
texture = r300_texture(views[i]->texture);
|
||||
if (texture->desc.is_npot) {
|
||||
r300->fs_rc_constant_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
state->sampler_views[i]->texcache_region =
|
||||
r300_assign_texture_cache_region(view_index, real_num_views);
|
||||
view_index++;
|
||||
if (!views[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* A new sampler view (= texture)... */
|
||||
dirty_tex = TRUE;
|
||||
|
||||
/* Set the texrect factor in the fragment shader.
|
||||
* Needed for RECT and NPOT fallback. */
|
||||
texture = r300_texture(views[i]->texture);
|
||||
if (texture->desc.is_npot) {
|
||||
r300->fs_rc_constant_state.dirty = TRUE;
|
||||
}
|
||||
|
||||
state->sampler_views[i]->texcache_region =
|
||||
r300_assign_texture_cache_region(view_index, real_num_views);
|
||||
view_index++;
|
||||
}
|
||||
|
||||
for (i = count; i < tex_units; i++) {
|
||||
@@ -1367,6 +1361,7 @@ r300_create_sampler_view(struct pipe_context *pipe,
|
||||
struct r300_sampler_view *view = CALLOC_STRUCT(r300_sampler_view);
|
||||
struct r300_texture *tex = r300_texture(texture);
|
||||
boolean is_r500 = r300_screen(pipe->screen)->caps.is_r500;
|
||||
boolean dxtc_swizzle = r300_screen(pipe->screen)->caps.dxtc_swizzle;
|
||||
|
||||
if (view) {
|
||||
view->base = *templ;
|
||||
@@ -1383,7 +1378,8 @@ r300_create_sampler_view(struct pipe_context *pipe,
|
||||
view->format = tex->tx_format;
|
||||
view->format.format1 |= r300_translate_texformat(templ->format,
|
||||
view->swizzle,
|
||||
is_r500);
|
||||
is_r500,
|
||||
dxtc_swizzle);
|
||||
if (is_r500) {
|
||||
view->format.format2 |= r500_tx_format_msb_bit(templ->format);
|
||||
}
|
||||
@@ -1468,6 +1464,15 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
|
||||
struct pipe_vertex_buffer *vbo;
|
||||
unsigned i, max_index = (1 << 24) - 1;
|
||||
boolean any_user_buffer = FALSE;
|
||||
struct pipe_vertex_buffer dummy_vb = {0};
|
||||
|
||||
/* There must be at least one vertex buffer set, otherwise it locks up. */
|
||||
if (!count) {
|
||||
dummy_vb.buffer = r300->dummy_vb;
|
||||
dummy_vb.max_index = r300->dummy_vb->width0 / 4;
|
||||
buffers = &dummy_vb;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
if (count == r300->vertex_buffer_count &&
|
||||
memcmp(r300->vertex_buffer, buffers,
|
||||
@@ -1503,14 +1508,14 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
|
||||
any_user_buffer = TRUE;
|
||||
}
|
||||
|
||||
/* The stride of zero means we will be fetching only the first
|
||||
* vertex, so don't care about max_index. */
|
||||
if (!vbo->stride)
|
||||
continue;
|
||||
|
||||
if (vbo->max_index == ~0) {
|
||||
/* if no VBO stride then only one vertex value so max index is 1 */
|
||||
/* should think about converting to VS constants like svga does */
|
||||
if (!vbo->stride)
|
||||
vbo->max_index = 1;
|
||||
else
|
||||
vbo->max_index =
|
||||
(vbo->buffer->width0 - vbo->buffer_offset) / vbo->stride;
|
||||
vbo->max_index =
|
||||
(vbo->buffer->width0 - vbo->buffer_offset) / vbo->stride;
|
||||
}
|
||||
|
||||
max_index = MIN2(vbo->max_index, max_index);
|
||||
@@ -1621,6 +1626,14 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
||||
struct r300_vertex_element_state *velems;
|
||||
unsigned i;
|
||||
enum pipe_format *format;
|
||||
struct pipe_vertex_element dummy_attrib = {0};
|
||||
|
||||
/* R300 Programmable Stream Control (PSC) doesn't support 0 vertex elements. */
|
||||
if (!count) {
|
||||
dummy_attrib.src_format = PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
attribs = &dummy_attrib;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
assert(count <= PIPE_MAX_ATTRIBS);
|
||||
velems = CALLOC_STRUCT(r300_vertex_element_state);
|
||||
@@ -1687,7 +1700,8 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
||||
* swizzles are already set up.
|
||||
* Also compute the vertex size. */
|
||||
for (i = 0; i < count; i++) {
|
||||
/* This is OK because we check for aligned strides too. */
|
||||
/* This is OK because we check for aligned strides too
|
||||
* elsewhere. */
|
||||
velems->hw_format_size[i] =
|
||||
align(util_format_get_blocksize(velems->hw_format[i]), 4);
|
||||
velems->vertex_size_dwords += velems->hw_format_size[i] / 4;
|
||||
|
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_pack_color.h"
|
||||
|
||||
#include "r300_context.h"
|
||||
#include "r300_fs.h"
|
||||
@@ -567,6 +568,96 @@ static void r300_update_rs_block(struct r300_context *r300)
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t r300_get_border_color(enum pipe_format format,
|
||||
const float border[4],
|
||||
boolean is_r500)
|
||||
{
|
||||
const struct util_format_description *desc;
|
||||
float border_swizzled[4] = {0};
|
||||
unsigned i;
|
||||
union util_color uc = {0};
|
||||
|
||||
desc = util_format_description(format);
|
||||
|
||||
/* Do depth formats first. */
|
||||
if (util_format_is_depth_or_stencil(format)) {
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]);
|
||||
case PIPE_FORMAT_X8Z24_UNORM:
|
||||
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
|
||||
if (is_r500) {
|
||||
return util_pack_z(PIPE_FORMAT_X8Z24_UNORM, border[0]);
|
||||
} else {
|
||||
return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]) << 16;
|
||||
}
|
||||
default:
|
||||
assert(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Apply inverse swizzle of the format. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
switch (desc->swizzle[i]) {
|
||||
case UTIL_FORMAT_SWIZZLE_X:
|
||||
border_swizzled[2] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Y:
|
||||
border_swizzled[1] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Z:
|
||||
border_swizzled[0] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_W:
|
||||
border_swizzled[3] = border[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Compressed formats. */
|
||||
if (util_format_is_compressed(format)) {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc);
|
||||
return uc.ui;
|
||||
}
|
||||
|
||||
switch (desc->channel[0].size) {
|
||||
case 4:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if (desc->channel[1].size == 5) {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G5R5A1_UNORM, &uc);
|
||||
} else if (desc->channel[1].size == 6) {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G6R5_UNORM, &uc);
|
||||
} else {
|
||||
assert(0);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
case 8:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 10:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B10G10R10A2_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
if (desc->nr_channels <= 2) {
|
||||
border_swizzled[0] = border_swizzled[2];
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_R16G16_UNORM, &uc);
|
||||
} else {
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return uc.ui;
|
||||
}
|
||||
|
||||
static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
{
|
||||
struct r300_textures_state *state =
|
||||
@@ -599,7 +690,12 @@ static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
texstate->format = view->format;
|
||||
texstate->filter0 = sampler->filter0;
|
||||
texstate->filter1 = sampler->filter1;
|
||||
texstate->border_color = sampler->border_color;
|
||||
|
||||
/* Set the border color. */
|
||||
texstate->border_color =
|
||||
r300_get_border_color(view->base.format,
|
||||
sampler->state.border_color,
|
||||
r300->screen->caps.is_r500);
|
||||
|
||||
/* determine min/max levels */
|
||||
max_level = MIN3(sampler->max_lod + view->base.first_level,
|
||||
@@ -645,13 +741,18 @@ static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
if (sampler->state.compare_mode == PIPE_TEX_COMPARE_NONE) {
|
||||
texstate->format.format1 |=
|
||||
r300_get_swizzle_combined(depth_swizzle,
|
||||
view->swizzle);
|
||||
view->swizzle, FALSE);
|
||||
} else {
|
||||
texstate->format.format1 |=
|
||||
r300_get_swizzle_combined(depth_swizzle, 0);
|
||||
r300_get_swizzle_combined(depth_swizzle, 0, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if (r300->screen->caps.dxtc_swizzle &&
|
||||
util_format_is_compressed(tex->desc.b.b.format)) {
|
||||
texstate->filter1 |= R400_DXTC_SWIZZLE_ENABLE;
|
||||
}
|
||||
|
||||
/* to emulate 1D textures through 2D ones correctly */
|
||||
if (tex->desc.b.b.target == PIPE_TEXTURE_1D) {
|
||||
texstate->filter0 &= ~R300_TX_WRAP_T_MASK;
|
||||
|
@@ -40,7 +40,8 @@
|
||||
#include "pipe/p_screen.h"
|
||||
|
||||
unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
const unsigned char *swizzle_view)
|
||||
const unsigned char *swizzle_view,
|
||||
boolean dxtc_swizzle)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned char swizzle[4];
|
||||
@@ -51,10 +52,10 @@ unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
R300_TX_FORMAT_B_SHIFT,
|
||||
R300_TX_FORMAT_A_SHIFT
|
||||
};
|
||||
const uint32_t swizzle_bit[4] = {
|
||||
R300_TX_FORMAT_X,
|
||||
uint32_t swizzle_bit[4] = {
|
||||
dxtc_swizzle ? R300_TX_FORMAT_Z : R300_TX_FORMAT_X,
|
||||
R300_TX_FORMAT_Y,
|
||||
R300_TX_FORMAT_Z,
|
||||
dxtc_swizzle ? R300_TX_FORMAT_X : R300_TX_FORMAT_Z,
|
||||
R300_TX_FORMAT_W
|
||||
};
|
||||
|
||||
@@ -107,7 +108,8 @@ unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
* makes available X, Y, Z, W, ZERO, and ONE for swizzling. */
|
||||
uint32_t r300_translate_texformat(enum pipe_format format,
|
||||
const unsigned char *swizzle_view,
|
||||
boolean is_r500)
|
||||
boolean is_r500,
|
||||
boolean dxtc_swizzle)
|
||||
{
|
||||
uint32_t result = 0;
|
||||
const struct util_format_description *desc;
|
||||
@@ -169,7 +171,8 @@ uint32_t r300_translate_texformat(enum pipe_format format,
|
||||
}
|
||||
}
|
||||
|
||||
result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view);
|
||||
result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view,
|
||||
util_format_is_compressed(format) && dxtc_swizzle);
|
||||
|
||||
/* S3TC formats. */
|
||||
if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
|
||||
@@ -538,7 +541,7 @@ boolean r300_is_zs_format_supported(enum pipe_format format)
|
||||
|
||||
boolean r300_is_sampler_format_supported(enum pipe_format format)
|
||||
{
|
||||
return r300_translate_texformat(format, 0, TRUE) != ~0;
|
||||
return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0;
|
||||
}
|
||||
|
||||
void r300_texture_setup_format_state(struct r300_screen *screen,
|
||||
@@ -862,7 +865,7 @@ struct pipe_surface* r300_get_tex_surface(struct pipe_screen* screen,
|
||||
tex->desc.b.b.nr_samples,
|
||||
tex->desc.microtile,
|
||||
tex->desc.macrotile[level],
|
||||
DIM_HEIGHT);
|
||||
DIM_HEIGHT, 0);
|
||||
|
||||
surface->cbzb_height = align((surface->base.height + 1) / 2,
|
||||
tile_height);
|
||||
|
@@ -35,11 +35,13 @@ struct r300_texture;
|
||||
struct r300_screen;
|
||||
|
||||
unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format,
|
||||
const unsigned char *swizzle_view);
|
||||
const unsigned char *swizzle_view,
|
||||
boolean dxtc_swizzle);
|
||||
|
||||
uint32_t r300_translate_texformat(enum pipe_format format,
|
||||
const unsigned char *swizzle_view,
|
||||
boolean is_r500);
|
||||
boolean is_r500,
|
||||
boolean dxtc_swizzle);
|
||||
|
||||
uint32_t r500_tx_format_msb_bit(enum pipe_format format);
|
||||
|
||||
|
@@ -34,7 +34,7 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
unsigned num_samples,
|
||||
enum r300_buffer_tiling microtile,
|
||||
enum r300_buffer_tiling macrotile,
|
||||
enum r300_dim dim)
|
||||
enum r300_dim dim, boolean is_rs690)
|
||||
{
|
||||
static const unsigned table[2][5][3][2] =
|
||||
{
|
||||
@@ -44,7 +44,7 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
{{ 32, 1}, { 8, 4}, { 0, 0}}, /* 8 bits per pixel */
|
||||
{{ 16, 1}, { 8, 2}, { 4, 4}}, /* 16 bits per pixel */
|
||||
{{ 8, 1}, { 4, 2}, { 0, 0}}, /* 32 bits per pixel */
|
||||
{{ 4, 1}, { 0, 0}, { 2, 2}}, /* 64 bits per pixel */
|
||||
{{ 4, 1}, { 2, 2}, { 0, 0}}, /* 64 bits per pixel */
|
||||
{{ 2, 1}, { 0, 0}, { 0, 0}} /* 128 bits per pixel */
|
||||
},
|
||||
{
|
||||
@@ -53,10 +53,11 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
{{256, 8}, {64, 32}, { 0, 0}}, /* 8 bits per pixel */
|
||||
{{128, 8}, {64, 16}, {32, 32}}, /* 16 bits per pixel */
|
||||
{{ 64, 8}, {32, 16}, { 0, 0}}, /* 32 bits per pixel */
|
||||
{{ 32, 8}, { 0, 0}, {16, 16}}, /* 64 bits per pixel */
|
||||
{{ 32, 8}, {16, 16}, { 0, 0}}, /* 64 bits per pixel */
|
||||
{{ 16, 8}, { 0, 0}, { 0, 0}} /* 128 bits per pixel */
|
||||
}
|
||||
};
|
||||
|
||||
static const unsigned aa_block[2] = {4, 8};
|
||||
unsigned tile = 0;
|
||||
unsigned pixsize = util_format_get_blocksize(format);
|
||||
@@ -74,6 +75,14 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
} else {
|
||||
/* Standard alignment. */
|
||||
tile = table[macrotile][util_logbase2(pixsize)][microtile][dim];
|
||||
if (macrotile == 0 && is_rs690 && dim == DIM_WIDTH) {
|
||||
int align;
|
||||
int h_tile;
|
||||
h_tile = table[macrotile][util_logbase2(pixsize)][microtile][DIM_HEIGHT];
|
||||
align = 64 / (pixsize * h_tile);
|
||||
if (tile < align)
|
||||
tile = align;
|
||||
}
|
||||
}
|
||||
|
||||
assert(tile);
|
||||
@@ -89,7 +98,7 @@ static boolean r300_texture_macro_switch(struct r300_texture_desc *desc,
|
||||
unsigned tile, texdim;
|
||||
|
||||
tile = r300_get_pixel_alignment(desc->b.b.format, desc->b.b.nr_samples,
|
||||
desc->microtile, R300_BUFFER_TILED, dim);
|
||||
desc->microtile, R300_BUFFER_TILED, dim, 0);
|
||||
if (dim == DIM_WIDTH) {
|
||||
texdim = u_minify(desc->b.b.width0, level);
|
||||
} else {
|
||||
@@ -113,6 +122,9 @@ static unsigned r300_texture_get_stride(struct r300_screen *screen,
|
||||
unsigned level)
|
||||
{
|
||||
unsigned tile_width, width, stride;
|
||||
boolean is_rs690 = (screen->caps.family == CHIP_FAMILY_RS600 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS690 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS740);
|
||||
|
||||
if (desc->stride_in_bytes_override)
|
||||
return desc->stride_in_bytes_override;
|
||||
@@ -131,38 +143,14 @@ static unsigned r300_texture_get_stride(struct r300_screen *screen,
|
||||
desc->b.b.nr_samples,
|
||||
desc->microtile,
|
||||
desc->macrotile[level],
|
||||
DIM_WIDTH);
|
||||
DIM_WIDTH, is_rs690);
|
||||
width = align(width, tile_width);
|
||||
|
||||
stride = util_format_get_stride(desc->b.b.format, width);
|
||||
|
||||
/* Some IGPs need a minimum stride of 64 bytes, hmm... */
|
||||
if (!desc->macrotile[level] &&
|
||||
(screen->caps.family == CHIP_FAMILY_RS600 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS690 ||
|
||||
screen->caps.family == CHIP_FAMILY_RS740)) {
|
||||
unsigned min_stride;
|
||||
|
||||
if (desc->microtile) {
|
||||
unsigned tile_height =
|
||||
r300_get_pixel_alignment(desc->b.b.format,
|
||||
desc->b.b.nr_samples,
|
||||
desc->microtile,
|
||||
desc->macrotile[level],
|
||||
DIM_HEIGHT);
|
||||
|
||||
min_stride = 64 / tile_height;
|
||||
} else {
|
||||
min_stride = 64;
|
||||
}
|
||||
|
||||
return stride < min_stride ? min_stride : stride;
|
||||
}
|
||||
|
||||
/* The alignment to 32 bytes is sort of implied by the layout... */
|
||||
return stride;
|
||||
} else {
|
||||
return align(util_format_get_stride(desc->b.b.format, width), 32);
|
||||
return align(util_format_get_stride(desc->b.b.format, width), is_rs690 ? 64 : 32);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,7 +167,7 @@ static unsigned r300_texture_get_nblocksy(struct r300_texture_desc *desc,
|
||||
desc->b.b.nr_samples,
|
||||
desc->microtile,
|
||||
desc->macrotile[level],
|
||||
DIM_HEIGHT);
|
||||
DIM_HEIGHT, 0);
|
||||
height = align(height, tile_height);
|
||||
|
||||
/* This is needed for the kernel checker, unfortunately. */
|
||||
@@ -256,7 +244,7 @@ static void r300_setup_miptree(struct r300_screen *screen,
|
||||
{
|
||||
struct pipe_resource *base = &desc->b.b;
|
||||
unsigned stride, size, layer_size, nblocksy, i;
|
||||
boolean rv350_mode = screen->caps.is_rv350;
|
||||
boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350;
|
||||
boolean aligned_for_cbzb;
|
||||
|
||||
desc->size_in_bytes = 0;
|
||||
@@ -351,7 +339,7 @@ static void r300_setup_tiling(struct r300_screen *screen,
|
||||
{
|
||||
struct r300_winsys_screen *rws = screen->rws;
|
||||
enum pipe_format format = desc->b.b.format;
|
||||
boolean rv350_mode = screen->caps.is_rv350;
|
||||
boolean rv350_mode = screen->caps.family >= CHIP_FAMILY_R350;
|
||||
boolean is_zb = util_format_is_depth_or_stencil(format);
|
||||
boolean dbg_no_tiling = SCREEN_DBG_ON(screen, DBG_NO_TILING);
|
||||
|
||||
@@ -368,11 +356,11 @@ static void r300_setup_tiling(struct r300_screen *screen,
|
||||
switch (util_format_get_blocksize(format)) {
|
||||
case 1:
|
||||
case 4:
|
||||
case 8:
|
||||
desc->microtile = R300_BUFFER_TILED;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 8:
|
||||
if (rws->get_value(rws, R300_VID_SQUARE_TILING_SUPPORT)) {
|
||||
desc->microtile = R300_BUFFER_SQUARETILED;
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ unsigned r300_get_pixel_alignment(enum pipe_format format,
|
||||
unsigned num_samples,
|
||||
enum r300_buffer_tiling microtile,
|
||||
enum r300_buffer_tiling macrotile,
|
||||
enum r300_dim dim);
|
||||
enum r300_dim dim, boolean is_rs690);
|
||||
|
||||
boolean r300_texture_desc_init(struct r300_screen *rscreen,
|
||||
struct r300_texture_desc *desc,
|
||||
|
@@ -575,7 +575,7 @@ setup_fragcoord_coeff(struct setup_context *setup, uint slot)
|
||||
setup->coef[slot].dady[0] = 0.0;
|
||||
/*Y*/
|
||||
setup->coef[slot].a0[1] =
|
||||
(spfs->origin_lower_left ? setup->softpipe->framebuffer.height : 0)
|
||||
(spfs->origin_lower_left ? setup->softpipe->framebuffer.height-1 : 0)
|
||||
+ (spfs->pixel_center_integer ? 0.0 : 0.5);
|
||||
setup->coef[slot].dadx[1] = 0.0;
|
||||
setup->coef[slot].dady[1] = spfs->origin_lower_left ? -1.0 : 1.0;
|
||||
|
@@ -203,7 +203,7 @@ svga_tgsi_translate( const struct svga_shader *shader,
|
||||
emit.imm_start += key.vkey.num_zero_stride_vertex_elements;
|
||||
}
|
||||
|
||||
emit.nr_hw_const = (emit.imm_start + emit.info.file_max[TGSI_FILE_IMMEDIATE] + 1);
|
||||
emit.nr_hw_float_const = (emit.imm_start + emit.info.file_max[TGSI_FILE_IMMEDIATE] + 1);
|
||||
|
||||
emit.nr_hw_temp = emit.info.file_max[TGSI_FILE_TEMPORARY] + 1;
|
||||
emit.in_main_func = TRUE;
|
||||
|
@@ -62,7 +62,8 @@ struct svga_shader_emitter
|
||||
|
||||
int imm_start;
|
||||
|
||||
int nr_hw_const;
|
||||
int nr_hw_float_const;
|
||||
int nr_hw_int_const;
|
||||
int nr_hw_temp;
|
||||
|
||||
int insn_offset;
|
||||
|
@@ -197,22 +197,37 @@ translate_src_register( const struct svga_shader_emitter *emit,
|
||||
break;
|
||||
}
|
||||
|
||||
/* Indirect addressing (for coninstant buffer lookups only)
|
||||
/* Indirect addressing.
|
||||
*/
|
||||
if (reg->Register.Indirect)
|
||||
{
|
||||
/* we shift the offset towards the minimum */
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
src.base.num -= svga_arl_adjustment( emit );
|
||||
if (reg->Register.Indirect) {
|
||||
if (emit->unit == PIPE_SHADER_FRAGMENT) {
|
||||
/* Pixel shaders have only loop registers for relative
|
||||
* addressing into inputs. Ignore the redundant address
|
||||
* register, the contents of aL should be in sync with it.
|
||||
*/
|
||||
if (reg->Register.File == TGSI_FILE_INPUT) {
|
||||
src.base.relAddr = 1;
|
||||
src.indirect = src_token(SVGA3DREG_LOOP, 0);
|
||||
}
|
||||
}
|
||||
src.base.relAddr = 1;
|
||||
else {
|
||||
/* Constant buffers only.
|
||||
*/
|
||||
if (reg->Register.File == TGSI_FILE_CONSTANT) {
|
||||
/* we shift the offset towards the minimum */
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
src.base.num -= svga_arl_adjustment( emit );
|
||||
}
|
||||
src.base.relAddr = 1;
|
||||
|
||||
/* Not really sure what should go in the second token:
|
||||
*/
|
||||
src.indirect = src_token( SVGA3DREG_ADDR,
|
||||
reg->Indirect.Index );
|
||||
/* Not really sure what should go in the second token:
|
||||
*/
|
||||
src.indirect = src_token( SVGA3DREG_ADDR,
|
||||
reg->Indirect.Index );
|
||||
|
||||
src.indirect.swizzle = SWIZZLE_XXXX;
|
||||
src.indirect.swizzle = SWIZZLE_XXXX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
src = swizzle( src,
|
||||
@@ -538,7 +553,7 @@ static boolean emit_def_const( struct svga_shader_emitter *emit,
|
||||
static INLINE boolean
|
||||
create_zero_immediate( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT,
|
||||
idx, 0, 0, 0, 1 ))
|
||||
@@ -553,7 +568,7 @@ create_zero_immediate( struct svga_shader_emitter *emit )
|
||||
static INLINE boolean
|
||||
create_loop_const( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_int_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_INT, idx,
|
||||
255, /* iteration count */
|
||||
@@ -571,7 +586,7 @@ create_loop_const( struct svga_shader_emitter *emit )
|
||||
static INLINE boolean
|
||||
create_sincos_consts( struct svga_shader_emitter *emit )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT, idx,
|
||||
-1.5500992e-006f,
|
||||
@@ -581,7 +596,7 @@ create_sincos_consts( struct svga_shader_emitter *emit )
|
||||
return FALSE;
|
||||
|
||||
emit->sincos_consts_idx = idx;
|
||||
idx = emit->nr_hw_const++;
|
||||
idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT, idx,
|
||||
-0.020833334f,
|
||||
@@ -602,7 +617,7 @@ create_arl_consts( struct svga_shader_emitter *emit )
|
||||
|
||||
for (i = 0; i < emit->num_arl_consts; i += 4) {
|
||||
int j;
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
float vals[4];
|
||||
for (j = 0; j < 4 && (j + i) < emit->num_arl_consts; ++j) {
|
||||
vals[j] = emit->arl_consts[i + j].number;
|
||||
@@ -1593,6 +1608,14 @@ static boolean emit_arl(struct svga_shader_emitter *emit,
|
||||
const struct tgsi_full_instruction *insn)
|
||||
{
|
||||
++emit->current_arl;
|
||||
if (emit->unit == PIPE_SHADER_FRAGMENT) {
|
||||
/* MOVA not present in pixel shader instruction set.
|
||||
* Ignore this instruction altogether since it is
|
||||
* only used for loop counters -- and for that
|
||||
* we reference aL directly.
|
||||
*/
|
||||
return TRUE;
|
||||
}
|
||||
if (svga_arl_needs_adjustment( emit )) {
|
||||
return emit_fake_arl( emit, insn );
|
||||
} else {
|
||||
@@ -2384,7 +2407,7 @@ static boolean make_immediate( struct svga_shader_emitter *emit,
|
||||
float d,
|
||||
struct src_register *out )
|
||||
{
|
||||
unsigned idx = emit->nr_hw_const++;
|
||||
unsigned idx = emit->nr_hw_float_const++;
|
||||
|
||||
if (!emit_def_const( emit, SVGA3D_CONST_TYPE_FLOAT,
|
||||
idx, a, b, c, d ))
|
||||
|
@@ -384,7 +384,6 @@ struct st_manager
|
||||
* This function is optional.
|
||||
*/
|
||||
boolean (*get_egl_image)(struct st_manager *smapi,
|
||||
struct st_context_iface *stctx,
|
||||
void *egl_image,
|
||||
struct st_egl_image *out);
|
||||
|
||||
|
@@ -141,12 +141,18 @@ GLboolean
|
||||
dri_unbind_context(__DRIcontext * cPriv)
|
||||
{
|
||||
/* dri_util.c ensures cPriv is not null */
|
||||
struct dri_screen *screen = dri_screen(cPriv->driScreenPriv);
|
||||
struct dri_context *ctx = dri_context(cPriv);
|
||||
struct dri_drawable *draw = dri_drawable(ctx->dPriv);
|
||||
struct dri_drawable *read = dri_drawable(ctx->rPriv);
|
||||
struct st_api *stapi = screen->st_api;
|
||||
|
||||
if (--ctx->bind_count == 0) {
|
||||
if (ctx->st == ctx->stapi->get_current(ctx->stapi)) {
|
||||
ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
|
||||
ctx->stapi->make_current(ctx->stapi, NULL, NULL, NULL);
|
||||
stapi->make_current(stapi, NULL, NULL, NULL);
|
||||
draw->context = NULL;
|
||||
read->context = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,10 +175,12 @@ dri_make_current(__DRIcontext * cPriv,
|
||||
|
||||
++ctx->bind_count;
|
||||
|
||||
draw->context = ctx;
|
||||
if (ctx->dPriv != driDrawPriv) {
|
||||
ctx->dPriv = driDrawPriv;
|
||||
draw->texture_stamp = driDrawPriv->lastStamp - 1;
|
||||
}
|
||||
read->context = ctx;
|
||||
if (ctx->rPriv != driReadPriv) {
|
||||
ctx->rPriv = driReadPriv;
|
||||
read->texture_stamp = driReadPriv->lastStamp - 1;
|
||||
|
@@ -61,9 +61,6 @@ struct dri_context
|
||||
/* gallium */
|
||||
struct st_api *stapi;
|
||||
struct st_context_iface *st;
|
||||
|
||||
/* hooks filled in by dri2 & drisw */
|
||||
__DRIimage * (*lookup_egl_image)(struct dri_context *ctx, void *handle);
|
||||
};
|
||||
|
||||
static INLINE struct dri_context *
|
||||
|
@@ -132,6 +132,7 @@ dri_create_buffer(__DRIscreen * sPriv,
|
||||
drawable->base.validate = dri_st_framebuffer_validate;
|
||||
drawable->base.st_manager_private = (void *) drawable;
|
||||
|
||||
drawable->screen = screen;
|
||||
drawable->sPriv = sPriv;
|
||||
drawable->dPriv = dPriv;
|
||||
dPriv->driverPrivate = (void *)drawable;
|
||||
|
@@ -41,6 +41,9 @@ struct dri_drawable
|
||||
struct st_framebuffer_iface base;
|
||||
struct st_visual stvis;
|
||||
|
||||
struct dri_screen *screen;
|
||||
struct dri_context *context;
|
||||
|
||||
/* dri */
|
||||
__DRIdrawable *dPriv;
|
||||
__DRIscreen *sPriv;
|
||||
|
@@ -287,16 +287,14 @@ dri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
|
||||
|
||||
static boolean
|
||||
dri_get_egl_image(struct st_manager *smapi,
|
||||
struct st_context_iface *stctxi,
|
||||
void *egl_image,
|
||||
struct st_egl_image *stimg)
|
||||
{
|
||||
struct dri_context *ctx =
|
||||
(struct dri_context *)stctxi->st_manager_private;
|
||||
struct dri_screen *screen = (struct dri_screen *)smapi;
|
||||
__DRIimage *img = NULL;
|
||||
|
||||
if (ctx->lookup_egl_image) {
|
||||
img = ctx->lookup_egl_image(ctx, egl_image);
|
||||
if (screen->lookup_egl_image) {
|
||||
img = screen->lookup_egl_image(screen, egl_image);
|
||||
}
|
||||
|
||||
if (!img)
|
||||
|
@@ -69,6 +69,9 @@ struct dri_screen
|
||||
boolean sd_depth_bits_last;
|
||||
boolean auto_fake_front;
|
||||
enum pipe_texture_target target;
|
||||
|
||||
/* hooks filled in by dri2 & drisw */
|
||||
__DRIimage * (*lookup_egl_image)(struct dri_screen *ctx, void *handle);
|
||||
};
|
||||
|
||||
/** cast wrapper */
|
||||
|
@@ -51,7 +51,7 @@ static void
|
||||
dri2_invalidate_drawable(__DRIdrawable *dPriv)
|
||||
{
|
||||
struct dri_drawable *drawable = dri_drawable(dPriv);
|
||||
struct dri_context *ctx = dri_context(dPriv->driContextPriv);
|
||||
struct dri_context *ctx = drawable->context;
|
||||
|
||||
dri2InvalidateDrawable(dPriv);
|
||||
drawable->dPriv->lastStamp = *drawable->dPriv->pStamp;
|
||||
@@ -291,25 +291,26 @@ dri2_flush_frontbuffer(struct dri_drawable *drawable,
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_lookup_egl_image(struct dri_context *ctx, void *handle)
|
||||
dri2_lookup_egl_image(struct dri_screen *screen, void *handle)
|
||||
{
|
||||
__DRIimageLookupExtension *loader = ctx->sPriv->dri2.image;
|
||||
__DRIimageLookupExtension *loader = screen->sPriv->dri2.image;
|
||||
__DRIimage *img;
|
||||
|
||||
if (!loader->lookupEGLImage)
|
||||
return NULL;
|
||||
|
||||
img = loader->lookupEGLImage(ctx->cPriv, handle, ctx->cPriv->loaderPrivate);
|
||||
img = loader->lookupEGLImage(screen->sPriv,
|
||||
handle, screen->sPriv->loaderPrivate);
|
||||
|
||||
return img;
|
||||
}
|
||||
|
||||
static __DRIimage *
|
||||
dri2_create_image_from_name(__DRIcontext *context,
|
||||
dri2_create_image_from_name(__DRIscreen *_screen,
|
||||
int width, int height, int format,
|
||||
int name, int pitch, void *loaderPrivate)
|
||||
{
|
||||
struct dri_screen *screen = dri_screen(context->driScreenPriv);
|
||||
struct dri_screen *screen = dri_screen(_screen);
|
||||
__DRIimage *img;
|
||||
struct pipe_resource templ;
|
||||
struct winsys_handle whandle;
|
||||
@@ -537,6 +538,7 @@ dri2_init_screen(__DRIscreen * sPriv)
|
||||
|
||||
screen->auto_fake_front = dri_with_format(sPriv);
|
||||
screen->broken_invalidate = !sPriv->dri2.useInvalidate;
|
||||
screen->lookup_egl_image = dri2_lookup_egl_image;
|
||||
|
||||
return configs;
|
||||
fail:
|
||||
@@ -556,8 +558,6 @@ dri2_create_context(gl_api api, const __GLcontextModes * visual,
|
||||
|
||||
ctx = cPriv->driverPrivate;
|
||||
|
||||
ctx->lookup_egl_image = dri2_lookup_egl_image;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@@ -17,16 +17,16 @@ x11_INCLUDES = \
|
||||
-I$(TOP)/src/mapi \
|
||||
-I$(TOP)/src/mesa \
|
||||
$(X11_CFLAGS) \
|
||||
$(shell pkg-config --cflags-only-I libdrm)
|
||||
$(shell pkg-config --cflags-only-I libdrm dri2proto)
|
||||
|
||||
x11_SOURCES = $(wildcard x11/*.c) \
|
||||
$(TOP)/src/glx/dri2.c
|
||||
x11_OBJECTS = $(x11_SOURCES:.c=.o)
|
||||
|
||||
|
||||
kms_INCLUDES = -I$(TOP)/src/gallium/winsys $(shell pkg-config --cflags-only-I libdrm)
|
||||
kms_SOURCES = $(wildcard kms/*.c)
|
||||
kms_OBJECTS = $(kms_SOURCES:.c=.o)
|
||||
drm_INCLUDES = -I$(TOP)/src/gallium/winsys $(shell pkg-config --cflags-only-I libdrm)
|
||||
drm_SOURCES = $(wildcard drm/*.c)
|
||||
drm_OBJECTS = $(drm_SOURCES:.c=.o)
|
||||
|
||||
|
||||
fbdev_INCLUDES = -I$(TOP)/src/gallium/winsys/sw
|
||||
@@ -34,8 +34,8 @@ fbdev_SOURCES = $(wildcard fbdev/*.c)
|
||||
fbdev_OBJECTS = $(fbdev_SOURCES:.c=.o)
|
||||
|
||||
|
||||
ALL_INCLUDES = $(common_INCLUDES) $(x11_INCLUDES) $(kms_INCLUDES) $(fbdev_INCLUDES)
|
||||
ALL_SOURCES = $(common_SOURCES) $(x11_SOURCES) $(kms_SOURCES) $(fbdev_SOURCES)
|
||||
ALL_INCLUDES = $(common_INCLUDES) $(x11_INCLUDES) $(drm_INCLUDES) $(fbdev_INCLUDES)
|
||||
ALL_SOURCES = $(common_SOURCES) $(x11_SOURCES) $(drm_SOURCES) $(fbdev_SOURCES)
|
||||
|
||||
EGL_OBJECTS = $(common_OBJECTS)
|
||||
EGL_CPPFLAGS = $(common_INCLUDES)
|
||||
@@ -45,9 +45,9 @@ ifneq ($(findstring x11, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(x11_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_X11_BACKEND
|
||||
endif
|
||||
ifneq ($(findstring kms, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(kms_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_KMS_BACKEND
|
||||
ifneq ($(findstring drm, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(drm_OBJECTS)
|
||||
EGL_CPPFLAGS += -DHAVE_DRM_BACKEND
|
||||
endif
|
||||
ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),)
|
||||
EGL_OBJECTS += $(fbdev_OBJECTS)
|
||||
@@ -87,8 +87,8 @@ $(common_OBJECTS): %.o: %.c
|
||||
$(x11_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,x11)
|
||||
|
||||
$(kms_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,kms)
|
||||
$(drm_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,drm)
|
||||
|
||||
$(fbdev_OBJECTS): %.o: %.c
|
||||
$(call egl-cc,fbdev)
|
||||
|
@@ -65,8 +65,8 @@ egl_g3d_get_platform(_EGLDriver *drv, _EGLPlatformType plat)
|
||||
break;
|
||||
case _EGL_PLATFORM_DRM:
|
||||
plat_name = "DRM";
|
||||
#ifdef HAVE_KMS_BACKEND
|
||||
nplat = native_get_kms_platform();
|
||||
#ifdef HAVE_DRM_BACKEND
|
||||
nplat = native_get_drm_platform();
|
||||
#endif
|
||||
break;
|
||||
case _EGL_PLATFORM_FBDEV:
|
||||
|
@@ -609,8 +609,10 @@ egl_g3d_wait_client(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
|
||||
|
||||
gctx->stctxi->flush(gctx->stctxi,
|
||||
PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
screen->fence_finish(screen, fence, 0);
|
||||
screen->fence_reference(screen, &fence, NULL);
|
||||
if (fence) {
|
||||
screen->fence_finish(screen, fence, 0);
|
||||
screen->fence_reference(screen, &fence, NULL);
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
@@ -51,7 +51,6 @@ egl_g3d_st_manager(struct st_manager *smapi)
|
||||
|
||||
static boolean
|
||||
egl_g3d_st_manager_get_egl_image(struct st_manager *smapi,
|
||||
struct st_context_iface *stctx,
|
||||
void *egl_image,
|
||||
struct st_egl_image *out)
|
||||
{
|
||||
|
@@ -227,7 +227,7 @@ const struct native_platform *
|
||||
native_get_x11_platform(void);
|
||||
|
||||
const struct native_platform *
|
||||
native_get_kms_platform(void);
|
||||
native_get_drm_platform(void);
|
||||
|
||||
const struct native_platform *
|
||||
native_get_fbdev_platform(void);
|
||||
|
619
src/gallium/state_trackers/egl/drm/modeset.c
Normal file
619
src/gallium/state_trackers/egl/drm/modeset.c
Normal file
@@ -0,0 +1,619 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.9
|
||||
*
|
||||
* Copyright (C) 2010 LunarG Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Chia-I Wu <olv@lunarg.com>
|
||||
*/
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_drm.h"
|
||||
|
||||
static boolean
|
||||
drm_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
int *width, int *height)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
|
||||
if (!resource_surface_add_resources(drmsurf->rsurf, attachment_mask))
|
||||
return FALSE;
|
||||
if (textures)
|
||||
resource_surface_get_resources(drmsurf->rsurf, textures, attachment_mask);
|
||||
|
||||
if (seq_num)
|
||||
*seq_num = drmsurf->sequence_number;
|
||||
if (width)
|
||||
*width = drmsurf->width;
|
||||
if (height)
|
||||
*height = drmsurf->height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add textures as DRM framebuffers.
|
||||
*/
|
||||
static boolean
|
||||
drm_surface_init_framebuffers(struct native_surface *nsurf, boolean need_back)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
int num_framebuffers = (need_back) ? 2 : 1;
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < num_framebuffers; i++) {
|
||||
struct drm_framebuffer *fb;
|
||||
enum native_attachment natt;
|
||||
struct winsys_handle whandle;
|
||||
uint block_bits;
|
||||
|
||||
if (i == 0) {
|
||||
fb = &drmsurf->front_fb;
|
||||
natt = NATIVE_ATTACHMENT_FRONT_LEFT;
|
||||
}
|
||||
else {
|
||||
fb = &drmsurf->back_fb;
|
||||
natt = NATIVE_ATTACHMENT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if (!fb->texture) {
|
||||
/* make sure the texture has been allocated */
|
||||
resource_surface_add_resources(drmsurf->rsurf, 1 << natt);
|
||||
fb->texture =
|
||||
resource_surface_get_single_resource(drmsurf->rsurf, natt);
|
||||
if (!fb->texture)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* already initialized */
|
||||
if (fb->buffer_id)
|
||||
continue;
|
||||
|
||||
/* TODO detect the real value */
|
||||
fb->is_passive = TRUE;
|
||||
|
||||
memset(&whandle, 0, sizeof(whandle));
|
||||
whandle.type = DRM_API_HANDLE_TYPE_KMS;
|
||||
|
||||
if (!drmdpy->base.screen->resource_get_handle(drmdpy->base.screen,
|
||||
fb->texture, &whandle))
|
||||
return FALSE;
|
||||
|
||||
block_bits = util_format_get_blocksizebits(drmsurf->color_format);
|
||||
err = drmModeAddFB(drmdpy->fd, drmsurf->width, drmsurf->height,
|
||||
block_bits, block_bits, whandle.stride, whandle.handle,
|
||||
&fb->buffer_id);
|
||||
if (err) {
|
||||
fb->buffer_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_surface_flush_frontbuffer(struct native_surface *nsurf)
|
||||
{
|
||||
#ifdef DRM_MODE_FEATURE_DIRTYFB
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
|
||||
if (drmsurf->front_fb.is_passive)
|
||||
drmModeDirtyFB(drmdpy->fd, drmsurf->front_fb.buffer_id, NULL, 0);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_surface_swap_buffers(struct native_surface *nsurf)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
struct drm_crtc *drmcrtc = &drmsurf->current_crtc;
|
||||
struct drm_display *drmdpy = drmsurf->drmdpy;
|
||||
struct drm_framebuffer tmp_fb;
|
||||
int err;
|
||||
|
||||
if (!drmsurf->back_fb.buffer_id) {
|
||||
if (!drm_surface_init_framebuffers(&drmsurf->base, TRUE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (drmsurf->is_shown && drmcrtc->crtc) {
|
||||
err = drmModeSetCrtc(drmdpy->fd, drmcrtc->crtc->crtc_id,
|
||||
drmsurf->back_fb.buffer_id, drmcrtc->crtc->x, drmcrtc->crtc->y,
|
||||
drmcrtc->connectors, drmcrtc->num_connectors, &drmcrtc->crtc->mode);
|
||||
if (err)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* swap the buffers */
|
||||
tmp_fb = drmsurf->front_fb;
|
||||
drmsurf->front_fb = drmsurf->back_fb;
|
||||
drmsurf->back_fb = tmp_fb;
|
||||
|
||||
resource_surface_swap_buffers(drmsurf->rsurf,
|
||||
NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
|
||||
/* the front/back textures are swapped */
|
||||
drmsurf->sequence_number++;
|
||||
drmdpy->event_handler->invalid_surface(&drmdpy->base,
|
||||
&drmsurf->base, drmsurf->sequence_number);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
static void
|
||||
drm_surface_destroy(struct native_surface *nsurf)
|
||||
{
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
|
||||
if (drmsurf->current_crtc.crtc)
|
||||
drmModeFreeCrtc(drmsurf->current_crtc.crtc);
|
||||
|
||||
if (drmsurf->front_fb.buffer_id)
|
||||
drmModeRmFB(drmsurf->drmdpy->fd, drmsurf->front_fb.buffer_id);
|
||||
pipe_resource_reference(&drmsurf->front_fb.texture, NULL);
|
||||
|
||||
if (drmsurf->back_fb.buffer_id)
|
||||
drmModeRmFB(drmsurf->drmdpy->fd, drmsurf->back_fb.buffer_id);
|
||||
pipe_resource_reference(&drmsurf->back_fb.texture, NULL);
|
||||
|
||||
resource_surface_destroy(drmsurf->rsurf);
|
||||
FREE(drmsurf);
|
||||
}
|
||||
|
||||
static struct drm_surface *
|
||||
drm_display_create_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_config *drmconf = drm_config(nconf);
|
||||
struct drm_surface *drmsurf;
|
||||
|
||||
drmsurf = CALLOC_STRUCT(drm_surface);
|
||||
if (!drmsurf)
|
||||
return NULL;
|
||||
|
||||
drmsurf->drmdpy = drmdpy;
|
||||
drmsurf->color_format = drmconf->base.color_format;
|
||||
drmsurf->width = width;
|
||||
drmsurf->height = height;
|
||||
|
||||
drmsurf->rsurf = resource_surface_create(drmdpy->base.screen,
|
||||
drmsurf->color_format,
|
||||
PIPE_BIND_RENDER_TARGET |
|
||||
PIPE_BIND_SAMPLER_VIEW |
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT);
|
||||
if (!drmsurf->rsurf) {
|
||||
FREE(drmsurf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resource_surface_set_size(drmsurf->rsurf, drmsurf->width, drmsurf->height);
|
||||
|
||||
drmsurf->base.destroy = drm_surface_destroy;
|
||||
drmsurf->base.swap_buffers = drm_surface_swap_buffers;
|
||||
drmsurf->base.flush_frontbuffer = drm_surface_flush_frontbuffer;
|
||||
drmsurf->base.validate = drm_surface_validate;
|
||||
drmsurf->base.wait = drm_surface_wait;
|
||||
|
||||
return drmsurf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Choose a CRTC that supports all given connectors.
|
||||
*/
|
||||
static uint32_t
|
||||
drm_display_choose_crtc(struct native_display *ndpy,
|
||||
uint32_t *connectors, int num_connectors)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < drmdpy->resources->count_crtcs; idx++) {
|
||||
boolean found_crtc = TRUE;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < num_connectors; i++) {
|
||||
drmModeConnectorPtr connector;
|
||||
int encoder_idx = -1;
|
||||
|
||||
connector = drmModeGetConnector(drmdpy->fd, connectors[i]);
|
||||
if (!connector) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* find an encoder the CRTC supports */
|
||||
for (j = 0; j < connector->count_encoders; j++) {
|
||||
drmModeEncoderPtr encoder =
|
||||
drmModeGetEncoder(drmdpy->fd, connector->encoders[j]);
|
||||
if (encoder->possible_crtcs & (1 << idx)) {
|
||||
encoder_idx = j;
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
|
||||
drmModeFreeConnector(connector);
|
||||
if (encoder_idx < 0) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_crtc)
|
||||
break;
|
||||
}
|
||||
|
||||
if (idx >= drmdpy->resources->count_crtcs) {
|
||||
_eglLog(_EGL_WARNING,
|
||||
"failed to find a CRTC that supports the given %d connectors",
|
||||
num_connectors);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return drmdpy->resources->crtcs[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remember the original CRTC status and set the CRTC
|
||||
*/
|
||||
static boolean
|
||||
drm_display_set_crtc(struct native_display *ndpy, int crtc_idx,
|
||||
uint32_t buffer_id, uint32_t x, uint32_t y,
|
||||
uint32_t *connectors, int num_connectors,
|
||||
drmModeModeInfoPtr mode)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_crtc *drmcrtc = &drmdpy->saved_crtcs[crtc_idx];
|
||||
uint32_t crtc_id;
|
||||
int err;
|
||||
|
||||
if (drmcrtc->crtc) {
|
||||
crtc_id = drmcrtc->crtc->crtc_id;
|
||||
}
|
||||
else {
|
||||
int count = 0, i;
|
||||
|
||||
/*
|
||||
* Choose the CRTC once. It could be more dynamic, but let's keep it
|
||||
* simple for now.
|
||||
*/
|
||||
crtc_id = drm_display_choose_crtc(&drmdpy->base,
|
||||
connectors, num_connectors);
|
||||
|
||||
/* save the original CRTC status */
|
||||
drmcrtc->crtc = drmModeGetCrtc(drmdpy->fd, crtc_id);
|
||||
if (!drmcrtc->crtc)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < drmdpy->num_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
drmModeConnectorPtr connector = drmconn->connector;
|
||||
drmModeEncoderPtr encoder;
|
||||
|
||||
encoder = drmModeGetEncoder(drmdpy->fd, connector->encoder_id);
|
||||
if (encoder) {
|
||||
if (encoder->crtc_id == crtc_id) {
|
||||
drmcrtc->connectors[count++] = connector->connector_id;
|
||||
if (count >= Elements(drmcrtc->connectors))
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
drmcrtc->num_connectors = count;
|
||||
}
|
||||
|
||||
err = drmModeSetCrtc(drmdpy->fd, crtc_id, buffer_id, x, y,
|
||||
connectors, num_connectors, mode);
|
||||
if (err) {
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
drmcrtc->crtc = NULL;
|
||||
drmcrtc->num_connectors = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
drm_display_program(struct native_display *ndpy, int crtc_idx,
|
||||
struct native_surface *nsurf, uint x, uint y,
|
||||
const struct native_connector **nconns, int num_nconns,
|
||||
const struct native_mode *nmode)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_surface *drmsurf = drm_surface(nsurf);
|
||||
const struct drm_mode *drmmode = drm_mode(nmode);
|
||||
uint32_t connector_ids[32];
|
||||
uint32_t buffer_id;
|
||||
drmModeModeInfo mode_tmp, *mode;
|
||||
int i;
|
||||
|
||||
if (num_nconns > Elements(connector_ids)) {
|
||||
_eglLog(_EGL_WARNING, "too many connectors (%d)", num_nconns);
|
||||
num_nconns = Elements(connector_ids);
|
||||
}
|
||||
|
||||
if (drmsurf) {
|
||||
if (!drm_surface_init_framebuffers(&drmsurf->base, FALSE))
|
||||
return FALSE;
|
||||
|
||||
buffer_id = drmsurf->front_fb.buffer_id;
|
||||
/* the mode argument of drmModeSetCrtc is not constified */
|
||||
mode_tmp = drmmode->mode;
|
||||
mode = &mode_tmp;
|
||||
}
|
||||
else {
|
||||
/* disable the CRTC */
|
||||
buffer_id = 0;
|
||||
mode = NULL;
|
||||
num_nconns = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_nconns; i++) {
|
||||
struct drm_connector *drmconn = drm_connector(nconns[i]);
|
||||
connector_ids[i] = drmconn->connector->connector_id;
|
||||
}
|
||||
|
||||
if (!drm_display_set_crtc(&drmdpy->base, crtc_idx, buffer_id, x, y,
|
||||
connector_ids, num_nconns, mode)) {
|
||||
_eglLog(_EGL_WARNING, "failed to set CRTC %d", crtc_idx);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (drmdpy->shown_surfaces[crtc_idx])
|
||||
drmdpy->shown_surfaces[crtc_idx]->is_shown = FALSE;
|
||||
drmdpy->shown_surfaces[crtc_idx] = drmsurf;
|
||||
|
||||
/* remember the settings for buffer swapping */
|
||||
if (drmsurf) {
|
||||
uint32_t crtc_id = drmdpy->saved_crtcs[crtc_idx].crtc->crtc_id;
|
||||
struct drm_crtc *drmcrtc = &drmsurf->current_crtc;
|
||||
|
||||
if (drmcrtc->crtc)
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
drmcrtc->crtc = drmModeGetCrtc(drmdpy->fd, crtc_id);
|
||||
|
||||
assert(num_nconns < Elements(drmcrtc->connectors));
|
||||
memcpy(drmcrtc->connectors, connector_ids,
|
||||
sizeof(*connector_ids) * num_nconns);
|
||||
drmcrtc->num_connectors = num_nconns;
|
||||
|
||||
drmsurf->is_shown = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const struct native_mode **
|
||||
drm_display_get_modes(struct native_display *ndpy,
|
||||
const struct native_connector *nconn,
|
||||
int *num_modes)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
struct drm_connector *drmconn = drm_connector(nconn);
|
||||
const struct native_mode **nmodes_return;
|
||||
int count, i;
|
||||
|
||||
/* delete old data */
|
||||
if (drmconn->connector) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
FREE(drmconn->drm_modes);
|
||||
|
||||
drmconn->connector = NULL;
|
||||
drmconn->drm_modes = NULL;
|
||||
drmconn->num_modes = 0;
|
||||
}
|
||||
|
||||
/* detect again */
|
||||
drmconn->connector = drmModeGetConnector(drmdpy->fd, drmconn->connector_id);
|
||||
if (!drmconn->connector)
|
||||
return NULL;
|
||||
|
||||
count = drmconn->connector->count_modes;
|
||||
drmconn->drm_modes = CALLOC(count, sizeof(*drmconn->drm_modes));
|
||||
if (!drmconn->drm_modes) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
drmconn->connector = NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct drm_mode *drmmode = &drmconn->drm_modes[i];
|
||||
drmModeModeInfoPtr mode = &drmconn->connector->modes[i];
|
||||
|
||||
drmmode->mode = *mode;
|
||||
|
||||
drmmode->base.desc = drmmode->mode.name;
|
||||
drmmode->base.width = drmmode->mode.hdisplay;
|
||||
drmmode->base.height = drmmode->mode.vdisplay;
|
||||
drmmode->base.refresh_rate = drmmode->mode.vrefresh;
|
||||
/* not all kernels have vrefresh = refresh_rate * 1000 */
|
||||
if (drmmode->base.refresh_rate > 1000)
|
||||
drmmode->base.refresh_rate = (drmmode->base.refresh_rate + 500) / 1000;
|
||||
}
|
||||
|
||||
nmodes_return = MALLOC(count * sizeof(*nmodes_return));
|
||||
if (nmodes_return) {
|
||||
for (i = 0; i < count; i++)
|
||||
nmodes_return[i] = &drmconn->drm_modes[i].base;
|
||||
if (num_modes)
|
||||
*num_modes = count;
|
||||
}
|
||||
|
||||
return nmodes_return;
|
||||
}
|
||||
|
||||
static const struct native_connector **
|
||||
drm_display_get_connectors(struct native_display *ndpy, int *num_connectors,
|
||||
int *num_crtc)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
const struct native_connector **connectors;
|
||||
int i;
|
||||
|
||||
if (!drmdpy->connectors) {
|
||||
drmdpy->connectors =
|
||||
CALLOC(drmdpy->resources->count_connectors, sizeof(*drmdpy->connectors));
|
||||
if (!drmdpy->connectors)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < drmdpy->resources->count_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
|
||||
drmconn->connector_id = drmdpy->resources->connectors[i];
|
||||
/* drmconn->connector is allocated when the modes are asked */
|
||||
}
|
||||
|
||||
drmdpy->num_connectors = drmdpy->resources->count_connectors;
|
||||
}
|
||||
|
||||
connectors = MALLOC(drmdpy->num_connectors * sizeof(*connectors));
|
||||
if (connectors) {
|
||||
for (i = 0; i < drmdpy->num_connectors; i++)
|
||||
connectors[i] = &drmdpy->connectors[i].base;
|
||||
if (num_connectors)
|
||||
*num_connectors = drmdpy->num_connectors;
|
||||
}
|
||||
|
||||
if (num_crtc)
|
||||
*num_crtc = drmdpy->resources->count_crtcs;
|
||||
|
||||
return connectors;
|
||||
}
|
||||
|
||||
static struct native_surface *
|
||||
drm_display_create_scanout_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct drm_surface *drmsurf;
|
||||
|
||||
drmsurf = drm_display_create_surface(ndpy, nconf, width, height);
|
||||
return &drmsurf->base;
|
||||
}
|
||||
|
||||
static struct native_display_modeset drm_display_modeset = {
|
||||
.get_connectors = drm_display_get_connectors,
|
||||
.get_modes = drm_display_get_modes,
|
||||
.create_scanout_surface = drm_display_create_scanout_surface,
|
||||
.program = drm_display_program
|
||||
};
|
||||
|
||||
void
|
||||
drm_display_fini_modeset(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
int i;
|
||||
|
||||
if (drmdpy->connectors) {
|
||||
for (i = 0; i < drmdpy->num_connectors; i++) {
|
||||
struct drm_connector *drmconn = &drmdpy->connectors[i];
|
||||
if (drmconn->connector) {
|
||||
drmModeFreeConnector(drmconn->connector);
|
||||
FREE(drmconn->drm_modes);
|
||||
}
|
||||
}
|
||||
FREE(drmdpy->connectors);
|
||||
}
|
||||
|
||||
if (drmdpy->shown_surfaces) {
|
||||
FREE(drmdpy->shown_surfaces);
|
||||
drmdpy->shown_surfaces = NULL;
|
||||
}
|
||||
|
||||
if (drmdpy->saved_crtcs) {
|
||||
for (i = 0; i < drmdpy->resources->count_crtcs; i++) {
|
||||
struct drm_crtc *drmcrtc = &drmdpy->saved_crtcs[i];
|
||||
|
||||
if (drmcrtc->crtc) {
|
||||
/* restore crtc */
|
||||
drmModeSetCrtc(drmdpy->fd, drmcrtc->crtc->crtc_id,
|
||||
drmcrtc->crtc->buffer_id, drmcrtc->crtc->x, drmcrtc->crtc->y,
|
||||
drmcrtc->connectors, drmcrtc->num_connectors,
|
||||
&drmcrtc->crtc->mode);
|
||||
|
||||
drmModeFreeCrtc(drmcrtc->crtc);
|
||||
}
|
||||
}
|
||||
FREE(drmdpy->saved_crtcs);
|
||||
}
|
||||
|
||||
if (drmdpy->resources) {
|
||||
drmModeFreeResources(drmdpy->resources);
|
||||
drmdpy->resources = NULL;
|
||||
}
|
||||
|
||||
drmdpy->base.modeset = NULL;
|
||||
}
|
||||
|
||||
boolean
|
||||
drm_display_init_modeset(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
|
||||
/* resources are fixed, unlike crtc, connector, or encoder */
|
||||
drmdpy->resources = drmModeGetResources(drmdpy->fd);
|
||||
if (!drmdpy->resources) {
|
||||
_eglLog(_EGL_DEBUG, "Failed to get KMS resources. Disable modeset.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->saved_crtcs =
|
||||
CALLOC(drmdpy->resources->count_crtcs, sizeof(*drmdpy->saved_crtcs));
|
||||
if (!drmdpy->saved_crtcs) {
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->shown_surfaces =
|
||||
CALLOC(drmdpy->resources->count_crtcs, sizeof(*drmdpy->shown_surfaces));
|
||||
if (!drmdpy->shown_surfaces) {
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drmdpy->base.modeset = &drm_display_modeset;
|
||||
|
||||
return TRUE;
|
||||
}
|
240
src/gallium/state_trackers/egl/drm/native_drm.c
Normal file
240
src/gallium/state_trackers/egl/drm/native_drm.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.8
|
||||
*
|
||||
* Copyright (C) 2010 Chia-I Wu <olv@0xlab.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_drm.h"
|
||||
|
||||
/* see get_drm_screen_name */
|
||||
#include <radeon_drm.h>
|
||||
#include "radeon/drm/radeon_drm.h"
|
||||
|
||||
static boolean
|
||||
drm_display_is_format_supported(struct native_display *ndpy,
|
||||
enum pipe_format fmt, boolean is_color)
|
||||
{
|
||||
return ndpy->screen->is_format_supported(ndpy->screen,
|
||||
fmt, PIPE_TEXTURE_2D, 0,
|
||||
(is_color) ? PIPE_BIND_RENDER_TARGET :
|
||||
PIPE_BIND_DEPTH_STENCIL, 0);
|
||||
}
|
||||
|
||||
static const struct native_config **
|
||||
drm_display_get_configs(struct native_display *ndpy, int *num_configs)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
const struct native_config **configs;
|
||||
|
||||
/* first time */
|
||||
if (!drmdpy->config) {
|
||||
struct native_config *nconf;
|
||||
enum pipe_format format;
|
||||
|
||||
drmdpy->config = CALLOC(1, sizeof(*drmdpy->config));
|
||||
if (!drmdpy->config)
|
||||
return NULL;
|
||||
|
||||
nconf = &drmdpy->config->base;
|
||||
|
||||
nconf->buffer_mask =
|
||||
(1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
|
||||
(1 << NATIVE_ATTACHMENT_BACK_LEFT);
|
||||
|
||||
format = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
if (!drm_display_is_format_supported(&drmdpy->base, format, TRUE)) {
|
||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
||||
if (!drm_display_is_format_supported(&drmdpy->base, format, TRUE))
|
||||
format = PIPE_FORMAT_NONE;
|
||||
}
|
||||
if (format == PIPE_FORMAT_NONE) {
|
||||
FREE(drmdpy->config);
|
||||
drmdpy->config = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nconf->color_format = format;
|
||||
|
||||
/* support KMS */
|
||||
if (drmdpy->resources)
|
||||
nconf->scanout_bit = TRUE;
|
||||
}
|
||||
|
||||
configs = MALLOC(sizeof(*configs));
|
||||
if (configs) {
|
||||
configs[0] = &drmdpy->config->base;
|
||||
if (num_configs)
|
||||
*num_configs = 1;
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
static int
|
||||
drm_display_get_param(struct native_display *ndpy,
|
||||
enum native_param_type param)
|
||||
{
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_display_destroy(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
|
||||
if (drmdpy->config)
|
||||
FREE(drmdpy->config);
|
||||
|
||||
drm_display_fini_modeset(&drmdpy->base);
|
||||
|
||||
if (drmdpy->base.screen)
|
||||
drmdpy->base.screen->destroy(drmdpy->base.screen);
|
||||
|
||||
if (drmdpy->fd >= 0)
|
||||
close(drmdpy->fd);
|
||||
|
||||
FREE(drmdpy);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_drm_screen_name(int fd, drmVersionPtr version)
|
||||
{
|
||||
const char *name = version->name;
|
||||
|
||||
if (name && !strcmp(name, "radeon")) {
|
||||
int chip_id;
|
||||
struct drm_radeon_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.request = RADEON_INFO_DEVICE_ID;
|
||||
info.value = pointer_to_intptr(&chip_id);
|
||||
if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
|
||||
return NULL;
|
||||
|
||||
name = is_r3xx(chip_id) ? "r300" : "r600";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize KMS and pipe screen.
|
||||
*/
|
||||
static boolean
|
||||
drm_display_init_screen(struct native_display *ndpy)
|
||||
{
|
||||
struct drm_display *drmdpy = drm_display(ndpy);
|
||||
drmVersionPtr version;
|
||||
const char *name;
|
||||
|
||||
version = drmGetVersion(drmdpy->fd);
|
||||
if (!version) {
|
||||
_eglLog(_EGL_WARNING, "invalid fd %d", drmdpy->fd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name = get_drm_screen_name(drmdpy->fd, version);
|
||||
if (name) {
|
||||
drmdpy->base.screen =
|
||||
drmdpy->event_handler->new_drm_screen(&drmdpy->base, name, drmdpy->fd);
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
|
||||
if (!drmdpy->base.screen) {
|
||||
_eglLog(_EGL_WARNING, "failed to create DRM screen");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
drm_create_display(int fd, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
struct drm_display *drmdpy;
|
||||
|
||||
drmdpy = CALLOC_STRUCT(drm_display);
|
||||
if (!drmdpy)
|
||||
return NULL;
|
||||
|
||||
drmdpy->fd = fd;
|
||||
drmdpy->event_handler = event_handler;
|
||||
drmdpy->base.user_data = user_data;
|
||||
|
||||
if (!drm_display_init_screen(&drmdpy->base)) {
|
||||
drm_display_destroy(&drmdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
drmdpy->base.destroy = drm_display_destroy;
|
||||
drmdpy->base.get_param = drm_display_get_param;
|
||||
drmdpy->base.get_configs = drm_display_get_configs;
|
||||
|
||||
drm_display_init_modeset(&drmdpy->base);
|
||||
|
||||
return &drmdpy->base;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
native_create_display(void *dpy, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (dpy) {
|
||||
fd = dup((int) pointer_to_intptr(dpy));
|
||||
}
|
||||
else {
|
||||
fd = open("/dev/dri/card0", O_RDWR);
|
||||
}
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return drm_create_display(fd, event_handler, user_data);
|
||||
}
|
||||
|
||||
static const struct native_platform drm_platform = {
|
||||
"DRM", /* name */
|
||||
native_create_display
|
||||
};
|
||||
|
||||
const struct native_platform *
|
||||
native_get_drm_platform(void)
|
||||
{
|
||||
return &drm_platform;
|
||||
}
|
@@ -23,8 +23,8 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _NATIVE_KMS_H_
|
||||
#define _NATIVE_KMS_H_
|
||||
#ifndef _NATIVE_DRM_H_
|
||||
#define _NATIVE_DRM_H_
|
||||
|
||||
#include <xf86drm.h>
|
||||
#include <xf86drmMode.h>
|
||||
@@ -37,101 +37,110 @@
|
||||
#include "common/native.h"
|
||||
#include "common/native_helper.h"
|
||||
|
||||
struct kms_config;
|
||||
struct kms_connector;
|
||||
struct kms_mode;
|
||||
struct drm_config;
|
||||
struct drm_crtc;
|
||||
struct drm_connector;
|
||||
struct drm_mode;
|
||||
struct drm_surface;
|
||||
|
||||
struct kms_crtc {
|
||||
drmModeCrtcPtr crtc;
|
||||
uint32_t connectors[32];
|
||||
int num_connectors;
|
||||
};
|
||||
|
||||
struct kms_display {
|
||||
struct drm_display {
|
||||
struct native_display base;
|
||||
|
||||
struct native_event_handler *event_handler;
|
||||
|
||||
int fd;
|
||||
drmModeResPtr resources;
|
||||
struct kms_config *config;
|
||||
struct drm_config *config;
|
||||
|
||||
struct kms_connector *connectors;
|
||||
/* for modesetting */
|
||||
drmModeResPtr resources;
|
||||
struct drm_connector *connectors;
|
||||
int num_connectors;
|
||||
|
||||
struct kms_surface **shown_surfaces;
|
||||
struct drm_surface **shown_surfaces;
|
||||
/* save the original settings of the CRTCs */
|
||||
struct kms_crtc *saved_crtcs;
|
||||
struct drm_crtc *saved_crtcs;
|
||||
};
|
||||
|
||||
struct kms_framebuffer {
|
||||
struct drm_config {
|
||||
struct native_config base;
|
||||
};
|
||||
|
||||
struct drm_crtc {
|
||||
drmModeCrtcPtr crtc;
|
||||
uint32_t connectors[32];
|
||||
int num_connectors;
|
||||
};
|
||||
|
||||
struct drm_framebuffer {
|
||||
struct pipe_resource *texture;
|
||||
boolean is_passive;
|
||||
|
||||
uint32_t buffer_id;
|
||||
};
|
||||
|
||||
struct kms_surface {
|
||||
struct drm_surface {
|
||||
struct native_surface base;
|
||||
struct kms_display *kdpy;
|
||||
struct drm_display *drmdpy;
|
||||
|
||||
struct resource_surface *rsurf;
|
||||
enum pipe_format color_format;
|
||||
int width, height;
|
||||
|
||||
unsigned int sequence_number;
|
||||
struct kms_framebuffer front_fb, back_fb;
|
||||
struct drm_framebuffer front_fb, back_fb;
|
||||
|
||||
boolean is_shown;
|
||||
struct kms_crtc current_crtc;
|
||||
struct drm_crtc current_crtc;
|
||||
};
|
||||
|
||||
struct kms_config {
|
||||
struct native_config base;
|
||||
};
|
||||
|
||||
struct kms_connector {
|
||||
struct drm_connector {
|
||||
struct native_connector base;
|
||||
|
||||
uint32_t connector_id;
|
||||
drmModeConnectorPtr connector;
|
||||
struct kms_mode *kms_modes;
|
||||
struct drm_mode *drm_modes;
|
||||
int num_modes;
|
||||
};
|
||||
|
||||
struct kms_mode {
|
||||
struct drm_mode {
|
||||
struct native_mode base;
|
||||
drmModeModeInfo mode;
|
||||
};
|
||||
|
||||
static INLINE struct kms_display *
|
||||
kms_display(const struct native_display *ndpy)
|
||||
static INLINE struct drm_display *
|
||||
drm_display(const struct native_display *ndpy)
|
||||
{
|
||||
return (struct kms_display *) ndpy;
|
||||
return (struct drm_display *) ndpy;
|
||||
}
|
||||
|
||||
static INLINE struct kms_surface *
|
||||
kms_surface(const struct native_surface *nsurf)
|
||||
static INLINE struct drm_config *
|
||||
drm_config(const struct native_config *nconf)
|
||||
{
|
||||
return (struct kms_surface *) nsurf;
|
||||
return (struct drm_config *) nconf;
|
||||
}
|
||||
|
||||
static INLINE struct kms_config *
|
||||
kms_config(const struct native_config *nconf)
|
||||
static INLINE struct drm_surface *
|
||||
drm_surface(const struct native_surface *nsurf)
|
||||
{
|
||||
return (struct kms_config *) nconf;
|
||||
return (struct drm_surface *) nsurf;
|
||||
}
|
||||
|
||||
static INLINE struct kms_connector *
|
||||
kms_connector(const struct native_connector *nconn)
|
||||
static INLINE struct drm_connector *
|
||||
drm_connector(const struct native_connector *nconn)
|
||||
{
|
||||
return (struct kms_connector *) nconn;
|
||||
return (struct drm_connector *) nconn;
|
||||
}
|
||||
|
||||
static INLINE struct kms_mode *
|
||||
kms_mode(const struct native_mode *nmode)
|
||||
static INLINE struct drm_mode *
|
||||
drm_mode(const struct native_mode *nmode)
|
||||
{
|
||||
return (struct kms_mode *) nmode;
|
||||
return (struct drm_mode *) nmode;
|
||||
}
|
||||
|
||||
#endif /* _NATIVE_KMS_H_ */
|
||||
boolean
|
||||
drm_display_init_modeset(struct native_display *ndpy);
|
||||
|
||||
void
|
||||
drm_display_fini_modeset(struct native_display *ndpy);
|
||||
|
||||
#endif /* _NATIVE_DRM_H_ */
|
@@ -1,808 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.8
|
||||
*
|
||||
* Copyright (C) 2010 Chia-I Wu <olv@0xlab.org>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_pointer.h"
|
||||
#include "util/u_string.h"
|
||||
#include "egllog.h"
|
||||
|
||||
#include "native_kms.h"
|
||||
|
||||
/* see get_drm_screen_name */
|
||||
#include <radeon_drm.h>
|
||||
#include "radeon/drm/radeon_drm.h"
|
||||
|
||||
static boolean
|
||||
kms_surface_validate(struct native_surface *nsurf, uint attachment_mask,
|
||||
unsigned int *seq_num, struct pipe_resource **textures,
|
||||
int *width, int *height)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
|
||||
if (!resource_surface_add_resources(ksurf->rsurf, attachment_mask))
|
||||
return FALSE;
|
||||
if (textures)
|
||||
resource_surface_get_resources(ksurf->rsurf, textures, attachment_mask);
|
||||
|
||||
if (seq_num)
|
||||
*seq_num = ksurf->sequence_number;
|
||||
if (width)
|
||||
*width = ksurf->width;
|
||||
if (height)
|
||||
*height = ksurf->height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add textures as DRM framebuffers.
|
||||
*/
|
||||
static boolean
|
||||
kms_surface_init_framebuffers(struct native_surface *nsurf, boolean need_back)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
int num_framebuffers = (need_back) ? 2 : 1;
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < num_framebuffers; i++) {
|
||||
struct kms_framebuffer *fb;
|
||||
enum native_attachment natt;
|
||||
struct winsys_handle whandle;
|
||||
uint block_bits;
|
||||
|
||||
if (i == 0) {
|
||||
fb = &ksurf->front_fb;
|
||||
natt = NATIVE_ATTACHMENT_FRONT_LEFT;
|
||||
}
|
||||
else {
|
||||
fb = &ksurf->back_fb;
|
||||
natt = NATIVE_ATTACHMENT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if (!fb->texture) {
|
||||
/* make sure the texture has been allocated */
|
||||
resource_surface_add_resources(ksurf->rsurf, 1 << natt);
|
||||
fb->texture =
|
||||
resource_surface_get_single_resource(ksurf->rsurf, natt);
|
||||
if (!fb->texture)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* already initialized */
|
||||
if (fb->buffer_id)
|
||||
continue;
|
||||
|
||||
/* TODO detect the real value */
|
||||
fb->is_passive = TRUE;
|
||||
|
||||
memset(&whandle, 0, sizeof(whandle));
|
||||
whandle.type = DRM_API_HANDLE_TYPE_KMS;
|
||||
|
||||
if (!kdpy->base.screen->resource_get_handle(kdpy->base.screen,
|
||||
fb->texture, &whandle))
|
||||
return FALSE;
|
||||
|
||||
block_bits = util_format_get_blocksizebits(ksurf->color_format);
|
||||
err = drmModeAddFB(kdpy->fd, ksurf->width, ksurf->height,
|
||||
block_bits, block_bits, whandle.stride, whandle.handle,
|
||||
&fb->buffer_id);
|
||||
if (err) {
|
||||
fb->buffer_id = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_surface_flush_frontbuffer(struct native_surface *nsurf)
|
||||
{
|
||||
#ifdef DRM_MODE_FEATURE_DIRTYFB
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
|
||||
if (ksurf->front_fb.is_passive)
|
||||
drmModeDirtyFB(kdpy->fd, ksurf->front_fb.buffer_id, NULL, 0);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_surface_swap_buffers(struct native_surface *nsurf)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
struct kms_crtc *kcrtc = &ksurf->current_crtc;
|
||||
struct kms_display *kdpy = ksurf->kdpy;
|
||||
struct kms_framebuffer tmp_fb;
|
||||
int err;
|
||||
|
||||
if (!ksurf->back_fb.buffer_id) {
|
||||
if (!kms_surface_init_framebuffers(&ksurf->base, TRUE))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (ksurf->is_shown && kcrtc->crtc) {
|
||||
err = drmModeSetCrtc(kdpy->fd, kcrtc->crtc->crtc_id,
|
||||
ksurf->back_fb.buffer_id, kcrtc->crtc->x, kcrtc->crtc->y,
|
||||
kcrtc->connectors, kcrtc->num_connectors, &kcrtc->crtc->mode);
|
||||
if (err)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* swap the buffers */
|
||||
tmp_fb = ksurf->front_fb;
|
||||
ksurf->front_fb = ksurf->back_fb;
|
||||
ksurf->back_fb = tmp_fb;
|
||||
|
||||
resource_surface_swap_buffers(ksurf->rsurf,
|
||||
NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, FALSE);
|
||||
/* the front/back textures are swapped */
|
||||
ksurf->sequence_number++;
|
||||
kdpy->event_handler->invalid_surface(&kdpy->base,
|
||||
&ksurf->base, ksurf->sequence_number);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
kms_surface_wait(struct native_surface *nsurf)
|
||||
{
|
||||
/* no-op */
|
||||
}
|
||||
|
||||
static void
|
||||
kms_surface_destroy(struct native_surface *nsurf)
|
||||
{
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
|
||||
if (ksurf->current_crtc.crtc)
|
||||
drmModeFreeCrtc(ksurf->current_crtc.crtc);
|
||||
|
||||
if (ksurf->front_fb.buffer_id)
|
||||
drmModeRmFB(ksurf->kdpy->fd, ksurf->front_fb.buffer_id);
|
||||
pipe_resource_reference(&ksurf->front_fb.texture, NULL);
|
||||
|
||||
if (ksurf->back_fb.buffer_id)
|
||||
drmModeRmFB(ksurf->kdpy->fd, ksurf->back_fb.buffer_id);
|
||||
pipe_resource_reference(&ksurf->back_fb.texture, NULL);
|
||||
|
||||
resource_surface_destroy(ksurf->rsurf);
|
||||
FREE(ksurf);
|
||||
}
|
||||
|
||||
static struct kms_surface *
|
||||
kms_display_create_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_config *kconf = kms_config(nconf);
|
||||
struct kms_surface *ksurf;
|
||||
|
||||
ksurf = CALLOC_STRUCT(kms_surface);
|
||||
if (!ksurf)
|
||||
return NULL;
|
||||
|
||||
ksurf->kdpy = kdpy;
|
||||
ksurf->color_format = kconf->base.color_format;
|
||||
ksurf->width = width;
|
||||
ksurf->height = height;
|
||||
|
||||
ksurf->rsurf = resource_surface_create(kdpy->base.screen,
|
||||
ksurf->color_format,
|
||||
PIPE_BIND_RENDER_TARGET |
|
||||
PIPE_BIND_SAMPLER_VIEW |
|
||||
PIPE_BIND_DISPLAY_TARGET |
|
||||
PIPE_BIND_SCANOUT);
|
||||
if (!ksurf->rsurf) {
|
||||
FREE(ksurf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
resource_surface_set_size(ksurf->rsurf, ksurf->width, ksurf->height);
|
||||
|
||||
ksurf->base.destroy = kms_surface_destroy;
|
||||
ksurf->base.swap_buffers = kms_surface_swap_buffers;
|
||||
ksurf->base.flush_frontbuffer = kms_surface_flush_frontbuffer;
|
||||
ksurf->base.validate = kms_surface_validate;
|
||||
ksurf->base.wait = kms_surface_wait;
|
||||
|
||||
return ksurf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Choose a CRTC that supports all given connectors.
|
||||
*/
|
||||
static uint32_t
|
||||
kms_display_choose_crtc(struct native_display *ndpy,
|
||||
uint32_t *connectors, int num_connectors)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < kdpy->resources->count_crtcs; idx++) {
|
||||
boolean found_crtc = TRUE;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < num_connectors; i++) {
|
||||
drmModeConnectorPtr connector;
|
||||
int encoder_idx = -1;
|
||||
|
||||
connector = drmModeGetConnector(kdpy->fd, connectors[i]);
|
||||
if (!connector) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* find an encoder the CRTC supports */
|
||||
for (j = 0; j < connector->count_encoders; j++) {
|
||||
drmModeEncoderPtr encoder =
|
||||
drmModeGetEncoder(kdpy->fd, connector->encoders[j]);
|
||||
if (encoder->possible_crtcs & (1 << idx)) {
|
||||
encoder_idx = j;
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
|
||||
drmModeFreeConnector(connector);
|
||||
if (encoder_idx < 0) {
|
||||
found_crtc = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_crtc)
|
||||
break;
|
||||
}
|
||||
|
||||
if (idx >= kdpy->resources->count_crtcs) {
|
||||
_eglLog(_EGL_WARNING,
|
||||
"failed to find a CRTC that supports the given %d connectors",
|
||||
num_connectors);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return kdpy->resources->crtcs[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remember the original CRTC status and set the CRTC
|
||||
*/
|
||||
static boolean
|
||||
kms_display_set_crtc(struct native_display *ndpy, int crtc_idx,
|
||||
uint32_t buffer_id, uint32_t x, uint32_t y,
|
||||
uint32_t *connectors, int num_connectors,
|
||||
drmModeModeInfoPtr mode)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_crtc *kcrtc = &kdpy->saved_crtcs[crtc_idx];
|
||||
uint32_t crtc_id;
|
||||
int err;
|
||||
|
||||
if (kcrtc->crtc) {
|
||||
crtc_id = kcrtc->crtc->crtc_id;
|
||||
}
|
||||
else {
|
||||
int count = 0, i;
|
||||
|
||||
/*
|
||||
* Choose the CRTC once. It could be more dynamic, but let's keep it
|
||||
* simple for now.
|
||||
*/
|
||||
crtc_id = kms_display_choose_crtc(&kdpy->base,
|
||||
connectors, num_connectors);
|
||||
|
||||
/* save the original CRTC status */
|
||||
kcrtc->crtc = drmModeGetCrtc(kdpy->fd, crtc_id);
|
||||
if (!kcrtc->crtc)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < kdpy->num_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
drmModeConnectorPtr connector = kconn->connector;
|
||||
drmModeEncoderPtr encoder;
|
||||
|
||||
encoder = drmModeGetEncoder(kdpy->fd, connector->encoder_id);
|
||||
if (encoder) {
|
||||
if (encoder->crtc_id == crtc_id) {
|
||||
kcrtc->connectors[count++] = connector->connector_id;
|
||||
if (count >= Elements(kcrtc->connectors))
|
||||
break;
|
||||
}
|
||||
drmModeFreeEncoder(encoder);
|
||||
}
|
||||
}
|
||||
|
||||
kcrtc->num_connectors = count;
|
||||
}
|
||||
|
||||
err = drmModeSetCrtc(kdpy->fd, crtc_id, buffer_id, x, y,
|
||||
connectors, num_connectors, mode);
|
||||
if (err) {
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
kcrtc->crtc = NULL;
|
||||
kcrtc->num_connectors = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_display_program(struct native_display *ndpy, int crtc_idx,
|
||||
struct native_surface *nsurf, uint x, uint y,
|
||||
const struct native_connector **nconns, int num_nconns,
|
||||
const struct native_mode *nmode)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_surface *ksurf = kms_surface(nsurf);
|
||||
const struct kms_mode *kmode = kms_mode(nmode);
|
||||
uint32_t connector_ids[32];
|
||||
uint32_t buffer_id;
|
||||
drmModeModeInfo mode_tmp, *mode;
|
||||
int i;
|
||||
|
||||
if (num_nconns > Elements(connector_ids)) {
|
||||
_eglLog(_EGL_WARNING, "too many connectors (%d)", num_nconns);
|
||||
num_nconns = Elements(connector_ids);
|
||||
}
|
||||
|
||||
if (ksurf) {
|
||||
if (!kms_surface_init_framebuffers(&ksurf->base, FALSE))
|
||||
return FALSE;
|
||||
|
||||
buffer_id = ksurf->front_fb.buffer_id;
|
||||
/* the mode argument of drmModeSetCrtc is not constified */
|
||||
mode_tmp = kmode->mode;
|
||||
mode = &mode_tmp;
|
||||
}
|
||||
else {
|
||||
/* disable the CRTC */
|
||||
buffer_id = 0;
|
||||
mode = NULL;
|
||||
num_nconns = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_nconns; i++) {
|
||||
struct kms_connector *kconn = kms_connector(nconns[i]);
|
||||
connector_ids[i] = kconn->connector->connector_id;
|
||||
}
|
||||
|
||||
if (!kms_display_set_crtc(&kdpy->base, crtc_idx, buffer_id, x, y,
|
||||
connector_ids, num_nconns, mode)) {
|
||||
_eglLog(_EGL_WARNING, "failed to set CRTC %d", crtc_idx);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (kdpy->shown_surfaces[crtc_idx])
|
||||
kdpy->shown_surfaces[crtc_idx]->is_shown = FALSE;
|
||||
kdpy->shown_surfaces[crtc_idx] = ksurf;
|
||||
|
||||
/* remember the settings for buffer swapping */
|
||||
if (ksurf) {
|
||||
uint32_t crtc_id = kdpy->saved_crtcs[crtc_idx].crtc->crtc_id;
|
||||
struct kms_crtc *kcrtc = &ksurf->current_crtc;
|
||||
|
||||
if (kcrtc->crtc)
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
kcrtc->crtc = drmModeGetCrtc(kdpy->fd, crtc_id);
|
||||
|
||||
assert(num_nconns < Elements(kcrtc->connectors));
|
||||
memcpy(kcrtc->connectors, connector_ids,
|
||||
sizeof(*connector_ids) * num_nconns);
|
||||
kcrtc->num_connectors = num_nconns;
|
||||
|
||||
ksurf->is_shown = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const struct native_mode **
|
||||
kms_display_get_modes(struct native_display *ndpy,
|
||||
const struct native_connector *nconn,
|
||||
int *num_modes)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
struct kms_connector *kconn = kms_connector(nconn);
|
||||
const struct native_mode **nmodes_return;
|
||||
int count, i;
|
||||
|
||||
/* delete old data */
|
||||
if (kconn->connector) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
FREE(kconn->kms_modes);
|
||||
|
||||
kconn->connector = NULL;
|
||||
kconn->kms_modes = NULL;
|
||||
kconn->num_modes = 0;
|
||||
}
|
||||
|
||||
/* detect again */
|
||||
kconn->connector = drmModeGetConnector(kdpy->fd, kconn->connector_id);
|
||||
if (!kconn->connector)
|
||||
return NULL;
|
||||
|
||||
count = kconn->connector->count_modes;
|
||||
kconn->kms_modes = CALLOC(count, sizeof(*kconn->kms_modes));
|
||||
if (!kconn->kms_modes) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
kconn->connector = NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct kms_mode *kmode = &kconn->kms_modes[i];
|
||||
drmModeModeInfoPtr mode = &kconn->connector->modes[i];
|
||||
|
||||
kmode->mode = *mode;
|
||||
|
||||
kmode->base.desc = kmode->mode.name;
|
||||
kmode->base.width = kmode->mode.hdisplay;
|
||||
kmode->base.height = kmode->mode.vdisplay;
|
||||
kmode->base.refresh_rate = kmode->mode.vrefresh;
|
||||
/* not all kernels have vrefresh = refresh_rate * 1000 */
|
||||
if (kmode->base.refresh_rate > 1000)
|
||||
kmode->base.refresh_rate = (kmode->base.refresh_rate + 500) / 1000;
|
||||
}
|
||||
|
||||
nmodes_return = MALLOC(count * sizeof(*nmodes_return));
|
||||
if (nmodes_return) {
|
||||
for (i = 0; i < count; i++)
|
||||
nmodes_return[i] = &kconn->kms_modes[i].base;
|
||||
if (num_modes)
|
||||
*num_modes = count;
|
||||
}
|
||||
|
||||
return nmodes_return;
|
||||
}
|
||||
|
||||
static const struct native_connector **
|
||||
kms_display_get_connectors(struct native_display *ndpy, int *num_connectors,
|
||||
int *num_crtc)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
const struct native_connector **connectors;
|
||||
int i;
|
||||
|
||||
if (!kdpy->connectors) {
|
||||
kdpy->connectors =
|
||||
CALLOC(kdpy->resources->count_connectors, sizeof(*kdpy->connectors));
|
||||
if (!kdpy->connectors)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < kdpy->resources->count_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
|
||||
kconn->connector_id = kdpy->resources->connectors[i];
|
||||
/* kconn->connector is allocated when the modes are asked */
|
||||
}
|
||||
|
||||
kdpy->num_connectors = kdpy->resources->count_connectors;
|
||||
}
|
||||
|
||||
connectors = MALLOC(kdpy->num_connectors * sizeof(*connectors));
|
||||
if (connectors) {
|
||||
for (i = 0; i < kdpy->num_connectors; i++)
|
||||
connectors[i] = &kdpy->connectors[i].base;
|
||||
if (num_connectors)
|
||||
*num_connectors = kdpy->num_connectors;
|
||||
}
|
||||
|
||||
if (num_crtc)
|
||||
*num_crtc = kdpy->resources->count_crtcs;
|
||||
|
||||
return connectors;
|
||||
}
|
||||
|
||||
static struct native_surface *
|
||||
kms_display_create_scanout_surface(struct native_display *ndpy,
|
||||
const struct native_config *nconf,
|
||||
uint width, uint height)
|
||||
{
|
||||
struct kms_surface *ksurf;
|
||||
|
||||
ksurf = kms_display_create_surface(ndpy, nconf, width, height);
|
||||
return &ksurf->base;
|
||||
}
|
||||
|
||||
static boolean
|
||||
kms_display_is_format_supported(struct native_display *ndpy,
|
||||
enum pipe_format fmt, boolean is_color)
|
||||
{
|
||||
return ndpy->screen->is_format_supported(ndpy->screen,
|
||||
fmt, PIPE_TEXTURE_2D, 0,
|
||||
(is_color) ? PIPE_BIND_RENDER_TARGET :
|
||||
PIPE_BIND_DEPTH_STENCIL, 0);
|
||||
}
|
||||
|
||||
static const struct native_config **
|
||||
kms_display_get_configs(struct native_display *ndpy, int *num_configs)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
const struct native_config **configs;
|
||||
|
||||
/* first time */
|
||||
if (!kdpy->config) {
|
||||
struct native_config *nconf;
|
||||
enum pipe_format format;
|
||||
|
||||
kdpy->config = CALLOC(1, sizeof(*kdpy->config));
|
||||
if (!kdpy->config)
|
||||
return NULL;
|
||||
|
||||
nconf = &kdpy->config->base;
|
||||
|
||||
nconf->buffer_mask =
|
||||
(1 << NATIVE_ATTACHMENT_FRONT_LEFT) |
|
||||
(1 << NATIVE_ATTACHMENT_BACK_LEFT);
|
||||
|
||||
format = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
if (!kms_display_is_format_supported(&kdpy->base, format, TRUE)) {
|
||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
||||
if (!kms_display_is_format_supported(&kdpy->base, format, TRUE))
|
||||
format = PIPE_FORMAT_NONE;
|
||||
}
|
||||
if (format == PIPE_FORMAT_NONE) {
|
||||
FREE(kdpy->config);
|
||||
kdpy->config = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nconf->color_format = format;
|
||||
|
||||
/* support KMS */
|
||||
if (kdpy->resources)
|
||||
nconf->scanout_bit = TRUE;
|
||||
}
|
||||
|
||||
configs = MALLOC(sizeof(*configs));
|
||||
if (configs) {
|
||||
configs[0] = &kdpy->config->base;
|
||||
if (num_configs)
|
||||
*num_configs = 1;
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
static int
|
||||
kms_display_get_param(struct native_display *ndpy,
|
||||
enum native_param_type param)
|
||||
{
|
||||
int val;
|
||||
|
||||
switch (param) {
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
kms_display_destroy(struct native_display *ndpy)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
int i;
|
||||
|
||||
if (kdpy->config)
|
||||
FREE(kdpy->config);
|
||||
|
||||
if (kdpy->connectors) {
|
||||
for (i = 0; i < kdpy->num_connectors; i++) {
|
||||
struct kms_connector *kconn = &kdpy->connectors[i];
|
||||
if (kconn->connector) {
|
||||
drmModeFreeConnector(kconn->connector);
|
||||
FREE(kconn->kms_modes);
|
||||
}
|
||||
}
|
||||
FREE(kdpy->connectors);
|
||||
}
|
||||
|
||||
if (kdpy->shown_surfaces)
|
||||
FREE(kdpy->shown_surfaces);
|
||||
|
||||
if (kdpy->saved_crtcs) {
|
||||
for (i = 0; i < kdpy->resources->count_crtcs; i++) {
|
||||
struct kms_crtc *kcrtc = &kdpy->saved_crtcs[i];
|
||||
|
||||
if (kcrtc->crtc) {
|
||||
/* restore crtc */
|
||||
drmModeSetCrtc(kdpy->fd, kcrtc->crtc->crtc_id,
|
||||
kcrtc->crtc->buffer_id, kcrtc->crtc->x, kcrtc->crtc->y,
|
||||
kcrtc->connectors, kcrtc->num_connectors,
|
||||
&kcrtc->crtc->mode);
|
||||
|
||||
drmModeFreeCrtc(kcrtc->crtc);
|
||||
}
|
||||
}
|
||||
FREE(kdpy->saved_crtcs);
|
||||
}
|
||||
|
||||
if (kdpy->resources)
|
||||
drmModeFreeResources(kdpy->resources);
|
||||
|
||||
if (kdpy->base.screen)
|
||||
kdpy->base.screen->destroy(kdpy->base.screen);
|
||||
|
||||
if (kdpy->fd >= 0)
|
||||
close(kdpy->fd);
|
||||
|
||||
FREE(kdpy);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_drm_screen_name(int fd, drmVersionPtr version)
|
||||
{
|
||||
const char *name = version->name;
|
||||
|
||||
if (name && !strcmp(name, "radeon")) {
|
||||
int chip_id;
|
||||
struct drm_radeon_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.request = RADEON_INFO_DEVICE_ID;
|
||||
info.value = pointer_to_intptr(&chip_id);
|
||||
if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
|
||||
return NULL;
|
||||
|
||||
name = is_r3xx(chip_id) ? "r300" : "r600";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize KMS and pipe screen.
|
||||
*/
|
||||
static boolean
|
||||
kms_display_init_screen(struct native_display *ndpy)
|
||||
{
|
||||
struct kms_display *kdpy = kms_display(ndpy);
|
||||
drmVersionPtr version;
|
||||
const char *name;
|
||||
|
||||
version = drmGetVersion(kdpy->fd);
|
||||
if (!version) {
|
||||
_eglLog(_EGL_WARNING, "invalid fd %d", kdpy->fd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name = get_drm_screen_name(kdpy->fd, version);
|
||||
if (name) {
|
||||
kdpy->base.screen =
|
||||
kdpy->event_handler->new_drm_screen(&kdpy->base, name, kdpy->fd);
|
||||
}
|
||||
drmFreeVersion(version);
|
||||
|
||||
if (!kdpy->base.screen) {
|
||||
_eglLog(_EGL_WARNING, "failed to create DRM screen");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static struct native_display_modeset kms_display_modeset = {
|
||||
.get_connectors = kms_display_get_connectors,
|
||||
.get_modes = kms_display_get_modes,
|
||||
.create_scanout_surface = kms_display_create_scanout_surface,
|
||||
.program = kms_display_program
|
||||
};
|
||||
|
||||
static struct native_display *
|
||||
kms_create_display(int fd, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
struct kms_display *kdpy;
|
||||
|
||||
kdpy = CALLOC_STRUCT(kms_display);
|
||||
if (!kdpy)
|
||||
return NULL;
|
||||
|
||||
kdpy->fd = fd;
|
||||
kdpy->event_handler = event_handler;
|
||||
kdpy->base.user_data = user_data;
|
||||
|
||||
if (!kms_display_init_screen(&kdpy->base)) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->base.destroy = kms_display_destroy;
|
||||
kdpy->base.get_param = kms_display_get_param;
|
||||
kdpy->base.get_configs = kms_display_get_configs;
|
||||
|
||||
/* resources are fixed, unlike crtc, connector, or encoder */
|
||||
kdpy->resources = drmModeGetResources(kdpy->fd);
|
||||
if (kdpy->resources) {
|
||||
kdpy->saved_crtcs =
|
||||
CALLOC(kdpy->resources->count_crtcs, sizeof(*kdpy->saved_crtcs));
|
||||
if (!kdpy->saved_crtcs) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->shown_surfaces =
|
||||
CALLOC(kdpy->resources->count_crtcs, sizeof(*kdpy->shown_surfaces));
|
||||
if (!kdpy->shown_surfaces) {
|
||||
kms_display_destroy(&kdpy->base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
kdpy->base.modeset = &kms_display_modeset;
|
||||
}
|
||||
else {
|
||||
_eglLog(_EGL_DEBUG, "Failed to get KMS resources. Disable modeset.");
|
||||
}
|
||||
|
||||
return &kdpy->base;
|
||||
}
|
||||
|
||||
static struct native_display *
|
||||
native_create_display(void *dpy, struct native_event_handler *event_handler,
|
||||
void *user_data)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (dpy) {
|
||||
fd = dup((int) pointer_to_intptr(dpy));
|
||||
}
|
||||
else {
|
||||
fd = open("/dev/dri/card0", O_RDWR);
|
||||
}
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
return kms_create_display(fd, event_handler, user_data);
|
||||
}
|
||||
|
||||
static const struct native_platform kms_platform = {
|
||||
"KMS", /* name */
|
||||
native_create_display
|
||||
};
|
||||
|
||||
const struct native_platform *
|
||||
native_get_kms_platform(void)
|
||||
{
|
||||
return &kms_platform;
|
||||
}
|
@@ -27,6 +27,7 @@
|
||||
#define _NATIVE_X11_H_
|
||||
|
||||
#include "common/native.h"
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
struct native_display *
|
||||
x11_create_ximage_display(Display *dpy,
|
||||
|
@@ -1086,20 +1086,30 @@ XMesaDestroyBuffer(XMesaBuffer b)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Notify the binding context to validate the buffer.
|
||||
*/
|
||||
void
|
||||
xmesa_notify_invalid_buffer(XMesaBuffer b)
|
||||
{
|
||||
XMesaContext xmctx = XMesaGetCurrentContext();
|
||||
|
||||
if (xmctx && xmctx->xm_buffer == b)
|
||||
xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Query the current drawable size and notify the binding context.
|
||||
*/
|
||||
void
|
||||
xmesa_check_buffer_size(XMesaBuffer b)
|
||||
{
|
||||
XMesaContext xmctx = XMesaGetCurrentContext();
|
||||
|
||||
if (b->type == PBUFFER)
|
||||
return;
|
||||
|
||||
xmesa_get_window_size(b->xm_visual->display, b, &b->width, &b->height);
|
||||
if (xmctx && xmctx->xm_buffer == b)
|
||||
xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
|
||||
xmesa_notify_invalid_buffer(b);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -360,6 +360,9 @@ extern void
|
||||
xmesa_get_window_size(Display *dpy, XMesaBuffer b,
|
||||
GLuint *width, GLuint *height);
|
||||
|
||||
extern void
|
||||
xmesa_notify_invalid_buffer(XMesaBuffer b);
|
||||
|
||||
extern void
|
||||
xmesa_check_buffer_size(XMesaBuffer b);
|
||||
|
||||
|
@@ -339,6 +339,10 @@ xmesa_swap_st_framebuffer(struct st_framebuffer_iface *stfbi)
|
||||
tmp = *front;
|
||||
*front = *back;
|
||||
*back = tmp;
|
||||
|
||||
/* the current context should validate the buffer after swapping */
|
||||
if (!xmesa_strict_invalidate)
|
||||
xmesa_notify_invalid_buffer(xstfb->buffer);
|
||||
}
|
||||
|
||||
if (xmesa_strict_invalidate)
|
||||
|
@@ -73,7 +73,8 @@ void vegaFinish(void)
|
||||
pipe = ctx->pipe;
|
||||
|
||||
pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
|
||||
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
if (fence) {
|
||||
pipe->screen->fence_finish(pipe->screen, fence, 0);
|
||||
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
|
||||
}
|
||||
}
|
||||
|
@@ -352,7 +352,7 @@ vg_api_create_context(struct st_api *stapi, struct st_manager *smapi,
|
||||
return NULL;
|
||||
|
||||
/* only 1.0 is supported */
|
||||
if (attribs->major != 1 || attribs->minor > 0)
|
||||
if (attribs->major > 1 || (attribs->major == 1 && attribs->minor > 0))
|
||||
return NULL;
|
||||
|
||||
pipe = smapi->screen->context_create(smapi->screen, NULL);
|
||||
|
@@ -10,7 +10,7 @@ LIBRARY_INCLUDES = \
|
||||
$(shell pkg-config libkms --atleast-version=1.0 \
|
||||
&& echo "-DHAVE_LIBKMS") \
|
||||
$(shell pkg-config libkms --silence-errors --cflags-only-I) \
|
||||
$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \
|
||||
$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto dri2proto) \
|
||||
-I$(TOP)/src/gallium/include \
|
||||
-I$(TOP)/src/gallium/auxiliary \
|
||||
-I$(TOP)/include \
|
||||
|
@@ -234,6 +234,10 @@ crtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image)
|
||||
64, 64, (void*)image, 64 * 4, 0, 0);
|
||||
ms->ctx->transfer_unmap(ms->ctx, transfer);
|
||||
ms->ctx->transfer_destroy(ms->ctx, transfer);
|
||||
|
||||
if (crtc->cursor_shown)
|
||||
drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
|
||||
crtcp->cursor_handle, 64, 64);
|
||||
}
|
||||
|
||||
#if HAVE_LIBKMS
|
||||
@@ -271,6 +275,10 @@ crtc_load_cursor_argb_kms(xf86CrtcPtr crtc, CARD32 * image)
|
||||
memcpy(ptr, image, 64*64*4);
|
||||
kms_bo_unmap(crtcp->cursor_bo);
|
||||
|
||||
if (crtc->cursor_shown)
|
||||
drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
|
||||
crtcp->cursor_handle, 64, 64);
|
||||
|
||||
return;
|
||||
|
||||
err_bo_destroy:
|
||||
@@ -353,7 +361,7 @@ crtc_destroy(xf86CrtcPtr crtc)
|
||||
|
||||
drmModeFreeCrtc(crtcp->drm_crtc);
|
||||
|
||||
xfree(crtcp);
|
||||
free(crtcp);
|
||||
crtc->driver_private = NULL;
|
||||
}
|
||||
|
||||
@@ -401,7 +409,7 @@ xorg_crtc_init(ScrnInfoPtr pScrn)
|
||||
if (crtc == NULL)
|
||||
goto out;
|
||||
|
||||
crtcp = xcalloc(1, sizeof(struct crtc_private));
|
||||
crtcp = calloc(1, sizeof(struct crtc_private));
|
||||
if (!crtcp) {
|
||||
xf86CrtcDestroy(crtc);
|
||||
goto out;
|
||||
|
@@ -201,11 +201,11 @@ dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, unsigned int form
|
||||
DRI2Buffer2Ptr buffer;
|
||||
BufferPrivatePtr private;
|
||||
|
||||
buffer = xcalloc(1, sizeof *buffer);
|
||||
buffer = calloc(1, sizeof *buffer);
|
||||
if (!buffer)
|
||||
return NULL;
|
||||
|
||||
private = xcalloc(1, sizeof *private);
|
||||
private = calloc(1, sizeof *private);
|
||||
if (!private) {
|
||||
goto fail;
|
||||
}
|
||||
@@ -217,9 +217,9 @@ dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, unsigned int form
|
||||
if (dri2_do_create_buffer(pDraw, (DRI2BufferPtr)buffer, format))
|
||||
return buffer;
|
||||
|
||||
xfree(private);
|
||||
free(private);
|
||||
fail:
|
||||
xfree(buffer);
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -229,8 +229,8 @@ dri2_destroy_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer)
|
||||
/* So far it is safe to downcast a DRI2Buffer2Ptr to DRI2BufferPtr */
|
||||
dri2_do_destroy_buffer(pDraw, (DRI2BufferPtr)buffer);
|
||||
|
||||
xfree(buffer->driverPrivate);
|
||||
xfree(buffer);
|
||||
free(buffer->driverPrivate);
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
#endif /* DRI2INFOREC_VERSION >= 2 */
|
||||
@@ -244,11 +244,11 @@ dri2_create_buffers(DrawablePtr pDraw, unsigned int *attachments, int count)
|
||||
DRI2BufferPtr buffers;
|
||||
int i;
|
||||
|
||||
buffers = xcalloc(count, sizeof *buffers);
|
||||
buffers = calloc(count, sizeof *buffers);
|
||||
if (!buffers)
|
||||
goto fail_buffers;
|
||||
|
||||
privates = xcalloc(count, sizeof *privates);
|
||||
privates = calloc(count, sizeof *privates);
|
||||
if (!privates)
|
||||
goto fail_privates;
|
||||
|
||||
@@ -263,9 +263,9 @@ dri2_create_buffers(DrawablePtr pDraw, unsigned int *attachments, int count)
|
||||
return buffers;
|
||||
|
||||
fail:
|
||||
xfree(privates);
|
||||
free(privates);
|
||||
fail_privates:
|
||||
xfree(buffers);
|
||||
free(buffers);
|
||||
fail_buffers:
|
||||
return NULL;
|
||||
}
|
||||
@@ -280,8 +280,8 @@ dri2_destroy_buffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
|
||||
}
|
||||
|
||||
if (buffers) {
|
||||
xfree(buffers[0].driverPrivate);
|
||||
xfree(buffers);
|
||||
free(buffers[0].driverPrivate);
|
||||
free(buffers);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -45,6 +45,7 @@
|
||||
#include "miscstruct.h"
|
||||
#include "dixstruct.h"
|
||||
#include "xf86xv.h"
|
||||
#include "xorgVersion.h"
|
||||
#ifndef XSERVER_LIBPCIACCESS
|
||||
#error "libpciaccess needed"
|
||||
#endif
|
||||
@@ -122,7 +123,7 @@ xorg_tracker_set_functions(ScrnInfoPtr scrn)
|
||||
Bool
|
||||
xorg_tracker_have_modesetting(ScrnInfoPtr pScrn, struct pci_device *device)
|
||||
{
|
||||
char *BusID = xalloc(64);
|
||||
char *BusID = malloc(64);
|
||||
sprintf(BusID, "pci:%04x:%02x:%02x.%d",
|
||||
device->domain, device->bus,
|
||||
device->dev, device->func);
|
||||
@@ -130,14 +131,14 @@ xorg_tracker_have_modesetting(ScrnInfoPtr pScrn, struct pci_device *device)
|
||||
if (drmCheckModesettingSupported(BusID)) {
|
||||
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
|
||||
"Drm modesetting not supported %s\n", BusID);
|
||||
xfree(BusID);
|
||||
free(BusID);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
|
||||
"Drm modesetting supported on %s\n", BusID);
|
||||
|
||||
xfree(BusID);
|
||||
free(BusID);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -174,7 +175,7 @@ drv_free_rec(ScrnInfoPtr pScrn)
|
||||
if (!pScrn->driverPrivate)
|
||||
return;
|
||||
|
||||
xfree(pScrn->driverPrivate);
|
||||
free(pScrn->driverPrivate);
|
||||
|
||||
pScrn->driverPrivate = NULL;
|
||||
}
|
||||
@@ -274,7 +275,7 @@ drv_init_drm(ScrnInfoPtr pScrn)
|
||||
if (ms->fd < 0) {
|
||||
char *BusID;
|
||||
|
||||
BusID = xalloc(64);
|
||||
BusID = malloc(64);
|
||||
sprintf(BusID, "PCI:%d:%d:%d",
|
||||
((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
|
||||
ms->PciInfo->dev, ms->PciInfo->func
|
||||
@@ -283,7 +284,7 @@ drv_init_drm(ScrnInfoPtr pScrn)
|
||||
|
||||
ms->fd = drmOpen(driver_descriptor.driver_name, BusID);
|
||||
ms->isMaster = TRUE;
|
||||
xfree(BusID);
|
||||
free(BusID);
|
||||
|
||||
if (ms->fd >= 0)
|
||||
return TRUE;
|
||||
@@ -369,6 +370,7 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
|
||||
ms = modesettingPTR(pScrn);
|
||||
ms->pEnt = pEnt;
|
||||
ms->cust = cust;
|
||||
ms->fb_id = -1;
|
||||
|
||||
pScrn->displayWidth = 640; /* default it */
|
||||
|
||||
@@ -402,19 +404,6 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
|
||||
if (!drv_init_drm(pScrn))
|
||||
return FALSE;
|
||||
|
||||
use3D = cust ? !cust->no_3d : TRUE;
|
||||
ms->from_3D = xf86GetOptValBool(ms->Options, OPTION_3D_ACCEL,
|
||||
&use3D) ?
|
||||
X_CONFIG : X_PROBED;
|
||||
|
||||
ms->no3D = !use3D;
|
||||
|
||||
if (!drv_init_resource_management(pScrn)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not init "
|
||||
"Gallium3D or libKMS.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pScrn->monitor = pScrn->confScreen->monitor;
|
||||
pScrn->progClock = TRUE;
|
||||
pScrn->rgbBits = 8;
|
||||
@@ -444,11 +433,24 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
|
||||
|
||||
/* Process the options */
|
||||
xf86CollectOptions(pScrn, NULL);
|
||||
if (!(ms->Options = xalloc(sizeof(drv_options))))
|
||||
if (!(ms->Options = malloc(sizeof(drv_options))))
|
||||
return FALSE;
|
||||
memcpy(ms->Options, drv_options, sizeof(drv_options));
|
||||
xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, ms->Options);
|
||||
|
||||
use3D = cust ? !cust->no_3d : TRUE;
|
||||
ms->from_3D = xf86GetOptValBool(ms->Options, OPTION_3D_ACCEL,
|
||||
&use3D) ?
|
||||
X_CONFIG : X_PROBED;
|
||||
|
||||
ms->no3D = !use3D;
|
||||
|
||||
if (!drv_init_resource_management(pScrn)) {
|
||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not init "
|
||||
"Gallium3D or libKMS.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Allocate an xf86CrtcConfig */
|
||||
xf86CrtcConfigInit(pScrn, &crtc_config_funcs);
|
||||
xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
@@ -791,7 +793,9 @@ drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
|
||||
if (!ms->SWCursor)
|
||||
xf86_cursors_init(pScreen, 64, 64,
|
||||
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
|
||||
HARDWARE_CURSOR_ARGB);
|
||||
HARDWARE_CURSOR_ARGB |
|
||||
((cust && cust->unhidden_hw_cursor_update) ?
|
||||
HARDWARE_CURSOR_UPDATE_UNHIDDEN : 0));
|
||||
|
||||
/* Must force it before EnterVT, so we are in control of VT and
|
||||
* later memory should be bound when allocating, e.g rotate_mem */
|
||||
@@ -862,8 +866,10 @@ drv_leave_vt(int scrnIndex, int flags)
|
||||
}
|
||||
}
|
||||
|
||||
drmModeRmFB(ms->fd, ms->fb_id);
|
||||
ms->fb_id = -1;
|
||||
if (ms->fb_id != -1) {
|
||||
drmModeRmFB(ms->fd, ms->fb_id);
|
||||
ms->fb_id = -1;
|
||||
}
|
||||
|
||||
/* idle hardware */
|
||||
if (!ms->kms)
|
||||
@@ -944,7 +950,6 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen)
|
||||
}
|
||||
#endif
|
||||
|
||||
drmModeRmFB(ms->fd, ms->fb_id);
|
||||
ms->destroy_front_buffer(pScrn);
|
||||
|
||||
if (ms->exa)
|
||||
@@ -1178,6 +1183,8 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
|
||||
stride,
|
||||
ptr);
|
||||
|
||||
#if (XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 9, 99, 1, 0))
|
||||
|
||||
/* This a hack to work around EnableDisableFBAccess setting the pointer
|
||||
* the real fix would be to replace pScrn->EnableDisableFBAccess hook
|
||||
* and set the rootPixmap->devPrivate.ptr to something valid before that.
|
||||
@@ -1187,6 +1194,8 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
|
||||
*/
|
||||
pScrn->pixmapPrivate.ptr = ptr;
|
||||
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
|
||||
err_destroy:
|
||||
|
@@ -720,7 +720,7 @@ ExaCreatePixmap(ScreenPtr pScreen, int size, int align)
|
||||
{
|
||||
struct exa_pixmap_priv *priv;
|
||||
|
||||
priv = xcalloc(1, sizeof(struct exa_pixmap_priv));
|
||||
priv = calloc(1, sizeof(struct exa_pixmap_priv));
|
||||
if (!priv)
|
||||
return NULL;
|
||||
|
||||
@@ -737,7 +737,7 @@ ExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
|
||||
|
||||
pipe_resource_reference(&priv->tex, NULL);
|
||||
|
||||
xfree(priv);
|
||||
free(priv);
|
||||
}
|
||||
|
||||
static Bool
|
||||
@@ -975,7 +975,7 @@ xorg_exa_close(ScrnInfoPtr pScrn)
|
||||
ms->ctx = NULL;
|
||||
|
||||
exaDriverFini(pScrn->pScreen);
|
||||
xfree(exa);
|
||||
free(exa);
|
||||
ms->exa = NULL;
|
||||
}
|
||||
|
||||
@@ -987,7 +987,7 @@ xorg_exa_init(ScrnInfoPtr pScrn, Bool accel)
|
||||
ExaDriverPtr pExa;
|
||||
CustomizerPtr cust = ms->cust;
|
||||
|
||||
exa = xcalloc(1, sizeof(struct exa_context));
|
||||
exa = calloc(1, sizeof(struct exa_context));
|
||||
if (!exa)
|
||||
return NULL;
|
||||
|
||||
|
@@ -128,7 +128,7 @@ output_get_modes(xf86OutputPtr output)
|
||||
for (i = 0; i < drm_connector->count_modes; i++) {
|
||||
drm_mode = &drm_connector->modes[i];
|
||||
if (drm_mode) {
|
||||
mode = xcalloc(1, sizeof(DisplayModeRec));
|
||||
mode = calloc(1, sizeof(DisplayModeRec));
|
||||
if (!mode)
|
||||
continue;
|
||||
mode->Clock = drm_mode->clock;
|
||||
@@ -195,7 +195,7 @@ output_destroy(xf86OutputPtr output)
|
||||
{
|
||||
struct output_private *priv = output->driver_private;
|
||||
drmModeFreeConnector(priv->drm_connector);
|
||||
xfree(priv);
|
||||
free(priv);
|
||||
output->driver_private = NULL;
|
||||
}
|
||||
|
||||
@@ -262,14 +262,14 @@ xorg_output_init(ScrnInfoPtr pScrn)
|
||||
drm_connector->connector_type_id);
|
||||
|
||||
|
||||
priv = xcalloc(sizeof(*priv), 1);
|
||||
priv = calloc(sizeof(*priv), 1);
|
||||
if (!priv) {
|
||||
continue;
|
||||
}
|
||||
|
||||
output = xf86OutputCreate(pScrn, &output_funcs, name);
|
||||
if (!output) {
|
||||
xfree(priv);
|
||||
free(priv);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@@ -76,6 +76,7 @@ typedef struct _CustomizerRec
|
||||
Bool dirty_throttling;
|
||||
Bool swap_throttling;
|
||||
Bool no_3d;
|
||||
Bool unhidden_hw_cursor_update;
|
||||
Bool (*winsys_pre_init) (struct _CustomizerRec *cust, int fd);
|
||||
Bool (*winsys_screen_init)(struct _CustomizerRec *cust);
|
||||
Bool (*winsys_screen_close)(struct _CustomizerRec *cust);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user