Compare commits
569 Commits
jump_and_c
...
the_perfec
Author | SHA1 | Date | |
---|---|---|---|
|
e3cdbca63f | ||
|
6bc9ea1df9 | ||
|
9a1b5af333 | ||
|
8818eae253 | ||
|
2b2bd08589 | ||
|
dc7fc17396 | ||
|
96582f4f28 | ||
|
dd4c1dd038 | ||
|
b745bf08cd | ||
|
2f74adc41f | ||
|
e53fc72f67 | ||
|
bd565e4bb7 | ||
|
9a3da7ea7b | ||
|
6e56f905d0 | ||
|
2860e5f536 | ||
|
22652f952f | ||
|
ae818ed1da | ||
|
198d6d05b0 | ||
|
5a0cb726d1 | ||
|
d2ab4eb2c2 | ||
|
2ec2e94e2e | ||
|
40c1c723fb | ||
|
bf7f998f39 | ||
|
bb2c65200c | ||
|
5119056324 | ||
|
4c80f8df46 | ||
|
e03b5cdf3f | ||
|
167b141e6e | ||
|
d06da50888 | ||
|
c1082804a8 | ||
|
ffd97d20aa | ||
|
a33f0d3024 | ||
|
380991cb65 | ||
|
3e8001a465 | ||
|
af1a729972 | ||
|
cf4f3c5061 | ||
|
4cf20d9236 | ||
|
72a313902b | ||
|
f9bad3dfea | ||
|
a495ed372f | ||
|
d9789b7861 | ||
|
51ac95ba89 | ||
|
6493bd07a7 | ||
|
7bfe8df08a | ||
|
5873faf39b | ||
|
fdeda9c458 | ||
|
9b134f641c | ||
|
efeea95dcc | ||
|
45472672a2 | ||
|
aca2e0da3c | ||
|
d5084d42d4 | ||
|
578f63f2bf | ||
|
1c606a9aa1 | ||
|
09f433b97c | ||
|
8110df4f61 | ||
|
9cf35d2876 | ||
|
11bd5c1ac4 | ||
|
686e9b9f57 | ||
|
aecc05627a | ||
|
d0ddf190aa | ||
|
5cb977fedf | ||
|
296428dcf4 | ||
|
ee83a1302f | ||
|
7012d01d88 | ||
|
a6ed129dfc | ||
|
733bc876ee | ||
|
64034c4fb5 | ||
|
846eb333ae | ||
|
c9a69a6968 | ||
|
269e3895d9 | ||
|
5c72837af9 | ||
|
5f430c9976 | ||
|
714be699be | ||
|
10432bcc0a | ||
|
69a2f7cdd5 | ||
|
db21f1c84f | ||
|
4e68f4c1fa | ||
|
1e5772f0ba | ||
|
ac6728d2d9 | ||
|
49d8cbe8d1 | ||
|
9d148e6b2b | ||
|
363d0bcf01 | ||
|
e490242b9a | ||
|
a582015905 | ||
|
3509fd8c1b | ||
|
93cd9237d7 | ||
|
1243b829bb | ||
|
2fcaf7a529 | ||
|
a42fe19d8d | ||
|
e57d5c4742 | ||
|
5a5b4436cb | ||
|
3ffe8731e6 | ||
|
c5f5055097 | ||
|
dbeea25bb8 | ||
|
f29f2fc294 | ||
|
ab81d1fd99 | ||
|
d9fdb6c2bb | ||
|
9eef0da109 | ||
|
8b88f62fbd | ||
|
948fa3b295 | ||
|
586f2c59fe | ||
|
e3b0c19ec9 | ||
|
9ca8815d3b | ||
|
ecb6bfc0ce | ||
|
fee163a61a | ||
|
0e26580c90 | ||
|
c8542705f7 | ||
|
435eff8b85 | ||
|
276330b241 | ||
|
ff6723e326 | ||
|
1180fc13db | ||
|
5c6aec2f39 | ||
|
86300c6945 | ||
|
fc3bc1ae14 | ||
|
d3bd97bb14 | ||
|
52064f6c37 | ||
|
2eb147e7f5 | ||
|
6f3d16c64a | ||
|
42fa81275c | ||
|
e3f684b753 | ||
|
883d20791a | ||
|
b1d0ac64ab | ||
|
c64573997c | ||
|
e133984f51 | ||
|
bd8162aaac | ||
|
4a55d4ffa7 | ||
|
6258b76c49 | ||
|
203dcb733d | ||
|
bd1d9d96b2 | ||
|
9f8b3fac97 | ||
|
0355d3ff94 | ||
|
cb34c11663 | ||
|
1077779c7d | ||
|
1c39d183c4 | ||
|
fd4f7064e2 | ||
|
db46e2a7dd | ||
|
e7769cb348 | ||
|
d83c4e6dd1 | ||
|
73e8ffe9f3 | ||
|
286c4cc201 | ||
|
b3e878ad90 | ||
|
eae0439ae6 | ||
|
79c0bb5264 | ||
|
41a93f544e | ||
|
e4b2356c07 | ||
|
ebef61f5c0 | ||
|
fe6ee3f5e6 | ||
|
f5581bb994 | ||
|
47b29f511a | ||
|
c3f764f7bb | ||
|
3151b27b0a | ||
|
209b090241 | ||
|
d8f9599403 | ||
|
c6e1569b7f | ||
|
82761cb08b | ||
|
c22990c29a | ||
|
3aeae20685 | ||
|
884b5ade86 | ||
|
138b7ef4d9 | ||
|
3a934557bf | ||
|
5f0bf77255 | ||
|
8af7ff1ded | ||
|
1c54579e86 | ||
|
7d33053e47 | ||
|
47d18cbb64 | ||
|
f1d053b19a | ||
|
28d0a9c9dd | ||
|
5f534aa1e2 | ||
|
e9e20fc47d | ||
|
a5cb1aa211 | ||
|
431417fec7 | ||
|
5c81a4b9cd | ||
|
a6ebcdfe7d | ||
|
2c19069182 | ||
|
15e75e00c7 | ||
|
d59054e60b | ||
|
5cef1a1fed | ||
|
545515cbea | ||
|
97e1e60b1c | ||
|
69441868f6 | ||
|
55d8dd4078 | ||
|
d09df24082 | ||
|
c03b6f40ba | ||
|
c039af165d | ||
|
c3259fa436 | ||
|
b83aadb0e4 | ||
|
576caad33e | ||
|
cbc8d7596a | ||
|
6ffd0a4cf1 | ||
|
5c906924ed | ||
|
9b4536a654 | ||
|
df943a4041 | ||
|
0d4af83f25 | ||
|
bf87f86493 | ||
|
963586b871 | ||
|
fc06f9fb25 | ||
|
20d44dc9bc | ||
|
11b0a76370 | ||
|
adbff7e977 | ||
|
a661654a33 | ||
|
6f973f3367 | ||
|
6a13c7da4c | ||
|
addcc6afbd | ||
|
19fb77ee7b | ||
|
b10d080b1e | ||
|
3ed1f07686 | ||
|
2cbbd3dc50 | ||
|
a7fcac5e92 | ||
|
07d91bbb59 | ||
|
b3474de7b5 | ||
|
7c26b61f93 | ||
|
88b69d7998 | ||
|
f069e5e412 | ||
|
0ff98b03c6 | ||
|
70375aff48 | ||
|
52bf005425 | ||
|
8d51bbf2a3 | ||
|
fc8f202181 | ||
|
c4e1fd5a7f | ||
|
f8ed0aa268 | ||
|
d03ab104db | ||
|
93d2d54e7a | ||
|
8ea22650bd | ||
|
2510ba618d | ||
|
b7142567bc | ||
|
61f08d8094 | ||
|
f905145b60 | ||
|
02986cb2cc | ||
|
2e823f29e4 | ||
|
b52673117b | ||
|
49b1d95c1c | ||
|
e9a3d8a772 | ||
|
afb3fb4b77 | ||
|
635ee2df37 | ||
|
509710cfd7 | ||
|
efb41b07ff | ||
|
78803b2667 | ||
|
a131d50fb7 | ||
|
e3a846b0e3 | ||
|
65ce50897e | ||
|
8855664489 | ||
|
35725a92be | ||
|
d8aa5ffed5 | ||
|
067e788acd | ||
|
73b4c1b388 | ||
|
a3deff2404 | ||
|
6cae4f3bc9 | ||
|
f434e07a6a | ||
|
369404299c | ||
|
b2b01a60db | ||
|
60e2810ae4 | ||
|
99b329ca13 | ||
|
ed5f790919 | ||
|
8c01903114 | ||
|
6372ea0da0 | ||
|
2a37053fd5 | ||
|
1e8fc5ffea | ||
|
5c968cbc5e | ||
|
98e35025ba | ||
|
fd451b6d01 | ||
|
25fe93f0a1 | ||
|
c604e457d1 | ||
|
9a5ba4794c | ||
|
fa2802d4d0 | ||
|
0e7836b500 | ||
|
d3ea221d3e | ||
|
2f951683be | ||
|
5a38200122 | ||
|
f18d70b804 | ||
|
cfcf86b37d | ||
|
0ad2ef20a7 | ||
|
ad0dbe6b04 | ||
|
41bddcfa7b | ||
|
55ba0dccc9 | ||
|
aaa5a66433 | ||
|
5f92c38f0e | ||
|
db382c5b1d | ||
|
a657c1aee8 | ||
|
d9c389dff6 | ||
|
c51ed8c236 | ||
|
c61782958b | ||
|
c3984fc015 | ||
|
481bdd383a | ||
|
bfc8a8dc63 | ||
|
29c909f81c | ||
|
5234d17514 | ||
|
c39a4bc83c | ||
|
a92100a3c6 | ||
|
fe1230f1c8 | ||
|
26772ac988 | ||
|
425569bbc5 | ||
|
93b52d9484 | ||
|
1706ba4101 | ||
|
9a54843a94 | ||
|
cb80e3905c | ||
|
32e845f05e | ||
|
7d4abc9b3a | ||
|
a62fe7f5e3 | ||
|
00e599e783 | ||
|
1d7f71924d | ||
|
05ab19ef43 | ||
|
a095aa4f4b | ||
|
675f802542 | ||
|
116986bad5 | ||
|
798e753e07 | ||
|
ce1d7ee5ee | ||
|
068039eec1 | ||
|
05bbafa01a | ||
|
8fb17f5b3f | ||
|
3e62d3a8d8 | ||
|
050b77a9ac | ||
|
59b4b7e07e | ||
|
46d50d9e8e | ||
|
de4fe1e3c5 | ||
|
7f8e10f96c | ||
|
e7c7a0f353 | ||
|
6bd390743d | ||
|
2fb2e27e28 | ||
|
5b641a516e | ||
|
706bb1c714 | ||
|
1d5c727bba | ||
|
a890ceee63 | ||
|
8a7dcd97bd | ||
|
a78bbd0816 | ||
|
80a939cafb | ||
|
6af6a69312 | ||
|
979f35fb78 | ||
|
b81efaaa1a | ||
|
00e760c971 | ||
|
3f35fbbf66 | ||
|
9eae0b9f19 | ||
|
c1aa3d1e6f | ||
|
dd9da8cdb5 | ||
|
fbe5296d14 | ||
|
7541794373 | ||
|
3c4c86aff2 | ||
|
34dd4843d7 | ||
|
7457a648d2 | ||
|
bd5bba8470 | ||
|
e2e4a5c992 | ||
|
02eb36fa8d | ||
|
0c7d2fff1e | ||
|
5c9d21df3d | ||
|
8998de569c | ||
|
278c6025f9 | ||
|
4f05e61543 | ||
|
45f26f9979 | ||
|
203bd3e8ec | ||
|
91c219d906 | ||
|
522ea42718 | ||
|
e24a9c10b5 | ||
|
96035d54f3 | ||
|
746df56717 | ||
|
5737fda093 | ||
|
439f7feab1 | ||
|
f0d484fa5a | ||
|
2579c32a5f | ||
|
0bd5373d94 | ||
|
9d05d3dd30 | ||
|
e6aa21156a | ||
|
a30402b56a | ||
|
07561c6b32 | ||
|
a4296239d4 | ||
|
3f9467c946 | ||
|
1bb14ad90c | ||
|
87030f6618 | ||
|
8ff72e9723 | ||
|
b47731f24d | ||
|
bc6bf401f5 | ||
|
984d527626 | ||
|
fdb5a87f91 | ||
|
ce77d37264 | ||
|
6e776f25fd | ||
|
c1f2f9090b | ||
|
7644bfb536 | ||
|
3e1961839e | ||
|
fff3b2f318 | ||
|
b960c14cbb | ||
|
3db7ae3a38 | ||
|
7cd2ae9d97 | ||
|
03dc437363 | ||
|
80875253ce | ||
|
d1e40c9bdd | ||
|
6c0c91714c | ||
|
87a2f3df64 | ||
|
ab7312ef63 | ||
|
67742383e8 | ||
|
4932ba28ad | ||
|
8ca515097f | ||
|
c68233cb35 | ||
|
9bfd9582d4 | ||
|
24dcc6b6bf | ||
|
f3a6e4fa5b | ||
|
4e262cfb07 | ||
|
40af76bbaa | ||
|
1fd3bbc42e | ||
|
ac8020ea9c | ||
|
2c6f911e10 | ||
|
7b7d00ca62 | ||
|
365a0a7c15 | ||
|
2b1ec683d3 | ||
|
ba0fe1832e | ||
|
540b260cbd | ||
|
8f5f6b3d59 | ||
|
6614766f3e | ||
|
57b5e8538e | ||
|
fdb07636f2 | ||
|
cb83f62e30 | ||
|
78123bb38b | ||
|
3c69df8a70 | ||
|
e00b729716 | ||
|
a2990a9d73 | ||
|
dee1c795c2 | ||
|
eb6560bf2b | ||
|
35bc4ac680 | ||
|
ff3ce3dd96 | ||
|
42896b2a18 | ||
|
10b892af96 | ||
|
9605806d81 | ||
|
3f22c0966d | ||
|
8281cca82f | ||
|
4d73f1af35 | ||
|
26d812ae00 | ||
|
f448e632b6 | ||
|
49f7430b12 | ||
|
d73b929ef2 | ||
|
6f37e76272 | ||
|
74477b24a8 | ||
|
78152f85e7 | ||
|
002a64cc48 | ||
|
ca4116bfce | ||
|
0846e52d46 | ||
|
6e2fd96627 | ||
|
a9eb712fc9 | ||
|
934be3266f | ||
|
c8af2b5a52 | ||
|
f321f16e83 | ||
|
41d180c899 | ||
|
8eeef423e9 | ||
|
1ff8f50f2f | ||
|
2c28dd892c | ||
|
5c2f3d5d3a | ||
|
d588311dbb | ||
|
f446027656 | ||
|
233d93d47e | ||
|
70f2be9cc6 | ||
|
9e5a0b8895 | ||
|
09298228c6 | ||
|
e82cb7852b | ||
|
4ea4589302 | ||
|
a5f2dcb57b | ||
|
72b2af6035 | ||
|
84396a72df | ||
|
0340663eb7 | ||
|
8352666a9d | ||
|
8d12a6d537 | ||
|
fbdd7a5e74 | ||
|
aeee36a311 | ||
|
2f99f6558c | ||
|
b6082fd236 | ||
|
0a13cebaa1 | ||
|
baa832d311 | ||
|
1718e34352 | ||
|
d5e008b84b | ||
|
3271390362 | ||
|
37cbb521d3 | ||
|
2752177ade | ||
|
f640ee2f6e | ||
|
25817dc26b | ||
|
ed9119b72a | ||
|
0872b85b1e | ||
|
6125515cec | ||
|
cc70176446 | ||
|
a0c8524924 | ||
|
2d10924a14 | ||
|
4837ea3020 | ||
|
26d3159125 | ||
|
b66251f76d | ||
|
d9468c9405 | ||
|
f901072afb | ||
|
1982a66838 | ||
|
3f9bae90c3 | ||
|
b97e478fe9 | ||
|
a9a4c5489e | ||
|
a85eb9c0a7 | ||
|
dd951e6dde | ||
|
d190734875 | ||
|
4afa1d7abb | ||
|
58010eb35c | ||
|
816c0c932d | ||
|
4f1f5e336b | ||
|
a8d5b176b5 | ||
|
fe7aa08ad9 | ||
|
1f6735a6a5 | ||
|
f0bbbf66b8 | ||
|
d863424032 | ||
|
799bc13da2 | ||
|
4754fc653f | ||
|
85199453cc | ||
|
a91e0218a3 | ||
|
5e4a7581df | ||
|
6a04cff065 | ||
|
3dec3c7a74 | ||
|
8e5f0e62dd | ||
|
46cde1715f | ||
|
d084982240 | ||
|
4885a9eb20 | ||
|
1764b78ee9 | ||
|
315afce941 | ||
|
3f847b73f3 | ||
|
923b6fc4d9 | ||
|
1864c7d79a | ||
|
386e997f45 | ||
|
3d2e10564e | ||
|
cf69e051ce | ||
|
78e6e59477 | ||
|
87440f531c | ||
|
6cfd4f7e55 | ||
|
463642c0be | ||
|
d1b1b37270 | ||
|
0d22b90540 | ||
|
27f75a863e | ||
|
049290c584 | ||
|
71699df7de | ||
|
8d621b3bdd | ||
|
1f2b715988 | ||
|
3deaa01c2b | ||
|
1e42244e82 | ||
|
66b48d6df6 | ||
|
5bdf2bc6c7 | ||
|
d9d972a944 | ||
|
ddc82eefca | ||
|
2886579324 | ||
|
bb7d5f8837 | ||
|
8c3ddf4270 | ||
|
f955218bf1 | ||
|
7aafcc86c7 | ||
|
ce657cf752 | ||
|
cf899d400d | ||
|
557dce9bc2 | ||
|
b64d4a27cb | ||
|
a02b83115a | ||
|
0a755ade51 | ||
|
19064f818a | ||
|
cbff5db516 | ||
|
64b85b4563 | ||
|
9ea600ff3f | ||
|
fe58074dea | ||
|
c326f9ffae | ||
|
54b03eefda | ||
|
d26e464b6a | ||
|
4c56261075 | ||
|
19b260119a | ||
|
3f0926b612 | ||
|
cb085044c9 | ||
|
f350617c24 | ||
|
f46de6f23b | ||
|
94a20cbadf | ||
|
eba5b610b9 | ||
|
2eb9e67a5a | ||
|
8b21166c14 | ||
|
1a141b9161 | ||
|
6286dda286 | ||
|
1a1c49f8a6 | ||
|
3fec8c24ec | ||
|
6b158a7d23 | ||
|
b5c90ca7d9 | ||
|
b5128c6e82 | ||
|
7bccfa1026 |
7
Makefile
7
Makefile
@@ -33,7 +33,7 @@ realclean:
|
||||
|
||||
install:
|
||||
@echo "Installing"
|
||||
$(TOP)/bin/installmesa
|
||||
$(TOP)/bin/installmesa $(DESTDIR)
|
||||
|
||||
# DirectFBGL module installation
|
||||
linux-directfb-install:
|
||||
@@ -87,6 +87,7 @@ linux-dri \
|
||||
linux-dri-x86 \
|
||||
linux-dri-x86-64 \
|
||||
linux-dri-ppc \
|
||||
linux-fbdev \
|
||||
linux-glide \
|
||||
linux-icc \
|
||||
linux-icc-static \
|
||||
@@ -105,8 +106,11 @@ linux-ultrasparc \
|
||||
linux-tcc \
|
||||
linux-x86 \
|
||||
linux-x86-debug \
|
||||
linux-x86-32 \
|
||||
linux-x86-64 \
|
||||
linux-x86-64-debug \
|
||||
linux-x86-64-static \
|
||||
linux-x86-xcb \
|
||||
linux-x86-glide \
|
||||
linux-x86-static \
|
||||
netbsd \
|
||||
@@ -141,7 +145,6 @@ LIB_FILES = \
|
||||
$(DIRECTORY)/configs/[a-z]* \
|
||||
$(DIRECTORY)/docs/*.html \
|
||||
$(DIRECTORY)/docs/COPYING \
|
||||
$(DIRECTORY)/docs/INSTALL.GNU \
|
||||
$(DIRECTORY)/docs/README.* \
|
||||
$(DIRECTORY)/docs/RELNOTES* \
|
||||
$(DIRECTORY)/docs/VERSIONS \
|
||||
|
@@ -12,7 +12,7 @@ TOP=.
|
||||
INCLUDE_DIR="/usr/local/include"
|
||||
LIB_DIR="/usr/local/lib"
|
||||
|
||||
|
||||
if [ x$# == "x0" ] ; then
|
||||
echo
|
||||
echo "***** Mesa installation - You may need root privileges to do this *****"
|
||||
echo
|
||||
@@ -33,7 +33,6 @@ if [ x${INPUT} != "x" ] ; then
|
||||
LIB_DIR=${INPUT}
|
||||
fi
|
||||
|
||||
|
||||
echo
|
||||
echo "About to install Mesa header files (GL/*.h) in: " ${INCLUDE_DIR}/GL
|
||||
echo "and Mesa library files (libGL.*, etc) in: " ${LIB_DIR}
|
||||
@@ -41,6 +40,10 @@ echo "Press <Enter> to continue, or <ctrl>-C to abort."
|
||||
|
||||
read INPUT
|
||||
|
||||
else
|
||||
INCLUDE_DIR=$1/include
|
||||
LIB_DIR=$1/lib
|
||||
fi
|
||||
|
||||
# flags:
|
||||
# -f = force
|
||||
|
@@ -173,6 +173,15 @@ case $ARCH in
|
||||
OPTS="${OPTS} -Xlinker --version-script=exptmp"
|
||||
# exptmp is removed below
|
||||
fi
|
||||
|
||||
# Check if objects are 32-bit and we're running in 64-bit
|
||||
# environment. If so, pass -m32 flag to linker.
|
||||
set ${OBJECTS}
|
||||
ABI32=`file $1 | grep 32-bit`
|
||||
if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
|
||||
OPTS="-m32 ${OPTS}"
|
||||
fi
|
||||
|
||||
if [ x${PATCH} = "x" ] ; then
|
||||
VERSION="${MAJOR}.${MINOR}"
|
||||
else
|
||||
|
@@ -35,11 +35,11 @@ OSMESA_LIB = OSMesa
|
||||
|
||||
|
||||
# Library names (actual file names)
|
||||
GL_LIB_NAME = libGL.so
|
||||
GLU_LIB_NAME = libGLU.so
|
||||
GLUT_LIB_NAME = libglut.so
|
||||
GLW_LIB_NAME = libGLw.so
|
||||
OSMESA_LIB_NAME = libOSMesa.so
|
||||
GL_LIB_NAME = lib$(GL_LIB).so
|
||||
GLU_LIB_NAME = lib$(GLU_LIB).so
|
||||
GLUT_LIB_NAME = lib$(GLUT_LIB).so
|
||||
GLW_LIB_NAME = lib$(GLW_LIB).so
|
||||
OSMESA_LIB_NAME = lib$(OSMesa).so
|
||||
|
||||
|
||||
# Optional assembly language optimization files for libGL
|
||||
@@ -56,6 +56,7 @@ INSTALL_PREFIX = /usr/local
|
||||
SRC_DIRS = mesa glu glut/glx glw
|
||||
GLU_DIRS = sgi
|
||||
DRIVER_DIRS = x11 osmesa
|
||||
# Which subdirs under $(TOP)/progs/ to enter:
|
||||
PROGRAM_DIRS = demos redbook samples xdemos
|
||||
|
||||
|
||||
|
@@ -19,7 +19,7 @@ CXXFLAGS = $(DEFINES) -Wall -g -ansi -pedantic -fPIC
|
||||
ASM_SOURCES =
|
||||
|
||||
# Library/program dependencies
|
||||
DRI_LIB_DEPS = -lm -lpthread -lexpat
|
||||
DRI_LIB_DEPS = -L/usr/local/lib -lm -lpthread -lexpat
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lm -pthread
|
||||
|
||||
GLUT_LIB_DEPS = -L$(LIB_DIR) -L/usr/X11R6/lib -lGLU -lGL -lX11 -lXmu -lXt -lXi -lm
|
||||
|
@@ -14,9 +14,11 @@ MKDEP = /usr/X11R6/bin/makedepend
|
||||
#MKDEP_OPTIONS = -MF depend
|
||||
|
||||
WARN_FLAGS = -Wall
|
||||
OPT_FLAGS = -O -g
|
||||
PIC_FLAGS = -fPIC
|
||||
OPT_FLAGS = -O -g
|
||||
PIC_FLAGS = -fPIC
|
||||
|
||||
# Add '-DGLX_USE_TLS' to ARCH_FLAGS to enable TLS support.
|
||||
ARCH_FLAGS ?=
|
||||
|
||||
DEFINES = -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE \
|
||||
-D_BSD_SOURCE -D_GNU_SOURCE \
|
||||
@@ -24,25 +26,25 @@ DEFINES = -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE \
|
||||
|
||||
X11_INCLUDES = -I/usr/X11R6/include -I/usr/X11R6/include/X11/extensions
|
||||
|
||||
CFLAGS = $(WARN_FLAGS) $(OPT_FLAGS) $(ASM_FLAGS) -std=c99 $(PIC_FLAGS) -ffast-math \
|
||||
$(DEFINES)
|
||||
CFLAGS = $(WARN_FLAGS) $(OPT_FLAGS) $(PIC_FLAGS) $(ARCH_FLAGS) $(DEFINES) \
|
||||
$(ASM_FLAGS) -std=c99 -ffast-math
|
||||
|
||||
CXXFLAGS = $(WARN_FLAGS) $(OPT_FLAGS) $(PIC_FLAGS) \
|
||||
$(DEFINES)
|
||||
CXXFLAGS = $(WARN_FLAGS) $(OPT_FLAGS) $(PIC_FLAGS) $(ARCH_FLAGS) $(DEFINES)
|
||||
|
||||
|
||||
ASM_SOURCES =
|
||||
|
||||
# Library/program dependencies
|
||||
DRI_LIB_DEPS = -lm -lpthread -lexpat -ldl
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lXxf86vm -lm -lpthread -ldl
|
||||
EXTRA_LIB_PATH=-L/usr/X11R6/lib
|
||||
|
||||
GLUT_LIB_DEPS = -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = -L$(LIB_DIR) -l$(GL_LIB) -L/usr/X11R6/lib -lXt -lX11
|
||||
DRI_LIB_DEPS = $(EXTRA_LIB_PATH) -lm -lpthread -lexpat -ldl
|
||||
GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lXxf86vm -lm -lpthread -ldl
|
||||
GLUT_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(LIB_DIR) -l$(GL_LIB) -lXt -lX11
|
||||
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = mesa glu glut/glx glw glx/x11
|
||||
SRC_DIRS = glx/x11 mesa glu glut/glx glw
|
||||
DRIVER_DIRS = dri
|
||||
PROGRAM_DIRS =
|
||||
WINDOW_SYSTEM=dri
|
||||
|
@@ -1,40 +1,20 @@
|
||||
# -*-makefile-*-
|
||||
# Configuration for linux-dri: Linux DRI hardware drivers for XFree86 & others
|
||||
|
||||
include $(TOP)/configs/default
|
||||
include $(TOP)/configs/linux-dri
|
||||
|
||||
CONFIG_NAME = linux-dri-x86-64
|
||||
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
DEFINES = -DDRI_NEW_INTERFACE_ONLY -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DPTHREADS -D_GNU_SOURCE -D__AMD64__
|
||||
|
||||
CFLAGS = -m64 -Wmissing-prototypes -g -std=c99 -Wundef -fPIC -ffast-math $(DEFINES)
|
||||
CXXFLAGS = -m64 -Wall -g -ansi -pedantic -fPIC $(DEFINES)
|
||||
|
||||
X11_INCLUDES = -I/usr/X11R6/include -I/usr/X11R6/include/X11/extensions
|
||||
|
||||
#ASM_SOURCES = $(X86_SOURCES)
|
||||
ARCH_FLAGS = -m64
|
||||
|
||||
LIB_DIR = $(TOP)/lib64
|
||||
|
||||
# Library/program dependencies
|
||||
DRI_LIB_DEPS = -lm -lpthread -lexpat -ldl
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib64 -lX11 -lXext -lXxf86vm -lm -lpthread -ldl
|
||||
GLUT_LIB_DEPS = -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib64 -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = -L$(LIB_DIR) -l$(GL_LIB) -L/usr/X11R6/lib64 -lXt -lX11
|
||||
EXTRA_LIB_PATH=-L/usr/X11R6/lib64
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = mesa glu glut/glx glw glx/x11
|
||||
DRIVER_DIRS = dri
|
||||
PROGRAM_DIRS =
|
||||
WINDOW_SYSTEM=dri
|
||||
|
||||
# ffb, gamma, and sis are missing because they have
|
||||
# not be converted to use the new interface. Do i810 & i830 really
|
||||
# need to be included here?
|
||||
# ffb, gamma, and sis are missing because they have not be converted to use
|
||||
# the new interface. i810 and i830 are missing because there is no x86-64
|
||||
# system where they could *ever* be used.
|
||||
#
|
||||
DRI_DIRS = dri_client i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome savage
|
||||
DRI_DIRS = dri_client i915 mach64 mga r128 r200 radeon tdfx unichrome savage
|
||||
|
||||
|
10
configs/linux-fbdev
Normal file
10
configs/linux-fbdev
Normal file
@@ -0,0 +1,10 @@
|
||||
# Configuration for Linux fbdev interface
|
||||
|
||||
include $(TOP)/configs/linux
|
||||
|
||||
CONFIG_NAME = linux-fbdev
|
||||
DRIVER_DIRS = fbdev
|
||||
|
||||
CFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -DUSE_GLFBDEV_DRIVER
|
||||
|
||||
PROGRAM_DIRS = fbdev
|
29
configs/linux-profile
Normal file
29
configs/linux-profile
Normal file
@@ -0,0 +1,29 @@
|
||||
# Configuration for profiling on Linux with gprof
|
||||
|
||||
include $(TOP)/configs/default
|
||||
|
||||
CONFIG_NAME = linux-profile
|
||||
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
CFLAGS = -pg -O -ansi -pedantic -Wall -Wmissing-prototypes -Wundef -fPIC -ffast-math -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -I/usr/X11R6/include -DUSE_XSHM -DPTHREADS -DDEBUG -DMESA_DEBUG
|
||||
|
||||
CXXFLAGS = -pg -O -ansi -pedantic -Wall -Wundef -fPIC -ffast-math -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -DDEBUG -DMESA_DEBUG
|
||||
|
||||
GLUT_CFLAGS = -fexceptions
|
||||
|
||||
# Need to have -L/usr/X11R6/lib in these:
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lm -lpthread
|
||||
GLUT_LIB_DEPS = -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = -L$(LIB_DIR) -l$(GL_LIB) -lXt -L/usr/X11R6/lib -lX11
|
||||
|
||||
# Need to make static libs for profiling:
|
||||
MKLIB_OPTIONS = -static
|
||||
GL_LIB_NAME = lib$(GL_LIB).a
|
||||
GLU_LIB_NAME = lib$(GLU_LIB).a
|
||||
GLUT_LIB_NAME = lib$(GLUT_LIB).a
|
||||
GLW_LIB_NAME = lib$(GLW_LIB).a
|
||||
OSMESA_LIB_NAME = lib$(OSMesa).a
|
||||
APP_LIB_DEPS = -L$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -lm -lpthread
|
@@ -8,26 +8,23 @@ CONFIG_NAME = linux-solo
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
DEFINES = -DDRI_NEW_INTERFACE_ONLY -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L -D_GNU_SOURCE -DUSE_EXTERNAL_DXTN_LIB=1
|
||||
DEFINES = -DDRI_NEW_INTERFACE_ONLY -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L -D_GNU_SOURCE -DUSE_EXTERNAL_DXTN_LIB=1 -DDRM_USE_MALLOC
|
||||
|
||||
CFLAGS = $(DEFINES) -Wmissing-prototypes -g -std=c99 -Wundef -fPIC -ffast-math
|
||||
|
||||
CXXFLAGS = $(DEFINES) -Wall -O3 -ansi -pedantic -fPIC
|
||||
|
||||
|
||||
ASM_SOURCES = $(X86_SOURCES)
|
||||
|
||||
# Library/program dependencies
|
||||
DRI_LIB_DEPS = -lm -lpthread -lexpat -ldl
|
||||
DRI_LIB_DEPS = -lm -lpthread -lexpat -ldl -L$(LIB_DIR) -lEGL -l$(GL_LIB)
|
||||
GL_LIB_DEPS = -lm -lpthread -ldl
|
||||
GLU_LIB_DEPS = -L$(LIB_DIR) -l$(GL_LIB) -lm
|
||||
GLUT_LIB_DEPS = -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -lm
|
||||
APP_LIB_DEPS = -L$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -lm -lpthread
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = mesa glx/mini glu glut/mini
|
||||
SRC_DIRS = mesa egl glx/mini glu glut/mini
|
||||
DRIVER_DIRS = dri
|
||||
PROGRAM_DIRS = miniglx
|
||||
PROGRAM_DIRS = miniglx egl
|
||||
|
||||
#DRI_DIRS = fb ffb gamma sis savage
|
||||
DRI_DIRS = i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome
|
||||
#DRI_DIRS = ffb gamma sis savage
|
||||
DRI_DIRS = i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome fb
|
||||
|
@@ -8,7 +8,7 @@ CONFIG_NAME = linux-solo-ia64
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
DEFINES = -DDRI_NEW_INTERFACE_ONLY -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L -D_GNU_SOURCE
|
||||
DEFINES = -DDRI_NEW_INTERFACE_ONLY -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L -D_GNU_SOURCE -DDRM_USE_MALLOC
|
||||
|
||||
CFLAGS = $(DEFINES) -Wmissing-prototypes -g -std=c99 -Wundef -fPIC -ffast-math
|
||||
|
||||
|
@@ -8,7 +8,7 @@ CONFIG_NAME = linux-solo-x86
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
DEFINES = -DDRI_NEW_INTERFACE_ONLY -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L -D_GNU_SOURCE -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1
|
||||
DEFINES = -DDRI_NEW_INTERFACE_ONLY -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=199309L -D_GNU_SOURCE -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DDRM_USE_MALLOC
|
||||
|
||||
CFLAGS = $(DEFINES) -Wmissing-prototypes -O3 -g -std=c99 -Wundef -fPIC -ffast-math
|
||||
|
||||
|
13
configs/linux-x86-32
Normal file
13
configs/linux-x86-32
Normal file
@@ -0,0 +1,13 @@
|
||||
# To build Linux x86 32-bit in an x86-64 environment
|
||||
|
||||
include $(TOP)/configs/linux-x86
|
||||
|
||||
CONFIG_NAME = linux-x86-32
|
||||
|
||||
|
||||
# Other than -m32, these are the same as in linux-x86, which we included above.
|
||||
|
||||
CFLAGS = -m32 -Wall -O3 -ansi -pedantic -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM -DPTHREADS -I/usr/X11R6/include
|
||||
|
||||
CXXFLAGS = -m32 -Wall -O3 fPIC -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE
|
||||
|
@@ -8,14 +8,14 @@ CONFIG_NAME = linux-x86-64
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
CFLAGS = -m64 -Wall -O3 -ansi -pedantic -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -D__AMD64__ -I/usr/X11R6/include
|
||||
CFLAGS = -m64 -Wall -O3 -std=c99 -pedantic -fPIC -D_REENTRANT -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -I/usr/X11R6/include -DUSE_X86_64_ASM
|
||||
|
||||
CXXFLAGS = -m64 -Wall -O3 -ansi -pedantic -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -D__AMD64__
|
||||
CXXFLAGS = -m64 -Wall -O3 -fPIC -D_REENTRANT -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE
|
||||
|
||||
GLUT_CFLAGS = -fexceptions
|
||||
|
||||
|
||||
#ASM_SOURCES = $(X86_SOURCES)
|
||||
ASM_SOURCES = $(X86-64_SOURCES)
|
||||
|
||||
|
||||
LIB_DIR = $(TOP)/lib64
|
||||
|
28
configs/linux-x86-64-debug
Normal file
28
configs/linux-x86-64-debug
Normal file
@@ -0,0 +1,28 @@
|
||||
# Configuration for Linux for 64-bit X86 (Opteron)
|
||||
|
||||
include $(TOP)/configs/default
|
||||
|
||||
CONFIG_NAME = linux-x86-64-debug
|
||||
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
CFLAGS = -g -m64 -Wall -O3 -std=c99 -pedantic -fPIC -D_REENTRANT -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -I/usr/X11R6/include -DUSE_X86_64_ASM -DDEBUG -DMESA_DEBUG -DRUN_DEBUG_BENCHMARK
|
||||
|
||||
CXXFLAGS = -g -m64 -Wall -O3 -ansi -pedantic -fPIC -D_REENTRANT -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DDEBUG -DMESA_DEBUG -DRUN_DEBUG_BENCHMARK
|
||||
|
||||
GLUT_CFLAGS = -fexceptions
|
||||
|
||||
|
||||
ASM_SOURCES = $(X86-64_SOURCES)
|
||||
|
||||
|
||||
LIB_DIR = $(TOP)/lib64
|
||||
|
||||
|
||||
# Library/program dependencies
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib64 -lX11 -lXext -lm -lpthread
|
||||
GLUT_LIB_DEPS = -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib64 -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = -L$(LIB_DIR) -l$(GL_LIB) -L/usr/X11R6/lib64 -lXt -lX11
|
||||
APP_LIB_DEPS = -L$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -lm
|
@@ -8,9 +8,9 @@ CONFIG_NAME = linux-x86-64-static
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
CFLAGS = -m64 -Wall -O3 -ansi -pedantic -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -D__AMD64__ -I/usr/X11R6/include
|
||||
CFLAGS = -m64 -Wall -O3 -ansi -pedantic -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -I/usr/X11R6/include
|
||||
|
||||
CXXFLAGS = -m64 -Wall -O3 -ansi -pedantic -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -D__AMD64__
|
||||
CXXFLAGS = -m64 -Wall -O3 -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE
|
||||
|
||||
GLUT_CFLAGS = -fexceptions
|
||||
|
||||
|
24
configs/linux-x86-xcb
Normal file
24
configs/linux-x86-xcb
Normal file
@@ -0,0 +1,24 @@
|
||||
# Configuration for Linux with x86 optimizations
|
||||
|
||||
include $(TOP)/configs/default
|
||||
|
||||
CONFIG_NAME = linux-x86-xcb
|
||||
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
CFLAGS = -Wall -O3 -ansi -pedantic -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM -DPTHREADS -DUSE_XCB -I/usr/X11R6/include
|
||||
|
||||
CXXFLAGS = -Wall -O3 -ansi -pedantic -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XCB
|
||||
|
||||
GLUT_CFLAGS = -fexceptions
|
||||
|
||||
|
||||
ASM_SOURCES = $(X86_SOURCES) $(X86_API)
|
||||
|
||||
# Library/program dependencies
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lm -lpthread -lXCB
|
||||
GLUT_LIB_DEPS = -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = -L$(LIB_DIR) -l$(GL_LIB) -L/usr/X11R6/lib -lXt -lX11
|
||||
APP_LIB_DEPS = -L$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -lm
|
182
docs/INSTALL.GNU
182
docs/INSTALL.GNU
@@ -1,182 +0,0 @@
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
These are generic installation instructions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, a file
|
||||
`config.cache' that saves the results of its tests to speed up
|
||||
reconfiguring, and a file `config.log' containing compiler output
|
||||
(useful mainly for debugging `configure').
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If at some point `config.cache'
|
||||
contains results you don't want to keep, you may remove or edit it.
|
||||
|
||||
The file `configure.in' is used to create `configure' by a program
|
||||
called `autoconf'. You only need `configure.in' if you want to change
|
||||
it or regenerate `configure' using a newer version of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system. If you're
|
||||
using `csh' on an old version of System V, you might need to type
|
||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||
`configure' itself.
|
||||
|
||||
Running `configure' takes awhile. While running, it prints some
|
||||
messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. You can give `configure'
|
||||
initial values for variables by setting them in the environment. Using
|
||||
a Bourne-compatible shell, you can do that on the command line like
|
||||
this:
|
||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
||||
|
||||
Or on systems that have the `env' program, you can do it like this:
|
||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you must use a version of `make' that
|
||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
If you have to use a `make' that does not supports the `VPATH'
|
||||
variable, you have to compile the package for one architecture at a time
|
||||
in the source code directory. After you have installed the package for
|
||||
one architecture, use `make distclean' before reconfiguring for another
|
||||
architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' will install the package's files in
|
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
||||
installation prefix other than `/usr/local' by giving `configure' the
|
||||
option `--prefix=PATH'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||
PATH as the prefix for installing programs and libraries.
|
||||
Documentation and other data files will still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=PATH' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' can not figure out
|
||||
automatically, but needs to determine by the type of host the package
|
||||
will run on. Usually `configure' can figure that out, but if it prints
|
||||
a message saying it can not guess the host type, give it the
|
||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name with three fields:
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the host type.
|
||||
|
||||
If you are building compiler tools for cross-compiling, you can also
|
||||
use the `--target=TYPE' option to select the type of system they will
|
||||
produce code for and the `--build=TYPE' option to select the type of
|
||||
system on which you are compiling the package.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Operation Controls
|
||||
==================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Use and save the results of the tests in FILE instead of
|
||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
||||
debugging `configure'.
|
||||
|
||||
`--help'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--version'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options.
|
@@ -113,14 +113,10 @@ FAQ:
|
||||
at peak performance ;-).
|
||||
|
||||
Q) I'm getting a "bad font!" fatal error.
|
||||
A) By default, DOS GLUT compiles with GLUT_IMPORT_LIB, to cope with variable
|
||||
access inside dynamic modules (same mechanism used for Win32 _DLL). Since
|
||||
-DGLUT_IMPORT_LIB affects Mesa's `glut.h', your apps must be compiled the
|
||||
same way GLUT was compiled (either with or without defining it). If you
|
||||
want to use another `glut.h' when building your own demos, or just don't
|
||||
feel happy about this, make sure you remove the line with GLUT_IMPORT_LIB
|
||||
from `Mesa/src/glut/dos/Makefile.DJ' before (re)making GLUT. Beware, this
|
||||
means you will never EVER be able to safely use `glut.dxe'!
|
||||
A) Always use GLUT_STROKE_* and GLUT_BITMAP_* constants when dealing with
|
||||
GLUT fonts. If you're using `glut.dxe', then make sure GLUT_STROKE_* and
|
||||
GLUT_BITMAP_* are mapped to integer constants, not to the actual font
|
||||
address (same mechanism used for Win32 _DLL).
|
||||
|
||||
Q) What is NUL driver good for, if I don't get any output at all?
|
||||
A) For debugging. The NUL driver is very much like OSMesa. Everything is
|
||||
@@ -265,8 +261,9 @@ v1.6 (aug-2004)
|
||||
v1.7 (???-2005)
|
||||
+ enabled OpenGL 2.0 support
|
||||
+ added support for sw texture compression
|
||||
* minor rework
|
||||
* `glutTimerFunc' now works with heavy callbacks
|
||||
+ added FreeGLUT specific functions
|
||||
* no more GLX sources in DOS GLUT
|
||||
* made GLUT timer callbacks less accurate but safer
|
||||
|
||||
|
||||
|
||||
|
@@ -27,6 +27,9 @@ GL_OES_read_format - allows one to query the fastest glReadPixels format
|
||||
|
||||
GL_ARB_pixel_buffer_object - buffer objects for pixel read/write functions.
|
||||
|
||||
GL_EXT_framebuffer_object - allows render-to-texture and provides a
|
||||
window-system indepedent Pbuffer facility
|
||||
|
||||
DirectFB driver, contributed by Claudio Ciccani. See docs/README.directfb
|
||||
for details.
|
||||
|
||||
@@ -94,4 +97,4 @@ D3D needs updating
|
||||
|
||||
|
||||
----------------------------------------------------------------------
|
||||
$Id: RELNOTES-6.3,v 3.8 2005/01/20 04:03:37 brianp Exp $
|
||||
$Id: RELNOTES-6.3,v 3.9 2005/05/04 20:11:35 brianp Exp $
|
||||
|
@@ -1308,7 +1308,7 @@ Mesa Version History
|
||||
- glReadPixels from a clipped front color buffer didn't always work
|
||||
- glTexImage didn't accept GL_RED/GREEN/BLUE as the format
|
||||
- Attempting queries/accesses of VBO 0 weren't detected as errors
|
||||
- paletted textures failed if the palette had fewer that 256 entries
|
||||
- paletted textures failed if the palette had fewer than 256 entries
|
||||
Changes:
|
||||
- fixed a bunch of compiler warnings found with gcc 3.4
|
||||
- bug reports should to go bugzilla.freedesktop.org
|
||||
@@ -1320,11 +1320,13 @@ Mesa Version History
|
||||
- GL_ARB_pixel_buffer_object extension
|
||||
- GL_OES_read_format extension (Ian Romanick)
|
||||
- DirectFB driver (Claudio Ciccani)
|
||||
- x86_64 vertex transformation code (Mikko T.)
|
||||
Changes:
|
||||
- added -stereo option for glxgears demo (Jacek Rosik)
|
||||
- updated the PBuffer demo code in xdemos/ directory
|
||||
- glDeleteTextures/Programs/Buffers() now makes the object ID
|
||||
available for immediate re-use
|
||||
- assorted 64-bit clean-ups fixes (x86_64 and Win64)
|
||||
Bug fixes:
|
||||
- some functions didn't support PBO functionality
|
||||
- glGetTexImage didn't convert color index images to RGBA as required
|
||||
|
@@ -1,15 +1,27 @@
|
||||
<HTML>
|
||||
|
||||
<title>Banner</title>
|
||||
|
||||
|
||||
<body text="#ffffff" bgcolor="#aa4444">
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>Banner</title>
|
||||
</head>
|
||||
<body bgcolor="#000000" text="#ffffff">
|
||||
<center>
|
||||
<p>
|
||||
<font size="5">The Mesa 3D Graphics Library</font>
|
||||
</p>
|
||||
<table style="width: 95%; text-align: left;" border="0" cellpadding="2"
|
||||
cellspacing="2">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="vertical-align: top;">
|
||||
<p><img src="gears.png"> </p>
|
||||
</td>
|
||||
<td style="text-align: center;"><font face="sans-serif" size="5">The
|
||||
Mesa 3D Graphics Library</font></td>
|
||||
<td style="vertical-align: top; text-align: right;">
|
||||
<p><img src="gears.png"> </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><font face="sans-serif" size="5"><br>
|
||||
</font></p>
|
||||
</center>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
@@ -4,20 +4,20 @@
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<body bgcolor="#119955">
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<!--Override a few values from the style sheet: -->
|
||||
<style>
|
||||
<!--
|
||||
body {
|
||||
background-color: #119955;
|
||||
color: white;
|
||||
background-color: #cccccc;
|
||||
color: black;
|
||||
}
|
||||
a:link {
|
||||
color: #fff;
|
||||
color: #000;
|
||||
}
|
||||
a:visited {
|
||||
color: #ccc;
|
||||
color: #000;
|
||||
}
|
||||
-->
|
||||
</style>
|
||||
|
@@ -67,9 +67,11 @@ Here are the basic instructions for Unix systems:
|
||||
Mesa developers working with the Mesa CVS repository need to first
|
||||
have an account on <a href="http://www.freedesktop.org" target="_parent">
|
||||
freedesktop.org</a>.
|
||||
You can request an account from either
|
||||
<a href="mailto:dstone@trinity.unimelb.edu.au">Daniel Stone</a> or
|
||||
<a href="mailto:eta@lclark.edu">Eric Anholt</a>.
|
||||
To get an account, please ask Brian or the other Mesa developers for
|
||||
permission.
|
||||
Then, if there are no objections, follow this
|
||||
<a href="http://www.freedesktop.org/wiki/AccountRequests" target="_parent">
|
||||
procedure</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
BIN
docs/gears.png
Normal file
BIN
docs/gears.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
@@ -9,54 +9,64 @@
|
||||
<H1>Help Wanted</H1>
|
||||
|
||||
<p>
|
||||
We can always use more help with the Mesa project. Here are some
|
||||
specific areas. If you think you can help out, post to the mesa3d-dev
|
||||
mailing list.
|
||||
We can always use more help with the Mesa project.
|
||||
Here are some specific ideas and areas where help would be appreciated:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Windows 98/NT build/driver maintenance and testing (Karl Schultz has been
|
||||
doing a great job of this lately)
|
||||
<li>DOS/DJGPP build/driver maintenance and testing
|
||||
<li>GGI driver/build maintenance and testing
|
||||
<li>GNU autoconfig/libtool maintenance (esp. on non-Linux systems)
|
||||
<li>x86, SSE, 3DNow! and SPARC assembly language programming
|
||||
<li>Implement WGL font functions in the WGL interface code
|
||||
<li>Implement off-screen bitmap rendering support in the WGL interface code
|
||||
<li>Help with writing/testing the new NV_fragment_program extension code
|
||||
<li>Implement the ARB_vertex/fragment extensions
|
||||
<li>Download/compile/test Mesa and report any bugs found
|
||||
</ul>
|
||||
<ol>
|
||||
<li><p>
|
||||
Generate the src/mesa/main/enums.c file with a Python script which
|
||||
uses the gl_API.xml file.
|
||||
</p>
|
||||
<li><p>
|
||||
Try to auto-generate the display list "save" functions seen in dlist.c
|
||||
using a Python script and the gl_API.xml file.
|
||||
The gl_API.xml file will probably need a new tag to indicate whether or
|
||||
not each function gets compiled into display lists.
|
||||
</p>
|
||||
<li><p>
|
||||
Maintenance of assembly language files on Linux, Windows and SPARC systems.
|
||||
</p>
|
||||
<li><p>
|
||||
Help to incorporate the 3Dlabs' shading language compiler for OpenGL 2.0.
|
||||
</p>
|
||||
<li><p>
|
||||
Implement assembly language (SSE/MMX) code generation for
|
||||
vertex/fragment programs.
|
||||
</p>
|
||||
<li><p>
|
||||
Windows 98/NT driver building, maintenance and testing
|
||||
(Karl Schultz has been doing a great job of this lately).
|
||||
</p>
|
||||
<li><p>
|
||||
Maintenance and testing of various drivers, such as DOS/DJGPP, GGI, etc.
|
||||
</p>
|
||||
<li><p>
|
||||
Write new tests for Glean.
|
||||
</p>
|
||||
</ol>
|
||||
|
||||
|
||||
<p>
|
||||
If you want to help with Mesa, first join the Mesa developer's
|
||||
mailing list. Then post a message explaining what you might like
|
||||
to help with. The Mesa web page has a list of a few work items
|
||||
which you may consider.
|
||||
mailing list.
|
||||
Then post a message to propose what you want to do, just to make sure
|
||||
there's no issues.
|
||||
</p>
|
||||
|
||||
</p>
|
||||
Anyone is welcome to contribute code to the Mesa project, provided you
|
||||
agree to the copyright terms of the relevant code. See the COPYRIGHT
|
||||
file.
|
||||
Anyone is welcome to contribute code to the Mesa project.
|
||||
By doing so, it's assumed that you agree to the code's licensing terms.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Unfortunately, all the easy work in Mesa was done years ago. Nowadays, the
|
||||
work is rather complicated and not suited to beginners.
|
||||
</p>
|
||||
Finally:
|
||||
<p>
|
||||
|
||||
<p>
|
||||
If you're contribution code to the Mesa library itself:
|
||||
<p>
|
||||
<ol>
|
||||
<li>Try to write clean code (uniform indentation, comments, meaningful
|
||||
identifiers, etc). It must be readable and maintainable!
|
||||
|
||||
<li>Test your code. On several occations I've incorporated code from
|
||||
users which later turned out to have bugs. Now, I'm pretty hesitant
|
||||
to use code which doesn't look good.
|
||||
<li>Try to write high-quality code that follows the existing style.
|
||||
<li>Use uniform indentation, write comments, use meaningful identifiers, etc.
|
||||
<li>Test your code thoroughly. Include test programs if appropriate.
|
||||
</ol>
|
||||
|
||||
|
||||
|
@@ -1,20 +1,29 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
|
||||
<html>
|
||||
|
||||
<title>Mesa Home Page</title></head>
|
||||
<head>
|
||||
<title>Mesa Home Page</title>
|
||||
</head>
|
||||
|
||||
<frameset rows="80,*" border="0" frameborder="yes">
|
||||
|
||||
<frameset rows="50,100% " border="1" framespacing="1" frameborder="yes">
|
||||
<frame src="banner.html" name="BannerFrame" scrolling="no" marginwidth="1" marginheight="1" resize="">
|
||||
<frameset cols="28%,72% " border="1" framespacing="1" frameborder="yes">
|
||||
<frame src="contents.html" name="ContentsFrame" marginwidth="2" marginheight="1" resize="">
|
||||
<frame src="news.html" name="MainFrame" marginwidth="3" marginheight="1" resize="">
|
||||
</frameset>
|
||||
</frameset>
|
||||
<frame src="banner.html" name="BannerFrame"
|
||||
scrolling="no" marginwidth="1" marginheight="1">
|
||||
|
||||
<frameset cols="28%,72% " border="1" frameborder="yes">
|
||||
|
||||
<frame src="contents.html" name="ContentsFrame"
|
||||
marginwidth="2" marginheight="1" noresize="noresize">
|
||||
|
||||
<frame src="news.html" name="MainFrame"
|
||||
marginwidth="3" marginheight="1" noresize="noresize">
|
||||
|
||||
</frameset>
|
||||
|
||||
<noframes>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
|
||||
<p>Sorry, this site requires frame support</p>
|
||||
</noframes>
|
||||
</html>
|
||||
|
||||
</frameset>
|
||||
|
||||
</html>
|
||||
|
@@ -1,20 +1,19 @@
|
||||
/* Mesa CSS */
|
||||
body {
|
||||
background-color: #55bbff;
|
||||
background-color: #ffffff;
|
||||
/*background-color: #55bbff;*/
|
||||
font: 14px 'Lucida Grande', Geneva, Arial, Verdana, sans-serif;
|
||||
color: black;
|
||||
link: #111188;
|
||||
}
|
||||
|
||||
h1 {
|
||||
background-color: #55bbff;
|
||||
font: 24px 'Lucida Grande', Geneva, Arial, Verdana, sans-serif;
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
}
|
||||
|
||||
h2 {
|
||||
background-color: #55bbff;
|
||||
font: 18px 'Lucida Grande', Geneva, Arial, Verdana, sans-serif, bold;
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
<TITLE>Mesa News</TITLE>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
@@ -25,7 +25,7 @@ This is a stable release which just fixes bugs since the 6.2 release.
|
||||
- glReadPixels from a clipped front color buffer didn't always work
|
||||
- glTexImage didn't accept GL_RED/GREEN/BLUE as the format
|
||||
- Attempting queries/accesses of VBO 0 weren't detected as errors
|
||||
- paletted textures failed if the palette had fewer that 256 entries
|
||||
- paletted textures failed if the palette had fewer than 256 entries
|
||||
Changes:
|
||||
- fixed a bunch of compiler warnings found with gcc 3.4
|
||||
- bug reports should to go bugzilla.freedesktop.org
|
||||
@@ -960,6 +960,6 @@ source code</a>.</p>
|
||||
|
||||
|
||||
<hr>
|
||||
$Id: news.html,v 3.17 2005/01/20 03:55:10 brianp Exp $
|
||||
$Id: news.html,v 3.19 2005/05/05 14:18:31 brianp Exp $
|
||||
</body>
|
||||
</html>
|
@@ -13,6 +13,7 @@
|
||||
|
||||
The following individuals and groups are to be acknowledged for their
|
||||
contributions to Mesa over the years.
|
||||
This list is far from complete and somewhat dated, unfortunately.
|
||||
|
||||
|
||||
<ul>
|
||||
@@ -32,14 +33,21 @@ substantial piece of work.
|
||||
Tungsten Graphics, Inc. have supported the ongoing development of Mesa.
|
||||
<br>
|
||||
<br>
|
||||
<li>The <A HREF="http://sourceforge.net/projects/mesa3d"
|
||||
target="_parent">Mesa</A>
|
||||
project is hosted by<A HREF="http://sourceforge.net"
|
||||
target="_parent"><IMG SRC="http://sourceforge.net/sflogo.php?group_id=3&type=1"
|
||||
<li>The
|
||||
<A HREF="http://sourceforge.net/projects/mesa3d" target="_parent">Mesa</A>
|
||||
website is hosted by
|
||||
<A HREF="http://sourceforge.net" target="_parent">
|
||||
<IMG SRC="http://sourceforge.net/sflogo.php?group_id=3&type=1"
|
||||
WIDTH="88" HEIGHT="31" ALIGN="BOTTOM" ALT="Sourceforge.net" BORDER="0"></A>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<li>The Mesa CVS repository is hosted by
|
||||
<a href="http://freedesktop.org/" target="_parent">freedesktop.org</a>.
|
||||
<br>
|
||||
<br>
|
||||
|
||||
|
||||
<li><a href="http://www.altsoftware.com/"
|
||||
target="_parent">alt.software</a> contributed the Direct3D driver.
|
||||
|
||||
|
128
include/GL/gl.h
128
include/GL/gl.h
@@ -62,6 +62,9 @@
|
||||
#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */
|
||||
# define GLAPI extern
|
||||
# define GLAPIENTRY __stdcall
|
||||
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
|
||||
# define GLAPI __attribute__((visibility("default")))
|
||||
# define GLAPIENTRY
|
||||
#endif /* WIN32 && !CYGWIN */
|
||||
|
||||
#if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__)
|
||||
@@ -101,7 +104,7 @@
|
||||
#define APIENTRY GLAPIENTRY
|
||||
#endif
|
||||
|
||||
/* "P" suffix for when function returns a pointer */
|
||||
/* "P" suffix to be used for a pointer to a function */
|
||||
#ifndef APIENTRYP
|
||||
#define APIENTRYP APIENTRY *
|
||||
#endif
|
||||
@@ -850,7 +853,7 @@ GLAPI GLint GLAPIENTRY glRenderMode( GLenum mode );
|
||||
|
||||
GLAPI GLenum GLAPIENTRY glGetError( void );
|
||||
|
||||
GLAPI const GLubyte GLAPIENTRYP glGetString( GLenum name );
|
||||
GLAPI const GLubyte * GLAPIENTRY glGetString( GLenum name );
|
||||
|
||||
GLAPI void GLAPIENTRY glFinish( void );
|
||||
|
||||
@@ -2210,11 +2213,11 @@ GLAPI void GLAPIENTRY glTracePointerRangeMESA( const GLvoid* first, const GLvoid
|
||||
|
||||
typedef void (*GLprogramcallbackMESA)(GLenum target, GLvoid *data);
|
||||
|
||||
extern void
|
||||
GLAPI void GLAPIENTRY
|
||||
glProgramCallbackMESA(GLenum target, GLprogramcallbackMESA callback,
|
||||
GLvoid *data);
|
||||
|
||||
extern void
|
||||
GLAPI void GLAPIENTRY
|
||||
glGetProgramRegisterfvMESA(GLenum target, GLsizei len, const GLubyte *name,
|
||||
GLfloat *v);
|
||||
|
||||
@@ -2232,6 +2235,123 @@ typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEATIPROC) (GLenum modeRGB, GLen
|
||||
#endif /* GL_ATI_blend_equation_separate */
|
||||
|
||||
|
||||
/* XXX this is temporary here! */
|
||||
#ifndef GL_EXT_framebuffer_object
|
||||
#define GL_EXT_framebuffer_object
|
||||
|
||||
GLAPI GLboolean GLAPIENTRY
|
||||
glIsRenderbufferEXT(GLuint renderbuffer);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glBindRenderbufferEXT(GLenum target, GLuint renderbuffer);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glRenderbufferStorageEXT(GLenum target, GLenum internalformat,
|
||||
GLsizei width, GLsizei height);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params);
|
||||
|
||||
GLAPI GLboolean GLAPIENTRY
|
||||
glIsFramebufferEXT(GLuint framebuffer);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glBindFramebufferEXT(GLenum target, GLuint framebuffer);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers);
|
||||
|
||||
GLAPI GLenum GLAPIENTRY
|
||||
glCheckFramebufferStatusEXT(GLenum target);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glFramebufferTexture1DEXT(GLenum target, GLenum attachment,
|
||||
GLenum textarget, GLuint texture, GLint level);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glFramebufferTexture2DEXT(GLenum target, GLenum attachment,
|
||||
GLenum textarget, GLuint texture, GLint level);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glFramebufferTexture3DEXT(GLenum target, GLenum attachment,
|
||||
GLenum textarget, GLuint texture,
|
||||
GLint level, GLint zoffset);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glFramebufferRenderbufferEXT(GLenum target, GLenum attachment,
|
||||
GLenum renderbuffertarget,
|
||||
GLuint renderbuffer);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,
|
||||
GLenum pname, GLint *params);
|
||||
|
||||
GLAPI void GLAPIENTRY
|
||||
glGenerateMipmapEXT(GLenum target);
|
||||
|
||||
|
||||
#define GL_FRAMEBUFFER_EXT 0x8D40
|
||||
#define GL_RENDERBUFFER_EXT 0x8D41
|
||||
#define GL_STENCIL_INDEX_EXT 0x8D45
|
||||
#define GL_STENCIL_INDEX1_EXT 0x8D46
|
||||
#define GL_STENCIL_INDEX4_EXT 0x8D47
|
||||
#define GL_STENCIL_INDEX8_EXT 0x8D48
|
||||
#define GL_STENCIL_INDEX16_EXT 0x8D49
|
||||
#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
|
||||
#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
|
||||
#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
|
||||
#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
|
||||
#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
|
||||
#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
|
||||
#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
|
||||
#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
|
||||
#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
|
||||
#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
|
||||
#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
|
||||
#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
|
||||
#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
|
||||
#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
|
||||
#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
|
||||
#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
|
||||
#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
|
||||
#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
|
||||
#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
|
||||
#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
|
||||
#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
|
||||
#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
|
||||
#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
|
||||
#define GL_FRAMEBUFFER_STATUS_ERROR_EXT 0x8CDE
|
||||
#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
|
||||
#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
|
||||
#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
|
||||
#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
|
||||
#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
|
||||
|
||||
#endif /* GL_EXT_framebuffer_object */
|
||||
|
||||
|
||||
|
||||
/**
|
||||
** NOTE!!!!! If you add new functions to this file, or update
|
||||
** glext.h be sure to regenerate the gl_mangle.h file. See comments
|
||||
|
@@ -62,7 +62,10 @@ extern const char *
|
||||
glFBDevGetString( int str );
|
||||
|
||||
|
||||
extern const void *
|
||||
typedef void (*GLFBDevProc)();
|
||||
|
||||
|
||||
extern const GLFBDevProc
|
||||
glFBDevGetProcAddress( const char *procName );
|
||||
|
||||
|
||||
|
@@ -193,13 +193,11 @@ WGLAPI int GLAPIENTRY SetPixelFormat(HDC,int,const PIXELFORMATDESCRIPTOR *);
|
||||
#else /* _WIN32 not defined */
|
||||
|
||||
/* Define GLUTAPIENTRY and GLUTCALLBACK to nothing if we aren't on Win32. */
|
||||
# define GLUTAPIENTRY
|
||||
# define GLUTAPIENTRY GLAPIENTRY
|
||||
# define GLUTAPIENTRYV
|
||||
# define GLUT_APIENTRY_DEFINED
|
||||
# define GLUTCALLBACK
|
||||
# define GLUTAPI extern
|
||||
/* Prototype exit for the non-Win32 case (see above). */
|
||||
/*extern void exit(int); this screws up gcc -ansi -pedantic! */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -747,26 +745,4 @@ GLUTAPI int GLUTAPIENTRY glutGameModeGet(GLenum mode);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#ifdef GLUT_APIENTRY_DEFINED
|
||||
# undef GLUT_APIENTRY_DEFINED
|
||||
# undef APIENTRY
|
||||
#endif
|
||||
|
||||
#ifdef GLUT_WINGDIAPI_DEFINED
|
||||
# undef GLUT_WINGDIAPI_DEFINED
|
||||
# undef WINGDIAPI
|
||||
#endif
|
||||
|
||||
#ifdef GLUT_DEFINED___CDECL
|
||||
# undef GLUT_DEFINED___CDECL
|
||||
# undef __cdecl
|
||||
#endif
|
||||
|
||||
#ifdef GLUT_DEFINED__CRTIMP
|
||||
# undef GLUT_DEFINED__CRTIMP
|
||||
# undef _CRTIMP
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* __glut_h__ */
|
||||
|
@@ -482,6 +482,21 @@ typedef GLuint (* PFNGLXGETAGPOFFSETMESAPROC) (const GLvoid *pointer);
|
||||
#endif /* GLX_MESA_agp_offset */
|
||||
|
||||
|
||||
/*
|
||||
* ???. GLX_MESA_allocate_memory
|
||||
*/
|
||||
#ifndef GLX_MESA_allocate_memory
|
||||
#define GLX_MESA_allocate_memory 1
|
||||
|
||||
extern void *glXAllocateMemoryMESA(Display *dpy, int scrn, size_t size, float readfreq, float writefreq, float priority);
|
||||
extern void glXFreeMemoryMESA(Display *dpy, int scrn, void *pointer);
|
||||
extern GLuint glXGetMemoryOffsetMESA(Display *dpy, int scrn, const void *pointer);
|
||||
typedef void * ( * PFNGLXALLOCATEMEMORYMESAPROC) (Display *dpy, int scrn, size_t size, float readfreq, float writefreq, float priority);
|
||||
typedef void ( * PFNGLXFREEMEMORYMESAPROC) (Display *dpy, int scrn, void *pointer);
|
||||
typedef GLuint (* PFNGLXGETMEMORYOFFSETMESAPROC) (Display *dpy, int scrn, const void *pointer);
|
||||
|
||||
#endif /* GLX_MESA_allocate_memory */
|
||||
|
||||
/*
|
||||
* ARB ?. GLX_ARB_render_texture
|
||||
*/
|
||||
@@ -506,6 +521,28 @@ extern Bool glXDrawableAttribARB(Display *dpy, GLXDrawable draw, const int *attr
|
||||
#endif /* GLX_NV_float_buffer */
|
||||
|
||||
|
||||
/*** Should these go here, or in another header? */
|
||||
/*
|
||||
** GLX Events
|
||||
*/
|
||||
typedef struct {
|
||||
int event_type; /* GLX_DAMAGED or GLX_SAVED */
|
||||
int draw_type; /* GLX_WINDOW or GLX_PBUFFER */
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
Bool send_event; /* true if this came for SendEvent request */
|
||||
Display *display; /* display the event was read from */
|
||||
GLXDrawable drawable; /* XID of Drawable */
|
||||
unsigned int buffer_mask; /* mask indicating which buffers are affected */
|
||||
unsigned int aux_buffer; /* which aux buffer was affected */
|
||||
int x, y;
|
||||
int width, height;
|
||||
int count; /* if nonzero, at least this many more */
|
||||
} GLXPbufferClobberEvent;
|
||||
|
||||
typedef union __GLXEvent {
|
||||
GLXPbufferClobberEvent glxpbufferclobber;
|
||||
long pad[24];
|
||||
} GLXEvent;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@@ -52,14 +52,20 @@ extern "C" {
|
||||
*
|
||||
* It can have the values #True or #False.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef int Bool;
|
||||
#endif
|
||||
typedef int MINI_Bool;
|
||||
|
||||
/**
|
||||
* \brief Color map.
|
||||
*
|
||||
* Alias for private ::MiniGLXColormapRec structure.
|
||||
*/
|
||||
typedef struct MiniGLXColormapRec *MINI_Colormap;
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXColormapRec *Colormap;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \brief Window attributes.
|
||||
@@ -67,7 +73,7 @@ typedef struct MiniGLXColormapRec *Colormap;
|
||||
typedef struct MiniGLXSetWindowAttributesRec {
|
||||
int background_pixel; /**< \brief background pixel */
|
||||
int border_pixel; /**< \brief border pixel value */
|
||||
Colormap colormap; /**< \brief color map to be associated with window */
|
||||
MINI_Colormap colormap; /**< \brief color map to be associated with window */
|
||||
int event_mask; /**< \brief set of events that should be saved */
|
||||
} XSetWindowAttributes;
|
||||
|
||||
@@ -85,10 +91,13 @@ typedef struct MiniGLXVisualRec Visual;
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
typedef unsigned int VisualID;
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef unsigned long VisualID;
|
||||
#endif
|
||||
typedef unsigned long MINI_VisualID;
|
||||
typedef struct MiniGLXXVisualInfoRec {
|
||||
Visual *visual; /**< \brief pointer to the GLX Visual */
|
||||
VisualID visualid; /**< \brief visual ID */
|
||||
MINI_VisualID visualid; /**< \brief visual ID */
|
||||
int screen; /**< \brief screen number */
|
||||
int depth; /**< \brief bit depth */
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
@@ -115,7 +124,10 @@ typedef struct MiniGLXFBConfigRec {
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXDisplayRec Display;
|
||||
#endif
|
||||
typedef struct MiniGLXDisplayRec MINI_Display;
|
||||
|
||||
/**
|
||||
* \brief Window handle.
|
||||
@@ -124,7 +136,10 @@ typedef struct MiniGLXDisplayRec Display;
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXWindowRec *Window;
|
||||
#endif
|
||||
typedef struct MiniGLXWindowRec *MINI_Window;
|
||||
|
||||
/**
|
||||
* \brief Drawable.
|
||||
@@ -136,7 +151,10 @@ typedef struct MiniGLXWindowRec *Window;
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXWindowRec *Drawable;
|
||||
#endif
|
||||
typedef struct MiniGLXWindowRec *MINI_Drawable;
|
||||
|
||||
/**
|
||||
* \brief GLX drawable.
|
||||
@@ -174,9 +192,9 @@ typedef struct MiniGLXContextRec *GLXContext;
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
Bool send_event; /* true if this came from a SendEvent request */
|
||||
Display *display; /* Display the event was read from */
|
||||
Window window;
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window window;
|
||||
int x, y;
|
||||
int width, height;
|
||||
int count; /* if non-zero, at least this many more */
|
||||
@@ -185,53 +203,53 @@ typedef struct {
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
Bool send_event; /* true if this came from a SendEvent request */
|
||||
Display *display; /* Display the event was read from */
|
||||
Window parent; /* parent of the window */
|
||||
Window window; /* window id of window created */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window parent; /* parent of the window */
|
||||
MINI_Window window; /* window id of window created */
|
||||
int x, y; /* window location */
|
||||
int width, height; /* size of window */
|
||||
int border_width; /* border width */
|
||||
Bool override_redirect; /* creation should be overridden */
|
||||
MINI_Bool override_redirect; /* creation should be overridden */
|
||||
} XCreateWindowEvent;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
Bool send_event; /* true if this came from a SendEvent request */
|
||||
Display *display; /* Display the event was read from */
|
||||
Window event;
|
||||
Window window;
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window event;
|
||||
MINI_Window window;
|
||||
} XDestroyWindowEvent;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
Bool send_event; /* true if this came from a SendEvent request */
|
||||
Display *display; /* Display the event was read from */
|
||||
Window event;
|
||||
Window window;
|
||||
Bool from_configure;
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window event;
|
||||
MINI_Window window;
|
||||
MINI_Bool from_configure;
|
||||
} XUnmapEvent;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
Bool send_event; /* true if this came from a SendEvent request */
|
||||
Display *display; /* Display the event was read from */
|
||||
Window event;
|
||||
Window window;
|
||||
Bool override_redirect; /* boolean, is override set... */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window event;
|
||||
MINI_Window window;
|
||||
MINI_Bool override_redirect; /* boolean, is override set... */
|
||||
} XMapEvent;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
Bool send_event; /* true if this came from a SendEvent request */
|
||||
Display *display; /* Display the event was read from */
|
||||
Window parent;
|
||||
Window window;
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window parent;
|
||||
MINI_Window window;
|
||||
} XMapRequestEvent;
|
||||
|
||||
typedef union _XEvent {
|
||||
@@ -263,6 +281,7 @@ typedef union _XEvent {
|
||||
#define CWColormap (1L<<13)
|
||||
#define PseudoColor 3
|
||||
#define TrueColor 4
|
||||
#define VisualIDMask 0x1
|
||||
#define VisualScreenMask 0x2
|
||||
#define Expose 12
|
||||
#define CreateNotify 16
|
||||
@@ -318,11 +337,11 @@ typedef union _XEvent {
|
||||
/**
|
||||
* \name Server-specific functions
|
||||
*/
|
||||
extern Display *
|
||||
extern MINI_Display *
|
||||
__miniglx_StartServer( const char *display_name );
|
||||
|
||||
extern int
|
||||
__miniglx_Select( Display *dpy, int maxfd,
|
||||
__miniglx_Select( MINI_Display *dpy, int maxfd,
|
||||
fd_set *rfds, fd_set *wfds, fd_set *xfds,
|
||||
struct timeval *tv );
|
||||
|
||||
@@ -331,25 +350,25 @@ __miniglx_Select( Display *dpy, int maxfd,
|
||||
* \name Simulated Xlib functions
|
||||
*/
|
||||
/*@{*/
|
||||
extern Display *
|
||||
extern MINI_Display *
|
||||
XOpenDisplay( const char *dpy_name );
|
||||
|
||||
|
||||
extern void
|
||||
XCloseDisplay( Display *display );
|
||||
XCloseDisplay( MINI_Display *display );
|
||||
|
||||
extern Window
|
||||
XCreateWindow( Display *display, Window parent, int x, int y,
|
||||
extern MINI_Window
|
||||
XCreateWindow( MINI_Display *display, MINI_Window parent, int x, int y,
|
||||
unsigned int width, unsigned int height,
|
||||
unsigned int border_width, int depth, unsigned int winclass,
|
||||
Visual *visual, unsigned long valuemask,
|
||||
XSetWindowAttributes *attributes );
|
||||
|
||||
extern int
|
||||
XNextEvent(Display *display, XEvent *event_return);
|
||||
XNextEvent(MINI_Display *display, XEvent *event_return);
|
||||
|
||||
extern Bool
|
||||
XCheckMaskEvent( Display *dpy, long event_mask, XEvent *event_return );
|
||||
extern MINI_Bool
|
||||
XCheckMaskEvent( MINI_Display *dpy, long event_mask, XEvent *event_return );
|
||||
|
||||
/**
|
||||
* \brief Return the root window.
|
||||
@@ -365,27 +384,27 @@ XCheckMaskEvent( Display *dpy, long event_mask, XEvent *event_return );
|
||||
#define DefaultScreen(dpy) 0
|
||||
|
||||
extern void
|
||||
XDestroyWindow( Display *display, Window w );
|
||||
XDestroyWindow( MINI_Display *display, MINI_Window w );
|
||||
|
||||
extern void
|
||||
XMapWindow( Display *display, Window w );
|
||||
XMapWindow( MINI_Display *display, MINI_Window w );
|
||||
|
||||
/* Should clients have access to this?
|
||||
*/
|
||||
extern void
|
||||
XUnmapWindow( Display *display, Window w );
|
||||
XUnmapWindow( MINI_Display *display, MINI_Window w );
|
||||
|
||||
extern Colormap
|
||||
XCreateColormap( Display *display, Window w, Visual *visual, int alloc );
|
||||
extern MINI_Colormap
|
||||
XCreateColormap( MINI_Display *display, MINI_Window w, Visual *visual, int alloc );
|
||||
|
||||
extern void
|
||||
XFreeColormap( Display *display, Colormap cmap );
|
||||
XFreeColormap( MINI_Display *display, MINI_Colormap cmap );
|
||||
|
||||
extern void
|
||||
XFree( void *data );
|
||||
|
||||
extern XVisualInfo *
|
||||
XGetVisualInfo( Display *display, long vinfo_mask,
|
||||
XGetVisualInfo( MINI_Display *display, long vinfo_mask,
|
||||
XVisualInfo *vinfo_template, int *nitems_return );
|
||||
/*@}*/
|
||||
|
||||
@@ -396,23 +415,23 @@ XGetVisualInfo( Display *display, long vinfo_mask,
|
||||
*/
|
||||
/*@{*/
|
||||
extern XVisualInfo*
|
||||
glXChooseVisual( Display *dpy, int screen, int *attribList );
|
||||
glXChooseVisual( MINI_Display *dpy, int screen, int *attribList );
|
||||
|
||||
extern int
|
||||
glXGetConfig( Display *dpy, XVisualInfo *vis, int attrib, int *value );
|
||||
glXGetConfig( MINI_Display *dpy, XVisualInfo *vis, int attrib, int *value );
|
||||
|
||||
extern GLXContext
|
||||
glXCreateContext( Display *dpy, XVisualInfo *vis,
|
||||
GLXContext shareList, Bool direct );
|
||||
glXCreateContext( MINI_Display *dpy, XVisualInfo *vis,
|
||||
GLXContext shareList, MINI_Bool direct );
|
||||
|
||||
extern void
|
||||
glXDestroyContext( Display *dpy, GLXContext ctx );
|
||||
glXDestroyContext( MINI_Display *dpy, GLXContext ctx );
|
||||
|
||||
extern Bool
|
||||
glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx);
|
||||
extern MINI_Bool
|
||||
glXMakeCurrent( MINI_Display *dpy, GLXDrawable drawable, GLXContext ctx);
|
||||
|
||||
extern void
|
||||
glXSwapBuffers( Display *dpy, GLXDrawable drawable );
|
||||
glXSwapBuffers( MINI_Display *dpy, GLXDrawable drawable );
|
||||
|
||||
extern GLXContext
|
||||
glXGetCurrentContext( void );
|
||||
@@ -423,22 +442,35 @@ glXGetCurrentDrawable( void );
|
||||
extern void
|
||||
(*glXGetProcAddress(const GLubyte *procname))( void );
|
||||
|
||||
extern Bool
|
||||
glXQueryVersion( Display *dpy, int *major, int *minor );
|
||||
extern MINI_Bool
|
||||
glXQueryVersion( MINI_Display *dpy, int *major, int *minor );
|
||||
|
||||
/* Added in MiniGLX 1.1 */
|
||||
extern GLXPbuffer
|
||||
glXCreatePbuffer( Display *dpy, GLXFBConfig config, const int *attribList );
|
||||
glXCreatePbuffer( MINI_Display *dpy, GLXFBConfig config, const int *attribList );
|
||||
|
||||
extern void
|
||||
glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf );
|
||||
glXDestroyPbuffer( MINI_Display *dpy, GLXPbuffer pbuf );
|
||||
|
||||
extern GLXFBConfig *
|
||||
glXChooseFBConfig( Display *dpy, int screen, const int *attribList,
|
||||
glXChooseFBConfig( MINI_Display *dpy, int screen, const int *attribList,
|
||||
int *nitems );
|
||||
|
||||
extern XVisualInfo *
|
||||
glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config );
|
||||
glXGetVisualFromFBConfig( MINI_Display *dpy, GLXFBConfig config );
|
||||
|
||||
extern void *glXAllocateMemoryMESA(Display *dpy, int scrn,
|
||||
size_t size, float readFreq,
|
||||
float writeFreq, float priority);
|
||||
|
||||
extern void glXFreeMemoryMESA(Display *dpy, int scrn, void *pointer);
|
||||
|
||||
extern GLuint glXGetMemoryOffsetMESA( Display *dpy, int scrn,
|
||||
const void *pointer );
|
||||
/*@}*/
|
||||
|
||||
extern void
|
||||
__glXScrEnableExtension( void *, const char * name );
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
274
include/GLES/egl.h
Normal file
274
include/GLES/egl.h
Normal file
@@ -0,0 +1,274 @@
|
||||
#ifndef _EGL_H
|
||||
#define _EGL_H
|
||||
|
||||
/*
|
||||
** License Applicability. Except to the extent portions of this file are
|
||||
** made subject to an alternative license as permitted in the SGI Free
|
||||
** Software License B, Version 1.0 (the "License"), the contents of this
|
||||
** file are subject only to the provisions of the License. You may not use
|
||||
** this file except in compliance with the License. You may obtain a copy
|
||||
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
|
||||
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
|
||||
**
|
||||
** http://oss.sgi.com/projects/FreeB
|
||||
**
|
||||
** Note that, as provided in the License, the Software is distributed on an
|
||||
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
|
||||
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
|
||||
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
|
||||
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
|
||||
**
|
||||
** Original Code. The Original Code is: OpenGL Sample Implementation,
|
||||
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
|
||||
** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc.
|
||||
** Copyright in any portions created by third parties is as indicated
|
||||
** elsewhere herein. All Rights Reserved.
|
||||
**
|
||||
** Additional Notice Provisions: The application programming interfaces
|
||||
** established by SGI in conjunction with the Original Code are The
|
||||
** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
|
||||
** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
|
||||
** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
|
||||
** Window System(R) (Version 1.3), released October 19, 1998. This software
|
||||
** was created using the OpenGL(R) version 1.2.1 Sample Implementation
|
||||
** published by SGI, but has not been independently verified as being
|
||||
** compliant with the OpenGL(R) version 1.2.1 Specification.
|
||||
*/
|
||||
|
||||
#if 0/*XXX TEMPORARY HACK*/
|
||||
#include <GLES/gl.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#endif
|
||||
#include <GLES/egltypes.h>
|
||||
|
||||
/* XXX should go in eglext.h */
|
||||
#define GL_OES_VERSION_1_0 1
|
||||
#define GL_OES_read_format 1
|
||||
#define GL_OES_compressed_paletted_texture 1
|
||||
#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A
|
||||
#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B
|
||||
#define GL_PALETTE4_RGB8_OES 0x8B90
|
||||
#define GL_PALETTE4_RGBA8_OES 0x8B91
|
||||
#define GL_PALETTE4_R5_G6_B5_OES 0x8B92
|
||||
#define GL_PALETTE4_RGBA4_OES 0x8B93
|
||||
#define GL_PALETTE4_RGB5_A1_OES 0x8B94
|
||||
#define GL_PALETTE8_RGB8_OES 0x8B95
|
||||
#define GL_PALETTE8_RGBA8_OES 0x8B96
|
||||
#define GL_PALETTE8_R5_G6_B5_OES 0x8B97
|
||||
#define GL_PALETTE8_RGBA4_OES 0x8B98
|
||||
#define GL_PALETTE8_RGB5_A1_OES 0x8B99
|
||||
/* XXX */
|
||||
|
||||
/*
|
||||
** Versioning and extensions
|
||||
*/
|
||||
#define EGL_VERSION_1_0 1
|
||||
#if 0
|
||||
#define EGL_VERSION_1_1 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Boolean
|
||||
*/
|
||||
#define EGL_FALSE 0
|
||||
#define EGL_TRUE 1
|
||||
|
||||
/*
|
||||
** Errors
|
||||
*/
|
||||
#define EGL_SUCCESS 0x3000
|
||||
#define EGL_NOT_INITIALIZED 0x3001
|
||||
#define EGL_BAD_ACCESS 0x3002
|
||||
#define EGL_BAD_ALLOC 0x3003
|
||||
#define EGL_BAD_ATTRIBUTE 0x3004
|
||||
#define EGL_BAD_CONFIG 0x3005
|
||||
#define EGL_BAD_CONTEXT 0x3006
|
||||
#define EGL_BAD_CURRENT_SURFACE 0x3007
|
||||
#define EGL_BAD_DISPLAY 0x3008
|
||||
#define EGL_BAD_MATCH 0x3009
|
||||
#define EGL_BAD_NATIVE_PIXMAP 0x300A
|
||||
#define EGL_BAD_NATIVE_WINDOW 0x300B
|
||||
#define EGL_BAD_PARAMETER 0x300C
|
||||
#define EGL_BAD_SURFACE 0x300D
|
||||
#define EGL_CONTEXT_LOST 0x300E
|
||||
/* 0x300F - 0x301F reserved for additional errors. */
|
||||
|
||||
/*
|
||||
** Config attributes
|
||||
*/
|
||||
#define EGL_BUFFER_SIZE 0x3020
|
||||
#define EGL_ALPHA_SIZE 0x3021
|
||||
#define EGL_BLUE_SIZE 0x3022
|
||||
#define EGL_GREEN_SIZE 0x3023
|
||||
#define EGL_RED_SIZE 0x3024
|
||||
#define EGL_DEPTH_SIZE 0x3025
|
||||
#define EGL_STENCIL_SIZE 0x3026
|
||||
#define EGL_CONFIG_CAVEAT 0x3027
|
||||
#define EGL_CONFIG_ID 0x3028
|
||||
#define EGL_LEVEL 0x3029
|
||||
#define EGL_MAX_PBUFFER_HEIGHT 0x302A
|
||||
#define EGL_MAX_PBUFFER_PIXELS 0x302B
|
||||
#define EGL_MAX_PBUFFER_WIDTH 0x302C
|
||||
#define EGL_NATIVE_RENDERABLE 0x302D
|
||||
#define EGL_NATIVE_VISUAL_ID 0x302E
|
||||
#define EGL_NATIVE_VISUAL_TYPE 0x302F
|
||||
/*#define EGL_PRESERVED_RESOURCES 0x3030*/
|
||||
#define EGL_SAMPLES 0x3031
|
||||
#define EGL_SAMPLE_BUFFERS 0x3032
|
||||
#define EGL_SURFACE_TYPE 0x3033
|
||||
#define EGL_TRANSPARENT_TYPE 0x3034
|
||||
#define EGL_TRANSPARENT_BLUE_VALUE 0x3035
|
||||
#define EGL_TRANSPARENT_GREEN_VALUE 0x3036
|
||||
#define EGL_TRANSPARENT_RED_VALUE 0x3037
|
||||
#define EGL_NONE 0x3038 /* Also a config value */
|
||||
#define EGL_BIND_TO_TEXTURE_RGB 0x3039
|
||||
#define EGL_BIND_TO_TEXTURE_RGBA 0x303A
|
||||
#define EGL_MIN_SWAP_INTERVAL 0x303B
|
||||
#define EGL_MAX_SWAP_INTERVAL 0x303C
|
||||
|
||||
/*
|
||||
** Config values
|
||||
*/
|
||||
#define EGL_DONT_CARE ((EGLint) -1)
|
||||
|
||||
#define EGL_SLOW_CONFIG 0x3050 /* EGL_CONFIG_CAVEAT value */
|
||||
#define EGL_NON_CONFORMANT_CONFIG 0x3051 /* " */
|
||||
#define EGL_TRANSPARENT_RGB 0x3052 /* EGL_TRANSPARENT_TYPE value */
|
||||
#define EGL_NO_TEXTURE 0x305C /* EGL_TEXTURE_FORMAT/TARGET value */
|
||||
#define EGL_TEXTURE_RGB 0x305D /* EGL_TEXTURE_FORMAT value */
|
||||
#define EGL_TEXTURE_RGBA 0x305E /* " */
|
||||
#define EGL_TEXTURE_2D 0x305F /* EGL_TEXTURE_TARGET value */
|
||||
|
||||
/*
|
||||
** Config attribute mask bits
|
||||
*/
|
||||
#define EGL_PBUFFER_BIT 0x01 /* EGL_SURFACE_TYPE mask bit */
|
||||
#define EGL_PIXMAP_BIT 0x02 /* " */
|
||||
#define EGL_WINDOW_BIT 0x04 /* " */
|
||||
|
||||
/*
|
||||
** String names
|
||||
*/
|
||||
#define EGL_VENDOR 0x3053 /* eglQueryString target */
|
||||
#define EGL_VERSION 0x3054 /* " */
|
||||
#define EGL_EXTENSIONS 0x3055 /* " */
|
||||
|
||||
/*
|
||||
** Surface attributes
|
||||
*/
|
||||
#define EGL_HEIGHT 0x3056
|
||||
#define EGL_WIDTH 0x3057
|
||||
#define EGL_LARGEST_PBUFFER 0x3058
|
||||
#define EGL_TEXTURE_FORMAT 0x3080 /* For pbuffers bound as textures */
|
||||
#define EGL_TEXTURE_TARGET 0x3081 /* " */
|
||||
#define EGL_MIPMAP_TEXTURE 0x3082 /* " */
|
||||
#define EGL_MIPMAP_LEVEL 0x3083 /* " */
|
||||
|
||||
/*
|
||||
** BindTexImage / ReleaseTexImage buffer target
|
||||
*/
|
||||
#define EGL_BACK_BUFFER 0x3084
|
||||
|
||||
/*
|
||||
** Current surfaces
|
||||
*/
|
||||
#define EGL_DRAW 0x3059
|
||||
#define EGL_READ 0x305A
|
||||
|
||||
/*
|
||||
** Engines
|
||||
*/
|
||||
#define EGL_CORE_NATIVE_ENGINE 0x305B
|
||||
|
||||
/* 0x305C-0x3FFFF reserved for future use */
|
||||
|
||||
/*
|
||||
** Functions
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
GLAPI EGLint APIENTRY eglGetError (void);
|
||||
|
||||
GLAPI EGLDisplay APIENTRY eglGetDisplay (NativeDisplayType display);
|
||||
GLAPI EGLBoolean APIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||
GLAPI EGLBoolean APIENTRY eglTerminate (EGLDisplay dpy);
|
||||
GLAPI const char * APIENTRY eglQueryString (EGLDisplay dpy, EGLint name);
|
||||
GLAPI void (* APIENTRY eglGetProcAddress (const char *procname))(void);
|
||||
|
||||
GLAPI EGLBoolean APIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
GLAPI EGLBoolean APIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
GLAPI EGLBoolean APIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
|
||||
|
||||
GLAPI EGLSurface APIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list);
|
||||
GLAPI EGLSurface APIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list);
|
||||
GLAPI EGLSurface APIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||
GLAPI EGLBoolean APIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface);
|
||||
GLAPI EGLBoolean APIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||
|
||||
/* EGL 1.1 render-to-texture APIs */
|
||||
GLAPI EGLBoolean APIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
|
||||
GLAPI EGLBoolean APIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
GLAPI EGLBoolean APIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
|
||||
/* EGL 1.1 swap control API */
|
||||
GLAPI EGLBoolean APIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval);
|
||||
|
||||
GLAPI EGLContext APIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list);
|
||||
GLAPI EGLBoolean APIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx);
|
||||
GLAPI EGLBoolean APIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||
GLAPI EGLContext APIENTRY eglGetCurrentContext (void);
|
||||
GLAPI EGLSurface APIENTRY eglGetCurrentSurface (EGLint readdraw);
|
||||
GLAPI EGLDisplay APIENTRY eglGetCurrentDisplay (void);
|
||||
GLAPI EGLBoolean APIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
|
||||
|
||||
GLAPI EGLBoolean APIENTRY eglWaitGL (void);
|
||||
GLAPI EGLBoolean APIENTRY eglWaitNative (EGLint engine);
|
||||
GLAPI EGLBoolean APIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface draw);
|
||||
GLAPI EGLBoolean APIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, NativePixmapType target);
|
||||
|
||||
|
||||
|
||||
/* EGL_MESA_screen extension >>> PRELIMINARY <<< */
|
||||
#ifndef EGL_MESA_screen_surface
|
||||
#define EGL_MESA_screen_surface 1
|
||||
|
||||
#define EGL_BAD_SCREEN_MESA 0x4000
|
||||
#define EGL_BAD_MODE_MESA 0x4001
|
||||
#define EGL_SCREEN_COUNT_MESA 0x4002
|
||||
#define EGL_SCREEN_POSITION_MESA 0x4003
|
||||
#define EGL_MODE_ID_MESA 0x4004
|
||||
#define EGL_REFRESH_RATE_MESA 0x4005
|
||||
#define EGL_OPTIMAL_MODE_MESA 0x4006
|
||||
#define EGL_SCREEN_BIT_MESA 0x08
|
||||
|
||||
GLAPI EGLBoolean APIENTRY eglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen, const EGLint *attrib_list, EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes);
|
||||
GLAPI EGLBoolean APIENTRY eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes);
|
||||
GLAPI EGLBoolean APIENTRY eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, EGLint attribute, EGLint *value);
|
||||
GLAPI EGLBoolean APIENTRY eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens, EGLint max_screens, EGLint *num_screens);
|
||||
GLAPI EGLSurface APIENTRY eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||
GLAPI EGLBoolean APIENTRY eglShowSurfaceMESA(EGLDisplay dpy, EGLint screen, EGLSurface surface, EGLModeMESA mode);
|
||||
GLAPI EGLBoolean APIENTRY eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y);
|
||||
GLAPI EGLBoolean APIENTRY eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint attribute, EGLint *value);
|
||||
GLAPI EGLBoolean APIENTRY eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLSurface *surface);
|
||||
GLAPI EGLBoolean APIENTRY eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode);
|
||||
GLAPI const char * APIENTRY eglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode);
|
||||
|
||||
#endif /* EGL_MESA_screen_surface */
|
||||
|
||||
|
||||
#ifndef EGL_MESA_copy_context
|
||||
#define EGL_MESA_copy_context 1
|
||||
|
||||
GLAPI EGLBoolean APIENTRY eglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest, EGLint mask);
|
||||
|
||||
#endif /* EGL_MESA_copy_context */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _EGL_H */
|
45
include/GLES/egltypes.h
Normal file
45
include/GLES/egltypes.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
** egltypes.h for Mesa
|
||||
**
|
||||
** ONLY egl.h SHOULD INCLUDE THIS FILE!
|
||||
**
|
||||
** See comments about egltypes.h in the standard egl.h file.
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
|
||||
/*
|
||||
** These opaque EGL types are implemented as unsigned 32-bit integers:
|
||||
*/
|
||||
typedef u_int32_t EGLDisplay;
|
||||
typedef u_int32_t EGLConfig;
|
||||
typedef u_int32_t EGLSurface;
|
||||
typedef u_int32_t EGLContext;
|
||||
|
||||
/* EGL_MESA_screen_surface */
|
||||
typedef u_int32_t EGLModeMESA;
|
||||
typedef u_int32_t EGLScreenMESA;
|
||||
|
||||
|
||||
/*
|
||||
** Other basic EGL types:
|
||||
*/
|
||||
typedef u_int8_t EGLBoolean;
|
||||
typedef int32_t EGLint;
|
||||
|
||||
typedef void * NativeDisplayType;
|
||||
typedef int NativePixmapType;
|
||||
typedef int NativeWindowType;
|
||||
|
||||
/*
|
||||
** EGL and native handle null values:
|
||||
*/
|
||||
#define EGL_DEFAULT_DISPLAY ((NativeDisplayType) 0)
|
||||
#define EGL_NO_CONTEXT ((EGLContext) 0)
|
||||
#define EGL_NO_DISPLAY ((EGLDisplay) 0)
|
||||
#define EGL_NO_SURFACE ((EGLSurface) 0)
|
||||
|
||||
/* EGL_MESA_screen_surface */
|
||||
#define EGL_NO_MODE_MESA ((EGLModeMESA) 0)
|
@@ -127,4 +127,4 @@ osdemo32: osdemo32.c
|
||||
clean:
|
||||
-rm -f $(PROGS)
|
||||
-rm -f *.o *~
|
||||
-rm -f readtex.[ch]
|
||||
-rm -f readtex.[ch] showbuffer.[ch]
|
||||
|
@@ -51,20 +51,16 @@ static void Redisplay( void )
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||
|
||||
if (PixelLight) {
|
||||
#if defined(GL_ARB_fragment_program)
|
||||
glProgramLocalParameter4fvARB_func(GL_FRAGMENT_PROGRAM_ARB,
|
||||
LIGHTPOS, LightPos);
|
||||
glEnable(GL_FRAGMENT_PROGRAM_ARB);
|
||||
glEnable(GL_VERTEX_PROGRAM_ARB);
|
||||
#endif
|
||||
glDisable(GL_LIGHTING);
|
||||
}
|
||||
else {
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
|
||||
#if defined(GL_ARB_fragment_program)
|
||||
glDisable(GL_FRAGMENT_PROGRAM_ARB);
|
||||
glDisable(GL_VERTEX_PROGRAM_ARB);
|
||||
#endif
|
||||
glEnable(GL_LIGHTING);
|
||||
}
|
||||
|
||||
@@ -302,7 +298,6 @@ static void Init( void )
|
||||
glDeleteProgramsARB_func = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
|
||||
assert(glDeleteProgramsARB_func);
|
||||
|
||||
#if defined(GL_ARB_fragment_program)
|
||||
/*
|
||||
* Fragment program
|
||||
*/
|
||||
@@ -354,7 +349,6 @@ static void Init( void )
|
||||
exit(0);
|
||||
}
|
||||
assert(glIsProgramARB_func(VertProg));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Misc init
|
||||
@@ -371,11 +365,9 @@ static void Init( void )
|
||||
{
|
||||
/* Green-ish fog color */
|
||||
static const GLfloat fogColor[4] = {0.5, 1.0, 0.5, 0};
|
||||
glFogi(GL_FOG_MODE, GL_LINEAR);
|
||||
glFogfv(GL_FOG_COLOR, fogColor);
|
||||
glFogf(GL_FOG_START, 5.0);
|
||||
glFogf(GL_FOG_END, 25.0);
|
||||
glEnable(GL_FOG);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -304,7 +304,7 @@ printhelp(void)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
|
||||
|
||||
glRasterPos2i(60, 390);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Togle Help");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
|
||||
|
||||
glRasterPos2i(60, 360);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Increase particle size");
|
||||
@@ -317,9 +317,9 @@ printhelp(void)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "R - Decrease emission radius");
|
||||
|
||||
glRasterPos2i(60, 240);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Togle Fog");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
|
||||
glRasterPos2i(60, 210);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "s - Togle shadows");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "s - Toggle shadows");
|
||||
glRasterPos2i(60, 180);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
|
||||
glRasterPos2i(60, 150);
|
||||
@@ -330,7 +330,7 @@ printhelp(void)
|
||||
glRasterPos2i(60, 90);
|
||||
if (joyavailable)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"j - Togle jostick control (Joystick control available)");
|
||||
"j - Toggle jostick control (Joystick control available)");
|
||||
else
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"(No Joystick control available)");
|
||||
|
@@ -146,10 +146,10 @@ static void printhelp(void)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Help");
|
||||
|
||||
glRasterPos2i(60,390);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Togle Help");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Toggle Help");
|
||||
|
||||
glRasterPos2i(60,360);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Togle Fog");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Toggle Fog");
|
||||
glRasterPos2i(60,330);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Arrow Keys - Rotate");
|
||||
glRasterPos2i(60,300);
|
||||
|
@@ -269,13 +269,13 @@ printhelp(void)
|
||||
printstring(GLUT_BITMAP_HELVETICA_18, "Help");
|
||||
|
||||
glRasterPos2i(60, 390);
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "h - Togle Help");
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "h - Toggle Help");
|
||||
glRasterPos2i(60, 370);
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "f - Togle Fog");
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "f - Toggle Fog");
|
||||
glRasterPos2i(60, 350);
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "b - Togle Back face culling");
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "b - Toggle Back face culling");
|
||||
glRasterPos2i(60, 330);
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "p - Togle Wire frame");
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "p - Toggle Wire frame");
|
||||
glRasterPos2i(60, 310);
|
||||
printstring(GLUT_BITMAP_HELVETICA_12, "Arrow Keys - Rotate");
|
||||
glRasterPos2i(60, 290);
|
||||
@@ -286,7 +286,7 @@ printhelp(void)
|
||||
glRasterPos2i(60, 250);
|
||||
if (joyavailable)
|
||||
printstring(GLUT_BITMAP_HELVETICA_12,
|
||||
"j - Togle jostick control (Joystick control available)");
|
||||
"j - Toggle jostick control (Joystick control available)");
|
||||
else
|
||||
printstring(GLUT_BITMAP_HELVETICA_12,
|
||||
"(No Joystick control available)");
|
||||
@@ -300,11 +300,11 @@ printhelp(void)
|
||||
|
||||
glRasterPos2i(60, 190);
|
||||
printstring(GLUT_BITMAP_HELVETICA_12,
|
||||
"1 - Togle the plane texture map window");
|
||||
"1 - Toggle the plane texture map window");
|
||||
|
||||
glRasterPos2i(60, 170);
|
||||
printstring(GLUT_BITMAP_HELVETICA_12,
|
||||
"2 - Togle the sphere texture map window");
|
||||
"2 - Toggle the sphere texture map window");
|
||||
}
|
||||
|
||||
static GLboolean
|
||||
|
@@ -39,6 +39,10 @@ static GLenum ReadType = GL_UNSIGNED_BYTE;
|
||||
#endif
|
||||
#if 0
|
||||
static GLenum ReadFormat = GL_RGB;
|
||||
static GLenum ReadType = GL_UNSIGNED_BYTE;
|
||||
#endif
|
||||
#if 0
|
||||
static GLenum ReadFormat = GL_RGB;
|
||||
static GLenum ReadType = GL_UNSIGNED_SHORT_5_6_5;
|
||||
#endif
|
||||
#if 0
|
||||
@@ -96,6 +100,45 @@ SetupPixelTransfer(GLboolean invert)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Pixel Pack parameters by reading the image in four pieces.
|
||||
*/
|
||||
static void
|
||||
ComplexReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
|
||||
GLenum format, GLenum type, GLvoid *pixels)
|
||||
{
|
||||
const GLsizei width0 = width / 2;
|
||||
const GLsizei width1 = width - width0;
|
||||
const GLsizei height0 = height / 2;
|
||||
const GLsizei height1 = height - height0;
|
||||
|
||||
glPixelStorei(GL_PACK_ROW_LENGTH, width);
|
||||
|
||||
/* lower-left quadrant */
|
||||
glReadPixels(x, y, width0, height0, format, type, pixels);
|
||||
|
||||
/* lower-right quadrant */
|
||||
glPixelStorei(GL_PACK_SKIP_PIXELS, width0);
|
||||
glReadPixels(x + width0, y, width1, height0, format, type, pixels);
|
||||
|
||||
/* upper-left quadrant */
|
||||
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_PACK_SKIP_ROWS, height0);
|
||||
glReadPixels(x, y + height0, width0, height1, format, type, pixels);
|
||||
|
||||
/* upper-right quadrant */
|
||||
glPixelStorei(GL_PACK_SKIP_PIXELS, width0);
|
||||
glPixelStorei(GL_PACK_SKIP_ROWS, height0);
|
||||
glReadPixels(x + width0, y + height0, width1, height1, format, type, pixels);
|
||||
|
||||
/* restore defaults */
|
||||
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
|
||||
glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
Display( void )
|
||||
{
|
||||
@@ -111,8 +154,13 @@ Display( void )
|
||||
glRasterPos2i(APosX, APosY);
|
||||
glEnable(GL_DITHER);
|
||||
SetupPixelTransfer(GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glDrawPixels(ImgWidth, ImgHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
|
||||
|
||||
/* might try alignment=4 here for testing */
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
|
||||
/* do readpixels, drawpixels */
|
||||
glRasterPos2i(BPosX, 5);
|
||||
PrintString("Read/DrawPixels");
|
||||
@@ -138,8 +186,14 @@ Display( void )
|
||||
else {
|
||||
/* clear the temporary image to white (helpful for debugging */
|
||||
memset(TempImage, 255, ImgWidth * ImgHeight * 4);
|
||||
#if 0
|
||||
/* you might use this when debugging */
|
||||
glReadPixels(APosX, APosY, ImgWidth, ImgHeight,
|
||||
ReadFormat, ReadType, TempImage);
|
||||
#else
|
||||
ComplexReadPixels(APosX, APosY, ImgWidth, ImgHeight,
|
||||
ReadFormat, ReadType, TempImage);
|
||||
#endif
|
||||
}
|
||||
glRasterPos2i(BPosX, BPosY);
|
||||
glDisable(GL_DITHER);
|
||||
@@ -253,14 +307,14 @@ Init( GLboolean ciMode )
|
||||
|
||||
printf("Loaded %d by %d image\n", ImgWidth, ImgHeight );
|
||||
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, ImgWidth);
|
||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth);
|
||||
|
||||
Reset();
|
||||
|
||||
TempImage = (GLubyte *) malloc(ImgWidth * ImgHeight * 4 * sizeof(GLubyte));
|
||||
/* allocate an extra 1KB in case we're tinkering with pack alignment */
|
||||
TempImage = (GLubyte *) malloc(ImgWidth * ImgHeight * 4 * sizeof(GLubyte)
|
||||
+ 1000);
|
||||
assert(TempImage);
|
||||
}
|
||||
|
||||
|
@@ -389,7 +389,7 @@ static void SpecialKey( int key, int x, int y )
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
glutInit(&argc, argv);
|
||||
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL);
|
||||
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL | GLUT_ALPHA);
|
||||
glutInitWindowPosition( 0, 0 );
|
||||
glutInitWindowSize( Width, Height );
|
||||
glutCreateWindow(argv[0]);
|
||||
|
@@ -250,13 +250,13 @@ static void printhelp(void)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Help");
|
||||
|
||||
glRasterPos2i(60,390);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Togle Help");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Toggle Help");
|
||||
glRasterPos2i(60,360);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"t - Togle Textures");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"t - Toggle Textures");
|
||||
glRasterPos2i(60,330);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Togle Fog");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Toggle Fog");
|
||||
glRasterPos2i(60,300);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"b - Togle Back face culling");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"b - Toggle Back face culling");
|
||||
glRasterPos2i(60,270);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Arrow Keys - Rotate");
|
||||
glRasterPos2i(60,240);
|
||||
@@ -266,7 +266,7 @@ static void printhelp(void)
|
||||
|
||||
glRasterPos2i(60,180);
|
||||
if(joyavailable)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"j - Togle jostick control (Joystick control available)");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"j - Toggle jostick control (Joystick control available)");
|
||||
else
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"(No Joystick control available)");
|
||||
}
|
||||
|
@@ -229,15 +229,15 @@ printhelp(void)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
|
||||
|
||||
glRasterPos2i(60, 390);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Togle Help");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
|
||||
glRasterPos2i(60, 360);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Togle Textures");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
|
||||
glRasterPos2i(60, 330);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Togle Fog");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
|
||||
glRasterPos2i(60, 300);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "p - Wire frame");
|
||||
glRasterPos2i(60, 270);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Togle Back face culling");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
|
||||
glRasterPos2i(60, 240);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
|
||||
glRasterPos2i(60, 210);
|
||||
@@ -248,7 +248,7 @@ printhelp(void)
|
||||
glRasterPos2i(60, 150);
|
||||
if (joyavailable)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"j - Togle jostick control (Joystick control available)");
|
||||
"j - Toggle jostick control (Joystick control available)");
|
||||
else
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"(No Joystick control available)");
|
||||
|
@@ -47,7 +47,6 @@ static GLdouble DownloadRate = 0.0; /* texels/sec */
|
||||
static GLuint Mode = 0;
|
||||
|
||||
|
||||
#define NUM_FORMATS 4
|
||||
struct FormatRec {
|
||||
GLenum Format;
|
||||
GLenum Type;
|
||||
@@ -56,15 +55,20 @@ struct FormatRec {
|
||||
};
|
||||
|
||||
|
||||
static const struct FormatRec FormatTable[NUM_FORMATS] = {
|
||||
static const struct FormatRec FormatTable[] = {
|
||||
/* Format Type IntFormat TexelSize */
|
||||
{ GL_BGRA, GL_UNSIGNED_BYTE, GL_RGBA, 4 },
|
||||
{ GL_RGB, GL_UNSIGNED_BYTE, GL_RGB, 3 },
|
||||
{ GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, 4 },
|
||||
{ GL_RGBA, GL_UNSIGNED_BYTE, GL_RGB, 4 },
|
||||
{ GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB, 2 },
|
||||
{ GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE, 1 },
|
||||
{ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_LUMINANCE_ALPHA, 2 },
|
||||
{ GL_ALPHA, GL_UNSIGNED_BYTE, GL_ALPHA, 1 },
|
||||
};
|
||||
static GLint Format;
|
||||
|
||||
#define NUM_FORMATS (sizeof(FormatTable)/sizeof(FormatTable[0]))
|
||||
|
||||
static int
|
||||
BytesPerTexel(GLint format)
|
||||
@@ -81,6 +85,14 @@ FormatStr(GLenum format)
|
||||
return "GL_RGB";
|
||||
case GL_RGBA:
|
||||
return "GL_RGBA";
|
||||
case GL_BGRA:
|
||||
return "GL_BGRA";
|
||||
case GL_LUMINANCE:
|
||||
return "GL_LUMINANCE";
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
return "GL_LUMINANCE_ALPHA";
|
||||
case GL_ALPHA:
|
||||
return "GL_ALPHA";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
@@ -314,6 +326,11 @@ Key(unsigned char key, int x, int y)
|
||||
Format = (Format + 1) % NUM_FORMATS;
|
||||
Mode = 0;
|
||||
break;
|
||||
case 'F':
|
||||
/* change format */
|
||||
Format = (Format - 1) % NUM_FORMATS;
|
||||
Mode = 0;
|
||||
break;
|
||||
case 'p':
|
||||
/* toggle border */
|
||||
ScaleAndBias = !ScaleAndBias;
|
||||
|
@@ -300,15 +300,15 @@ printhelp(void)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
|
||||
|
||||
glRasterPos2i(60, 390);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Togle Help");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
|
||||
glRasterPos2i(60, 360);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Togle Textures");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
|
||||
glRasterPos2i(60, 330);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Togle Fog");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
|
||||
glRasterPos2i(60, 300);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "m - Togle strips");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "m - Toggle strips");
|
||||
glRasterPos2i(60, 270);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Togle Back face culling");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
|
||||
glRasterPos2i(60, 240);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
|
||||
glRasterPos2i(60, 210);
|
||||
@@ -319,7 +319,7 @@ printhelp(void)
|
||||
glRasterPos2i(60, 150);
|
||||
if (joyavailable)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"j - Togle jostick control (Joystick control available)");
|
||||
"j - Toggle jostick control (Joystick control available)");
|
||||
else
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"(No Joystick control available)");
|
||||
|
@@ -324,15 +324,15 @@ printhelp(void)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
|
||||
|
||||
glRasterPos2i(60, 390);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Togle Help");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
|
||||
glRasterPos2i(60, 360);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Togle Textures");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
|
||||
glRasterPos2i(60, 330);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Togle Fog");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
|
||||
glRasterPos2i(60, 300);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "m - Togle strips");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "m - Toggle strips");
|
||||
glRasterPos2i(60, 270);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Togle Back face culling");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
|
||||
glRasterPos2i(60, 240);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
|
||||
glRasterPos2i(60, 210);
|
||||
@@ -343,7 +343,7 @@ printhelp(void)
|
||||
glRasterPos2i(60, 150);
|
||||
if (joyavailable)
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"j - Togle jostick control (Joystick control available)");
|
||||
"j - Toggle jostick control (Joystick control available)");
|
||||
else
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,
|
||||
"(No Joystick control available)");
|
||||
|
58
progs/egl/Makefile
Normal file
58
progs/egl/Makefile
Normal file
@@ -0,0 +1,58 @@
|
||||
# progs/egl/Makefile
|
||||
|
||||
TOP = ../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
|
||||
INCLUDE_DIRS = -I$(TOP)/include
|
||||
|
||||
HEADERS = $(TOP)/include/GLES/egl.h
|
||||
|
||||
PROGRAMS = \
|
||||
demo1 \
|
||||
demo2 \
|
||||
demo3 \
|
||||
eglinfo
|
||||
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
|
||||
|
||||
|
||||
|
||||
default: $(PROGRAMS)
|
||||
|
||||
|
||||
demo1: demo1.o $(LIB_DIR)/libEGL.so
|
||||
$(CC) demo1.o -L$(LIB_DIR) -lEGL -o $@
|
||||
|
||||
demo1.o: demo1.c $(HEADERS)
|
||||
$(CC) -c $(CFLAGS) -I$(TOP)/include demo1.c
|
||||
|
||||
|
||||
demo2: demo2.o $(LIB_DIR)/libEGL.so
|
||||
$(CC) demo2.o -L$(LIB_DIR) -lEGL $(APP_LIB_DEPS) -o $@
|
||||
|
||||
demo2.o: demo2.c $(HEADERS)
|
||||
$(CC) -c $(CFLAGS) -I$(TOP)/include demo2.c
|
||||
|
||||
|
||||
demo3: demo3.o $(LIB_DIR)/libEGL.so
|
||||
$(CC) demo3.o -L$(LIB_DIR) -lEGL $(APP_LIB_DEPS) -o $@
|
||||
|
||||
demo3.o: demo3.c $(HEADERS)
|
||||
$(CC) -c $(CFLAGS) -I$(TOP)/include demo3.c
|
||||
|
||||
|
||||
eglinfo: eglinfo.o $(LIB_DIR)/libEGL.so
|
||||
$(CC) eglinfo.o -L$(LIB_DIR) -lEGL -o $@
|
||||
|
||||
eglinfo.o: eglinfo.c $(HEADERS)
|
||||
$(CC) -c $(CFLAGS) -I$(TOP)/include eglinfo.c
|
||||
|
||||
|
||||
|
||||
clean:
|
||||
rm -f *.o *~
|
||||
rm -f *.so
|
||||
rm -f $(PROGRAMS)
|
146
progs/egl/demo1.c
Normal file
146
progs/egl/demo1.c
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Exercise EGL API functions
|
||||
*/
|
||||
|
||||
#include <GLES/egl.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/**
|
||||
* Test EGL_MESA_screen_surface functions
|
||||
*/
|
||||
static void
|
||||
TestScreens(EGLDisplay dpy)
|
||||
{
|
||||
#define MAX 8
|
||||
EGLScreenMESA screens[MAX];
|
||||
EGLint numScreens;
|
||||
EGLint i;
|
||||
|
||||
eglGetScreensMESA(dpy, screens, MAX, &numScreens);
|
||||
printf("Found %d screens\n", numScreens);
|
||||
for (i = 0; i < numScreens; i++) {
|
||||
printf(" Screen %d handle: %d\n", i, (int) screens[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Print table of all available configurations.
|
||||
*/
|
||||
static void
|
||||
PrintConfigs(EGLDisplay d)
|
||||
{
|
||||
EGLConfig *configs;
|
||||
EGLint numConfigs, i;
|
||||
|
||||
eglGetConfigs(d, NULL, 0, &numConfigs);
|
||||
configs = malloc(sizeof(*configs) *numConfigs);
|
||||
eglGetConfigs(d, configs, numConfigs, &numConfigs);
|
||||
|
||||
printf("Configurations:\n");
|
||||
printf(" bf lv d st colorbuffer dp st supported \n");
|
||||
printf(" id sz l b ro r g b a th cl surfaces \n");
|
||||
printf("----------------------------------------------\n");
|
||||
for (i = 0; i < numConfigs; i++) {
|
||||
EGLint id, size, level;
|
||||
EGLint red, green, blue, alpha;
|
||||
EGLint depth, stencil;
|
||||
EGLint surfaces;
|
||||
EGLint doubleBuf = 1, stereo = 0;
|
||||
char surfString[100] = "";
|
||||
|
||||
eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level);
|
||||
|
||||
eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces);
|
||||
|
||||
if (surfaces & EGL_WINDOW_BIT)
|
||||
strcat(surfString, "win,");
|
||||
if (surfaces & EGL_PBUFFER_BIT)
|
||||
strcat(surfString, "pb,");
|
||||
if (surfaces & EGL_PIXMAP_BIT)
|
||||
strcat(surfString, "pix,");
|
||||
if (strlen(surfString) > 0)
|
||||
surfString[strlen(surfString) - 1] = 0;
|
||||
|
||||
printf("0x%02x %2d %2d %c %c %2d %2d %2d %2d %2d %2d %-12s\n",
|
||||
id, size, level,
|
||||
doubleBuf ? 'y' : '.',
|
||||
stereo ? 'y' : '.',
|
||||
red, green, blue, alpha,
|
||||
depth, stencil, surfString);
|
||||
}
|
||||
free(configs);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int maj, min;
|
||||
EGLContext ctx;
|
||||
EGLSurface pbuffer;
|
||||
EGLConfig configs[10];
|
||||
EGLint numConfigs, i;
|
||||
EGLBoolean b;
|
||||
const EGLint pbufAttribs[] = {
|
||||
EGL_WIDTH, 500,
|
||||
EGL_HEIGHT, 500,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
/*
|
||||
EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
*/
|
||||
EGLDisplay d = eglGetDisplay("!fb_dri");
|
||||
assert(d);
|
||||
|
||||
if (!eglInitialize(d, &maj, &min)) {
|
||||
printf("demo: eglInitialize failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("EGL version = %d.%d\n", maj, min);
|
||||
printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
|
||||
|
||||
PrintConfigs(d);
|
||||
|
||||
ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
|
||||
if (ctx == EGL_NO_CONTEXT) {
|
||||
printf("failed to create context\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs);
|
||||
if (pbuffer == EGL_NO_SURFACE) {
|
||||
printf("failed to create pbuffer\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
b = eglMakeCurrent(d, pbuffer, pbuffer, ctx);
|
||||
if (!b) {
|
||||
printf("make current failed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
|
||||
TestScreens(d);
|
||||
|
||||
eglDestroySurface(d, pbuffer);
|
||||
eglDestroyContext(d, ctx);
|
||||
eglTerminate(d);
|
||||
|
||||
return 0;
|
||||
}
|
190
progs/egl/demo2.c
Normal file
190
progs/egl/demo2.c
Normal file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* Exercise EGL API functions
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <GLES/egl.h>
|
||||
|
||||
//#define FRONTBUFFER
|
||||
|
||||
static void _subset_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
|
||||
{
|
||||
glBegin( GL_QUADS );
|
||||
glVertex2f( x1, y1 );
|
||||
glVertex2f( x2, y1 );
|
||||
glVertex2f( x2, y2 );
|
||||
glVertex2f( x1, y2 );
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
static void redraw(EGLDisplay dpy, EGLSurface surf, int rot)
|
||||
{
|
||||
printf("Redraw event\n");
|
||||
|
||||
#ifdef FRONTBUFFER
|
||||
glDrawBuffer( GL_FRONT );
|
||||
#else
|
||||
glDrawBuffer( GL_BACK );
|
||||
#endif
|
||||
|
||||
glClearColor( rand()/(float)RAND_MAX,
|
||||
rand()/(float)RAND_MAX,
|
||||
rand()/(float)RAND_MAX,
|
||||
1);
|
||||
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
glColor3f( rand()/(float)RAND_MAX,
|
||||
rand()/(float)RAND_MAX,
|
||||
rand()/(float)RAND_MAX );
|
||||
glPushMatrix();
|
||||
glRotatef(rot, 0, 0, 1);
|
||||
glScalef(.5, .5, .5);
|
||||
_subset_Rectf( -1, -1, 1, 1 );
|
||||
glPopMatrix();
|
||||
|
||||
#ifdef FRONTBUFFER
|
||||
glFlush();
|
||||
#else
|
||||
eglSwapBuffers( dpy, surf );
|
||||
#endif
|
||||
glFinish();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test EGL_MESA_screen_surface functions
|
||||
*/
|
||||
static void
|
||||
TestScreens(EGLDisplay dpy)
|
||||
{
|
||||
#define MAX 8
|
||||
EGLScreenMESA screens[MAX];
|
||||
EGLint numScreens;
|
||||
EGLint i;
|
||||
|
||||
eglGetScreensMESA(dpy, screens, MAX, &numScreens);
|
||||
printf("Found %d screens\n", numScreens);
|
||||
for (i = 0; i < numScreens; i++) {
|
||||
printf(" Screen %d handle: %d\n", i, (int) screens[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int maj, min;
|
||||
EGLContext ctx;
|
||||
EGLSurface pbuffer, screen_surf;
|
||||
EGLConfig configs[10];
|
||||
EGLint numConfigs, i;
|
||||
EGLBoolean b;
|
||||
const EGLint pbufAttribs[] = {
|
||||
EGL_WIDTH, 500,
|
||||
EGL_HEIGHT, 500,
|
||||
EGL_NONE
|
||||
};
|
||||
const EGLint screenAttribs[] = {
|
||||
EGL_WIDTH, 1024,
|
||||
EGL_HEIGHT, 768,
|
||||
EGL_NONE
|
||||
};
|
||||
EGLModeMESA mode;
|
||||
EGLScreenMESA screen;
|
||||
EGLint count;
|
||||
|
||||
/*
|
||||
EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
*/
|
||||
EGLDisplay d = eglGetDisplay("!fb_dri");
|
||||
assert(d);
|
||||
|
||||
if (!eglInitialize(d, &maj, &min)) {
|
||||
printf("demo: eglInitialize failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("EGL version = %d.%d\n", maj, min);
|
||||
printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
|
||||
|
||||
eglGetConfigs(d, configs, 10, &numConfigs);
|
||||
printf("Got %d EGL configs:\n", numConfigs);
|
||||
for (i = 0; i < numConfigs; i++) {
|
||||
EGLint id, red, depth;
|
||||
eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
|
||||
printf("%2d: Red Size = %d Depth Size = %d\n", id, red, depth);
|
||||
}
|
||||
|
||||
eglGetScreensMESA(d, &screen, 1, &count);
|
||||
eglGetModesMESA(d, screen, &mode, 1, &count);
|
||||
|
||||
ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
|
||||
if (ctx == EGL_NO_CONTEXT) {
|
||||
printf("failed to create context\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs);
|
||||
if (pbuffer == EGL_NO_SURFACE) {
|
||||
printf("failed to create pbuffer\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
b = eglMakeCurrent(d, pbuffer, pbuffer, ctx);
|
||||
if (!b) {
|
||||
printf("make current failed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
|
||||
screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
|
||||
if (screen_surf == EGL_NO_SURFACE) {
|
||||
printf("failed to create screen surface\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
eglShowSurfaceMESA(d, screen, screen_surf, mode);
|
||||
|
||||
b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
|
||||
if (!b) {
|
||||
printf("make current failed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
glViewport(0, 0, 1024, 768);
|
||||
glDrawBuffer( GL_FRONT );
|
||||
|
||||
glClearColor( 0,
|
||||
1.0,
|
||||
0,
|
||||
1);
|
||||
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
|
||||
TestScreens(d);
|
||||
|
||||
glShadeModel( GL_FLAT );
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
redraw(d, screen_surf, i*10 );
|
||||
|
||||
printf("sleep(1)\n");
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
eglDestroySurface(d, pbuffer);
|
||||
eglDestroyContext(d, ctx);
|
||||
eglTerminate(d);
|
||||
|
||||
return 0;
|
||||
}
|
572
progs/egl/demo3.c
Normal file
572
progs/egl/demo3.c
Normal file
@@ -0,0 +1,572 @@
|
||||
/*
|
||||
* Exercise EGL API functions
|
||||
*/
|
||||
|
||||
#include <GLES/egl.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
#define PIXEL_CENTER(x) ((long)(x) + 0.5)
|
||||
|
||||
#define GAP 10
|
||||
#define ROWS 3
|
||||
#define COLS 4
|
||||
|
||||
#define OPENGL_WIDTH 48
|
||||
#define OPENGL_HEIGHT 13
|
||||
|
||||
|
||||
GLenum rgb, doubleBuffer, windType;
|
||||
GLint windW, windH;
|
||||
|
||||
GLenum mode1, mode2;
|
||||
GLint boxW, boxH;
|
||||
GLubyte OpenGL_bits[] = {
|
||||
0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
|
||||
0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
|
||||
0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01,
|
||||
0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
|
||||
0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00,
|
||||
0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
|
||||
0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00,
|
||||
0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
|
||||
0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e,
|
||||
0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
|
||||
0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00,
|
||||
};
|
||||
|
||||
|
||||
static void Init(void)
|
||||
{
|
||||
|
||||
mode1 = GL_TRUE;
|
||||
mode2 = GL_TRUE;
|
||||
}
|
||||
|
||||
static void Reshape(int width, int height)
|
||||
{
|
||||
|
||||
windW = (GLint)width;
|
||||
windH = (GLint)height;
|
||||
}
|
||||
|
||||
static void RotateColorMask(void)
|
||||
{
|
||||
static GLint rotation = 0;
|
||||
|
||||
rotation = (rotation + 1) & 0x3;
|
||||
switch (rotation) {
|
||||
case 0:
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
glIndexMask( 0xff );
|
||||
break;
|
||||
case 1:
|
||||
glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
glIndexMask(0xFE);
|
||||
break;
|
||||
case 2:
|
||||
glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
|
||||
glIndexMask(0xFD);
|
||||
break;
|
||||
case 3:
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
|
||||
glIndexMask(0xFB);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void Viewport(GLint row, GLint column)
|
||||
{
|
||||
GLint x, y;
|
||||
|
||||
boxW = (windW - (COLS + 1) * GAP) / COLS;
|
||||
boxH = (windH - (ROWS + 1) * GAP) / ROWS;
|
||||
|
||||
x = GAP + column * (boxW + GAP);
|
||||
y = GAP + row * (boxH + GAP);
|
||||
|
||||
glViewport(x, y, boxW, boxH);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
glScissor(x, y, boxW, boxH);
|
||||
}
|
||||
|
||||
enum {
|
||||
COLOR_BLACK = 0,
|
||||
COLOR_RED,
|
||||
COLOR_GREEN,
|
||||
COLOR_YELLOW,
|
||||
COLOR_BLUE,
|
||||
COLOR_MAGENTA,
|
||||
COLOR_CYAN,
|
||||
COLOR_WHITE
|
||||
};
|
||||
|
||||
static float RGBMap[9][3] = {
|
||||
{0, 0, 0},
|
||||
{1, 0, 0},
|
||||
{0, 1, 0},
|
||||
{1, 1, 0},
|
||||
{0, 0, 1},
|
||||
{1, 0, 1},
|
||||
{0, 1, 1},
|
||||
{1, 1, 1},
|
||||
{0.5, 0.5, 0.5}
|
||||
};
|
||||
|
||||
static void SetColor(int c)
|
||||
{
|
||||
glColor3fv(RGBMap[c]);
|
||||
}
|
||||
|
||||
static void Point(void)
|
||||
{
|
||||
GLint i;
|
||||
|
||||
glBegin(GL_POINTS);
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2i(0, 0);
|
||||
for (i = 1; i < 8; i++) {
|
||||
GLint j = i * 2;
|
||||
SetColor(COLOR_BLACK+i);
|
||||
glVertex2i(-j, -j);
|
||||
glVertex2i(-j, 0);
|
||||
glVertex2i(-j, j);
|
||||
glVertex2i(0, j);
|
||||
glVertex2i(j, j);
|
||||
glVertex2i(j, 0);
|
||||
glVertex2i(j, -j);
|
||||
glVertex2i(0, -j);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void Lines(void)
|
||||
{
|
||||
GLint i;
|
||||
|
||||
glPushMatrix();
|
||||
|
||||
glTranslatef(-12, 0, 0);
|
||||
for (i = 1; i < 8; i++) {
|
||||
SetColor(COLOR_BLACK+i);
|
||||
glBegin(GL_LINES);
|
||||
glVertex2i(-boxW/4, -boxH/4);
|
||||
glVertex2i(boxW/4, boxH/4);
|
||||
glEnd();
|
||||
glTranslatef(4, 0, 0);
|
||||
}
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
glBegin(GL_LINES);
|
||||
glVertex2i(0, 0);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void LineStrip(void)
|
||||
{
|
||||
|
||||
glBegin(GL_LINE_STRIP);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_LINE_STRIP);
|
||||
glVertex2i(0, 0);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void LineLoop(void)
|
||||
{
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
|
||||
glEnd();
|
||||
|
||||
glEnable(GL_LOGIC_OP);
|
||||
glLogicOp(GL_XOR);
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_ONE, GL_ONE);
|
||||
|
||||
SetColor(COLOR_MAGENTA);
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8));
|
||||
glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));
|
||||
glEnd();
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5));
|
||||
glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));
|
||||
glEnd();
|
||||
glDisable(GL_LOGIC_OP);
|
||||
glDisable(GL_BLEND);
|
||||
|
||||
SetColor(COLOR_GREEN);
|
||||
glBegin(GL_POINTS);
|
||||
glVertex2i(0, 0);
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex2i(0, 0);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void Bitmap(void)
|
||||
{
|
||||
|
||||
glBegin(GL_LINES);
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2i(-boxW/2, 0);
|
||||
glVertex2i(boxW/2, 0);
|
||||
glVertex2i(0, -boxH/2);
|
||||
glVertex2i(0, boxH/2);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2i(0, -3);
|
||||
glVertex2i(0, -3+OPENGL_HEIGHT);
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2i(0, -3);
|
||||
glVertex2i(OPENGL_WIDTH, -3);
|
||||
glEnd();
|
||||
|
||||
SetColor(COLOR_GREEN);
|
||||
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
|
||||
glRasterPos2i(0, 0);
|
||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits);
|
||||
}
|
||||
|
||||
static void Triangles(void)
|
||||
{
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2i(-boxW/4, -boxH/4);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2i(-boxW/8, -boxH/16);
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2i(boxW/8, -boxH/16);
|
||||
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2i(-boxW/4, boxH/4);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2i(-boxW/8, boxH/16);
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2i(boxW/8, boxH/16);
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
glVertex2i(0, 0);
|
||||
glVertex2i(-100, 100);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void TriangleStrip(void)
|
||||
{
|
||||
|
||||
glBegin(GL_TRIANGLE_STRIP);
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2i(-boxW/4, -boxH/4);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2i(-boxW/4, boxH/4);
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2i(0, -boxH/4);
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2i(0, boxH/4);
|
||||
SetColor(COLOR_CYAN);
|
||||
glVertex2i(boxW/4, -boxH/4);
|
||||
SetColor(COLOR_YELLOW);
|
||||
glVertex2i(boxW/4, boxH/4);
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_TRIANGLE_STRIP);
|
||||
glVertex2i(0, 0);
|
||||
glVertex2i(-100, 100);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void TriangleFan(void)
|
||||
{
|
||||
GLint vx[8][2];
|
||||
GLint x0, y0, x1, y1, x2, y2, x3, y3;
|
||||
GLint i;
|
||||
|
||||
y0 = -boxH/4;
|
||||
y1 = y0 + boxH/2/3;
|
||||
y2 = y1 + boxH/2/3;
|
||||
y3 = boxH/4;
|
||||
x0 = -boxW/4;
|
||||
x1 = x0 + boxW/2/3;
|
||||
x2 = x1 + boxW/2/3;
|
||||
x3 = boxW/4;
|
||||
|
||||
vx[0][0] = x0; vx[0][1] = y1;
|
||||
vx[1][0] = x0; vx[1][1] = y2;
|
||||
vx[2][0] = x1; vx[2][1] = y3;
|
||||
vx[3][0] = x2; vx[3][1] = y3;
|
||||
vx[4][0] = x3; vx[4][1] = y2;
|
||||
vx[5][0] = x3; vx[5][1] = y1;
|
||||
vx[6][0] = x2; vx[6][1] = y0;
|
||||
vx[7][0] = x1; vx[7][1] = y0;
|
||||
|
||||
glBegin(GL_TRIANGLE_FAN);
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2i(0, 0);
|
||||
for (i = 0; i < 8; i++) {
|
||||
SetColor(COLOR_WHITE-i);
|
||||
glVertex2iv(vx[i]);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_TRIANGLE_FAN);
|
||||
glVertex2i(0, 0);
|
||||
glVertex2i(-100, 100);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void Rect(void)
|
||||
{
|
||||
|
||||
SetColor(COLOR_GREEN);
|
||||
glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
|
||||
}
|
||||
|
||||
static void PolygonFunc(void)
|
||||
{
|
||||
GLint vx[8][2];
|
||||
GLint x0, y0, x1, y1, x2, y2, x3, y3;
|
||||
GLint i;
|
||||
|
||||
y0 = -boxH/4;
|
||||
y1 = y0 + boxH/2/3;
|
||||
y2 = y1 + boxH/2/3;
|
||||
y3 = boxH/4;
|
||||
x0 = -boxW/4;
|
||||
x1 = x0 + boxW/2/3;
|
||||
x2 = x1 + boxW/2/3;
|
||||
x3 = boxW/4;
|
||||
|
||||
vx[0][0] = x0; vx[0][1] = y1;
|
||||
vx[1][0] = x0; vx[1][1] = y2;
|
||||
vx[2][0] = x1; vx[2][1] = y3;
|
||||
vx[3][0] = x2; vx[3][1] = y3;
|
||||
vx[4][0] = x3; vx[4][1] = y2;
|
||||
vx[5][0] = x3; vx[5][1] = y1;
|
||||
vx[6][0] = x2; vx[6][1] = y0;
|
||||
vx[7][0] = x1; vx[7][1] = y0;
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
for (i = 0; i < 8; i++) {
|
||||
SetColor(COLOR_WHITE-i);
|
||||
glVertex2iv(vx[i]);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex2i(0, 0);
|
||||
glVertex2i(100, 100);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void Quads(void)
|
||||
{
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2i(-boxW/4, -boxH/4);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2i(-boxW/8, -boxH/16);
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2i(boxW/8, -boxH/16);
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2i(boxW/4, -boxH/4);
|
||||
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2i(-boxW/4, boxH/4);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2i(-boxW/8, boxH/16);
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2i(boxW/8, boxH/16);
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2i(boxW/4, boxH/4);
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2i(0, 0);
|
||||
glVertex2i(100, 100);
|
||||
glVertex2i(-100, 100);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void QuadStrip(void)
|
||||
{
|
||||
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
SetColor(COLOR_GREEN);
|
||||
glVertex2i(-boxW/4, -boxH/4);
|
||||
SetColor(COLOR_RED);
|
||||
glVertex2i(-boxW/4, boxH/4);
|
||||
SetColor(COLOR_BLUE);
|
||||
glVertex2i(0, -boxH/4);
|
||||
SetColor(COLOR_WHITE);
|
||||
glVertex2i(0, boxH/4);
|
||||
SetColor(COLOR_CYAN);
|
||||
glVertex2i(boxW/4, -boxH/4);
|
||||
SetColor(COLOR_YELLOW);
|
||||
glVertex2i(boxW/4, boxH/4);
|
||||
glEnd();
|
||||
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
glVertex2i(0, 0);
|
||||
glVertex2i(100, 100);
|
||||
glVertex2i(-100, 100);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void Draw(EGLDisplay dpy, EGLSurface surf)
|
||||
{
|
||||
|
||||
glViewport(0, 0, windW, windH);
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
||||
glPushAttrib(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glColorMask(1, 1, 1, 1);
|
||||
glIndexMask(~0);
|
||||
|
||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glPopAttrib();
|
||||
|
||||
if (mode1) {
|
||||
glShadeModel(GL_SMOOTH);
|
||||
} else {
|
||||
glShadeModel(GL_FLAT);
|
||||
}
|
||||
|
||||
if (mode2) {
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
} else {
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
}
|
||||
|
||||
Viewport(0, 0); Point();
|
||||
Viewport(0, 1); Lines();
|
||||
Viewport(0, 2); LineStrip();
|
||||
Viewport(0, 3); LineLoop();
|
||||
|
||||
Viewport(1, 0); Bitmap();
|
||||
|
||||
Viewport(1, 1); TriangleFan();
|
||||
Viewport(1, 2); Triangles();
|
||||
Viewport(1, 3); TriangleStrip();
|
||||
|
||||
Viewport(2, 0); Rect();
|
||||
Viewport(2, 1); PolygonFunc();
|
||||
Viewport(2, 2); Quads();
|
||||
Viewport(2, 3); QuadStrip();
|
||||
|
||||
glFlush();
|
||||
|
||||
if (doubleBuffer) {
|
||||
eglSwapBuffers(dpy, surf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int maj, min;
|
||||
EGLContext ctx;
|
||||
EGLSurface screen_surf;
|
||||
EGLConfig configs[10];
|
||||
EGLScreenMESA screen;
|
||||
EGLModeMESA mode;
|
||||
EGLint numConfigs, count;
|
||||
EGLBoolean b;
|
||||
const EGLint screenAttribs[] = {
|
||||
EGL_WIDTH, 1024,
|
||||
EGL_HEIGHT, 768,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
/*
|
||||
EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
*/
|
||||
EGLDisplay d = eglGetDisplay("!fb_dri");
|
||||
assert(d);
|
||||
|
||||
if (!eglInitialize(d, &maj, &min)) {
|
||||
printf("demo: eglInitialize failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("EGL version = %d.%d\n", maj, min);
|
||||
printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR));
|
||||
|
||||
eglGetConfigs(d, configs, 10, &numConfigs);
|
||||
eglGetScreensMESA(d, &screen, 1, &count);
|
||||
eglGetModesMESA(d, screen, &mode, 1, &count);
|
||||
|
||||
ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL);
|
||||
if (ctx == EGL_NO_CONTEXT) {
|
||||
printf("failed to create context\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs);
|
||||
if (screen_surf == EGL_NO_SURFACE) {
|
||||
printf("failed to create screen surface\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
eglShowSurfaceMESA(d, screen, screen_surf, mode);
|
||||
|
||||
b = eglMakeCurrent(d, screen_surf, screen_surf, ctx);
|
||||
if (!b) {
|
||||
printf("make current failed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
Init();
|
||||
Reshape(1024, 768);
|
||||
|
||||
glDrawBuffer( GL_FRONT );
|
||||
|
||||
Draw(d, screen_surf);
|
||||
|
||||
eglDestroySurface(d, screen_surf);
|
||||
eglDestroyContext(d, ctx);
|
||||
eglTerminate(d);
|
||||
|
||||
return 0;
|
||||
}
|
159
progs/egl/eglinfo.c
Normal file
159
progs/egl/eglinfo.c
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* eglinfo - like glxinfo but for EGL
|
||||
*
|
||||
* Brian Paul
|
||||
* 11 March 2005
|
||||
*
|
||||
* Copyright (C) 2005 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* 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
|
||||
* BRIAN PAUL 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 <GLES/egl.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_CONFIGS 1000
|
||||
#define MAX_MODES 1000
|
||||
|
||||
|
||||
/**
|
||||
* Print table of all available configurations.
|
||||
*/
|
||||
static void
|
||||
PrintConfigs(EGLDisplay d)
|
||||
{
|
||||
EGLConfig configs[MAX_CONFIGS];
|
||||
EGLint numConfigs, i;
|
||||
|
||||
eglGetConfigs(d, configs, MAX_CONFIGS, &numConfigs);
|
||||
|
||||
printf("Configurations:\n");
|
||||
printf(" bf lv d st colorbuffer dp st supported \n");
|
||||
printf(" id sz l b ro r g b a th cl surfaces \n");
|
||||
printf("----------------------------------------------\n");
|
||||
for (i = 0; i < numConfigs; i++) {
|
||||
EGLint id, size, level;
|
||||
EGLint red, green, blue, alpha;
|
||||
EGLint depth, stencil;
|
||||
EGLint surfaces;
|
||||
EGLint doubleBuf = 1, stereo = 0;
|
||||
char surfString[100] = "";
|
||||
|
||||
eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level);
|
||||
|
||||
eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil);
|
||||
eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces);
|
||||
|
||||
if (surfaces & EGL_WINDOW_BIT)
|
||||
strcat(surfString, "win,");
|
||||
if (surfaces & EGL_PBUFFER_BIT)
|
||||
strcat(surfString, "pb,");
|
||||
if (surfaces & EGL_PIXMAP_BIT)
|
||||
strcat(surfString, "pix,");
|
||||
if (strlen(surfString) > 0)
|
||||
surfString[strlen(surfString) - 1] = 0;
|
||||
|
||||
printf("0x%02x %2d %2d %c %c %2d %2d %2d %2d %2d %2d %-12s\n",
|
||||
id, size, level,
|
||||
doubleBuf ? 'y' : '.',
|
||||
stereo ? 'y' : '.',
|
||||
red, green, blue, alpha,
|
||||
depth, stencil, surfString);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Print table of all available configurations.
|
||||
*/
|
||||
static void
|
||||
PrintModes(EGLDisplay d)
|
||||
{
|
||||
#ifdef EGL_MESA_screen_surface
|
||||
const char *extensions = eglQueryString(d, EGL_EXTENSIONS);
|
||||
if (strstr("EGL_MESA_screen_surface", extensions)) {
|
||||
EGLScreenMESA screens[20];
|
||||
EGLint numScreens = 1, scrn;
|
||||
EGLModeMESA modes[MAX_MODES];
|
||||
|
||||
eglGetScreensMESA(d, screens, 20, &numScreens);
|
||||
printf("Number of Screens: %d\n\n", numScreens);
|
||||
|
||||
for (scrn = 0; scrn < numScreens; scrn++) {
|
||||
EGLint numModes, i;
|
||||
|
||||
eglGetModesMESA(d, screens[scrn], modes, MAX_MODES, &numModes);
|
||||
|
||||
printf("Screen %d Modes:\n", scrn);
|
||||
printf(" id width height refresh\n");
|
||||
printf("-------------------------\n");
|
||||
for (i = 0; i < numModes; i++) {
|
||||
EGLint id, w, h, r;
|
||||
eglGetModeAttribMESA(d, modes[i], EGL_MODE_ID_MESA, &id);
|
||||
eglGetModeAttribMESA(d, modes[i], EGL_WIDTH, &w);
|
||||
eglGetModeAttribMESA(d, modes[i], EGL_HEIGHT, &h);
|
||||
eglGetModeAttribMESA(d, modes[i], EGL_REFRESH_RATE_MESA, &r);
|
||||
printf("0x%02x %5d %5d %.3f\n", id, w, h, r / 1000.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int maj, min;
|
||||
// EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
EGLDisplay d = eglGetDisplay("!fb_dri");
|
||||
|
||||
if (!eglInitialize(d, &maj, &min)) {
|
||||
printf("eglinfo: eglInitialize failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("EGL API version: %d.%d\n", maj, min);
|
||||
printf("EGL vendor string: %s\n", eglQueryString(d, EGL_VENDOR));
|
||||
printf("EGL version string: %s\n", eglQueryString(d, EGL_VERSION));
|
||||
printf("EGL extensions string:\n");
|
||||
printf(" %s\n", eglQueryString(d, EGL_EXTENSIONS));
|
||||
printf("\n");
|
||||
|
||||
PrintConfigs(d);
|
||||
|
||||
printf("\n");
|
||||
|
||||
PrintModes(d);
|
||||
|
||||
eglTerminate(d);
|
||||
|
||||
return 0;
|
||||
}
|
53
progs/fbdev/Makefile
Normal file
53
progs/fbdev/Makefile
Normal file
@@ -0,0 +1,53 @@
|
||||
# Makefile for miniglx demo programs
|
||||
|
||||
TOP = ../..
|
||||
|
||||
include $(TOP)/configs/current
|
||||
|
||||
|
||||
SOURCES = glfbdevtest.c
|
||||
|
||||
OBJECTS = $(SOURCES:.c=.o)
|
||||
|
||||
PROGS = $(SOURCES:%.c=%)
|
||||
|
||||
INCLUDES = \
|
||||
-I. \
|
||||
-I$(TOP)/include
|
||||
|
||||
|
||||
##### RULES #####
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c
|
||||
|
||||
.c:
|
||||
$(CC) $(INCLUDES) $(CFLAGS) $< $(APP_LIB_DEPS) -o $@
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $< -o $@
|
||||
|
||||
.S.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $< -o $@
|
||||
|
||||
|
||||
##### TARGETS #####
|
||||
|
||||
default: depend $(PROGS)
|
||||
|
||||
clean:
|
||||
rm -f $(PROGS)
|
||||
rm -f *.o
|
||||
|
||||
|
||||
depend: $(SOURCES)
|
||||
touch depend
|
||||
$(MKDEP) $(MKDEP_OPTIONS) $(INCLUDES) $(SOURCES) > /dev/null
|
||||
|
||||
|
||||
# Emacs tags
|
||||
tags:
|
||||
etags `find . -name \*.[ch]` `find ../include`
|
||||
|
||||
|
||||
include depend
|
BIN
progs/images/girl2.rgb
Normal file
BIN
progs/images/girl2.rgb
Normal file
Binary file not shown.
@@ -45,3 +45,4 @@ readtex.o: readtex.c readtex.h
|
||||
clean:
|
||||
-rm -f $(PROGS)
|
||||
-rm -f *.o *~
|
||||
-rm -f readtex.c readtex.h
|
||||
|
@@ -14,7 +14,9 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#define GL_GLEXT_LEGACY
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <GL/glut.h>
|
||||
#include <GL/glext.h>
|
||||
|
||||
|
||||
GLenum doubleBuffer;
|
||||
|
@@ -37,7 +37,7 @@ static PPMImage *LoadPPM(const char *filename)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (fscanf(fp, "%d %d", &result->sizeX, &result->sizeY) != 2)
|
||||
if (fscanf(fp, "%lu %lu", &result->sizeX, &result->sizeY) != 2)
|
||||
{
|
||||
fprintf(stderr, "Error loading image `%s'\n", filename);
|
||||
exit(1);
|
||||
|
@@ -22,13 +22,17 @@ SOURCES = antialias.c \
|
||||
blendminmax.c \
|
||||
blendsquare.c \
|
||||
bufferobj.c \
|
||||
crossbar.c \
|
||||
cva.c \
|
||||
dinoshade.c \
|
||||
floattex.c \
|
||||
fbotest1.c \
|
||||
fbotexture.c \
|
||||
fogcoord.c \
|
||||
fptest1.c \
|
||||
fptexture.c \
|
||||
getprocaddress.c \
|
||||
invert.c \
|
||||
manytex.c \
|
||||
multipal.c \
|
||||
no_s3tc.c \
|
||||
@@ -99,6 +103,12 @@ texrect: texrect.o readtex.o
|
||||
texrect.o: texrect.c readtex.h
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
|
||||
|
||||
invert: invert.o readtex.o
|
||||
$(CC) invert.o readtex.o $(LIBS) -o $@
|
||||
|
||||
invert.o: invert.c readtex.h
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
|
||||
|
||||
readtex.o: readtex.c
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
|
||||
|
||||
|
235
progs/tests/crossbar.c
Normal file
235
progs/tests/crossbar.c
Normal file
@@ -0,0 +1,235 @@
|
||||
/*
|
||||
* (C) Copyright IBM Corporation 2005
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* 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
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, 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 (including the next
|
||||
* paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file crossbar.c
|
||||
*
|
||||
* Simple test of GL_ARB_texture_env_crossbar functionality. Several squares
|
||||
* are drawn with different texture combine modes, but all should be rendered
|
||||
* with the same final color.
|
||||
*
|
||||
* \author Ian Romanick <idr@us.ibm.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
static const GLint tests[][8] = {
|
||||
{ 1, GL_REPLACE, GL_PRIMARY_COLOR, GL_PRIMARY_COLOR,
|
||||
2, GL_REPLACE, GL_TEXTURE, GL_PRIMARY_COLOR },
|
||||
{ 3, GL_REPLACE, GL_PRIMARY_COLOR, GL_PRIMARY_COLOR,
|
||||
2, GL_SUBTRACT, GL_TEXTURE0, GL_TEXTURE1 },
|
||||
{ 2, GL_REPLACE, GL_PRIMARY_COLOR, GL_PRIMARY_COLOR,
|
||||
2, GL_REPLACE, GL_TEXTURE0, GL_TEXTURE0 },
|
||||
{ 2, GL_REPLACE, GL_PRIMARY_COLOR, GL_PRIMARY_COLOR,
|
||||
1, GL_SUBTRACT, GL_TEXTURE0, GL_TEXTURE1 },
|
||||
{ 3, GL_ADD, GL_TEXTURE1, GL_TEXTURE1,
|
||||
2, GL_MODULATE, GL_TEXTURE1, GL_PREVIOUS },
|
||||
{ 3, GL_ADD, GL_TEXTURE1, GL_TEXTURE1,
|
||||
4, GL_MODULATE, GL_TEXTURE0, GL_PREVIOUS },
|
||||
};
|
||||
|
||||
#define NUM_TESTS (sizeof(tests) / sizeof(tests[0]))
|
||||
|
||||
static int Width = 100 * (NUM_TESTS + 1);
|
||||
static int Height = 200;
|
||||
static const GLfloat Near = 5.0, Far = 25.0;
|
||||
|
||||
|
||||
static void Display( void )
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
|
||||
glClearColor(0.2, 0.2, 0.8, 0);
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
glPushMatrix();
|
||||
|
||||
/* This is the "reference" square.
|
||||
*/
|
||||
|
||||
glActiveTexture( GL_TEXTURE0 );
|
||||
glDisable( GL_TEXTURE_2D );
|
||||
glActiveTexture( GL_TEXTURE1 );
|
||||
glDisable( GL_TEXTURE_2D );
|
||||
|
||||
glTranslatef(-(NUM_TESTS * 1.5), 0, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glColor3f( 0.5, 0.5, 0.5 );
|
||||
glVertex2f(-1, -1);
|
||||
glVertex2f( 1, -1);
|
||||
glVertex2f( 1, 1);
|
||||
glVertex2f(-1, 1);
|
||||
glEnd();
|
||||
|
||||
for ( i = 0 ; i < NUM_TESTS ; i++ ) {
|
||||
glActiveTexture( GL_TEXTURE0 );
|
||||
glEnable( GL_TEXTURE_2D );
|
||||
glBindTexture( GL_TEXTURE_2D, tests[i][0] );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB, tests[i][1] );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB, tests[i][2] );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB, tests[i][3] );
|
||||
|
||||
glActiveTexture( GL_TEXTURE1 );
|
||||
glEnable( GL_TEXTURE_2D );
|
||||
glBindTexture( GL_TEXTURE_2D, tests[i][4] );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB, tests[i][5] );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB, tests[i][6] );
|
||||
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB, tests[i][7] );
|
||||
|
||||
glCallList(1);
|
||||
}
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
GLfloat ar = (float) width / (float) height;
|
||||
Width = width;
|
||||
Height = height;
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glFrustum( -ar, ar, -1.0, 1.0, Near, Far );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -15.0 );
|
||||
}
|
||||
|
||||
|
||||
static void Key( unsigned char key, int x, int y )
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 27:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Init( void )
|
||||
{
|
||||
const char * const ver_string = (const char * const)
|
||||
glGetString( GL_VERSION );
|
||||
float ver = strtof( ver_string, NULL );
|
||||
GLint tex_units;
|
||||
GLint temp[ 256 ];
|
||||
|
||||
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
printf("GL_VERSION = %s\n", ver_string);
|
||||
|
||||
if ( (!glutExtensionSupported("GL_ARB_multitexture")
|
||||
&& (ver < 1.3))
|
||||
|| (!glutExtensionSupported("GL_ARB_texture_env_combine")
|
||||
&& !glutExtensionSupported("GL_EXT_texture_env_combine")
|
||||
&& (ver < 1.3))
|
||||
|| (!glutExtensionSupported("GL_ARB_texture_env_crossbar")
|
||||
&& !glutExtensionSupported("GL_NV_texture_env_combine4")
|
||||
&& (ver < 1.4)) ) {
|
||||
printf("\nSorry, this program requires GL_ARB_multitexture and either\n"
|
||||
"GL_ARB_texture_env_combine or GL_EXT_texture_env_combine (or OpenGL 1.3).\n"
|
||||
"Either GL_ARB_texture_env_crossbar or GL_NV_texture_env_combine4 (or\n"
|
||||
"OpenGL 1.4) are also required.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
glGetIntegerv( GL_MAX_TEXTURE_UNITS, & tex_units );
|
||||
if ( tex_units < 2 ) {
|
||||
printf("\nSorry, this program requires at least 2 texture units.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("\nAll %u squares should be the same color.\n", NUM_TESTS + 1);
|
||||
|
||||
(void) memset( temp, 0x00, sizeof( temp ) );
|
||||
glBindTexture( GL_TEXTURE_2D, 1 );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, temp );
|
||||
|
||||
(void) memset( temp, 0x7f, sizeof( temp ) );
|
||||
glBindTexture( GL_TEXTURE_2D, 2 );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, temp );
|
||||
|
||||
(void) memset( temp, 0xff, sizeof( temp ) );
|
||||
glBindTexture( GL_TEXTURE_2D, 3 );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, temp );
|
||||
|
||||
(void) memset( temp, 0x3f, sizeof( temp ) );
|
||||
glBindTexture( GL_TEXTURE_2D, 4 );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, temp );
|
||||
|
||||
|
||||
glNewList( 1, GL_COMPILE );
|
||||
glTranslatef(3.0, 0, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glColor3f( 0.9, 0.0, 0.0 );
|
||||
glMultiTexCoord2f( GL_TEXTURE0, 0.5, 0.5 );
|
||||
glMultiTexCoord2f( GL_TEXTURE1, 0.5, 0.5 );
|
||||
glVertex2f(-1, -1);
|
||||
glVertex2f( 1, -1);
|
||||
glVertex2f( 1, 1);
|
||||
glVertex2f(-1, 1);
|
||||
glEnd();
|
||||
glEndList();
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
glutInit( &argc, argv );
|
||||
glutInitWindowPosition( 0, 0 );
|
||||
glutInitWindowSize( Width, Height );
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
|
||||
glutCreateWindow( "GL_ARB_texture_env_crossbar test" );
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutDisplayFunc( Display );
|
||||
Init();
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
169
progs/tests/fbotest1.c
Normal file
169
progs/tests/fbotest1.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Test GL_EXT_framebuffer_object
|
||||
*
|
||||
* Brian Paul
|
||||
* 7 Feb 2005
|
||||
*/
|
||||
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
static int Width = 400, Height = 400;
|
||||
static GLuint MyFB;
|
||||
|
||||
|
||||
static void
|
||||
CheckError(int line)
|
||||
{
|
||||
GLenum err = glGetError();
|
||||
if (err) {
|
||||
printf("GL Error 0x%x at line %d\n", (int) err, line);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Display( void )
|
||||
{
|
||||
GLubyte *buffer = malloc(Width * Height * 4);
|
||||
GLenum status;
|
||||
|
||||
/* draw to user framebuffer */
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
|
||||
glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
|
||||
glReadBuffer(GL_COLOR_ATTACHMENT1_EXT);
|
||||
|
||||
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
|
||||
printf("Framebuffer incomplete!!!\n");
|
||||
}
|
||||
|
||||
glClearColor(0.5, 0.5, 1.0, 0.0);
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
glColor3f(1, 0, 0);
|
||||
glVertex2f(-1, -1);
|
||||
glColor3f(0, 1, 0);
|
||||
glVertex2f(1, -1);
|
||||
glColor3f(0, 0, 1);
|
||||
glVertex2f(0, 1);
|
||||
glEnd();
|
||||
|
||||
/* read from user framebuffer */
|
||||
glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
|
||||
|
||||
/* draw to window */
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
glWindowPos2iARB(0, 0);
|
||||
glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
|
||||
|
||||
free(buffer);
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Reshape( int width, int height )
|
||||
{
|
||||
float ar = (float) width / (float) height;
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
#if 0
|
||||
glFrustum( -ar, ar, -1.0, 1.0, 5.0, 25.0 );
|
||||
#else
|
||||
glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
|
||||
#endif
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -15.0 );
|
||||
Width = width;
|
||||
Height = height;
|
||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Key( unsigned char key, int x, int y )
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 27:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Init( void )
|
||||
{
|
||||
GLuint rb;
|
||||
GLint i;
|
||||
|
||||
if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
|
||||
printf("GL_EXT_framebuffer_object not found!\n");
|
||||
/*exit(0);*/
|
||||
}
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
|
||||
glGenFramebuffersEXT(1, &MyFB);
|
||||
assert(MyFB);
|
||||
assert(glIsFramebufferEXT(MyFB));
|
||||
glDeleteFramebuffersEXT(1, &MyFB);
|
||||
assert(!glIsFramebufferEXT(MyFB));
|
||||
/* Note, continue to use MyFB below */
|
||||
|
||||
glGenRenderbuffersEXT(1, &rb);
|
||||
assert(rb);
|
||||
assert(glIsRenderbufferEXT(rb));
|
||||
glDeleteRenderbuffersEXT(1, &rb);
|
||||
assert(!glIsRenderbufferEXT(rb));
|
||||
rb = 42; /* an arbitrary ID */
|
||||
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
|
||||
assert(glIsFramebufferEXT(MyFB));
|
||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rb);
|
||||
assert(glIsRenderbufferEXT(rb));
|
||||
|
||||
glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT, &i);
|
||||
assert(i == rb);
|
||||
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &i);
|
||||
assert(i == MyFB);
|
||||
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
|
||||
GL_RENDERBUFFER_EXT, rb);
|
||||
|
||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
|
||||
|
||||
CheckError(__LINE__);
|
||||
|
||||
/* restore to default */
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main( int argc, char *argv[] )
|
||||
{
|
||||
glutInit( &argc, argv );
|
||||
glutInitWindowPosition( 0, 0 );
|
||||
glutInitWindowSize(Width, Height);
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
|
||||
glutCreateWindow(argv[0]);
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutDisplayFunc( Display );
|
||||
Init();
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
276
progs/tests/fbotexture.c
Normal file
276
progs/tests/fbotexture.c
Normal file
@@ -0,0 +1,276 @@
|
||||
/*
|
||||
* Test GL_EXT_framebuffer_object render-to-texture
|
||||
*
|
||||
* Draw a teapot into a texture image with stenciling.
|
||||
* Then draw a textured quad using that texture.
|
||||
*
|
||||
* Brian Paul
|
||||
* 18 Apr 2005
|
||||
*/
|
||||
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
static int Width = 400, Height = 400;
|
||||
static int TexWidth = 512, TexHeight = 512;
|
||||
static GLuint MyFB;
|
||||
static GLuint TexObj;
|
||||
static GLuint DepthRB, StencilRB;
|
||||
static GLboolean Anim = GL_FALSE;
|
||||
static GLfloat Rot = 0.0;
|
||||
|
||||
|
||||
static void
|
||||
CheckError(int line)
|
||||
{
|
||||
GLenum err = glGetError();
|
||||
if (err) {
|
||||
printf("GL Error 0x%x at line %d\n", (int) err, line);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Idle(void)
|
||||
{
|
||||
Rot = glutGet(GLUT_ELAPSED_TIME) * 0.05;
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
RenderTexture(void)
|
||||
{
|
||||
GLint level = 0;
|
||||
GLenum status;
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.0, 0.0, -15.0);
|
||||
|
||||
/* draw to texture */
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
|
||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||
GL_TEXTURE_2D, TexObj, level);
|
||||
|
||||
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
|
||||
printf("Framebuffer incomplete!!!\n");
|
||||
}
|
||||
|
||||
glViewport(0, 0, TexWidth, TexHeight);
|
||||
|
||||
glClearColor(0.5, 0.5, 1.0, 0.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
glStencilFunc(GL_NEVER, 1, ~0);
|
||||
glStencilOp(GL_REPLACE, GL_KEEP, GL_REPLACE);
|
||||
|
||||
/* draw diamond-shaped stencil pattern */
|
||||
glColor3f(0, 1, 0);
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex2f(-0.2, 0.0);
|
||||
glVertex2f( 0.0, -0.2);
|
||||
glVertex2f( 0.2, 0.0);
|
||||
glVertex2f( 0.0, 0.2);
|
||||
glEnd();
|
||||
|
||||
/* draw teapot where stencil != 1 */
|
||||
glStencilFunc(GL_NOTEQUAL, 1, ~0);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
|
||||
|
||||
#if 0
|
||||
glBegin(GL_POLYGON);
|
||||
glColor3f(1, 0, 0);
|
||||
glVertex2f(-1, -1);
|
||||
glColor3f(0, 1, 0);
|
||||
glVertex2f(1, -1);
|
||||
glColor3f(0, 0, 1);
|
||||
glVertex2f(0, 1);
|
||||
glEnd();
|
||||
#else
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
glPushMatrix();
|
||||
glRotatef(0.5 * Rot, 1.0, 0.0, 0.0);
|
||||
glutSolidTeapot(0.5);
|
||||
glPopMatrix();
|
||||
glDisable(GL_LIGHTING);
|
||||
#endif
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
|
||||
/* Bind normal framebuffer */
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
|
||||
CheckError(__LINE__);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
Display(void)
|
||||
{
|
||||
float ar = (float) Width / (float) Height;
|
||||
|
||||
RenderTexture();
|
||||
|
||||
/* draw textured quad in the window */
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum(-ar, ar, -1.0, 1.0, 5.0, 25.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.0, 0.0, -7.0);
|
||||
|
||||
glViewport(0, 0, Width, Height);
|
||||
|
||||
glClearColor(0.25, 0.25, 0.25, 0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(Rot, 0, 1, 0);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBegin(GL_POLYGON);
|
||||
glColor3f(0.25, 0.25, 0.25);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2f(-1, -1);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2f(1, -1);
|
||||
glColor3f(1.0, 1.0, 1.0);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2f(1, 1);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2f(-1, 1);
|
||||
glEnd();
|
||||
glPopMatrix();
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
|
||||
glutSwapBuffers();
|
||||
CheckError(__LINE__);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Reshape(int width, int height)
|
||||
{
|
||||
glViewport(0, 0, width, height);
|
||||
Width = width;
|
||||
Height = height;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Key(unsigned char key, int x, int y)
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 'a':
|
||||
Anim = !Anim;
|
||||
if (Anim)
|
||||
glutIdleFunc(Idle);
|
||||
else
|
||||
glutIdleFunc(NULL);
|
||||
break;
|
||||
case 27:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Init(void)
|
||||
{
|
||||
GLint i;
|
||||
|
||||
if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
|
||||
printf("GL_EXT_framebuffer_object not found!\n");
|
||||
exit(0);
|
||||
}
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
|
||||
/* make framebuffer */
|
||||
glGenFramebuffersEXT(1, &MyFB);
|
||||
assert(MyFB);
|
||||
assert(glIsFramebufferEXT(MyFB));
|
||||
glDeleteFramebuffersEXT(1, &MyFB);
|
||||
assert(!glIsFramebufferEXT(MyFB));
|
||||
/* Note, continue to use MyFB below */
|
||||
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
|
||||
assert(glIsFramebufferEXT(MyFB));
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &i);
|
||||
assert(i == MyFB);
|
||||
|
||||
/* make depth renderbuffer */
|
||||
glGenRenderbuffersEXT(1, &DepthRB);
|
||||
assert(DepthRB);
|
||||
assert(glIsRenderbufferEXT(DepthRB));
|
||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRB);
|
||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
||||
TexWidth, TexHeight);
|
||||
|
||||
/* make stencil renderbuffer */
|
||||
glGenRenderbuffersEXT(1, &StencilRB);
|
||||
assert(StencilRB);
|
||||
assert(glIsRenderbufferEXT(StencilRB));
|
||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, StencilRB);
|
||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX,
|
||||
TexWidth, TexHeight);
|
||||
|
||||
/* attach DepthRB to MyFB */
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
||||
GL_RENDERBUFFER_EXT, DepthRB);
|
||||
|
||||
/* attach StencilRB to MyFB */
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
|
||||
GL_RENDERBUFFER_EXT, StencilRB);
|
||||
|
||||
|
||||
/* bind regular framebuffer */
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
|
||||
/* Make texture object/image */
|
||||
glGenTextures(1, &TexObj);
|
||||
glBindTexture(GL_TEXTURE_2D, TexObj);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexWidth, TexHeight, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
|
||||
CheckError(__LINE__);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
glutInit(&argc, argv);
|
||||
glutInitWindowPosition(0, 0);
|
||||
glutInitWindowSize(Width, Height);
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
|
||||
glutCreateWindow(argv[0]);
|
||||
glutReshapeFunc(Reshape);
|
||||
glutKeyboardFunc(Key);
|
||||
glutDisplayFunc(Display);
|
||||
if (Anim)
|
||||
glutIdleFunc(Idle);
|
||||
Init();
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
@@ -288,6 +288,7 @@ check_functions( const char *extensions )
|
||||
|
||||
for (entry = functions; entry->name; entry++) {
|
||||
if (entry->name[0] == '-') {
|
||||
/* XXX update for OpenGL 2.0 */
|
||||
if (entry->name[1] == '1') {
|
||||
/* check GL version X.Y */
|
||||
const char *version = (const char *) glGetString(GL_VERSION);
|
||||
|
195
progs/tests/invert.c
Normal file
195
progs/tests/invert.c
Normal file
@@ -0,0 +1,195 @@
|
||||
/*
|
||||
* (C) Copyright IBM Corporation 2005
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* 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
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, 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 (including the next
|
||||
* paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file invert.c
|
||||
*
|
||||
* Simple test of GL_MESA_pack_invert functionality. Three squares are
|
||||
* drawn. The first two should look the same, and the third one should
|
||||
* look inverted.
|
||||
*
|
||||
* \author Ian Romanick <idr@us.ibm.com>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "readtex.h"
|
||||
|
||||
#define IMAGE_FILE "../images/tree3.rgb"
|
||||
|
||||
static int Width = 420;
|
||||
static int Height = 150;
|
||||
static const GLfloat Near = 5.0, Far = 25.0;
|
||||
|
||||
static GLubyte * image = NULL;
|
||||
static GLubyte * temp_image = NULL;
|
||||
static GLuint img_width = 0;
|
||||
static GLuint img_height = 0;
|
||||
static GLuint img_format = 0;
|
||||
|
||||
PFNGLWINDOWPOS2IPROC win_pos_2i = NULL;
|
||||
|
||||
|
||||
static void Display( void )
|
||||
{
|
||||
GLint err;
|
||||
|
||||
|
||||
glClearColor(0.2, 0.2, 0.8, 0);
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
|
||||
/* This is the "reference" square.
|
||||
*/
|
||||
|
||||
(*win_pos_2i)( 5, 5 );
|
||||
glDrawPixels( img_width, img_height, img_format, GL_UNSIGNED_BYTE, image );
|
||||
|
||||
glPixelStorei( GL_PACK_INVERT_MESA, GL_FALSE );
|
||||
err = glGetError();
|
||||
if ( err != GL_NO_ERROR ) {
|
||||
printf( "Setting PACK_INVERT_MESA to false generated an error (0x%04x).\n",
|
||||
err );
|
||||
}
|
||||
|
||||
glReadPixels( 5, 5, img_width, img_height, img_format, GL_UNSIGNED_BYTE, temp_image );
|
||||
(*win_pos_2i)( 5 + 1 * (10 + img_width), 5 );
|
||||
glDrawPixels( img_width, img_height, img_format, GL_UNSIGNED_BYTE, temp_image );
|
||||
|
||||
glPixelStorei( GL_PACK_INVERT_MESA, GL_TRUE );
|
||||
err = glGetError();
|
||||
if ( err != GL_NO_ERROR ) {
|
||||
printf( "Setting PACK_INVERT_MESA to true generated an error (0x%04x).\n",
|
||||
err );
|
||||
}
|
||||
|
||||
glReadPixels( 5, 5, img_width, img_height, img_format, GL_UNSIGNED_BYTE, temp_image );
|
||||
(*win_pos_2i)( 5 + 2 * (10 + img_width), 5 );
|
||||
glDrawPixels( img_width, img_height, img_format, GL_UNSIGNED_BYTE, temp_image );
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
GLfloat ar = (float) width / (float) height;
|
||||
Width = width;
|
||||
Height = height;
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glFrustum( -ar, ar, -1.0, 1.0, Near, Far );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -15.0 );
|
||||
}
|
||||
|
||||
|
||||
static void Key( unsigned char key, int x, int y )
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 27:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Init( void )
|
||||
{
|
||||
const char * const ver_string = (const char * const)
|
||||
glGetString( GL_VERSION );
|
||||
const float ver = strtof( ver_string, NULL );
|
||||
|
||||
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
printf("GL_VERSION = %s\n", ver_string);
|
||||
|
||||
if ( !glutExtensionSupported("GL_MESA_pack_invert") ) {
|
||||
printf("\nSorry, this program requires GL_MESA_pack_invert.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if ( ver >= 1.4 ) {
|
||||
win_pos_2i = (PFNGLWINDOWPOS2IPROC) glutGetProcAddress( "glWindowPos2i" );
|
||||
}
|
||||
else if ( glutExtensionSupported("GL_ARB_window_pos") ) {
|
||||
win_pos_2i = (PFNGLWINDOWPOS2IPROC) glutGetProcAddress( "glWindowPos2iARB" );
|
||||
}
|
||||
else if ( glutExtensionSupported("GL_MESA_window_pos") ) {
|
||||
win_pos_2i = (PFNGLWINDOWPOS2IPROC) glutGetProcAddress( "glWindowPos2iMESA" );
|
||||
}
|
||||
|
||||
|
||||
/* Do this check as a separate if-statement instead of as an else in case
|
||||
* one of the required extensions is supported but glutGetProcAddress
|
||||
* returns NULL.
|
||||
*/
|
||||
|
||||
if ( win_pos_2i == NULL ) {
|
||||
printf("\nSorry, this program requires either GL 1.4 (or higher),\n"
|
||||
"GL_ARB_window_pos, or GL_MESA_window_pos.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("\nThe left 2 squares should be the same color, and the right\n"
|
||||
"square should look upside-down.\n");
|
||||
|
||||
|
||||
image = LoadRGBImage( IMAGE_FILE, & img_width, & img_height,
|
||||
& img_format );
|
||||
if ( image == NULL ) {
|
||||
printf( "Could not open image file \"%s\".\n", IMAGE_FILE );
|
||||
exit(1);
|
||||
}
|
||||
|
||||
temp_image = malloc( 3 * img_height * img_width );
|
||||
if ( temp_image == NULL ) {
|
||||
printf( "Could not allocate memory for temporary image.\n" );
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
glutInit( &argc, argv );
|
||||
glutInitWindowPosition( 0, 0 );
|
||||
glutInitWindowSize( Width, Height );
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
|
||||
glutCreateWindow( "GL_MESA_pack_invert test" );
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutDisplayFunc( Display );
|
||||
Init();
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
@@ -11,6 +11,7 @@ LIB_DEP = $(LIB_DIR)/$(GL_LIB_NAME) $(LIB_DIR)/$(GLU_LIB_NAME)
|
||||
PROGS = glthreads \
|
||||
glxdemo \
|
||||
glxgears \
|
||||
glxgears_fbconfig \
|
||||
glxcontexts \
|
||||
glxheads \
|
||||
glxinfo \
|
||||
@@ -24,7 +25,8 @@ PROGS = glthreads \
|
||||
wincopy \
|
||||
xdemo \
|
||||
xfont \
|
||||
xrotfontdemo
|
||||
xrotfontdemo \
|
||||
yuvrect_client
|
||||
|
||||
|
||||
|
||||
@@ -63,6 +65,11 @@ pbdemo.o: pbdemo.c pbutil.h
|
||||
pbutil.o: pbutil.c pbutil.h
|
||||
$(CC) -c -I. -I$(INCDIR) $(CFLAGS) pbutil.c
|
||||
|
||||
glxgears_fbconfig: glxgears_fbconfig.o pbutil.o
|
||||
$(CC) glxgears_fbconfig.o pbutil.o $(APP_LIB_DEPS) -o $@
|
||||
|
||||
glxgears_fbconfig.o: glxgears_fbconfig.c pbutil.h
|
||||
$(CC) -c -I. -I$(INCDIR) $(CFLAGS) glxgears_fbconfig.c
|
||||
|
||||
xrotfontdemo: xrotfontdemo.o xuserotfont.o
|
||||
$(CC) xrotfontdemo.o xuserotfont.o $(APP_LIB_DEPS) -o $@
|
||||
|
@@ -32,6 +32,8 @@
|
||||
*/
|
||||
|
||||
|
||||
#define GLX_GLXEXT_PROTOTYPES
|
||||
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -44,7 +46,7 @@
|
||||
#include <assert.h>
|
||||
#include "pbutil.h"
|
||||
|
||||
/* I had to the the SGIX versions of these because for some reason glxext.h
|
||||
/* I had to use the SGIX versions of these because for some reason glxext.h
|
||||
* doesn't define the core versions if GLX_VERSION_1_3 is defined, and glx.h
|
||||
* doesn't define them at all. One or both header files is clearly broken.
|
||||
*/
|
||||
@@ -358,19 +360,19 @@ init_fbconfig_functions(Display *dpy, int scrnum)
|
||||
|
||||
if ( glx_1_3_supported ) {
|
||||
choose_fbconfig = (PFNGLXCHOOSEFBCONFIGSGIXPROC) glXGetProcAddressARB(
|
||||
(GLbyte *) "glXChooseFBConfig");
|
||||
(GLubyte *) "glXChooseFBConfig");
|
||||
get_visual_from_fbconfig = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) glXGetProcAddressARB(
|
||||
(GLbyte *) "glXGetVisualFromFBConfig");
|
||||
(GLubyte *) "glXGetVisualFromFBConfig");
|
||||
create_new_context = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) glXGetProcAddressARB(
|
||||
(GLbyte *) "glXCreateNewContext");
|
||||
(GLubyte *) "glXCreateNewContext");
|
||||
}
|
||||
else if ( ext_version_supported ) {
|
||||
choose_fbconfig = (PFNGLXCHOOSEFBCONFIGSGIXPROC) glXGetProcAddressARB(
|
||||
(GLbyte *) "glXChooseFBConfigSGIX");
|
||||
(GLubyte *) "glXChooseFBConfigSGIX");
|
||||
get_visual_from_fbconfig = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) glXGetProcAddressARB(
|
||||
(GLbyte *) "glXGetVisualFromFBConfigSGIX");
|
||||
(GLubyte *) "glXGetVisualFromFBConfigSGIX");
|
||||
create_new_context = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) glXGetProcAddressARB(
|
||||
(GLbyte *) "glXCreateContextWithConfigSGIX");
|
||||
(GLubyte *) "glXCreateContextWithConfigSGIX");
|
||||
}
|
||||
else {
|
||||
printf( "This demo requires either GLX 1.3 or %s be supported.\n",
|
||||
@@ -436,7 +438,7 @@ make_window( Display *dpy, const char *name,
|
||||
printf("\nThe following fbconfigs meet the requirements. The first one "
|
||||
"will be used.\n\n");
|
||||
for ( i = 0 ; i < num_configs ; i++ ) {
|
||||
PrintFBConfigInfo(dpy, fbconfig[i], GL_TRUE);
|
||||
PrintFBConfigInfo(dpy, scrnum, fbconfig[i], GL_TRUE);
|
||||
}
|
||||
|
||||
/* window attributes */
|
||||
@@ -557,7 +559,7 @@ main(int argc, char *argv[])
|
||||
Display *dpy;
|
||||
Window win;
|
||||
GLXContext ctx;
|
||||
char *dpyName = ":0";
|
||||
const char *dpyName = NULL;
|
||||
GLboolean printInfo = GL_FALSE;
|
||||
int i;
|
||||
|
||||
|
@@ -9,7 +9,6 @@
|
||||
* to the GLX_SGIX_fbconfig/pbuffer extensions.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "pbutil.h"
|
||||
@@ -89,13 +88,10 @@ GetAllFBConfigs(Display *dpy, int screen, int *nConfigs)
|
||||
#endif
|
||||
#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer)
|
||||
if (pbSupport == 2) {
|
||||
/* this *seems* to work, but may not be perfect */
|
||||
static int fbAttribs[] = {
|
||||
GLX_RENDER_TYPE, 0,
|
||||
GLX_DRAWABLE_TYPE, 0,
|
||||
None
|
||||
};
|
||||
return glXChooseFBConfigSGIX(dpy, screen, fbAttribs, nConfigs);
|
||||
/* The GLX_SGIX_fbconfig extensions says to pass NULL to get list
|
||||
* of all available configurations.
|
||||
*/
|
||||
return glXChooseFBConfigSGIX(dpy, screen, NULL, nConfigs);
|
||||
}
|
||||
#endif
|
||||
return NULL;
|
||||
@@ -296,6 +292,43 @@ PrintFBConfigInfo(Display *dpy, int screen, FBCONFIG config, Bool horizFormat)
|
||||
|
||||
|
||||
|
||||
GLXContext
|
||||
CreateContext(Display *dpy, int screen, FBCONFIG config)
|
||||
{
|
||||
int pbSupport = QueryPbuffers(dpy, screen);
|
||||
#if defined(GLX_VERSION_1_3)
|
||||
if (pbSupport == 1) {
|
||||
/* GLX 1.3 */
|
||||
GLXContext c;
|
||||
c = glXCreateNewContext(dpy, config, GLX_RGBA_TYPE, NULL, True);
|
||||
if (!c) {
|
||||
/* try indirect */
|
||||
c = glXCreateNewContext(dpy, config, GLX_RGBA_TYPE, NULL, False);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
#endif
|
||||
#if defined(GLX_SGIX_fbconfig) && defined(GLX_SGIX_pbuffer)
|
||||
if (pbSupport == 2) {
|
||||
GLXContext c;
|
||||
c = glXCreateContextWithConfigSGIX(dpy, config, GLX_RGBA_TYPE_SGIX, NULL, True);
|
||||
if (!c) {
|
||||
c = glXCreateContextWithConfigSGIX(dpy, config, GLX_RGBA_TYPE_SGIX, NULL, False);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DestroyContext(Display *dpy, GLXContext ctx)
|
||||
{
|
||||
glXDestroyContext(dpy, ctx);
|
||||
}
|
||||
|
||||
|
||||
/* This is only used by CreatePbuffer() */
|
||||
static int XErrorFlag = 0;
|
||||
static int HandleXError(Display *dpy, XErrorEvent *event)
|
||||
|
@@ -46,6 +46,14 @@ extern XVisualInfo *
|
||||
GetVisualFromFBConfig(Display *dpy, int screen, FBCONFIG config);
|
||||
|
||||
|
||||
extern GLXContext
|
||||
CreateContext(Display *dpy, int screen, FBCONFIG config);
|
||||
|
||||
|
||||
extern void
|
||||
DestroyContext(Display *dpy, GLXContext ctx);
|
||||
|
||||
|
||||
extern PBUFFER
|
||||
CreatePbuffer(Display *dpy, int screen, FBCONFIG config,
|
||||
int width, int height, Bool preserve, Bool largest);
|
||||
|
326
progs/xdemos/yuvrect_client.c
Normal file
326
progs/xdemos/yuvrect_client.c
Normal file
@@ -0,0 +1,326 @@
|
||||
/*
|
||||
* Test the GL_NV_texture_rectangle and GL_MESA_ycrcb_texture extensions and GLX_MESA_allocate-memory
|
||||
*
|
||||
* Dave Airlie - Feb 2005
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/keysym.h>
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <GL/glx.h>
|
||||
|
||||
#include "../util/readtex.c" /* I know, this is a hack. */
|
||||
|
||||
#define TEXTURE_FILE "../images/girl2.rgb"
|
||||
|
||||
static GLfloat Xrot = 0, Yrot = 0, Zrot = 0;
|
||||
static GLint ImgWidth, ImgHeight;
|
||||
static GLushort *ImageYUV = NULL;
|
||||
static void *glx_memory;
|
||||
|
||||
static void DrawObject(void)
|
||||
{
|
||||
glBegin(GL_QUADS);
|
||||
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2f(-1.0, -1.0);
|
||||
|
||||
glTexCoord2f(ImgWidth, 0);
|
||||
glVertex2f(1.0, -1.0);
|
||||
|
||||
glTexCoord2f(ImgWidth, ImgHeight);
|
||||
glVertex2f(1.0, 1.0);
|
||||
|
||||
glTexCoord2f(0, ImgHeight);
|
||||
glVertex2f(-1.0, 1.0);
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
static void scr_Display( void )
|
||||
{
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(Xrot, 1.0, 0.0, 0.0);
|
||||
glRotatef(Yrot, 0.0, 1.0, 0.0);
|
||||
glRotatef(Zrot, 0.0, 0.0, 1.0);
|
||||
DrawObject();
|
||||
glPopMatrix();
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -15.0 );
|
||||
}
|
||||
|
||||
static int queryClient(Display *dpy, int screen)
|
||||
{
|
||||
#ifdef GLX_MESA_allocate_memory
|
||||
char *extensions;
|
||||
|
||||
extensions = (char *)glXQueryExtensionsString(dpy, screen);
|
||||
if (!extensions || !strstr(extensions,"GLX_MESA_allocate_memory")) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
query_extension(char* extName) {
|
||||
char *p = (char *) glGetString(GL_EXTENSIONS);
|
||||
char *end = p + strlen(p);
|
||||
while (p < end) {
|
||||
int n = strcspn(p, " ");
|
||||
if ((strlen(extName) == n) && (strncmp(extName, p, n) == 0))
|
||||
return GL_TRUE;
|
||||
p += (n + 1);
|
||||
}
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
static void Init( int argc, char *argv[] , Display *dpy, int screen, Window win)
|
||||
{
|
||||
GLuint texObj = 100;
|
||||
const char *file;
|
||||
void *glx_memory;
|
||||
|
||||
if (!query_extension("GL_NV_texture_rectangle")) {
|
||||
printf("Sorry, GL_NV_texture_rectangle is required\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (!query_extension("GL_MESA_ycbcr_texture")) {
|
||||
printf("Sorry, GL_MESA_ycbcr_texture is required\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (!queryClient(dpy, screen)) {
|
||||
printf("Sorry, GLX_MESA_allocate_memory is required\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
|
||||
glBindTexture(GL_TEXTURE_RECTANGLE_NV, texObj);
|
||||
#ifdef LINEAR_FILTER
|
||||
/* linear filtering looks much nicer but is much slower for Mesa */
|
||||
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
#else
|
||||
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
#endif
|
||||
|
||||
if (argc > 1)
|
||||
file = argv[1];
|
||||
else
|
||||
file = TEXTURE_FILE;
|
||||
|
||||
ImageYUV = LoadYUVImage(file, &ImgWidth, &ImgHeight);
|
||||
if (!ImageYUV) {
|
||||
printf("Couldn't read %s\n", TEXTURE_FILE);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
glx_memory = glXAllocateMemoryMESA(dpy, screen, ImgWidth * ImgHeight * 2, 0, 0 ,0);
|
||||
if (!glx_memory)
|
||||
{
|
||||
fprintf(stderr,"Failed to allocate MESA memory\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
memcpy(glx_memory, ImageYUV, ImgWidth * ImgHeight * 2);
|
||||
|
||||
printf("Image: %dx%d\n", ImgWidth, ImgHeight);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0,
|
||||
GL_YCBCR_MESA, ImgWidth, ImgHeight, 0,
|
||||
GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_APPLE, glx_memory);
|
||||
|
||||
assert(glGetError() == GL_NO_ERROR);
|
||||
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
|
||||
glEnable(GL_TEXTURE_RECTANGLE_NV);
|
||||
|
||||
glShadeModel(GL_FLAT);
|
||||
glClearColor(0.3, 0.3, 0.4, 1.0);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Create an RGB, double-buffered window.
|
||||
* Return the window and context handles.
|
||||
*/
|
||||
static void
|
||||
make_window( Display *dpy, const char *name,
|
||||
int x, int y, int width, int height,
|
||||
Window *winRet, GLXContext *ctxRet)
|
||||
{
|
||||
int attribs[] = { GLX_RGBA,
|
||||
GLX_RED_SIZE, 1,
|
||||
GLX_GREEN_SIZE, 1,
|
||||
GLX_BLUE_SIZE, 1,
|
||||
GLX_DOUBLEBUFFER,
|
||||
GLX_DEPTH_SIZE, 1,
|
||||
None };
|
||||
int scrnum;
|
||||
XSetWindowAttributes attr;
|
||||
unsigned long mask;
|
||||
Window root;
|
||||
Window win;
|
||||
GLXContext ctx;
|
||||
XVisualInfo *visinfo;
|
||||
|
||||
scrnum = DefaultScreen( dpy );
|
||||
root = RootWindow( dpy, scrnum );
|
||||
|
||||
visinfo = glXChooseVisual( dpy, scrnum, attribs );
|
||||
if (!visinfo) {
|
||||
printf("Error: couldn't get an RGB, Double-buffered visual\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* window attributes */
|
||||
attr.background_pixel = 0;
|
||||
attr.border_pixel = 0;
|
||||
attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
|
||||
attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
|
||||
attr.override_redirect = 0;
|
||||
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
|
||||
|
||||
win = XCreateWindow( dpy, root, 0, 0, width, height,
|
||||
0, visinfo->depth, InputOutput,
|
||||
visinfo->visual, mask, &attr );
|
||||
|
||||
/* set hints and properties */
|
||||
{
|
||||
XSizeHints sizehints;
|
||||
sizehints.x = x;
|
||||
sizehints.y = y;
|
||||
sizehints.width = width;
|
||||
sizehints.height = height;
|
||||
sizehints.flags = USSize | USPosition;
|
||||
XSetNormalHints(dpy, win, &sizehints);
|
||||
XSetStandardProperties(dpy, win, name, name,
|
||||
None, (char **)NULL, 0, &sizehints);
|
||||
}
|
||||
|
||||
ctx = glXCreateContext( dpy, visinfo, NULL, True );
|
||||
if (!ctx) {
|
||||
printf("Error: glXCreateContext failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
XFree(visinfo);
|
||||
|
||||
*winRet = win;
|
||||
*ctxRet = ctx;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_loop(Display *dpy, Window win)
|
||||
{
|
||||
while (1) {
|
||||
while (XPending(dpy) > 0) {
|
||||
XEvent event;
|
||||
XNextEvent(dpy, &event);
|
||||
switch (event.type) {
|
||||
case Expose:
|
||||
/* we'll redraw below */
|
||||
break;
|
||||
case ConfigureNotify:
|
||||
Reshape(event.xconfigure.width, event.xconfigure.height);
|
||||
break;
|
||||
case KeyPress:
|
||||
{
|
||||
char buffer[10];
|
||||
int r, code;
|
||||
code = XLookupKeysym(&event.xkey, 0);
|
||||
r = XLookupString(&event.xkey, buffer, sizeof(buffer),
|
||||
NULL, NULL);
|
||||
if (buffer[0] == 27) {
|
||||
/* escape */
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
Display *dpy;
|
||||
Window win;
|
||||
GLXContext ctx;
|
||||
char *dpyName = NULL;
|
||||
GLboolean printInfo = GL_FALSE;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "-display") == 0) {
|
||||
dpyName = argv[i+1];
|
||||
i++;
|
||||
}
|
||||
else if (strcmp(argv[i], "-info") == 0) {
|
||||
printInfo = GL_TRUE;
|
||||
}
|
||||
else
|
||||
printf("Warrning: unknown parameter: %s\n", argv[i]);
|
||||
}
|
||||
|
||||
dpy = XOpenDisplay(dpyName);
|
||||
if (!dpy) {
|
||||
printf("Error: couldn't open display %s\n",
|
||||
dpyName ? dpyName : getenv("DISPLAY"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
make_window(dpy, "yuvrect_client", 0, 0, 300, 300, &win, &ctx);
|
||||
XMapWindow(dpy, win);
|
||||
glXMakeCurrent(dpy, win, ctx);
|
||||
|
||||
if (printInfo) {
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
|
||||
printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
|
||||
printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
|
||||
}
|
||||
|
||||
Init(argc, argv, dpy, DefaultScreen(dpy), win);
|
||||
|
||||
scr_Display();
|
||||
glXSwapBuffers(dpy, win);
|
||||
event_loop(dpy, win);
|
||||
|
||||
glXFreeMemoryMESA(dpy, DefaultScreen(dpy), glx_memory);
|
||||
glXDestroyContext(dpy, ctx);
|
||||
XDestroyWindow(dpy, win);
|
||||
XCloseDisplay(dpy);
|
||||
|
||||
return 0;
|
||||
}
|
24
src/egl/Makefile
Normal file
24
src/egl/Makefile
Normal file
@@ -0,0 +1,24 @@
|
||||
# src/egl/Makefile
|
||||
|
||||
TOP = ../..
|
||||
|
||||
SUBDIRS = main drivers/demo
|
||||
|
||||
|
||||
default: subdirs
|
||||
|
||||
|
||||
subdirs:
|
||||
@for dir in $(SUBDIRS) ; do \
|
||||
if [ -d $$dir ] ; then \
|
||||
(cd $$dir ; $(MAKE)) || exit 1 ; \
|
||||
fi \
|
||||
done
|
||||
|
||||
|
||||
clean:
|
||||
@for dir in $(SUBDIRS) ; do \
|
||||
if [ -d $$dir ] ; then \
|
||||
(cd $$dir ; $(MAKE) clean) ; \
|
||||
fi \
|
||||
done
|
31
src/egl/drivers/demo/Makefile
Normal file
31
src/egl/drivers/demo/Makefile
Normal file
@@ -0,0 +1,31 @@
|
||||
# src/egl/drivers/demo/Makefile
|
||||
|
||||
TOP = ../../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
|
||||
INCLUDE_DIRS = -I$(TOP)/include -I$(TOP)/src/egl/main
|
||||
|
||||
|
||||
SOURCES = demo.c
|
||||
|
||||
OBJECTS = $(SOURCES:.c=.o)
|
||||
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
|
||||
|
||||
|
||||
|
||||
default: $(LIB_DIR)/demodriver.so
|
||||
|
||||
|
||||
$(LIB_DIR)/demodriver.so: $(OBJECTS)
|
||||
$(TOP)/bin/mklib -o demodriver.so -noprefix \
|
||||
-install $(LIB_DIR) $(OBJECTS)
|
||||
|
||||
|
||||
|
||||
clean:
|
||||
rm -f *.o
|
||||
rm -f *.so
|
328
src/egl/drivers/demo/demo.c
Normal file
328
src/egl/drivers/demo/demo.c
Normal file
@@ -0,0 +1,328 @@
|
||||
/*
|
||||
* Sample driver: Demo
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "eglconfig.h"
|
||||
#include "eglcontext.h"
|
||||
#include "egldisplay.h"
|
||||
#include "egldriver.h"
|
||||
#include "eglglobals.h"
|
||||
#include "eglmode.h"
|
||||
#include "eglscreen.h"
|
||||
#include "eglsurface.h"
|
||||
|
||||
|
||||
/**
|
||||
* Demo driver-specific driver class derived from _EGLDriver
|
||||
*/
|
||||
typedef struct demo_driver
|
||||
{
|
||||
_EGLDriver Base; /* base class/object */
|
||||
GLuint DemoStuff;
|
||||
} DemoDriver;
|
||||
|
||||
#define DEMO_DRIVER(D) ((DemoDriver *) (D))
|
||||
|
||||
|
||||
/**
|
||||
* Demo driver-specific surface class derived from _EGLSurface
|
||||
*/
|
||||
typedef struct demo_surface
|
||||
{
|
||||
_EGLSurface Base; /* base class/object */
|
||||
GLuint DemoStuff;
|
||||
} DemoSurface;
|
||||
|
||||
|
||||
/**
|
||||
* Demo driver-specific context class derived from _EGLContext
|
||||
*/
|
||||
typedef struct demo_context
|
||||
{
|
||||
_EGLContext Base; /* base class/object */
|
||||
GLuint DemoStuff;
|
||||
} DemoContext;
|
||||
|
||||
|
||||
|
||||
static EGLBoolean
|
||||
demoInitialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
|
||||
{
|
||||
_EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
_EGLScreen *scrn;
|
||||
EGLint i;
|
||||
|
||||
/* Create a screen */
|
||||
scrn = calloc(1, sizeof(*scrn));
|
||||
_eglAddScreen(disp, scrn);
|
||||
|
||||
/* Create the screen's modes - silly example */
|
||||
_eglAddMode(scrn, 1600, 1200, 72 * 1000, "1600x1200-72");
|
||||
_eglAddMode(scrn, 1280, 1024, 72 * 1000, "1280x1024-70");
|
||||
_eglAddMode(scrn, 1280, 1024, 70 * 1000, "1280x1024-70");
|
||||
_eglAddMode(scrn, 1024, 768, 72 * 1000, "1024x768-72");
|
||||
|
||||
/* Create the display's visual configs - silly example */
|
||||
for (i = 0; i < 4; i++) {
|
||||
_EGLConfig config;
|
||||
_eglInitConfig(&config, i + 1);
|
||||
_eglSetConfigAttrib(&config, EGL_RED_SIZE, 8);
|
||||
_eglSetConfigAttrib(&config, EGL_GREEN_SIZE, 8);
|
||||
_eglSetConfigAttrib(&config, EGL_BLUE_SIZE, 8);
|
||||
_eglSetConfigAttrib(&config, EGL_ALPHA_SIZE, 8);
|
||||
_eglSetConfigAttrib(&config, EGL_BUFFER_SIZE, 32);
|
||||
if (i & 1) {
|
||||
_eglSetConfigAttrib(&config, EGL_DEPTH_SIZE, 32);
|
||||
}
|
||||
if (i & 2) {
|
||||
_eglSetConfigAttrib(&config, EGL_STENCIL_SIZE, 8);
|
||||
}
|
||||
_eglSetConfigAttrib(&config, EGL_SURFACE_TYPE,
|
||||
(EGL_WINDOW_BIT | EGL_PIXMAP_BIT | EGL_PBUFFER_BIT));
|
||||
_eglAddConfig(disp, &config);
|
||||
}
|
||||
|
||||
drv->Initialized = EGL_TRUE;
|
||||
|
||||
*major = 1;
|
||||
*minor = 0;
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static EGLBoolean
|
||||
demoTerminate(_EGLDriver *drv, EGLDisplay dpy)
|
||||
{
|
||||
/*DemoDriver *demo = DEMO_DRIVER(dpy);*/
|
||||
free(drv);
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static DemoContext *
|
||||
LookupDemoContext(EGLContext ctx)
|
||||
{
|
||||
_EGLContext *c = _eglLookupContext(ctx);
|
||||
return (DemoContext *) c;
|
||||
}
|
||||
|
||||
|
||||
static DemoSurface *
|
||||
LookupDemoSurface(EGLSurface surf)
|
||||
{
|
||||
_EGLSurface *s = _eglLookupSurface(surf);
|
||||
return (DemoSurface *) s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static EGLContext
|
||||
demoCreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLConfig *conf;
|
||||
DemoContext *c;
|
||||
_EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
int i;
|
||||
|
||||
conf = _eglLookupConfig(drv, dpy, config);
|
||||
if (!conf) {
|
||||
_eglError(EGL_BAD_CONFIG, "eglCreateContext");
|
||||
return EGL_NO_CONTEXT;
|
||||
}
|
||||
|
||||
for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
|
||||
switch (attrib_list[i]) {
|
||||
/* no attribs defined for now */
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglCreateContext");
|
||||
return EGL_NO_CONTEXT;
|
||||
}
|
||||
}
|
||||
|
||||
c = (DemoContext *) calloc(1, sizeof(DemoContext));
|
||||
if (!c)
|
||||
return EGL_NO_CONTEXT;
|
||||
|
||||
_eglInitContext(&c->Base);
|
||||
c->Base.Display = disp;
|
||||
c->Base.Config = conf;
|
||||
c->Base.DrawSurface = EGL_NO_SURFACE;
|
||||
c->Base.ReadSurface = EGL_NO_SURFACE;
|
||||
c->DemoStuff = 1;
|
||||
printf("demoCreateContext\n");
|
||||
|
||||
/* generate handle and insert into hash table */
|
||||
_eglSaveContext(&c->Base);
|
||||
assert(c->Base.Handle);
|
||||
|
||||
return c->Base.Handle;
|
||||
}
|
||||
|
||||
|
||||
static EGLSurface
|
||||
demoCreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
|
||||
switch (attrib_list[i]) {
|
||||
/* no attribs at this time */
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglCreateWindowSurface");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
}
|
||||
printf("eglCreateWindowSurface()\n");
|
||||
/* XXX unfinished */
|
||||
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
|
||||
static EGLSurface
|
||||
demoCreatePixmapSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLConfig *conf;
|
||||
EGLint i;
|
||||
|
||||
conf = _eglLookupConfig(drv, dpy, config);
|
||||
if (!conf) {
|
||||
_eglError(EGL_BAD_CONFIG, "eglCreatePixmapSurface");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
|
||||
switch (attrib_list[i]) {
|
||||
/* no attribs at this time */
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglCreatePixmapSurface");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
}
|
||||
|
||||
if (conf->Attrib[EGL_SURFACE_TYPE - FIRST_ATTRIB] == 0) {
|
||||
_eglError(EGL_BAD_MATCH, "eglCreatePixmapSurface");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
printf("eglCreatePixmapSurface()\n");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
|
||||
static EGLSurface
|
||||
demoCreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
|
||||
const EGLint *attrib_list)
|
||||
{
|
||||
DemoSurface *surf = (DemoSurface *) calloc(1, sizeof(DemoSurface));
|
||||
if (!surf)
|
||||
return EGL_NO_SURFACE;
|
||||
|
||||
if (_eglInitPbufferSurface(&surf->Base, drv, dpy, config, attrib_list)
|
||||
== EGL_NO_SURFACE) {
|
||||
free(surf);
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
/* a real driver would allocate the pbuffer memory here */
|
||||
|
||||
return surf->Base.Handle;
|
||||
}
|
||||
|
||||
|
||||
static EGLBoolean
|
||||
demoDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
||||
{
|
||||
DemoSurface *fs = LookupDemoSurface(surface);
|
||||
_eglRemoveSurface(&fs->Base);
|
||||
if (fs->Base.IsBound) {
|
||||
fs->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
free(fs);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static EGLBoolean
|
||||
demoDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
|
||||
{
|
||||
DemoContext *fc = LookupDemoContext(context);
|
||||
_eglRemoveContext(&fc->Base);
|
||||
if (fc->Base.IsBound) {
|
||||
fc->Base.DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
free(fc);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
static EGLBoolean
|
||||
demoMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext context)
|
||||
{
|
||||
/*DemoDriver *demo = DEMO_DRIVER(dpy);*/
|
||||
DemoSurface *readSurf = LookupDemoSurface(read);
|
||||
DemoSurface *drawSurf = LookupDemoSurface(draw);
|
||||
DemoContext *ctx = LookupDemoContext(context);
|
||||
EGLBoolean b;
|
||||
|
||||
b = _eglMakeCurrent(drv, dpy, draw, read, context);
|
||||
if (!b)
|
||||
return EGL_FALSE;
|
||||
|
||||
/* XXX this is where we'd do the hardware context switch */
|
||||
(void) drawSurf;
|
||||
(void) readSurf;
|
||||
(void) ctx;
|
||||
|
||||
printf("eglMakeCurrent()\n");
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Just to silence warning
|
||||
*/
|
||||
extern _EGLDriver *
|
||||
_eglMain(NativeDisplayType dpy);
|
||||
|
||||
|
||||
/**
|
||||
* The bootstrap function. Return a new DemoDriver object and
|
||||
* plug in API functions.
|
||||
*/
|
||||
_EGLDriver *
|
||||
_eglMain(NativeDisplayType dpy)
|
||||
{
|
||||
DemoDriver *demo;
|
||||
|
||||
demo = (DemoDriver *) calloc(1, sizeof(DemoDriver));
|
||||
if (!demo) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* First fill in the dispatch table with defaults */
|
||||
_eglInitDriverFallbacks(&demo->Base);
|
||||
/* then plug in our Demo-specific functions */
|
||||
demo->Base.Initialize = demoInitialize;
|
||||
demo->Base.Terminate = demoTerminate;
|
||||
demo->Base.CreateContext = demoCreateContext;
|
||||
demo->Base.MakeCurrent = demoMakeCurrent;
|
||||
demo->Base.CreateWindowSurface = demoCreateWindowSurface;
|
||||
demo->Base.CreatePixmapSurface = demoCreatePixmapSurface;
|
||||
demo->Base.CreatePbufferSurface = demoCreatePbufferSurface;
|
||||
demo->Base.DestroySurface = demoDestroySurface;
|
||||
demo->Base.DestroyContext = demoDestroyContext;
|
||||
|
||||
/* enable supported extensions */
|
||||
demo->Base.MESA_screen_surface = EGL_TRUE;
|
||||
demo->Base.MESA_copy_context = EGL_TRUE;
|
||||
|
||||
return &demo->Base;
|
||||
}
|
64
src/egl/main/Makefile
Normal file
64
src/egl/main/Makefile
Normal file
@@ -0,0 +1,64 @@
|
||||
# src/egl/main/Makefile
|
||||
|
||||
TOP = ../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
|
||||
INCLUDE_DIRS = -I$(TOP)/include -I$(TOP)/src/mesa/glapi
|
||||
|
||||
HEADERS = \
|
||||
eglconfig.h \
|
||||
eglcontext.h \
|
||||
egldisplay.h \
|
||||
egldriver.h \
|
||||
eglglobals.h \
|
||||
eglhash.h \
|
||||
eglmode.h \
|
||||
eglscreen.h \
|
||||
eglsurface.h
|
||||
|
||||
SOURCES = \
|
||||
eglapi.c \
|
||||
eglconfig.c \
|
||||
eglcontext.c \
|
||||
egldisplay.c \
|
||||
egldriver.c \
|
||||
eglglobals.c \
|
||||
eglhash.c \
|
||||
eglmode.c \
|
||||
eglscreen.c \
|
||||
eglsurface.c
|
||||
|
||||
OBJECTS = $(SOURCES:.c=.o)
|
||||
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
|
||||
|
||||
|
||||
|
||||
default: depend library
|
||||
|
||||
|
||||
# EGL Library
|
||||
library: $(LIB_DIR)/libEGL.so
|
||||
|
||||
$(LIB_DIR)/libEGL.so: $(OBJECTS)
|
||||
$(TOP)/bin/mklib -o EGL -major 1 -minor 0 \
|
||||
-install $(LIB_DIR) -ldl $(OBJECTS)
|
||||
|
||||
|
||||
|
||||
clean:
|
||||
rm -f *.o *.so*
|
||||
rm -f core.*
|
||||
|
||||
|
||||
depend: $(SOURCES) $(HEADERS)
|
||||
@ echo "running $(MKDEP)"
|
||||
@ touch depend
|
||||
$(MKDEP) $(MKDEP_OPTIONS) $(DEFINES) $(INCLUDE_DIRS) \
|
||||
$(SOURCES) $(HEADERS) > /dev/null
|
||||
|
||||
include depend
|
||||
# DO NOT DELETE
|
497
src/egl/main/eglapi.c
Normal file
497
src/egl/main/eglapi.c
Normal file
@@ -0,0 +1,497 @@
|
||||
/**
|
||||
* Public EGL API entrypoints
|
||||
*
|
||||
* Generally, we use the EGLDisplay parameter as a key to lookup the
|
||||
* appropriate device driver handle, then jump though the driver's
|
||||
* dispatch table to handle the function.
|
||||
*
|
||||
* That allows us the option of supporting multiple, simultaneous,
|
||||
* heterogeneous hardware devices in the future.
|
||||
*
|
||||
* The EGLDisplay, EGLConfig, EGLContext and EGLSurface types are
|
||||
* opaque handles implemented with 32-bit unsigned integers.
|
||||
* It's up to the driver function or fallback function to look up the
|
||||
* handle and get an object.
|
||||
* By using opaque handles, we leave open the possibility of having
|
||||
* indirect rendering in the future, like GLX.
|
||||
*
|
||||
*
|
||||
* Notes on naming conventions:
|
||||
*
|
||||
* eglFooBar - public EGL function
|
||||
* EGL_FOO_BAR - public EGL token
|
||||
* EGLDatatype - public EGL datatype
|
||||
*
|
||||
* _eglFooBar - private EGL function
|
||||
* _EGLDatatype - private EGL datatype, typedef'd struct
|
||||
* _egl_struct - private EGL struct, non-typedef'd
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
/**#include "glapi.h"**/
|
||||
#include "eglcontext.h"
|
||||
#include "egldisplay.h"
|
||||
#include "egltypedefs.h"
|
||||
#include "eglglobals.h"
|
||||
#include "egldriver.h"
|
||||
#include "eglsurface.h"
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* NOTE: displayName is treated as a string in _eglChooseDriver()!!!
|
||||
* This will probably change!
|
||||
* See _eglChooseDriver() for details!
|
||||
*/
|
||||
EGLDisplay APIENTRY
|
||||
eglGetDisplay(NativeDisplayType displayName)
|
||||
{
|
||||
_EGLDisplay *dpy;
|
||||
_eglInitGlobals();
|
||||
dpy = _eglNewDisplay(displayName);
|
||||
if (dpy)
|
||||
return dpy->Handle;
|
||||
else
|
||||
return EGL_NO_DISPLAY;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
|
||||
{
|
||||
if (dpy) {
|
||||
_EGLDriver *drv = _eglChooseDriver(dpy);
|
||||
if (drv)
|
||||
return drv->Initialize(drv, dpy, major, minor);
|
||||
}
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglTerminate(EGLDisplay dpy)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
if (drv)
|
||||
return _eglCloseDriver(drv, dpy);
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
const char * APIENTRY
|
||||
eglQueryString(EGLDisplay dpy, EGLint name)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
if (drv)
|
||||
return drv->QueryString(drv, dpy, name);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
/* XXX check drv for null in remaining functions */
|
||||
return drv->GetConfigs(drv, dpy, configs, config_size, num_config);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->ChooseConfig(drv, dpy, attrib_list, configs, config_size, num_config);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->GetConfigAttrib(drv, dpy, config, attribute, value);
|
||||
}
|
||||
|
||||
|
||||
EGLContext APIENTRY
|
||||
eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->CreateContext(drv, dpy, config, share_list, attrib_list);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->DestroyContext(drv, dpy, ctx);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->MakeCurrent(drv, dpy, draw, read, ctx);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->QueryContext(drv, dpy, ctx, attribute, value);
|
||||
}
|
||||
|
||||
|
||||
EGLSurface APIENTRY
|
||||
eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->CreateWindowSurface(drv, dpy, config, window, attrib_list);
|
||||
}
|
||||
|
||||
|
||||
EGLSurface APIENTRY
|
||||
eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->CreatePixmapSurface(drv, dpy, config, pixmap, attrib_list);
|
||||
}
|
||||
|
||||
|
||||
EGLSurface APIENTRY
|
||||
eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->CreatePbufferSurface(drv, dpy, config, attrib_list);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->DestroySurface(drv, dpy, surface);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->QuerySurface(drv, dpy, surface, attribute, value);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->SurfaceAttrib(drv, dpy, surface, attribute, value);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->BindTexImage(drv, dpy, surface, buffer);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->ReleaseTexImage(drv, dpy, surface, buffer);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglSwapInterval(EGLDisplay dpy, EGLint interval)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->SwapInterval(drv, dpy, interval);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->SwapBuffers(drv, dpy, draw);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, NativePixmapType target)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->CopyBuffers(drv, dpy, surface, target);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglWaitGL(void)
|
||||
{
|
||||
EGLDisplay dpy = eglGetCurrentDisplay();
|
||||
if (dpy != EGL_NO_DISPLAY) {
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->WaitGL(drv, dpy);
|
||||
}
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglWaitNative(EGLint engine)
|
||||
{
|
||||
EGLDisplay dpy = eglGetCurrentDisplay();
|
||||
if (dpy != EGL_NO_DISPLAY) {
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->WaitNative(drv, dpy, engine);
|
||||
}
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLDisplay APIENTRY
|
||||
eglGetCurrentDisplay(void)
|
||||
{
|
||||
_EGLDisplay *dpy = _eglGetCurrentDisplay();
|
||||
if (dpy)
|
||||
return dpy->Handle;
|
||||
else
|
||||
return EGL_NO_DISPLAY;
|
||||
}
|
||||
|
||||
|
||||
EGLContext APIENTRY
|
||||
eglGetCurrentContext(void)
|
||||
{
|
||||
_EGLContext *ctx = _eglGetCurrentContext();
|
||||
if (ctx)
|
||||
return ctx->Handle;
|
||||
else
|
||||
return EGL_NO_CONTEXT;
|
||||
}
|
||||
|
||||
|
||||
EGLSurface APIENTRY
|
||||
eglGetCurrentSurface(EGLint readdraw)
|
||||
{
|
||||
_EGLSurface *s = _eglGetCurrentSurface(readdraw);
|
||||
if (s)
|
||||
return s->Handle;
|
||||
else
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
|
||||
EGLint APIENTRY
|
||||
eglGetError(void)
|
||||
{
|
||||
EGLint e = _eglGlobal.LastError;
|
||||
_eglGlobal.LastError = EGL_SUCCESS;
|
||||
return e;
|
||||
}
|
||||
|
||||
|
||||
void (* APIENTRY eglGetProcAddress(const char *procname))()
|
||||
{
|
||||
typedef void (*genericFunc)();
|
||||
struct name_function {
|
||||
const char *name;
|
||||
_EGLProc function;
|
||||
};
|
||||
static struct name_function egl_functions[] = {
|
||||
/* alphabetical order */
|
||||
{ "eglBindTexImage", (_EGLProc) eglBindTexImage },
|
||||
{ "eglChooseConfig", (_EGLProc) eglChooseConfig },
|
||||
{ "eglCopyBuffers", (_EGLProc) eglCopyBuffers },
|
||||
{ "eglCreateContext", (_EGLProc) eglCreateContext },
|
||||
{ "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface },
|
||||
{ "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface },
|
||||
{ "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface },
|
||||
{ "eglDestroyContext", (_EGLProc) eglDestroyContext },
|
||||
{ "eglDestroySurface", (_EGLProc) eglDestroySurface },
|
||||
{ "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib },
|
||||
{ "eglGetConfigs", (_EGLProc) eglGetConfigs },
|
||||
{ "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext },
|
||||
{ "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay },
|
||||
{ "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface },
|
||||
{ "eglGetDisplay", (_EGLProc) eglGetDisplay },
|
||||
{ "eglGetError", (_EGLProc) eglGetError },
|
||||
{ "eglGetProcAddress", (_EGLProc) eglGetProcAddress },
|
||||
{ "eglInitialize", (_EGLProc) eglInitialize },
|
||||
{ "eglMakeCurrent", (_EGLProc) eglMakeCurrent },
|
||||
{ "eglQueryContext", (_EGLProc) eglQueryContext },
|
||||
{ "eglQueryString", (_EGLProc) eglQueryString },
|
||||
{ "eglQuerySurface", (_EGLProc) eglQuerySurface },
|
||||
{ "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage },
|
||||
{ "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib },
|
||||
{ "eglSwapBuffers", (_EGLProc) eglSwapBuffers },
|
||||
{ "eglSwapInterval", (_EGLProc) eglSwapInterval },
|
||||
{ "eglTerminate", (_EGLProc) eglTerminate },
|
||||
{ "eglWaitGL", (_EGLProc) eglWaitGL },
|
||||
{ "eglWaitNative", (_EGLProc) eglWaitNative },
|
||||
/* Extensions */
|
||||
{ "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
|
||||
{ "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
|
||||
{ "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
|
||||
{ "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
|
||||
{ "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
|
||||
{ "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
|
||||
{ "eglShowSurfaceMESA", (_EGLProc) eglShowSurfaceMESA },
|
||||
{ "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
|
||||
{ "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
|
||||
{ "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
|
||||
{ "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
|
||||
{ "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
EGLint i;
|
||||
for (i = 0; egl_functions[i].name; i++) {
|
||||
if (strcmp(egl_functions[i].name, procname) == 0) {
|
||||
return (genericFunc) egl_functions[i].function;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
/* XXX enable this code someday */
|
||||
return (genericFunc) _glapi_get_proc_address(procname);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* EGL_MESA_screen extension
|
||||
*/
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
|
||||
const EGLint *attrib_list, EGLModeMESA *modes,
|
||||
EGLint modes_size, EGLint *num_modes)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
if (drv)
|
||||
return drv->ChooseModeMESA(drv, dpy, screen, attrib_list, modes, modes_size, num_modes);
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes, EGLint mode_size, EGLint *num_mode)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
if (drv)
|
||||
return drv->GetModesMESA(drv, dpy, screen, modes, mode_size, num_mode);
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
if (drv)
|
||||
return drv->GetModeAttribMESA(drv, dpy, mode, attribute, value);
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean APIENTRY
|
||||
eglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest, EGLint mask)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
if (drv)
|
||||
return drv->CopyContextMESA(drv, dpy, source, dest, mask);
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens, EGLint max_screens, EGLint *num_screens)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
if (drv)
|
||||
return drv->GetScreensMESA(drv, dpy, screens, max_screens, num_screens);
|
||||
else
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLSurface
|
||||
eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->CreateScreenSurfaceMESA(drv, dpy, config, attrib_list);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
eglShowSurfaceMESA(EGLDisplay dpy, EGLint screen, EGLSurface surface, EGLModeMESA mode)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->ShowSurfaceMESA(drv, dpy, screen, surface, mode);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->ScreenPositionMESA(drv, dpy, screen, x, y);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
eglQueryScreenMESA( EGLDisplay dpy, EGLScreenMESA screen, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->QueryScreenMESA(drv, dpy, screen, attribute, value);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLSurface *surface)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->QueryScreenSurfaceMESA(drv, dpy, screen, surface);
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->QueryScreenModeMESA(drv, dpy, screen, mode);
|
||||
}
|
||||
|
||||
|
||||
const char *
|
||||
eglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
|
||||
{
|
||||
_EGLDriver *drv = _eglLookupDriver(dpy);
|
||||
return drv->QueryModeStringMESA(drv, dpy, mode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
577
src/egl/main/eglconfig.c
Normal file
577
src/egl/main/eglconfig.c
Normal file
@@ -0,0 +1,577 @@
|
||||
/**
|
||||
* EGL Configuration (pixel format) functions.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include "eglconfig.h"
|
||||
#include "egldisplay.h"
|
||||
#include "egldriver.h"
|
||||
#include "eglglobals.h"
|
||||
|
||||
|
||||
#define MIN2(A, B) (((A) < (B)) ? (A) : (B))
|
||||
|
||||
|
||||
/**
|
||||
* Convert an _EGLConfig to a __GLcontextModes object.
|
||||
* NOTE: This routine may be incomplete - we're only making sure that
|
||||
* the fields needed by Mesa (for _mesa_create_context/framebuffer) are
|
||||
* set correctly.
|
||||
*/
|
||||
void
|
||||
_eglConfigToContextModesRec(const _EGLConfig *config, __GLcontextModes *mode)
|
||||
{
|
||||
memset(mode, 0, sizeof(*mode));
|
||||
|
||||
mode->rgbMode = GL_TRUE; /* no color index */
|
||||
mode->colorIndexMode = GL_FALSE;
|
||||
mode->doubleBufferMode = GL_TRUE; /* always DB for now */
|
||||
mode->stereoMode = GL_FALSE;
|
||||
|
||||
mode->redBits = GET_CONFIG_ATTRIB(config, EGL_RED_SIZE);
|
||||
mode->greenBits = GET_CONFIG_ATTRIB(config, EGL_GREEN_SIZE);
|
||||
mode->blueBits = GET_CONFIG_ATTRIB(config, EGL_BLUE_SIZE);
|
||||
mode->alphaBits = GET_CONFIG_ATTRIB(config, EGL_ALPHA_SIZE);
|
||||
mode->rgbBits = GET_CONFIG_ATTRIB(config, EGL_BUFFER_SIZE);
|
||||
|
||||
/* no rgba masks - fix? */
|
||||
|
||||
mode->depthBits = GET_CONFIG_ATTRIB(config, EGL_DEPTH_SIZE);
|
||||
mode->haveDepthBuffer = mode->depthBits > 0;
|
||||
|
||||
mode->stencilBits = GET_CONFIG_ATTRIB(config, EGL_STENCIL_SIZE);
|
||||
mode->haveStencilBuffer = mode->stencilBits > 0;
|
||||
|
||||
/* no accum */
|
||||
|
||||
mode->level = GET_CONFIG_ATTRIB(config, EGL_LEVEL);
|
||||
mode->samples = GET_CONFIG_ATTRIB(config, EGL_SAMPLES);
|
||||
mode->sampleBuffers = GET_CONFIG_ATTRIB(config, EGL_SAMPLE_BUFFERS);
|
||||
|
||||
/* surface type - not really needed */
|
||||
mode->visualType = GLX_TRUE_COLOR;
|
||||
mode->renderType = GLX_RGBA_BIT;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_eglSetConfigAttrib(_EGLConfig *config, EGLint attr, EGLint val)
|
||||
{
|
||||
assert(attr >= FIRST_ATTRIB);
|
||||
assert(attr < FIRST_ATTRIB + MAX_ATTRIBS);
|
||||
config->Attrib[attr - FIRST_ATTRIB] = val;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Init the given _EGLconfig to default values.
|
||||
* \param id the configuration's ID.
|
||||
*/
|
||||
void
|
||||
_eglInitConfig(_EGLConfig *config, EGLint id)
|
||||
{
|
||||
memset(config, 0, sizeof(*config));
|
||||
config->Handle = id;
|
||||
_eglSetConfigAttrib(config, EGL_CONFIG_ID, id);
|
||||
_eglSetConfigAttrib(config, EGL_BIND_TO_TEXTURE_RGB, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_BIND_TO_TEXTURE_RGBA, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_CONFIG_CAVEAT, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_NATIVE_RENDERABLE, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_NATIVE_VISUAL_TYPE, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_MIN_SWAP_INTERVAL, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_MAX_SWAP_INTERVAL, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_SURFACE_TYPE,
|
||||
EGL_SCREEN_BIT_MESA | EGL_PBUFFER_BIT |
|
||||
EGL_PIXMAP_BIT | EGL_WINDOW_BIT);
|
||||
_eglSetConfigAttrib(config, EGL_TRANSPARENT_TYPE, EGL_NONE);
|
||||
_eglSetConfigAttrib(config, EGL_TRANSPARENT_RED_VALUE, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_TRANSPARENT_GREEN_VALUE, EGL_DONT_CARE);
|
||||
_eglSetConfigAttrib(config, EGL_TRANSPARENT_BLUE_VALUE, EGL_DONT_CARE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given an EGLConfig handle, return the corresponding _EGLConfig object.
|
||||
*/
|
||||
_EGLConfig *
|
||||
_eglLookupConfig(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config)
|
||||
{
|
||||
EGLint i;
|
||||
_EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
for (i = 0; i < disp->NumConfigs; i++) {
|
||||
if (disp->Configs[i].Handle == config) {
|
||||
return disp->Configs + i;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add the given _EGLConifg to the given display.
|
||||
*/
|
||||
_EGLConfig *
|
||||
_eglAddConfig(_EGLDisplay *display, const _EGLConfig *config)
|
||||
{
|
||||
_EGLConfig *newConfigs;
|
||||
EGLint n;
|
||||
|
||||
n = display->NumConfigs;
|
||||
|
||||
newConfigs = (_EGLConfig *) realloc(display->Configs,
|
||||
(n + 1) * sizeof(_EGLConfig));
|
||||
if (newConfigs) {
|
||||
display->Configs = newConfigs;
|
||||
display->Configs[n] = *config; /* copy struct */
|
||||
display->Configs[n].Handle = n;
|
||||
display->NumConfigs++;
|
||||
return display->Configs + n;
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse the attrib_list to fill in the fields of the given _egl_config
|
||||
* Return EGL_FALSE if any errors, EGL_TRUE otherwise.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglParseConfigAttribs(_EGLConfig *config, const EGLint *attrib_list)
|
||||
{
|
||||
EGLint i;
|
||||
|
||||
/* XXX set all config attribs to EGL_DONT_CARE */
|
||||
|
||||
for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
|
||||
EGLint k = attrib_list[i] - FIRST_ATTRIB;
|
||||
if (k >= 0 && k < MAX_ATTRIBS) {
|
||||
config->Attrib[k] = attrib_list[++i];
|
||||
}
|
||||
else {
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
#define EXACT 1
|
||||
#define ATLEAST 2
|
||||
#define MASK 3
|
||||
#define SMALLER 4
|
||||
#define SPECIAL 5
|
||||
#define NONE 6
|
||||
|
||||
struct sort_info {
|
||||
EGLint Attribute;
|
||||
EGLint MatchCriteria;
|
||||
EGLint SortOrder;
|
||||
};
|
||||
|
||||
/* This encodes the info from Table 3.5 of the EGL spec, ordered by
|
||||
* Sort Priority.
|
||||
*/
|
||||
static struct sort_info SortInfo[] = {
|
||||
{ EGL_CONFIG_CAVEAT, EXACT, SPECIAL },
|
||||
{ EGL_RED_SIZE, ATLEAST, SPECIAL },
|
||||
{ EGL_GREEN_SIZE, ATLEAST, SPECIAL },
|
||||
{ EGL_BLUE_SIZE, ATLEAST, SPECIAL },
|
||||
{ EGL_ALPHA_SIZE, ATLEAST, SPECIAL },
|
||||
{ EGL_BUFFER_SIZE, ATLEAST, SMALLER },
|
||||
{ EGL_SAMPLE_BUFFERS, ATLEAST, SMALLER },
|
||||
{ EGL_SAMPLES, ATLEAST, SMALLER },
|
||||
{ EGL_DEPTH_SIZE, ATLEAST, SMALLER },
|
||||
{ EGL_STENCIL_SIZE, ATLEAST, SMALLER },
|
||||
{ EGL_NATIVE_VISUAL_TYPE, EXACT, SPECIAL },
|
||||
{ EGL_CONFIG_ID, EXACT, SMALLER },
|
||||
{ EGL_BIND_TO_TEXTURE_RGB, EXACT, NONE },
|
||||
{ EGL_BIND_TO_TEXTURE_RGBA, EXACT, NONE },
|
||||
{ EGL_LEVEL, EXACT, NONE },
|
||||
{ EGL_NATIVE_RENDERABLE, EXACT, NONE },
|
||||
{ EGL_MAX_SWAP_INTERVAL, EXACT, NONE },
|
||||
{ EGL_MIN_SWAP_INTERVAL, EXACT, NONE },
|
||||
{ EGL_SURFACE_TYPE, MASK, NONE },
|
||||
{ EGL_TRANSPARENT_TYPE, EXACT, NONE },
|
||||
{ EGL_TRANSPARENT_RED_VALUE, EXACT, NONE },
|
||||
{ EGL_TRANSPARENT_GREEN_VALUE, EXACT, NONE },
|
||||
{ EGL_TRANSPARENT_BLUE_VALUE, EXACT, NONE },
|
||||
{ 0, 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Return EGL_TRUE if the attributes of c meet or exceed the minimums
|
||||
* specified by min.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglConfigQualifies(const _EGLConfig *c, const _EGLConfig *min)
|
||||
{
|
||||
EGLint i;
|
||||
for (i = 0; SortInfo[i].Attribute != 0; i++) {
|
||||
const EGLint mv = GET_CONFIG_ATTRIB(min, SortInfo[i].Attribute);
|
||||
if (mv != EGL_DONT_CARE) {
|
||||
const EGLint cv = GET_CONFIG_ATTRIB(c, SortInfo[i].Attribute);
|
||||
if (SortInfo[i].MatchCriteria == EXACT) {
|
||||
if (cv != mv) {
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
else if (SortInfo[i].MatchCriteria == ATLEAST) {
|
||||
if (cv < mv) {
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert(SortInfo[i].MatchCriteria == MASK);
|
||||
if ((mv & cv) != mv) {
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Compare configs 'a' and 'b' and return -1 if a belongs before b,
|
||||
* 1 if a belongs after b, or 0 if they're equal.
|
||||
*/
|
||||
EGLint
|
||||
_eglCompareConfigs(const _EGLConfig *a, const _EGLConfig *b)
|
||||
{
|
||||
EGLint i;
|
||||
for (i = 0; SortInfo[i].Attribute != 0; i++) {
|
||||
const EGLint av = GET_CONFIG_ATTRIB(a, SortInfo[i].Attribute);
|
||||
const EGLint bv = GET_CONFIG_ATTRIB(b, SortInfo[i].Attribute);
|
||||
if (SortInfo[i].SortOrder == SMALLER) {
|
||||
if (av < bv)
|
||||
return -1;
|
||||
else if (av > bv)
|
||||
return 1;
|
||||
/* else, continue examining attribute values */
|
||||
}
|
||||
else if (SortInfo[i].SortOrder == SPECIAL) {
|
||||
if (SortInfo[i].Attribute == EGL_CONFIG_CAVEAT) {
|
||||
/* values are EGL_NONE, SLOW_CONFIG, or NON_CONFORMANT_CONFIG */
|
||||
if (av < bv)
|
||||
return -1;
|
||||
else if (av > bv)
|
||||
return 1;
|
||||
}
|
||||
else if (SortInfo[i].Attribute == EGL_RED_SIZE ||
|
||||
SortInfo[i].Attribute == EGL_GREEN_SIZE ||
|
||||
SortInfo[i].Attribute == EGL_BLUE_SIZE ||
|
||||
SortInfo[i].Attribute == EGL_ALPHA_SIZE) {
|
||||
if (av > bv)
|
||||
return -1;
|
||||
else if (av < bv)
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
assert(SortInfo[i].Attribute == EGL_NATIVE_VISUAL_TYPE);
|
||||
if (av < bv)
|
||||
return -1;
|
||||
else if (av > bv)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert(SortInfo[i].SortOrder == NONE);
|
||||
/* continue examining attribute values */
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Typical fallback routine for eglChooseConfig
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglChooseConfig(_EGLDriver *drv, EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
|
||||
{
|
||||
_EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
_EGLConfig criteria;
|
||||
EGLint i;
|
||||
|
||||
/* parse the attrib_list to initialize criteria */
|
||||
if (!_eglParseConfigAttribs(&criteria, attrib_list)) {
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
*num_config = 0;
|
||||
for (i = 0; i < disp->NumConfigs; i++) {
|
||||
const _EGLConfig *conf = disp->Configs + i;
|
||||
if (_eglConfigQualifies(conf, &criteria)) {
|
||||
if (*num_config < config_size) {
|
||||
/* save */
|
||||
configs[*num_config] = conf->Handle;
|
||||
(*num_config)++;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX sort the list here */
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fallback for eglGetConfigAttrib.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglGetConfigAttrib(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
|
||||
{
|
||||
const _EGLConfig *conf = _eglLookupConfig(drv, dpy, config);
|
||||
const EGLint k = attribute - FIRST_ATTRIB;
|
||||
if (k >= 0 && k < MAX_ATTRIBS) {
|
||||
*value = conf->Attrib[k];
|
||||
return EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglGetConfigAttrib");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fallback for eglGetConfigs.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglGetConfigs(_EGLDriver *drv, EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
|
||||
{
|
||||
_EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
|
||||
if (!drv->Initialized) {
|
||||
_eglError(EGL_NOT_INITIALIZED, "eglGetConfigs");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
if (configs) {
|
||||
EGLint i;
|
||||
*num_config = MIN2(disp->NumConfigs, config_size);
|
||||
for (i = 0; i < *num_config; i++) {
|
||||
configs[i] = disp->Configs[i].Handle;
|
||||
}
|
||||
} else
|
||||
*num_config = disp->NumConfigs;
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a set of \c __GLcontextModes that a driver will expose.
|
||||
*
|
||||
* A set of \c __GLcontextModes will be created based on the supplied
|
||||
* parameters. The number of modes processed will be 2 *
|
||||
* \c num_depth_stencil_bits * \c num_db_modes.
|
||||
*
|
||||
* For the most part, data is just copied from \c depth_bits, \c stencil_bits,
|
||||
* \c db_modes, and \c visType into each \c __GLcontextModes element.
|
||||
* However, the meanings of \c fb_format and \c fb_type require further
|
||||
* explanation. The \c fb_format specifies which color components are in
|
||||
* each pixel and what the default order is. For example, \c GL_RGB specifies
|
||||
* that red, green, blue are available and red is in the "most significant"
|
||||
* position and blue is in the "least significant". The \c fb_type specifies
|
||||
* the bit sizes of each component and the actual ordering. For example, if
|
||||
* \c GL_UNSIGNED_SHORT_5_6_5_REV is specified with \c GL_RGB, bits [15:11]
|
||||
* are the blue value, bits [10:5] are the green value, and bits [4:0] are
|
||||
* the red value.
|
||||
*
|
||||
* One sublte issue is the combination of \c GL_RGB or \c GL_BGR and either
|
||||
* of the \c GL_UNSIGNED_INT_8_8_8_8 modes. The resulting mask values in the
|
||||
* \c __GLcontextModes structure is \b identical to the \c GL_RGBA or
|
||||
* \c GL_BGRA case, except the \c alphaMask is zero. This means that, as
|
||||
* far as this routine is concerned, \c GL_RGB with \c GL_UNSIGNED_INT_8_8_8_8
|
||||
* still uses 32-bits.
|
||||
*
|
||||
* If in doubt, look at the tables used in the function.
|
||||
*
|
||||
* \param ptr_to_modes Pointer to a pointer to a linked list of
|
||||
* \c __GLcontextModes. Upon completion, a pointer to
|
||||
* the next element to be process will be stored here.
|
||||
* If the function fails and returns \c GL_FALSE, this
|
||||
* value will be unmodified, but some elements in the
|
||||
* linked list may be modified.
|
||||
* \param fb_format Format of the framebuffer. Currently only \c GL_RGB,
|
||||
* \c GL_RGBA, \c GL_BGR, and \c GL_BGRA are supported.
|
||||
* \param fb_type Type of the pixels in the framebuffer. Currently only
|
||||
* \c GL_UNSIGNED_SHORT_5_6_5,
|
||||
* \c GL_UNSIGNED_SHORT_5_6_5_REV,
|
||||
* \c GL_UNSIGNED_INT_8_8_8_8, and
|
||||
* \c GL_UNSIGNED_INT_8_8_8_8_REV are supported.
|
||||
* \param depth_bits Array of depth buffer sizes to be exposed.
|
||||
* \param stencil_bits Array of stencil buffer sizes to be exposed.
|
||||
* \param num_depth_stencil_bits Number of entries in both \c depth_bits and
|
||||
* \c stencil_bits.
|
||||
* \param db_modes Array of buffer swap modes. If an element has a
|
||||
* value of \c GLX_NONE, then it represents a
|
||||
* single-buffered mode. Other valid values are
|
||||
* \c GLX_SWAP_EXCHANGE_OML, \c GLX_SWAP_COPY_OML, and
|
||||
* \c GLX_SWAP_UNDEFINED_OML. See the
|
||||
* GLX_OML_swap_method extension spec for more details.
|
||||
* \param num_db_modes Number of entries in \c db_modes.
|
||||
* \param visType GLX visual type. Usually either \c GLX_TRUE_COLOR or
|
||||
* \c GLX_DIRECT_COLOR.
|
||||
*
|
||||
* \returns
|
||||
* \c GL_TRUE on success or \c GL_FALSE on failure. Currently the only
|
||||
* cause of failure is a bad parameter (i.e., unsupported \c fb_format or
|
||||
* \c fb_type).
|
||||
*
|
||||
* \todo
|
||||
* There is currently no way to support packed RGB modes (i.e., modes with
|
||||
* exactly 3 bytes per pixel) or floating-point modes. This could probably
|
||||
* be done by creating some new, private enums with clever names likes
|
||||
* \c GL_UNSIGNED_3BYTE_8_8_8, \c GL_4FLOAT_32_32_32_32,
|
||||
* \c GL_4HALF_16_16_16_16, etc. We can cross that bridge when we come to it.
|
||||
*/
|
||||
GLboolean
|
||||
_eglFillInConfigs(_EGLConfig * configs,
|
||||
GLenum fb_format, GLenum fb_type,
|
||||
const u_int8_t * depth_bits, const u_int8_t * stencil_bits,
|
||||
unsigned num_depth_stencil_bits,
|
||||
const GLenum * db_modes, unsigned num_db_modes,
|
||||
int visType) {
|
||||
static const u_int8_t bits_table[3][4] = {
|
||||
/* R G B A */
|
||||
{ 5, 6, 5, 0 }, /* Any GL_UNSIGNED_SHORT_5_6_5 */
|
||||
{ 8, 8, 8, 0 }, /* Any RGB with any GL_UNSIGNED_INT_8_8_8_8 */
|
||||
{ 8, 8, 8, 8 } /* Any RGBA with any GL_UNSIGNED_INT_8_8_8_8 */
|
||||
};
|
||||
|
||||
/* The following arrays are all indexed by the fb_type masked with 0x07.
|
||||
* Given the four supported fb_type values, this results in valid array
|
||||
* indices of 3, 4, 5, and 7.
|
||||
*/
|
||||
static const u_int32_t masks_table_rgb[8][4] = {
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000F800, 0x000007E0, 0x0000001F, 0x00000000}, /* 5_6_5 */
|
||||
{0x0000001F, 0x000007E0, 0x0000F800, 0x00000000}, /* 5_6_5_REV */
|
||||
{0xFF000000, 0x00FF0000, 0x0000FF00, 0x00000000}, /* 8_8_8_8 */
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x000000FF, 0x0000FF00, 0x00FF0000, 0x00000000} /* 8_8_8_8_REV */
|
||||
};
|
||||
|
||||
static const u_int32_t masks_table_rgba[8][4] = {
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000F800, 0x000007E0, 0x0000001F, 0x00000000}, /* 5_6_5 */
|
||||
{0x0000001F, 0x000007E0, 0x0000F800, 0x00000000}, /* 5_6_5_REV */
|
||||
{0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF}, /* 8_8_8_8 */
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000}, /* 8_8_8_8_REV */
|
||||
};
|
||||
|
||||
static const u_int32_t masks_table_bgr[8][4] = {
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000001F, 0x000007E0, 0x0000F800, 0x00000000}, /* 5_6_5 */
|
||||
{0x0000F800, 0x000007E0, 0x0000001F, 0x00000000}, /* 5_6_5_REV */
|
||||
{0x0000FF00, 0x00FF0000, 0xFF000000, 0x00000000}, /* 8_8_8_8 */
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000}, /* 8_8_8_8_REV */
|
||||
};
|
||||
|
||||
static const u_int32_t masks_table_bgra[8][4] = {
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000001F, 0x000007E0, 0x0000F800, 0x00000000}, /* 5_6_5 */
|
||||
{0x0000F800, 0x000007E0, 0x0000001F, 0x00000000}, /* 5_6_5_REV */
|
||||
{0x0000FF00, 0x00FF0000, 0xFF000000, 0x000000FF}, /* 8_8_8_8 */
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000}, /* 8_8_8_8_REV */
|
||||
};
|
||||
|
||||
static const u_int8_t bytes_per_pixel[8] = {
|
||||
0, 0, 0, 2, 2, 4, 0, 4
|
||||
};
|
||||
|
||||
const u_int8_t * bits;
|
||||
const u_int32_t * masks;
|
||||
const int index = fb_type & 0x07;
|
||||
_EGLConfig *config;
|
||||
unsigned i;
|
||||
unsigned j;
|
||||
unsigned k;
|
||||
|
||||
if ( bytes_per_pixel[index] == 0 ) {
|
||||
fprintf(stderr, "[%s:%u] Framebuffer type 0x%04x has 0 bytes per pixel.\n",
|
||||
__FUNCTION__, __LINE__, fb_type);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* Valid types are GL_UNSIGNED_SHORT_5_6_5 and GL_UNSIGNED_INT_8_8_8_8 and
|
||||
* the _REV versions.
|
||||
*
|
||||
* Valid formats are GL_RGBA, GL_RGB, and GL_BGRA.
|
||||
*/
|
||||
switch ( fb_format ) {
|
||||
case GL_RGB:
|
||||
bits = (bytes_per_pixel[index] == 2) ? bits_table[0] : bits_table[1];
|
||||
masks = masks_table_rgb[index];
|
||||
break;
|
||||
|
||||
case GL_RGBA:
|
||||
bits = (bytes_per_pixel[index] == 2) ? bits_table[0] : bits_table[2];
|
||||
masks = masks_table_rgba[index];
|
||||
break;
|
||||
|
||||
case GL_BGR:
|
||||
bits = (bytes_per_pixel[index] == 2) ? bits_table[0] : bits_table[1];
|
||||
masks = masks_table_bgr[index];
|
||||
break;
|
||||
|
||||
case GL_BGRA:
|
||||
bits = (bytes_per_pixel[index] == 2) ? bits_table[0] : bits_table[2];
|
||||
masks = masks_table_bgra[index];
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "[%s:%u] Framebuffer format 0x%04x is not GL_RGB, GL_RGBA, GL_BGR, or GL_BGRA.\n",
|
||||
__FUNCTION__, __LINE__, fb_format);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
config = configs;
|
||||
for (k = 0; k < num_depth_stencil_bits; k++) {
|
||||
for (i = 0; i < num_db_modes; i++) {
|
||||
for (j = 0; j < 2; j++) {
|
||||
_eglSetConfigAttrib(config, EGL_RED_SIZE, bits[0]);
|
||||
_eglSetConfigAttrib(config, EGL_GREEN_SIZE, bits[1]);
|
||||
_eglSetConfigAttrib(config, EGL_BLUE_SIZE, bits[2]);
|
||||
_eglSetConfigAttrib(config, EGL_ALPHA_SIZE, bits[3]);
|
||||
_eglSetConfigAttrib(config, EGL_BUFFER_SIZE,
|
||||
bits[0] + bits[1] + bits[2] + bits[3]);
|
||||
|
||||
_eglSetConfigAttrib(config, EGL_STENCIL_SIZE, stencil_bits[k]);
|
||||
_eglSetConfigAttrib(config, EGL_DEPTH_SIZE, depth_bits[i]);
|
||||
|
||||
_eglSetConfigAttrib(config, EGL_SURFACE_TYPE, EGL_SCREEN_BIT_MESA |
|
||||
EGL_PBUFFER_BIT | EGL_PIXMAP_BIT | EGL_WINDOW_BIT);
|
||||
|
||||
config++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
75
src/egl/main/eglconfig.h
Normal file
75
src/egl/main/eglconfig.h
Normal file
@@ -0,0 +1,75 @@
|
||||
#ifndef EGLCONFIG_INCLUDED
|
||||
#define EGLCONFIG_INCLUDED
|
||||
|
||||
|
||||
#include "egltypedefs.h"
|
||||
#include "GL/internal/glcore.h"
|
||||
|
||||
|
||||
#define MAX_ATTRIBS 100
|
||||
#define FIRST_ATTRIB EGL_BUFFER_SIZE
|
||||
|
||||
|
||||
struct _egl_config
|
||||
{
|
||||
EGLConfig Handle; /* the public/opaque handle which names this config */
|
||||
EGLint Attrib[MAX_ATTRIBS];
|
||||
};
|
||||
|
||||
|
||||
#define SET_CONFIG_ATTRIB(CONF, ATTR, VAL) ((CONF)->Attrib[(ATTR) - FIRST_ATTRIB] = VAL)
|
||||
#define GET_CONFIG_ATTRIB(CONF, ATTR) ((CONF)->Attrib[(ATTR) - FIRST_ATTRIB])
|
||||
|
||||
|
||||
extern void
|
||||
_eglInitConfig(_EGLConfig *config, EGLint id);
|
||||
|
||||
|
||||
extern _EGLConfig *
|
||||
_eglLookupConfig(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config);
|
||||
|
||||
|
||||
extern _EGLConfig *
|
||||
_eglAddConfig(_EGLDisplay *display, const _EGLConfig *config);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglParseConfigAttribs(_EGLConfig *config, const EGLint *attrib_list);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglConfigQualifies(const _EGLConfig *c, const _EGLConfig *min);
|
||||
|
||||
|
||||
extern EGLint
|
||||
_eglCompareConfigs(const _EGLConfig *a, const _EGLConfig *b);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglChooseConfig(_EGLDriver *drv, EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglGetConfigAttrib(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglGetConfigs(_EGLDriver *drv, EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
|
||||
|
||||
extern void
|
||||
_eglSetConfigAttrib(_EGLConfig *config, EGLint attr, EGLint val);
|
||||
|
||||
extern GLboolean
|
||||
_eglFillInConfigs( _EGLConfig *configs,
|
||||
GLenum fb_format, GLenum fb_type,
|
||||
const u_int8_t * depth_bits, const u_int8_t * stencil_bits,
|
||||
unsigned num_depth_stencil_bits,
|
||||
const GLenum * db_modes, unsigned num_db_modes,
|
||||
int visType );
|
||||
|
||||
extern void
|
||||
_eglConfigToContextModesRec(const _EGLConfig *config, __GLcontextModes *mode);
|
||||
|
||||
|
||||
#endif /* EGLCONFIG_INCLUDED */
|
240
src/egl/main/eglcontext.c
Normal file
240
src/egl/main/eglcontext.c
Normal file
@@ -0,0 +1,240 @@
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "eglconfig.h"
|
||||
#include "eglcontext.h"
|
||||
#include "egldriver.h"
|
||||
#include "eglglobals.h"
|
||||
#include "eglhash.h"
|
||||
#include "eglsurface.h"
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the given _EGLContext object to defaults.
|
||||
*/
|
||||
void
|
||||
_eglInitContext(_EGLContext *ctx)
|
||||
{
|
||||
/* just init to zero for now */
|
||||
memset(ctx, 0, sizeof(_EGLContext));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Assign an EGLContext handle to the _EGLContext object then put it into
|
||||
* the hash table.
|
||||
*/
|
||||
void
|
||||
_eglSaveContext(_EGLContext *ctx)
|
||||
{
|
||||
assert(ctx);
|
||||
ctx->Handle = _eglHashGenKey(_eglGlobal.Contexts);
|
||||
_eglHashInsert(_eglGlobal.Contexts, ctx->Handle, ctx);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove the given _EGLContext object from the hash table.
|
||||
*/
|
||||
void
|
||||
_eglRemoveContext(_EGLContext *ctx)
|
||||
{
|
||||
_eglHashRemove(_eglGlobal.Contexts, ctx->Handle);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the _EGLContext object that corresponds to the given
|
||||
* EGLContext handle.
|
||||
*/
|
||||
_EGLContext *
|
||||
_eglLookupContext(EGLContext ctx)
|
||||
{
|
||||
_EGLContext *c = (_EGLContext *) _eglHashLookup(_eglGlobal.Contexts, ctx);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the currently bound _EGLContext object, or NULL.
|
||||
*/
|
||||
_EGLContext *
|
||||
_eglGetCurrentContext(void)
|
||||
{
|
||||
/* XXX this should be per-thread someday */
|
||||
return _eglGlobal.CurrentContext;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Just a placeholder/demo function. Real driver will never use this!
|
||||
*/
|
||||
EGLContext
|
||||
_eglCreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLConfig *conf = _eglLookupConfig(drv, dpy, config);
|
||||
if (!conf) {
|
||||
_eglError(EGL_BAD_CONFIG, "eglCreateContext");
|
||||
return EGL_NO_CONTEXT;
|
||||
}
|
||||
|
||||
if (share_list != EGL_NO_CONTEXT) {
|
||||
_EGLContext *shareCtx = _eglLookupContext(share_list);
|
||||
if (!shareCtx) {
|
||||
_eglError(EGL_BAD_CONTEXT, "eglCreateContext(share_list)");
|
||||
return EGL_NO_CONTEXT;
|
||||
}
|
||||
}
|
||||
|
||||
return EGL_NO_CONTEXT;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default fallback routine - drivers should usually override this.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx)
|
||||
{
|
||||
_EGLContext *context = _eglLookupContext(ctx);
|
||||
if (context) {
|
||||
_eglHashRemove(_eglGlobal.Contexts, ctx);
|
||||
if (context->IsBound) {
|
||||
context->DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
free(context);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
_eglError(EGL_BAD_CONTEXT, "eglDestroyContext");
|
||||
return EGL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglQueryContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLContext *c = _eglLookupContext(ctx);
|
||||
|
||||
(void) drv;
|
||||
(void) dpy;
|
||||
|
||||
if (!c) {
|
||||
_eglError(EGL_BAD_CONTEXT, "eglQueryContext");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
switch (attribute) {
|
||||
case EGL_CONFIG_ID:
|
||||
*value = GET_CONFIG_ATTRIB(c->Config, EGL_CONFIG_ID);
|
||||
return EGL_TRUE;
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Drivers will typically call this to do the error checking and
|
||||
* update the various IsBound and DeletePending flags.
|
||||
* Then, the driver will do its device-dependent Make-Current stuff.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface d, EGLSurface r, EGLContext context)
|
||||
{
|
||||
_EGLContext *ctx = _eglLookupContext(context);
|
||||
_EGLSurface *draw = _eglLookupSurface(d);
|
||||
_EGLSurface *read = _eglLookupSurface(r);
|
||||
|
||||
_EGLContext *oldContext = _eglGetCurrentContext();
|
||||
_EGLSurface *oldDrawSurface = _eglGetCurrentSurface(EGL_DRAW);
|
||||
_EGLSurface *oldReadSurface = _eglGetCurrentSurface(EGL_READ);
|
||||
|
||||
/* error checking */
|
||||
if (ctx) {
|
||||
if (draw == NULL || read == NULL) {
|
||||
_eglError(EGL_BAD_MATCH, "eglMakeCurrent");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
if (draw->Config != ctx->Config) {
|
||||
_eglError(EGL_BAD_MATCH, "eglMakeCurrent");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
if (read->Config != ctx->Config) {
|
||||
_eglError(EGL_BAD_MATCH, "eglMakeCurrent");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* check if the old context or surfaces need to be deleted
|
||||
*/
|
||||
if (oldDrawSurface != NULL) {
|
||||
oldDrawSurface->IsBound = EGL_FALSE;
|
||||
if (oldDrawSurface->DeletePending) {
|
||||
/* make sure we don't try to rebind a deleted surface */
|
||||
if (draw == oldDrawSurface || draw == oldReadSurface) {
|
||||
draw = NULL;
|
||||
}
|
||||
/* really delete surface now */
|
||||
drv->DestroySurface(drv, dpy, oldDrawSurface->Handle);
|
||||
}
|
||||
}
|
||||
if (oldReadSurface != NULL && oldReadSurface != oldDrawSurface) {
|
||||
oldReadSurface->IsBound = EGL_FALSE;
|
||||
if (oldReadSurface->DeletePending) {
|
||||
/* make sure we don't try to rebind a deleted surface */
|
||||
if (read == oldDrawSurface || read == oldReadSurface) {
|
||||
read = NULL;
|
||||
}
|
||||
/* really delete surface now */
|
||||
drv->DestroySurface(drv, dpy, oldReadSurface->Handle);
|
||||
}
|
||||
}
|
||||
if (oldContext != NULL) {
|
||||
oldContext->IsBound = EGL_FALSE;
|
||||
if (oldContext->DeletePending) {
|
||||
/* make sure we don't try to rebind a deleted context */
|
||||
if (ctx == oldContext) {
|
||||
ctx = NULL;
|
||||
}
|
||||
/* really delete context now */
|
||||
drv->DestroyContext(drv, dpy, oldContext->Handle);
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx) {
|
||||
/* check read/draw again, in case we deleted them above */
|
||||
if (draw == NULL || read == NULL) {
|
||||
_eglError(EGL_BAD_MATCH, "eglMakeCurrent");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
ctx->DrawSurface = draw;
|
||||
ctx->ReadSurface = read;
|
||||
ctx->IsBound = EGL_TRUE;
|
||||
draw->IsBound = EGL_TRUE;
|
||||
read->IsBound = EGL_TRUE;
|
||||
}
|
||||
|
||||
_eglGlobal.CurrentContext = ctx;
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is defined by the EGL_MESA_copy_context extension.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglCopyContextMESA(_EGLDriver *drv, EGLDisplay dpy, EGLContext source,
|
||||
EGLContext dest, EGLint mask)
|
||||
{
|
||||
/* This function will always have to be overridden/implemented in the
|
||||
* device driver. If the driver is based on Mesa, use _mesa_copy_context().
|
||||
*/
|
||||
return EGL_FALSE;
|
||||
}
|
67
src/egl/main/eglcontext.h
Normal file
67
src/egl/main/eglcontext.h
Normal file
@@ -0,0 +1,67 @@
|
||||
|
||||
#ifndef EGLCONTEXT_INCLUDED
|
||||
#define EGLCONTEXT_INCLUDED
|
||||
|
||||
|
||||
#include "egltypedefs.h"
|
||||
|
||||
|
||||
/**
|
||||
* "Base" class for device driver contexts.
|
||||
*/
|
||||
struct _egl_context
|
||||
{
|
||||
EGLContext Handle; /* The public/opaque handle which names this object */
|
||||
|
||||
_EGLDisplay *Display; /* who do I belong to? */
|
||||
|
||||
_EGLConfig *Config;
|
||||
|
||||
_EGLSurface *DrawSurface;
|
||||
_EGLSurface *ReadSurface;
|
||||
|
||||
EGLBoolean IsBound;
|
||||
EGLBoolean DeletePending;
|
||||
};
|
||||
|
||||
|
||||
extern void
|
||||
_eglInitContext(_EGLContext *ctx);
|
||||
|
||||
|
||||
extern void
|
||||
_eglSaveContext(_EGLContext *ctx);
|
||||
|
||||
|
||||
extern void
|
||||
_eglRemoveContext(_EGLContext *ctx);
|
||||
|
||||
|
||||
extern _EGLContext *
|
||||
_eglLookupContext(EGLContext ctx);
|
||||
|
||||
|
||||
extern _EGLContext *
|
||||
_eglGetCurrentContext(void);
|
||||
|
||||
|
||||
extern EGLContext
|
||||
_eglCreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglQueryContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglCopyContextMESA(_EGLDriver *drv, EGLDisplay dpy, EGLContext source, EGLContext dest, EGLint mask);
|
||||
|
||||
#endif /* EGLCONTEXT_INCLUDED */
|
71
src/egl/main/egldisplay.c
Normal file
71
src/egl/main/egldisplay.c
Normal file
@@ -0,0 +1,71 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "eglcontext.h"
|
||||
#include "egldisplay.h"
|
||||
#include "eglglobals.h"
|
||||
#include "eglhash.h"
|
||||
|
||||
|
||||
static char *
|
||||
my_strdup(const char *s)
|
||||
{
|
||||
int l = strlen(s);
|
||||
char *s2 = malloc(l + 1);
|
||||
strcpy(s2, s);
|
||||
return s2;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* We're assuming that the NativeDisplayType parameter is actually
|
||||
* a string.
|
||||
* Return a new _EGLDisplay object for the given displayName
|
||||
*/
|
||||
_EGLDisplay *
|
||||
_eglNewDisplay(NativeDisplayType displayName)
|
||||
{
|
||||
_EGLDisplay *dpy = (_EGLDisplay *) malloc(sizeof(_EGLDisplay));
|
||||
if (dpy) {
|
||||
dpy->Handle = _eglHashGenKey(_eglGlobal.Displays);
|
||||
_eglHashInsert(_eglGlobal.Displays, dpy->Handle, dpy);
|
||||
if (displayName)
|
||||
dpy->Name = my_strdup(displayName);
|
||||
else
|
||||
dpy->Name = NULL;
|
||||
dpy->Driver = NULL; /* this gets set later */
|
||||
}
|
||||
return dpy;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the _EGLDisplay object that corresponds to the given public/
|
||||
* opaque display handle.
|
||||
*/
|
||||
_EGLDisplay *
|
||||
_eglLookupDisplay(EGLDisplay dpy)
|
||||
{
|
||||
_EGLDisplay *d = (_EGLDisplay *) _eglHashLookup(_eglGlobal.Displays, dpy);
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
_EGLDisplay *
|
||||
_eglGetCurrentDisplay(void)
|
||||
{
|
||||
_EGLContext *ctx = _eglGetCurrentContext();
|
||||
if (ctx)
|
||||
return ctx->Display;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_eglCleanupDisplay(_EGLDisplay *disp)
|
||||
{
|
||||
/* XXX incomplete */
|
||||
free(disp->Configs);
|
||||
free(disp->Name);
|
||||
/* driver deletes _EGLDisplay */
|
||||
}
|
44
src/egl/main/egldisplay.h
Normal file
44
src/egl/main/egldisplay.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#ifndef EGLDISPLAY_INCLUDED
|
||||
#define EGLDISPLAY_INCLUDED
|
||||
|
||||
|
||||
#include "egltypedefs.h"
|
||||
|
||||
|
||||
struct _egl_display
|
||||
{
|
||||
EGLDisplay Handle;
|
||||
|
||||
char *Name;
|
||||
_EGLDriver *Driver;
|
||||
|
||||
EGLint NumScreens;
|
||||
_EGLScreen **Screens; /* array [NumScreens] */
|
||||
|
||||
EGLint NumConfigs;
|
||||
_EGLConfig *Configs; /* array [NumConfigs] */
|
||||
};
|
||||
|
||||
|
||||
extern _EGLDisplay *
|
||||
_eglNewDisplay(NativeDisplayType displayName);
|
||||
|
||||
|
||||
extern _EGLDisplay *
|
||||
_eglLookupDisplay(EGLDisplay dpy);
|
||||
|
||||
|
||||
extern _EGLDisplay *
|
||||
_eglGetCurrentDisplay(void);
|
||||
|
||||
|
||||
extern void
|
||||
_eglCleanupDisplay(_EGLDisplay *disp);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglQueryDisplayMESA(_EGLDriver *drv, EGLDisplay dpy, EGLint attrib, EGLint *value);
|
||||
|
||||
|
||||
|
||||
#endif /* EGLDISPLAY_INCLUDED */
|
255
src/egl/main/egldriver.c
Normal file
255
src/egl/main/egldriver.c
Normal file
@@ -0,0 +1,255 @@
|
||||
#include <assert.h>
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "eglconfig.h"
|
||||
#include "eglcontext.h"
|
||||
#include "egldisplay.h"
|
||||
#include "egldriver.h"
|
||||
#include "eglglobals.h"
|
||||
#include "eglmode.h"
|
||||
#include "eglscreen.h"
|
||||
#include "eglsurface.h"
|
||||
|
||||
|
||||
const char *DefaultDriverName = "demodriver";
|
||||
|
||||
|
||||
/**
|
||||
* Choose and open/init the hardware driver for the given EGLDisplay.
|
||||
* Previously, the EGLDisplay was created with _eglNewDisplay() where
|
||||
* we recorded the user's NativeDisplayType parameter.
|
||||
*
|
||||
* Now we'll use the NativeDisplayType value.
|
||||
*
|
||||
* Currently, the native display value is treated as a string.
|
||||
* If the first character is ':' we interpret it as a screen or card index
|
||||
* number (i.e. ":0" or ":1", etc)
|
||||
* Else if the first character is '!' we interpret it as specific driver name
|
||||
* (i.e. "!r200" or "!i830".
|
||||
*/
|
||||
_EGLDriver *
|
||||
_eglChooseDriver(EGLDisplay display)
|
||||
{
|
||||
_EGLDisplay *dpy = _eglLookupDisplay(display);
|
||||
_EGLDriver *drv;
|
||||
const char *driverName = DefaultDriverName;
|
||||
const char *name;
|
||||
|
||||
assert(dpy);
|
||||
|
||||
name = dpy->Name;
|
||||
if (!name) {
|
||||
/* use default */
|
||||
}
|
||||
else if (name[0] == ':' && (name[1] >= '0' && name[1] <= '9') && !name[2]) {
|
||||
printf("EGL: Use driver for screen: %s\n", name);
|
||||
/* XXX probe hardware here to determine which driver to open */
|
||||
/* driverName = "something"; */
|
||||
}
|
||||
else if (name[0] == '!') {
|
||||
/* use specified driver name */
|
||||
driverName = name + 1;
|
||||
printf("EGL: Use driver named %s\n", driverName);
|
||||
}
|
||||
else {
|
||||
/* Maybe display was returned by XOpenDisplay? */
|
||||
printf("EGL: can't parse display pointer\n");
|
||||
}
|
||||
|
||||
drv = _eglOpenDriver(dpy, driverName);
|
||||
dpy->Driver = drv;
|
||||
|
||||
return drv;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open/load the named driver and call its bootstrap function: _eglMain().
|
||||
* \return new _EGLDriver object.
|
||||
*/
|
||||
_EGLDriver *
|
||||
_eglOpenDriver(_EGLDisplay *dpy, const char *driverName)
|
||||
{
|
||||
void *lib;
|
||||
char driverFilename[1000];
|
||||
|
||||
/* XXX also prepend a directory path??? */
|
||||
sprintf(driverFilename, "%s.so", driverName);
|
||||
|
||||
#if 1
|
||||
lib = dlopen(driverFilename, RTLD_NOW);
|
||||
if (lib) {
|
||||
_EGLDriver *drv;
|
||||
_EGLMain_t mainFunc;
|
||||
|
||||
mainFunc = (_EGLMain_t) dlsym(lib, "_eglMain");
|
||||
if (!mainFunc) {
|
||||
fprintf(stderr, "_eglMain not found in %s", (char *) driverFilename);
|
||||
dlclose(lib);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
drv = mainFunc(dpy);
|
||||
if (!drv) {
|
||||
dlclose(lib);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
drv->LibHandle = lib;
|
||||
drv->Display = dpy;
|
||||
return drv;
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "EGLdebug: Error opening %s: %s\n",
|
||||
driverFilename, dlerror());
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
/* use built-in driver */
|
||||
return _eglDefaultMain(d);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy)
|
||||
{
|
||||
void *handle = drv->LibHandle;
|
||||
EGLBoolean b;
|
||||
fprintf(stderr, "EGL debug: Closing driver\n");
|
||||
|
||||
/*
|
||||
* XXX check for currently bound context/surfaces and delete them?
|
||||
*/
|
||||
|
||||
b = drv->Terminate(drv, dpy);
|
||||
dlclose(handle);
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given a display handle, return the _EGLDriver for that display.
|
||||
*/
|
||||
_EGLDriver *
|
||||
_eglLookupDriver(EGLDisplay dpy)
|
||||
{
|
||||
_EGLDisplay *d = _eglLookupDisplay(dpy);
|
||||
if (d)
|
||||
return d->Driver;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Plug all the available fallback routines into the given driver's
|
||||
* dispatch table.
|
||||
*/
|
||||
void
|
||||
_eglInitDriverFallbacks(_EGLDriver *drv)
|
||||
{
|
||||
/* If a pointer is set to NULL, then the device driver _really_ has
|
||||
* to implement it.
|
||||
*/
|
||||
drv->Initialize = NULL;
|
||||
drv->Terminate = NULL;
|
||||
|
||||
drv->GetConfigs = _eglGetConfigs;
|
||||
drv->ChooseConfig = _eglChooseConfig;
|
||||
drv->GetConfigAttrib = _eglGetConfigAttrib;
|
||||
|
||||
drv->CreateContext = _eglCreateContext;
|
||||
drv->DestroyContext = _eglDestroyContext;
|
||||
drv->MakeCurrent = _eglMakeCurrent;
|
||||
drv->QueryContext = _eglQueryContext;
|
||||
|
||||
drv->CreateWindowSurface = _eglCreateWindowSurface;
|
||||
drv->CreatePixmapSurface = _eglCreatePixmapSurface;
|
||||
drv->CreatePbufferSurface = _eglCreatePbufferSurface;
|
||||
drv->DestroySurface = _eglDestroySurface;
|
||||
drv->QuerySurface = _eglQuerySurface;
|
||||
drv->SurfaceAttrib = _eglSurfaceAttrib;
|
||||
drv->BindTexImage = _eglBindTexImage;
|
||||
drv->ReleaseTexImage = _eglReleaseTexImage;
|
||||
drv->SwapInterval = _eglSwapInterval;
|
||||
drv->SwapBuffers = _eglSwapBuffers;
|
||||
drv->CopyBuffers = _eglCopyBuffers;
|
||||
|
||||
drv->QueryString = _eglQueryString;
|
||||
drv->WaitGL = _eglWaitGL;
|
||||
drv->WaitNative = _eglWaitNative;
|
||||
|
||||
/* EGL_MESA_screen */
|
||||
drv->ChooseModeMESA = _eglChooseModeMESA;
|
||||
drv->GetModesMESA = _eglGetModesMESA;
|
||||
drv->GetModeAttribMESA = _eglGetModeAttribMESA;
|
||||
drv->GetScreensMESA = _eglGetScreensMESA;
|
||||
drv->CreateScreenSurfaceMESA = _eglCreateScreenSurfaceMESA;
|
||||
drv->ShowSurfaceMESA = _eglShowSurfaceMESA;
|
||||
drv->ScreenPositionMESA = _eglScreenPositionMESA;
|
||||
drv->QueryScreenMESA = _eglQueryScreenMESA;
|
||||
drv->QueryScreenSurfaceMESA = _eglQueryScreenSurfaceMESA;
|
||||
drv->QueryScreenModeMESA = _eglQueryScreenModeMESA;
|
||||
drv->QueryModeStringMESA = _eglQueryModeStringMESA;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Examine the individual extension enable/disable flags and recompute
|
||||
* the driver's Extensions string.
|
||||
*/
|
||||
static void
|
||||
UpdateExtensionsString(_EGLDriver *drv)
|
||||
{
|
||||
drv->Extensions[0] = 0;
|
||||
|
||||
if (drv->MESA_screen_surface)
|
||||
strcat(drv->Extensions, "EGL_MESA_screen_surface ");
|
||||
if (drv->MESA_copy_context)
|
||||
strcat(drv->Extensions, "EGL_MESA_copy_context ");
|
||||
assert(strlen(drv->Extensions) < MAX_EXTENSIONS_LEN);
|
||||
}
|
||||
|
||||
|
||||
|
||||
const char *
|
||||
_eglQueryString(_EGLDriver *drv, EGLDisplay dpy, EGLint name)
|
||||
{
|
||||
(void) drv;
|
||||
(void) dpy;
|
||||
switch (name) {
|
||||
case EGL_VENDOR:
|
||||
return "Mesa Project";
|
||||
case EGL_VERSION:
|
||||
return "1.0";
|
||||
case EGL_EXTENSIONS:
|
||||
UpdateExtensionsString(drv);
|
||||
return drv->Extensions;
|
||||
default:
|
||||
_eglError(EGL_BAD_PARAMETER, "eglQueryString");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglWaitGL(_EGLDriver *drv, EGLDisplay dpy)
|
||||
{
|
||||
/* just a placeholder */
|
||||
(void) drv;
|
||||
(void) dpy;
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglWaitNative(_EGLDriver *drv, EGLDisplay dpy, EGLint engine)
|
||||
{
|
||||
/* just a placeholder */
|
||||
(void) drv;
|
||||
(void) dpy;
|
||||
(void) engine;
|
||||
return EGL_TRUE;
|
||||
}
|
167
src/egl/main/egldriver.h
Normal file
167
src/egl/main/egldriver.h
Normal file
@@ -0,0 +1,167 @@
|
||||
#ifndef EGLDRIVER_INCLUDED
|
||||
#define EGLDRIVER_INCLUDED
|
||||
|
||||
|
||||
#include "egltypedefs.h"
|
||||
|
||||
/* should probably use a dynamic-lengh string, but this will do */
|
||||
#define MAX_EXTENSIONS_LEN 1000
|
||||
|
||||
|
||||
/* driver funcs */
|
||||
typedef EGLBoolean (*Initialize_t)(_EGLDriver *, EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||
typedef EGLBoolean (*Terminate_t)(_EGLDriver *, EGLDisplay dpy);
|
||||
|
||||
/* config funcs */
|
||||
typedef EGLBoolean (*GetConfigs_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
typedef EGLBoolean (*ChooseConfig_t)(_EGLDriver *drv, EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
typedef EGLBoolean (*GetConfigAttrib_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
|
||||
|
||||
/* context funcs */
|
||||
typedef EGLContext (*CreateContext_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (*DestroyContext_t)(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx);
|
||||
typedef EGLBoolean (*MakeCurrent_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||
typedef EGLBoolean (*QueryContext_t)(_EGLDriver *drv, EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
|
||||
|
||||
/* surface funcs */
|
||||
typedef EGLSurface (*CreateWindowSurface_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list);
|
||||
typedef EGLSurface (*CreatePixmapSurface_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list);
|
||||
typedef EGLSurface (*CreatePbufferSurface_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (*DestroySurface_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface);
|
||||
typedef EGLBoolean (*QuerySurface_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||
typedef EGLBoolean (*SurfaceAttrib_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
|
||||
typedef EGLBoolean (*BindTexImage_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
typedef EGLBoolean (*ReleaseTexImage_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
typedef EGLBoolean (*SwapInterval_t)(_EGLDriver *drv, EGLDisplay dpy, EGLint interval);
|
||||
typedef EGLBoolean (*SwapBuffers_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw);
|
||||
typedef EGLBoolean (*CopyBuffers_t)(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, NativePixmapType target);
|
||||
|
||||
/* misc funcs */
|
||||
typedef const char *(*QueryString_t)(_EGLDriver *drv, EGLDisplay dpy, EGLint name);
|
||||
typedef EGLBoolean (*WaitGL_t)(_EGLDriver *drv, EGLDisplay dpy);
|
||||
typedef EGLBoolean (*WaitNative_t)(_EGLDriver *drv, EGLDisplay dpy, EGLint engine);
|
||||
|
||||
|
||||
/* EGL_MESA_screen extension */
|
||||
typedef EGLBoolean (*ChooseModeMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, const EGLint *attrib_list, EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes);
|
||||
typedef EGLBoolean (*GetModesMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes, EGLint mode_size, EGLint *num_mode);
|
||||
typedef EGLBoolean (*GetModeAttribMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode, EGLint attribute, EGLint *value);
|
||||
typedef EGLBoolean (*CopyContextMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLContext source, EGLContext dest, EGLint mask);
|
||||
typedef EGLBoolean (*GetScreensMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA *screens, EGLint max_screens, EGLint *num_screens);
|
||||
typedef EGLSurface (*CreateScreenSurfaceMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (*ShowSurfaceMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface surface, EGLModeMESA mode);
|
||||
typedef EGLBoolean (*ScreenPositionMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y);
|
||||
typedef EGLBoolean (*QueryScreenMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLint attribute, EGLint *value);
|
||||
typedef EGLBoolean (*QueryScreenSurfaceMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface *surface);
|
||||
typedef EGLBoolean (*QueryScreenModeMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode);
|
||||
typedef const char * (*QueryModeStringMESA_t)(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode);
|
||||
|
||||
|
||||
/**
|
||||
* Base class for device drivers.
|
||||
*/
|
||||
struct _egl_driver
|
||||
{
|
||||
EGLBoolean Initialized; /* set by driver after initialized */
|
||||
|
||||
void *LibHandle; /* dlopen handle */
|
||||
|
||||
_EGLDisplay *Display;
|
||||
|
||||
int ABIversion;
|
||||
int APImajor, APIminor; /* returned through eglInitialize */
|
||||
|
||||
/*
|
||||
* The API dispatcher jumps through these functions
|
||||
*/
|
||||
Initialize_t Initialize;
|
||||
Terminate_t Terminate;
|
||||
|
||||
GetConfigs_t GetConfigs;
|
||||
ChooseConfig_t ChooseConfig;
|
||||
GetConfigAttrib_t GetConfigAttrib;
|
||||
|
||||
CreateContext_t CreateContext;
|
||||
DestroyContext_t DestroyContext;
|
||||
MakeCurrent_t MakeCurrent;
|
||||
QueryContext_t QueryContext;
|
||||
|
||||
CreateWindowSurface_t CreateWindowSurface;
|
||||
CreatePixmapSurface_t CreatePixmapSurface;
|
||||
CreatePbufferSurface_t CreatePbufferSurface;
|
||||
DestroySurface_t DestroySurface;
|
||||
QuerySurface_t QuerySurface;
|
||||
SurfaceAttrib_t SurfaceAttrib;
|
||||
BindTexImage_t BindTexImage;
|
||||
ReleaseTexImage_t ReleaseTexImage;
|
||||
SwapInterval_t SwapInterval;
|
||||
SwapBuffers_t SwapBuffers;
|
||||
CopyBuffers_t CopyBuffers;
|
||||
|
||||
QueryString_t QueryString;
|
||||
WaitGL_t WaitGL;
|
||||
WaitNative_t WaitNative;
|
||||
|
||||
/* EGL_MESA_screen extension */
|
||||
ChooseModeMESA_t ChooseModeMESA;
|
||||
GetModesMESA_t GetModesMESA;
|
||||
GetModeAttribMESA_t GetModeAttribMESA;
|
||||
CopyContextMESA_t CopyContextMESA;
|
||||
GetScreensMESA_t GetScreensMESA;
|
||||
CreateScreenSurfaceMESA_t CreateScreenSurfaceMESA;
|
||||
ShowSurfaceMESA_t ShowSurfaceMESA;
|
||||
ScreenPositionMESA_t ScreenPositionMESA;
|
||||
QueryScreenMESA_t QueryScreenMESA;
|
||||
QueryScreenSurfaceMESA_t QueryScreenSurfaceMESA;
|
||||
QueryScreenModeMESA_t QueryScreenModeMESA;
|
||||
QueryModeStringMESA_t QueryModeStringMESA;
|
||||
|
||||
/* Extension enable flags */
|
||||
EGLBoolean MESA_screen_surface;
|
||||
EGLBoolean MESA_copy_context;
|
||||
|
||||
/* Extensions string */
|
||||
char Extensions[MAX_EXTENSIONS_LEN];
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
extern _EGLDriver *
|
||||
_eglDefaultMain(NativeDisplayType d);
|
||||
|
||||
|
||||
extern _EGLDriver *
|
||||
_eglChooseDriver(EGLDisplay dpy);
|
||||
|
||||
|
||||
extern _EGLDriver *
|
||||
_eglOpenDriver(_EGLDisplay *dpy, const char *driverName);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy);
|
||||
|
||||
|
||||
extern _EGLDriver *
|
||||
_eglLookupDriver(EGLDisplay d);
|
||||
|
||||
|
||||
extern void
|
||||
_eglInitDriverFallbacks(_EGLDriver *drv);
|
||||
|
||||
|
||||
extern const char *
|
||||
_eglQueryString(_EGLDriver *drv, EGLDisplay dpy, EGLint name);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglWaitGL(_EGLDriver *drv, EGLDisplay dpy);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglWaitNative(_EGLDriver *drv, EGLDisplay dpy, EGLint engine);
|
||||
|
||||
|
||||
|
||||
#endif /* EGLDRIVER_INCLUDED */
|
65
src/egl/main/eglglobals.c
Normal file
65
src/egl/main/eglglobals.c
Normal file
@@ -0,0 +1,65 @@
|
||||
#include <stdio.h>
|
||||
#include "eglglobals.h"
|
||||
|
||||
|
||||
struct _egl_global _eglGlobal = { EGL_FALSE };
|
||||
|
||||
|
||||
/**
|
||||
* Init the fields in the _eglGlobal struct
|
||||
* May be safely called more than once.
|
||||
*/
|
||||
void
|
||||
_eglInitGlobals(void)
|
||||
{
|
||||
if (!_eglGlobal.Initialized) {
|
||||
_eglGlobal.Displays = _eglNewHashTable();
|
||||
_eglGlobal.Contexts = _eglNewHashTable();
|
||||
_eglGlobal.Surfaces = _eglNewHashTable();
|
||||
_eglGlobal.FreeScreenHandle = 1;
|
||||
_eglGlobal.CurrentContext = EGL_NO_CONTEXT;
|
||||
_eglGlobal.LastError = EGL_SUCCESS;
|
||||
_eglGlobal.Initialized = EGL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Should call this via an atexit handler.
|
||||
*/
|
||||
void
|
||||
_eglDestroyGlobals(void)
|
||||
{
|
||||
/* XXX TODO walk over table entries, deleting each */
|
||||
_eglDeleteHashTable(_eglGlobal.Displays);
|
||||
_eglDeleteHashTable(_eglGlobal.Contexts);
|
||||
_eglDeleteHashTable(_eglGlobal.Surfaces);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Record EGL error code.
|
||||
*/
|
||||
void
|
||||
_eglError(EGLint errCode, const char *msg)
|
||||
{
|
||||
if (_eglGlobal.LastError == EGL_SUCCESS) {
|
||||
_eglGlobal.LastError = errCode;
|
||||
/* XXX temporary */
|
||||
fprintf(stderr, "EGL Error 0x%x in %s\n", errCode, msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return a new screen handle/ID.
|
||||
* NOTE: we never reuse these!
|
||||
*/
|
||||
EGLScreenMESA
|
||||
_eglAllocScreenHandle(void)
|
||||
{
|
||||
EGLScreenMESA s = _eglGlobal.FreeScreenHandle;
|
||||
_eglGlobal.FreeScreenHandle++;
|
||||
return s;
|
||||
}
|
44
src/egl/main/eglglobals.h
Normal file
44
src/egl/main/eglglobals.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#ifndef EGLGLOBALS_INCLUDED
|
||||
#define EGLGLOBALS_INCLUDED
|
||||
|
||||
#include "egltypedefs.h"
|
||||
#include "eglhash.h"
|
||||
|
||||
|
||||
struct _egl_global
|
||||
{
|
||||
EGLBoolean Initialized;
|
||||
|
||||
_EGLHashtable *Displays;
|
||||
_EGLHashtable *Contexts;
|
||||
_EGLHashtable *Surfaces;
|
||||
|
||||
EGLScreenMESA FreeScreenHandle;
|
||||
|
||||
EGLint LastError;
|
||||
|
||||
/* XXX this should be per-thread someday */
|
||||
_EGLContext *CurrentContext;
|
||||
};
|
||||
|
||||
|
||||
extern struct _egl_global _eglGlobal;
|
||||
|
||||
|
||||
extern void
|
||||
_eglInitGlobals(void);
|
||||
|
||||
|
||||
extern void
|
||||
_eglDestroyGlobals(void);
|
||||
|
||||
|
||||
extern void
|
||||
_eglError(EGLint errCode, const char *msg);
|
||||
|
||||
|
||||
extern EGLScreenMESA
|
||||
_eglAllocScreenHandle(void);
|
||||
|
||||
|
||||
#endif /* EGLGLOBALS_INCLUDED */
|
347
src/egl/main/eglhash.c
Normal file
347
src/egl/main/eglhash.c
Normal file
@@ -0,0 +1,347 @@
|
||||
/**
|
||||
* \file hash.c
|
||||
* Generic hash table.
|
||||
*
|
||||
* This code taken from Mesa and adapted.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "eglhash.h"
|
||||
|
||||
|
||||
#define TABLE_SIZE 1023 /**< Size of lookup table/array */
|
||||
|
||||
#define HASH_FUNC(K) ((K) % TABLE_SIZE)
|
||||
|
||||
|
||||
/*
|
||||
* Unfinished mutex stuff
|
||||
*/
|
||||
|
||||
typedef int _EGLMutex;
|
||||
|
||||
static void
|
||||
_eglInitMutex(_EGLMutex m)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
_eglDestroyMutex(_EGLMutex m)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
_eglLockMutex(_EGLMutex m)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
_eglUnlockMutex(_EGLMutex m)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
typedef struct _egl_hashentry _EGLHashentry;
|
||||
|
||||
struct _egl_hashentry
|
||||
{
|
||||
EGLuint Key; /**< the entry's key */
|
||||
void *Data; /**< the entry's data */
|
||||
_EGLHashentry *Next; /**< pointer to next entry */
|
||||
};
|
||||
|
||||
|
||||
struct _egl_hashtable
|
||||
{
|
||||
_EGLHashentry *Table[TABLE_SIZE]; /**< the lookup table */
|
||||
EGLuint MaxKey; /**< highest key inserted so far */
|
||||
_EGLMutex Mutex; /**< mutual exclusion lock */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Create a new hash table.
|
||||
*
|
||||
* \return pointer to a new, empty hash table.
|
||||
*/
|
||||
_EGLHashtable *
|
||||
_eglNewHashTable(void)
|
||||
{
|
||||
_EGLHashtable *table = (_EGLHashtable *) calloc(1, sizeof(_EGLHashtable));
|
||||
if (table) {
|
||||
_eglInitMutex(table->Mutex);
|
||||
table->MaxKey = 1;
|
||||
}
|
||||
return table;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Delete a hash table.
|
||||
* Frees each entry on the hash table and then the hash table structure itself.
|
||||
* Note that the caller should have already traversed the table and deleted
|
||||
* the objects in the table (i.e. We don't free the entries' data pointer).
|
||||
*
|
||||
* \param table the hash table to delete.
|
||||
*/
|
||||
void
|
||||
_eglDeleteHashTable(_EGLHashtable *table)
|
||||
{
|
||||
EGLuint i;
|
||||
assert(table);
|
||||
for (i = 0; i < TABLE_SIZE; i++) {
|
||||
_EGLHashentry *entry = table->Table[i];
|
||||
while (entry) {
|
||||
_EGLHashentry *next = entry->Next;
|
||||
free(entry);
|
||||
entry = next;
|
||||
}
|
||||
}
|
||||
_eglDestroyMutex(table->Mutex);
|
||||
free(table);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Lookup an entry in the hash table.
|
||||
*
|
||||
* \param table the hash table.
|
||||
* \param key the key.
|
||||
*
|
||||
* \return pointer to user's data or NULL if key not in table
|
||||
*/
|
||||
void *
|
||||
_eglHashLookup(const _EGLHashtable *table, EGLuint key)
|
||||
{
|
||||
EGLuint pos;
|
||||
const _EGLHashentry *entry;
|
||||
|
||||
assert(table);
|
||||
|
||||
if (!key)
|
||||
return NULL;
|
||||
|
||||
pos = HASH_FUNC(key);
|
||||
entry = table->Table[pos];
|
||||
while (entry) {
|
||||
if (entry->Key == key) {
|
||||
return entry->Data;
|
||||
}
|
||||
entry = entry->Next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Insert a key/pointer pair into the hash table.
|
||||
* If an entry with this key already exists we'll replace the existing entry.
|
||||
*
|
||||
* \param table the hash table.
|
||||
* \param key the key (not zero).
|
||||
* \param data pointer to user data.
|
||||
*/
|
||||
void
|
||||
_eglHashInsert(_EGLHashtable *table, EGLuint key, void *data)
|
||||
{
|
||||
/* search for existing entry with this key */
|
||||
EGLuint pos;
|
||||
_EGLHashentry *entry;
|
||||
|
||||
assert(table);
|
||||
assert(key);
|
||||
|
||||
_eglLockMutex(table->Mutex);
|
||||
|
||||
if (key > table->MaxKey)
|
||||
table->MaxKey = key;
|
||||
|
||||
pos = HASH_FUNC(key);
|
||||
entry = table->Table[pos];
|
||||
while (entry) {
|
||||
if (entry->Key == key) {
|
||||
/* replace entry's data */
|
||||
entry->Data = data;
|
||||
_eglUnlockMutex(table->Mutex);
|
||||
return;
|
||||
}
|
||||
entry = entry->Next;
|
||||
}
|
||||
|
||||
/* alloc and insert new table entry */
|
||||
entry = (_EGLHashentry *) malloc(sizeof(_EGLHashentry));
|
||||
entry->Key = key;
|
||||
entry->Data = data;
|
||||
entry->Next = table->Table[pos];
|
||||
table->Table[pos] = entry;
|
||||
|
||||
_eglUnlockMutex(table->Mutex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Remove an entry from the hash table.
|
||||
*
|
||||
* \param table the hash table.
|
||||
* \param key key of entry to remove.
|
||||
*
|
||||
* While holding the hash table's lock, searches the entry with the matching
|
||||
* key and unlinks it.
|
||||
*/
|
||||
void
|
||||
_eglHashRemove(_EGLHashtable *table, EGLuint key)
|
||||
{
|
||||
EGLuint pos;
|
||||
_EGLHashentry *entry, *prev;
|
||||
|
||||
assert(table);
|
||||
assert(key);
|
||||
|
||||
_eglLockMutex(table->Mutex);
|
||||
|
||||
pos = HASH_FUNC(key);
|
||||
prev = NULL;
|
||||
entry = table->Table[pos];
|
||||
while (entry) {
|
||||
if (entry->Key == key) {
|
||||
/* found it! */
|
||||
if (prev) {
|
||||
prev->Next = entry->Next;
|
||||
}
|
||||
else {
|
||||
table->Table[pos] = entry->Next;
|
||||
}
|
||||
free(entry);
|
||||
_eglUnlockMutex(table->Mutex);
|
||||
return;
|
||||
}
|
||||
prev = entry;
|
||||
entry = entry->Next;
|
||||
}
|
||||
|
||||
_eglUnlockMutex(table->Mutex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the key of the "first" entry in the hash table.
|
||||
*
|
||||
* This is used in the course of deleting all display lists when
|
||||
* a context is destroyed.
|
||||
*
|
||||
* \param table the hash table
|
||||
*
|
||||
* \return key for the "first" entry in the hash table.
|
||||
*
|
||||
* While holding the lock, walks through all table positions until finding
|
||||
* the first entry of the first non-empty one.
|
||||
*/
|
||||
EGLuint
|
||||
_eglHashFirstEntry(_EGLHashtable *table)
|
||||
{
|
||||
EGLuint pos;
|
||||
assert(table);
|
||||
_eglLockMutex(table->Mutex);
|
||||
for (pos = 0; pos < TABLE_SIZE; pos++) {
|
||||
if (table->Table[pos]) {
|
||||
_eglUnlockMutex(table->Mutex);
|
||||
return table->Table[pos]->Key;
|
||||
}
|
||||
}
|
||||
_eglUnlockMutex(table->Mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given a hash table key, return the next key. This is used to walk
|
||||
* over all entries in the table. Note that the keys returned during
|
||||
* walking won't be in any particular order.
|
||||
* \return next hash key or 0 if end of table.
|
||||
*/
|
||||
EGLuint
|
||||
_eglHashNextEntry(const _EGLHashtable *table, EGLuint key)
|
||||
{
|
||||
const _EGLHashentry *entry;
|
||||
EGLuint pos;
|
||||
|
||||
assert(table);
|
||||
assert(key);
|
||||
|
||||
/* Find the entry with given key */
|
||||
pos = HASH_FUNC(key);
|
||||
entry = table->Table[pos];
|
||||
while (entry) {
|
||||
if (entry->Key == key) {
|
||||
break;
|
||||
}
|
||||
entry = entry->Next;
|
||||
}
|
||||
|
||||
if (!entry) {
|
||||
/* the key was not found, we can't find next entry */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (entry->Next) {
|
||||
/* return next in linked list */
|
||||
return entry->Next->Key;
|
||||
}
|
||||
else {
|
||||
/* look for next non-empty table slot */
|
||||
pos++;
|
||||
while (pos < TABLE_SIZE) {
|
||||
if (table->Table[pos]) {
|
||||
return table->Table[pos]->Key;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Dump contents of hash table for debugging.
|
||||
*
|
||||
* \param table the hash table.
|
||||
*/
|
||||
void
|
||||
_eglHashPrint(const _EGLHashtable *table)
|
||||
{
|
||||
EGLuint i;
|
||||
assert(table);
|
||||
for (i = 0; i < TABLE_SIZE; i++) {
|
||||
const _EGLHashentry *entry = table->Table[i];
|
||||
while (entry) {
|
||||
printf("%u %p\n", entry->Key, entry->Data);
|
||||
entry = entry->Next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Return a new, unused hash key.
|
||||
*/
|
||||
EGLuint
|
||||
_eglHashGenKey(_EGLHashtable *table)
|
||||
{
|
||||
EGLuint k;
|
||||
|
||||
_eglLockMutex(table->Mutex);
|
||||
k = table->MaxKey;
|
||||
table->MaxKey++;
|
||||
_eglUnlockMutex(table->Mutex);
|
||||
return k;
|
||||
}
|
||||
|
39
src/egl/main/eglhash.h
Normal file
39
src/egl/main/eglhash.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
* \file eglhash.h
|
||||
* Generic hash table.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef EGLHASH_INCLUDED
|
||||
#define EGLHASH_INCLUDED
|
||||
|
||||
|
||||
/* XXX move this? */
|
||||
typedef unsigned int EGLuint;
|
||||
|
||||
|
||||
typedef struct _egl_hashtable _EGLHashtable;
|
||||
|
||||
|
||||
extern _EGLHashtable *_eglNewHashTable(void);
|
||||
|
||||
extern void _eglDeleteHashTable(_EGLHashtable *table);
|
||||
|
||||
extern void *_eglHashLookup(const _EGLHashtable *table, EGLuint key);
|
||||
|
||||
extern void _eglHashInsert(_EGLHashtable *table, EGLuint key, void *data);
|
||||
|
||||
extern void _eglHashRemove(_EGLHashtable *table, EGLuint key);
|
||||
|
||||
extern EGLuint _eglHashFirstEntry(_EGLHashtable *table);
|
||||
|
||||
extern EGLuint _eglHashNextEntry(const _EGLHashtable *table, EGLuint key);
|
||||
|
||||
extern void _eglHashPrint(const _EGLHashtable *table);
|
||||
|
||||
extern EGLuint _eglHashGenKey(_EGLHashtable *table);
|
||||
|
||||
extern void _egltest_hash_functions(void);
|
||||
|
||||
|
||||
#endif /* EGLHASH_INCLUDED */
|
199
src/egl/main/eglmode.c
Normal file
199
src/egl/main/eglmode.c
Normal file
@@ -0,0 +1,199 @@
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "egldisplay.h"
|
||||
#include "egldriver.h"
|
||||
#include "eglmode.h"
|
||||
#include "eglglobals.h"
|
||||
#include "eglscreen.h"
|
||||
|
||||
|
||||
#define MIN2(A, B) (((A) < (B)) ? (A) : (B))
|
||||
|
||||
|
||||
static char *
|
||||
my_strdup(const char *s)
|
||||
{
|
||||
int l = strlen(s);
|
||||
char *s2 = malloc(l + 1);
|
||||
strcpy(s2, s);
|
||||
return s2;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given an EGLModeMESA handle, return the corresponding _EGLMode object
|
||||
* or null if non-existant.
|
||||
*/
|
||||
_EGLMode *
|
||||
_eglLookupMode(EGLDisplay dpy, EGLModeMESA mode)
|
||||
{
|
||||
const _EGLDisplay *disp = _eglLookupDisplay(dpy);
|
||||
EGLint scrnum;
|
||||
|
||||
/* loop over all screens on the display */
|
||||
for (scrnum = 0; scrnum < disp->NumScreens; scrnum++) {
|
||||
const _EGLScreen *scrn = disp->Screens[scrnum];
|
||||
EGLint i;
|
||||
/* search list of modes for handle */
|
||||
for (i = 0; i < scrn->NumModes; i++) {
|
||||
if (scrn->Modes[i].Handle == mode) {
|
||||
return scrn->Modes + i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a new mode with the given attributes (width, height, depth, refreshRate)
|
||||
* to the given screen.
|
||||
* Assign a new mode ID/handle to the mode as well.
|
||||
* \return pointer to the new _EGLMode
|
||||
*/
|
||||
_EGLMode *
|
||||
_eglAddMode(_EGLScreen *screen, EGLint width, EGLint height,
|
||||
EGLint refreshRate, const char *name)
|
||||
{
|
||||
EGLint n;
|
||||
_EGLMode *newModes;
|
||||
|
||||
assert(screen);
|
||||
assert(width > 0);
|
||||
assert(height > 0);
|
||||
assert(refreshRate > 0);
|
||||
|
||||
n = screen->NumModes;
|
||||
newModes = (_EGLMode *) realloc(screen->Modes, (n+1) * sizeof(_EGLMode));
|
||||
if (newModes) {
|
||||
screen->Modes = newModes;
|
||||
screen->Modes[n].Handle = n + 1;
|
||||
screen->Modes[n].Width = width;
|
||||
screen->Modes[n].Height = height;
|
||||
screen->Modes[n].RefreshRate = refreshRate;
|
||||
screen->Modes[n].Stereo = EGL_FALSE;
|
||||
screen->Modes[n].Name = my_strdup(name);
|
||||
screen->NumModes++;
|
||||
return screen->Modes + n;
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Search for the EGLMode that best matches the given attribute list.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglChooseModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
const EGLint *attrib_list, EGLModeMESA *modes,
|
||||
EGLint modes_size, EGLint *num_modes)
|
||||
{
|
||||
EGLint i;
|
||||
|
||||
/* XXX incomplete */
|
||||
|
||||
for (i = 0; attrib_list[i] != EGL_NONE; i++) {
|
||||
switch (attrib_list[i]) {
|
||||
case EGL_WIDTH:
|
||||
i++;
|
||||
break;
|
||||
case EGL_HEIGHT:
|
||||
i++;
|
||||
break;
|
||||
case EGL_REFRESH_RATE_MESA:
|
||||
i++;
|
||||
break;
|
||||
#if 0
|
||||
case EGL_STEREO_MESA:
|
||||
i++;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglChooseMode");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Return all possible modes for the given screen
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglGetModesMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes)
|
||||
{
|
||||
_EGLScreen *scrn = _eglLookupScreen(dpy, screen);
|
||||
EGLint i;
|
||||
|
||||
if (!scrn) {
|
||||
_eglError(EGL_BAD_SCREEN_MESA, "eglGetModes");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
*num_modes = MIN2(modes_size, scrn->NumModes);
|
||||
for (i = 0; i < *num_modes; i++) {
|
||||
modes[i] = scrn->Modes[i].Handle;
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Query an attribute of a mode.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglGetModeAttribMESA(_EGLDriver *drv, EGLDisplay dpy,
|
||||
EGLModeMESA mode, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLMode *m = _eglLookupMode(dpy, mode);
|
||||
|
||||
switch (attribute) {
|
||||
case EGL_MODE_ID_MESA:
|
||||
*value = m->Handle;
|
||||
break;
|
||||
case EGL_WIDTH:
|
||||
*value = m->Width;
|
||||
break;
|
||||
case EGL_HEIGHT:
|
||||
*value = m->Height;
|
||||
break;
|
||||
#if 0
|
||||
case EGL_DEPTH_MESA:
|
||||
*value = m->Depth;
|
||||
break;
|
||||
#endif
|
||||
case EGL_REFRESH_RATE_MESA:
|
||||
*value = m->RefreshRate;
|
||||
break;
|
||||
#if 0
|
||||
case EGL_STEREO_MESA:
|
||||
*value = m->Stereo;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglGetModeAttrib");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
const char *
|
||||
_eglQueryModeStringMESA(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode)
|
||||
{
|
||||
_EGLMode *m = _eglLookupMode(dpy, mode);
|
||||
return m->Name;
|
||||
}
|
||||
|
||||
|
53
src/egl/main/eglmode.h
Normal file
53
src/egl/main/eglmode.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#ifndef EGLMODE_INCLUDED
|
||||
#define EGLMODE_INCLUDED
|
||||
|
||||
#include "egltypedefs.h"
|
||||
|
||||
|
||||
/**
|
||||
* Data structure which corresponds to an EGLModeMESA.
|
||||
*/
|
||||
struct _egl_mode
|
||||
{
|
||||
EGLModeMESA Handle; /* the public/opaque handle which names this mode */
|
||||
EGLint Width, Height; /* size in pixels */
|
||||
EGLint RefreshRate; /* rate * 1000.0 */
|
||||
EGLBoolean Stereo;
|
||||
const char *Name;
|
||||
|
||||
/* Other possible attributes */
|
||||
/* interlaced */
|
||||
/* external sync */
|
||||
};
|
||||
|
||||
|
||||
extern _EGLMode *
|
||||
_eglLookupMode(EGLDisplay dpy, EGLModeMESA mode);
|
||||
|
||||
|
||||
extern _EGLMode *
|
||||
_eglAddMode(_EGLScreen *screen, EGLint width, EGLint height,
|
||||
EGLint refreshRate, const char *name);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglChooseModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
const EGLint *attrib_list, EGLModeMESA *modes,
|
||||
EGLint modes_size, EGLint *num_modes);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglGetModesMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglGetModeAttribMESA(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
|
||||
extern const char *
|
||||
_eglQueryModeStringMESA(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode);
|
||||
|
||||
|
||||
#endif /* EGLMODE_INCLUDED */
|
334
src/egl/main/eglscreen.c
Normal file
334
src/egl/main/eglscreen.c
Normal file
@@ -0,0 +1,334 @@
|
||||
/*
|
||||
* Ideas for screen management extension to EGL.
|
||||
*
|
||||
* Each EGLDisplay has one or more screens (CRTs, Flat Panels, etc).
|
||||
* The screens' handles can be obtained with eglGetScreensMESA().
|
||||
*
|
||||
* A new kind of EGLSurface is possible- one which can be directly scanned
|
||||
* out on a screen. Such a surface is created with eglCreateScreenSurface().
|
||||
*
|
||||
* To actually display a screen surface on a screen, the eglShowSurface()
|
||||
* function is called.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "egldisplay.h"
|
||||
#include "eglglobals.h"
|
||||
#include "eglmode.h"
|
||||
#include "eglconfig.h"
|
||||
#include "eglsurface.h"
|
||||
#include "eglscreen.h"
|
||||
|
||||
|
||||
/**
|
||||
* Initialize an _EGLScreen object to default values.
|
||||
*/
|
||||
void
|
||||
_eglInitScreen(_EGLScreen *screen)
|
||||
{
|
||||
/* just init to zero for now */
|
||||
memset(screen, 0, sizeof(_EGLScreen));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given a public screen handle, return the internal _EGLScreen object.
|
||||
*/
|
||||
_EGLScreen *
|
||||
_eglLookupScreen(EGLDisplay dpy, EGLScreenMESA screen)
|
||||
{
|
||||
EGLint i;
|
||||
_EGLDisplay *display = _eglLookupDisplay(dpy);
|
||||
|
||||
if (!display)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < display->NumScreens; i++) {
|
||||
if (display->Screens[i]->Handle == screen)
|
||||
return display->Screens[i];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add the given _EGLScreen to the display's list of screens.
|
||||
*/
|
||||
void
|
||||
_eglAddScreen(_EGLDisplay *display, _EGLScreen *screen)
|
||||
{
|
||||
EGLint n;
|
||||
|
||||
assert(display);
|
||||
assert(screen);
|
||||
|
||||
screen->Handle = _eglAllocScreenHandle();
|
||||
n = display->NumScreens;
|
||||
display->Screens = realloc(display->Screens, (n+1) * sizeof(_EGLScreen *));
|
||||
display->Screens[n] = screen;
|
||||
display->NumScreens++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglGetScreensMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA *screens,
|
||||
EGLint max_screens, EGLint *num_screens)
|
||||
{
|
||||
_EGLDisplay *display = _eglLookupDisplay(dpy);
|
||||
EGLint n;
|
||||
|
||||
if (!display) {
|
||||
_eglError(EGL_BAD_DISPLAY, "eglGetScreensMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
if (display->NumScreens > max_screens) {
|
||||
n = max_screens;
|
||||
}
|
||||
else {
|
||||
n = display->NumScreens;
|
||||
}
|
||||
|
||||
if (screens) {
|
||||
EGLint i;
|
||||
for (i = 0; i < n; i++)
|
||||
screens[i] = display->Screens[i]->Handle;
|
||||
}
|
||||
if (num_screens)
|
||||
*num_screens = n;
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the given _EGLSurface object. Do error checking.
|
||||
* Assign it an EGLSurface handle and insert into hash table.
|
||||
* \return EGLSurface handle or EGL_NO_SURFACE if error.
|
||||
*/
|
||||
EGLSurface
|
||||
_eglInitScreenSurface(_EGLSurface *surf, _EGLDriver *drv, EGLDisplay dpy,
|
||||
EGLConfig config, const EGLint *attrib_list)
|
||||
{
|
||||
EGLint width = 0, height = 0;
|
||||
EGLint i;
|
||||
|
||||
for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
|
||||
switch (attrib_list[i]) {
|
||||
case EGL_WIDTH:
|
||||
width = attrib_list[++i];
|
||||
break;
|
||||
case EGL_HEIGHT:
|
||||
height = attrib_list[++i];
|
||||
break;
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglCreateScreenSurfaceMESA");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
}
|
||||
|
||||
if (width <= 0 || height <= 0) {
|
||||
_eglError(EGL_BAD_ATTRIBUTE,
|
||||
"eglCreateScreenSurfaceMESA(width or height)");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
_eglInitSurface(surf);
|
||||
surf->Width = width;
|
||||
surf->Height = height;
|
||||
surf->Type = EGL_SCREEN_BIT_MESA;
|
||||
surf->Config = _eglLookupConfig(drv, dpy, config);
|
||||
|
||||
/* insert into hash table */
|
||||
_eglSaveSurface(surf);
|
||||
assert(surf->Handle);
|
||||
|
||||
return surf->Handle;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a drawing surface which can be directly displayed on a screen.
|
||||
*/
|
||||
EGLSurface
|
||||
_eglCreateScreenSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
|
||||
const EGLint *attrib_list)
|
||||
{
|
||||
_EGLSurface *surf;
|
||||
EGLSurface surface;
|
||||
|
||||
surf = (_EGLSurface *) malloc(sizeof(_EGLSurface));
|
||||
surface = _eglInitScreenSurface(surf, drv, dpy, config, attrib_list);
|
||||
if (surface == EGL_NO_SURFACE)
|
||||
free(surf);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the given surface on the named screen.
|
||||
* If surface is EGL_NO_SURFACE, disable the screen's output.
|
||||
*
|
||||
* This is just a placeholder function; drivers will always override
|
||||
* this with code that _really_ shows the surface.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
EGLSurface surface, EGLModeMESA m)
|
||||
{
|
||||
_EGLScreen *scrn = _eglLookupScreen(dpy, screen);
|
||||
_EGLMode *mode = _eglLookupMode(dpy, m);
|
||||
|
||||
if (!scrn) {
|
||||
_eglError(EGL_BAD_SCREEN_MESA, "eglShowSurfaceMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
if (!mode && (m != EGL_NO_MODE_MESA )) {
|
||||
_eglError(EGL_BAD_MODE_MESA, "eglShowSurfaceMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
if (surface == EGL_NO_SURFACE) {
|
||||
scrn->CurrentSurface = NULL;
|
||||
} else {
|
||||
_EGLSurface *surf = _eglLookupSurface(surface);
|
||||
if (!surf || surf->Type != EGL_SCREEN_BIT_MESA) {
|
||||
_eglError(EGL_BAD_SURFACE, "eglShowSurfaceMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
if (surf->Width < mode->Width || surf->Height < mode->Height) {
|
||||
_eglError(EGL_BAD_SURFACE,
|
||||
"eglShowSurfaceMESA(surface smaller than screen size)");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
scrn->CurrentSurface = surf;
|
||||
scrn->CurrentMode = mode;
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a screen's current display mode.
|
||||
* Note: mode = EGL_NO_MODE is valid (turns off the screen)
|
||||
*
|
||||
* This is just a placeholder function; drivers will always override
|
||||
* this with code that _really_ sets the mode.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglScreenModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
EGLModeMESA mode)
|
||||
{
|
||||
_EGLScreen *scrn = _eglLookupScreen(dpy, screen);
|
||||
|
||||
if (!scrn) {
|
||||
_eglError(EGL_BAD_SCREEN_MESA, "eglScreenModeMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
scrn->CurrentMode = _eglLookupMode(dpy, mode);
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a screen's surface origin.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglScreenPositionMESA(_EGLDriver *drv, EGLDisplay dpy,
|
||||
EGLScreenMESA screen, EGLint x, EGLint y)
|
||||
{
|
||||
_EGLScreen *scrn = _eglLookupScreen(dpy, screen);
|
||||
if (!scrn) {
|
||||
_eglError(EGL_BAD_SCREEN_MESA, "eglScreenPositionMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
scrn->OriginX = x;
|
||||
scrn->OriginY = y;
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Query a screen's current surface.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglQueryScreenSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy,
|
||||
EGLScreenMESA screen, EGLSurface *surface)
|
||||
{
|
||||
const _EGLScreen *scrn = _eglLookupScreen(dpy, screen);
|
||||
if (scrn->CurrentSurface)
|
||||
*surface = scrn->CurrentSurface->Handle;
|
||||
else
|
||||
*surface = EGL_NO_SURFACE;
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Query a screen's current mode.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglQueryScreenModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
EGLModeMESA *mode)
|
||||
{
|
||||
const _EGLScreen *scrn = _eglLookupScreen(dpy, screen);
|
||||
if (scrn->CurrentMode)
|
||||
*mode = scrn->CurrentMode->Handle;
|
||||
else
|
||||
*mode = EGL_NO_MODE_MESA;
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglQueryScreenMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
|
||||
EGLint attribute, EGLint *value)
|
||||
{
|
||||
const _EGLScreen *scrn = _eglLookupScreen(dpy, screen);
|
||||
|
||||
if (!scrn) {
|
||||
_eglError(EGL_BAD_SCREEN_MESA, "eglQueryScreenMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
switch (attribute) {
|
||||
case EGL_SCREEN_POSITION_MESA:
|
||||
value[0] = scrn->OriginX;
|
||||
value[1] = scrn->OriginY;
|
||||
break;
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglQueryScreenMESA");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_eglDestroyScreenModes(_EGLScreen *scrn)
|
||||
{
|
||||
free(scrn->Modes);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default fallback routine - drivers should usually override this.
|
||||
*/
|
||||
void
|
||||
_eglDestroyScreen(_EGLScreen *scrn)
|
||||
{
|
||||
_eglDestroyScreenModes(scrn);
|
||||
free(scrn);
|
||||
}
|
||||
|
83
src/egl/main/eglscreen.h
Normal file
83
src/egl/main/eglscreen.h
Normal file
@@ -0,0 +1,83 @@
|
||||
#ifndef EGLSCREEN_INCLUDED
|
||||
#define EGLSCREEN_INCLUDED
|
||||
|
||||
|
||||
/* NOTE: there is no public EGLScreen type, we refers to screens with
|
||||
* an integer.
|
||||
*/
|
||||
|
||||
struct _egl_screen
|
||||
{
|
||||
EGLScreenMESA Handle; /* The public/opaque handle which names this object */
|
||||
|
||||
_EGLMode *CurrentMode;
|
||||
_EGLSurface *CurrentSurface;
|
||||
EGLint OriginX, OriginY;
|
||||
|
||||
EGLint NumModes;
|
||||
_EGLMode *Modes; /* array [NumModes] */
|
||||
};
|
||||
|
||||
|
||||
extern void
|
||||
_eglInitScreen(_EGLScreen *screen);
|
||||
|
||||
|
||||
extern _EGLScreen *
|
||||
_eglLookupScreen(EGLDisplay dpy, EGLScreenMESA screen);
|
||||
|
||||
|
||||
extern void
|
||||
_eglAddScreen(_EGLDisplay *display, _EGLScreen *screen);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglGetScreensMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA *screens, EGLint max_screens, EGLint *num_screens);
|
||||
|
||||
|
||||
extern EGLSurface
|
||||
_eglInitScreenSurface(_EGLSurface *surf, _EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||
|
||||
|
||||
extern EGLSurface
|
||||
_eglCreateScreenSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface surface, EGLModeMESA mode);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglScreenModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA mode);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglScreenPositionMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglQueryDisplayMESA(_EGLDriver *drv, EGLDisplay dpy, EGLint attribute, EGLint *value);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglQueryScreenSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy,
|
||||
EGLScreenMESA screen, EGLSurface *surface);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglQueryScreenModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglQueryScreenMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLint attribute, EGLint *value);
|
||||
|
||||
|
||||
extern void
|
||||
_eglDestroyScreenModes(_EGLScreen *scrn);
|
||||
|
||||
|
||||
extern void
|
||||
_eglDestroyScreen(_EGLScreen *scrn);
|
||||
|
||||
|
||||
#endif /* EGLSCREEN_INCLUDED */
|
323
src/egl/main/eglsurface.c
Normal file
323
src/egl/main/eglsurface.c
Normal file
@@ -0,0 +1,323 @@
|
||||
/**
|
||||
* Surface-related functions.
|
||||
*
|
||||
* See the eglcontext.c file for comments that also apply here.
|
||||
*/
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "eglcontext.h"
|
||||
#include "eglconfig.h"
|
||||
#include "eglsurface.h"
|
||||
#include "eglglobals.h"
|
||||
#include "eglhash.h"
|
||||
|
||||
|
||||
void
|
||||
_eglInitSurface(_EGLSurface *surf)
|
||||
{
|
||||
/* XXX fix this up */
|
||||
memset(surf, 0, sizeof(_EGLSurface));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_eglSaveSurface(_EGLSurface *surf)
|
||||
{
|
||||
assert(surf);
|
||||
surf->Handle = _eglHashGenKey(_eglGlobal.Contexts);
|
||||
_eglHashInsert(_eglGlobal.Surfaces, surf->Handle, surf);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_eglRemoveSurface(_EGLSurface *surf)
|
||||
{
|
||||
_eglHashRemove(_eglGlobal.Surfaces, surf->Handle);
|
||||
}
|
||||
|
||||
|
||||
_EGLSurface *
|
||||
_eglLookupSurface(EGLSurface surf)
|
||||
{
|
||||
_EGLSurface *c = (_EGLSurface *) _eglHashLookup(_eglGlobal.Surfaces, surf);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
_EGLSurface *
|
||||
_eglGetCurrentSurface(EGLint readdraw)
|
||||
{
|
||||
_EGLContext *ctx = _eglGetCurrentContext();
|
||||
if (ctx) {
|
||||
switch (readdraw) {
|
||||
case EGL_DRAW:
|
||||
return ctx->DrawSurface;
|
||||
case EGL_READ:
|
||||
return ctx->ReadSurface;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
|
||||
{
|
||||
/* Basically just do error checking */
|
||||
_EGLContext *context = _eglGetCurrentContext();
|
||||
_EGLSurface *surface = _eglLookupSurface(draw);
|
||||
if (context && context->DrawSurface != surface) {
|
||||
_eglError(EGL_BAD_SURFACE, "eglSwapBuffers");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
if (surface == NULL) {
|
||||
_eglError(EGL_BAD_SURFACE, "eglSwapBuffers");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglCopyBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, NativePixmapType target)
|
||||
{
|
||||
/* XXX unfinished */
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglQuerySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surf, EGLint attribute, EGLint *value)
|
||||
{
|
||||
_EGLSurface *surface = _eglLookupSurface(surf);
|
||||
if (surface == NULL) {
|
||||
_eglError(EGL_BAD_SURFACE, "eglQuerySurface");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
switch (attribute) {
|
||||
case EGL_WIDTH:
|
||||
*value = surface->Width;
|
||||
return EGL_TRUE;
|
||||
case EGL_HEIGHT:
|
||||
*value = surface->Height;
|
||||
return EGL_TRUE;
|
||||
case EGL_CONFIG_ID:
|
||||
*value = GET_CONFIG_ATTRIB(surface->Config, EGL_CONFIG_ID);
|
||||
return EGL_TRUE;
|
||||
case EGL_TEXTURE_FORMAT:
|
||||
/* texture attributes: only for pbuffers, no error otherwise */
|
||||
if (surface->Type == EGL_PBUFFER_BIT)
|
||||
*value = surface->TextureFormat;
|
||||
return EGL_TRUE;
|
||||
case EGL_TEXTURE_TARGET:
|
||||
if (surface->Type == EGL_PBUFFER_BIT)
|
||||
*value = surface->TextureTarget;
|
||||
return EGL_TRUE;
|
||||
case EGL_MIPMAP_TEXTURE:
|
||||
if (surface->Type == EGL_PBUFFER_BIT)
|
||||
*value = surface->MipmapTexture;
|
||||
return EGL_TRUE;
|
||||
case EGL_MIPMAP_LEVEL:
|
||||
if (surface->Type == EGL_PBUFFER_BIT)
|
||||
*value = surface->MipmapLevel;
|
||||
return EGL_TRUE;
|
||||
case EGL_SURFACE_TYPE:
|
||||
*value = surface->Type;
|
||||
return EGL_TRUE;
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default fallback routine - drivers should usually override this.
|
||||
*/
|
||||
EGLSurface
|
||||
_eglCreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list)
|
||||
{
|
||||
/* nothing - just a placeholder */
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default fallback routine - drivers should usually override this.
|
||||
*/
|
||||
EGLSurface
|
||||
_eglCreatePixmapSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list)
|
||||
{
|
||||
/* nothing - just a placeholder */
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default fallback routine - drivers should usually override this.
|
||||
*/
|
||||
EGLSurface
|
||||
_eglCreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
|
||||
{
|
||||
/* nothing - just a placeholder */
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default fallback routine - drivers should usually override this.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
|
||||
{
|
||||
_EGLSurface *surf = _eglLookupSurface(surface);
|
||||
if (surf) {
|
||||
_eglHashRemove(_eglGlobal.Surfaces, surface);
|
||||
if (surf->IsBound) {
|
||||
surf->DeletePending = EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
free(surf);
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
else {
|
||||
_eglError(EGL_BAD_SURFACE, "eglDestroySurface");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default fallback routine - drivers might override this.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglSurfaceAttrib(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surf, EGLint attribute, EGLint value)
|
||||
{
|
||||
_EGLSurface *surface = _eglLookupSurface(surf);
|
||||
|
||||
if (surface == NULL) {
|
||||
_eglError(EGL_BAD_SURFACE, "eglSurfaceAttrib");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
switch (attribute) {
|
||||
case EGL_MIPMAP_LEVEL:
|
||||
surface->MipmapLevel = value;
|
||||
break;
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglSurfaceAttrib");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglBindTexImage(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint buffer)
|
||||
{
|
||||
/* XXX unfinished */
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglReleaseTexImage(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint buffer)
|
||||
{
|
||||
/* XXX unfinished */
|
||||
return EGL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
EGLBoolean
|
||||
_eglSwapInterval(_EGLDriver *drv, EGLDisplay dpy, EGLint interval)
|
||||
{
|
||||
_EGLSurface *surf = _eglGetCurrentSurface(EGL_DRAW);
|
||||
if (surf == NULL) {
|
||||
_eglError(EGL_BAD_SURFACE, "eglSwapInterval");
|
||||
return EGL_FALSE;
|
||||
}
|
||||
surf->SwapInterval = interval;
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
** EGL Surface Utility Functions. This could be handy for device drivers.
|
||||
**/
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the fields of the given _EGLSurface object from the other
|
||||
* parameters. Do error checking too. Allocate EGLSurface handle and
|
||||
* insert into hash table.
|
||||
* \return EGLSurface handle or EGL_NO_SURFACE if any error
|
||||
*/
|
||||
EGLSurface
|
||||
_eglInitPbufferSurface(_EGLSurface *surface, _EGLDriver *drv, EGLDisplay dpy,
|
||||
EGLConfig config, const EGLint *attrib_list)
|
||||
{
|
||||
_EGLConfig *conf;
|
||||
EGLint width = 0, height = 0, largest = 0;
|
||||
EGLint texFormat = 0, texTarget = 0, mipmapTex = 0;
|
||||
EGLint i;
|
||||
|
||||
conf = _eglLookupConfig(drv, dpy, config);
|
||||
if (!conf) {
|
||||
_eglError(EGL_BAD_CONFIG, "eglCreatePbufferSurface");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
|
||||
switch (attrib_list[i]) {
|
||||
case EGL_WIDTH:
|
||||
width = attrib_list[++i];
|
||||
break;
|
||||
case EGL_HEIGHT:
|
||||
height = attrib_list[++i];
|
||||
break;
|
||||
case EGL_LARGEST_PBUFFER:
|
||||
largest = attrib_list[++i];
|
||||
break;
|
||||
case EGL_TEXTURE_FORMAT:
|
||||
texFormat = attrib_list[++i];
|
||||
break;
|
||||
case EGL_TEXTURE_TARGET:
|
||||
texTarget = attrib_list[++i];
|
||||
break;
|
||||
case EGL_MIPMAP_TEXTURE:
|
||||
mipmapTex = attrib_list[++i];
|
||||
break;
|
||||
default:
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglCreatePbufferSurface");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
}
|
||||
|
||||
if (width <= 0 || height <= 0) {
|
||||
_eglError(EGL_BAD_ATTRIBUTE, "eglCreatePbufferSurface(width or height)");
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
surface->Config = conf;
|
||||
surface->Type = EGL_PBUFFER_BIT;
|
||||
surface->Width = width;
|
||||
surface->Height = height;
|
||||
surface->TextureFormat = texFormat;
|
||||
surface->TextureTarget = texTarget;
|
||||
surface->MipmapTexture = mipmapTex;
|
||||
surface->MipmapLevel = 0;
|
||||
surface->SwapInterval = 0;
|
||||
|
||||
/* insert into hash table */
|
||||
_eglSaveSurface(surface);
|
||||
assert(surface->Handle);
|
||||
|
||||
return surface->Handle;
|
||||
}
|
100
src/egl/main/eglsurface.h
Normal file
100
src/egl/main/eglsurface.h
Normal file
@@ -0,0 +1,100 @@
|
||||
#ifndef EGLSURFACE_INCLUDED
|
||||
#define EGLSURFACE_INCLUDED
|
||||
|
||||
|
||||
#include "egltypedefs.h"
|
||||
|
||||
|
||||
/**
|
||||
* "Base" class for device driver surfaces.
|
||||
*/
|
||||
struct _egl_surface
|
||||
{
|
||||
EGLSurface Handle; /* The public/opaque handle which names this object */
|
||||
_EGLConfig *Config;
|
||||
|
||||
/* May need reference counting here */
|
||||
EGLBoolean IsBound;
|
||||
EGLBoolean DeletePending;
|
||||
|
||||
EGLint Type; /* one of EGL_WINDOW_BIT, EGL_PIXMAP_BIT or EGL_PBUFFER_BIT */
|
||||
EGLint Width, Height;
|
||||
EGLint TextureFormat, TextureTarget;
|
||||
EGLint MipmapTexture, MipmapLevel;
|
||||
EGLint SwapInterval;
|
||||
|
||||
/* If type == EGL_SCREEN_BIT: */
|
||||
EGLint VisibleRefCount; /* number of screens I'm displayed on */
|
||||
};
|
||||
|
||||
|
||||
extern void
|
||||
_eglInitSurface(_EGLSurface *surf);
|
||||
|
||||
|
||||
extern void
|
||||
_eglSaveSurface(_EGLSurface *surf);
|
||||
|
||||
|
||||
extern void
|
||||
_eglRemoveSurface(_EGLSurface *surf);
|
||||
|
||||
|
||||
extern _EGLSurface *
|
||||
_eglLookupSurface(EGLSurface surf);
|
||||
|
||||
|
||||
extern _EGLSurface *
|
||||
_eglGetCurrentSurface(EGLint readdraw);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglSwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglCopyBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, NativePixmapType target);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglQuerySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||
|
||||
|
||||
extern EGLSurface
|
||||
_eglCreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list);
|
||||
|
||||
|
||||
extern EGLSurface
|
||||
_eglCreatePixmapSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list);
|
||||
|
||||
|
||||
extern EGLSurface
|
||||
_eglCreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglSurfaceAttrib(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglBindTexImage(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglReleaseTexImage(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglSwapInterval(_EGLDriver *drv, EGLDisplay dpy, EGLint interval);
|
||||
|
||||
|
||||
|
||||
extern EGLSurface
|
||||
_eglInitPbufferSurface(_EGLSurface *surface, _EGLDriver *drv, EGLDisplay dpy,
|
||||
EGLConfig config, const EGLint *attrib_list);
|
||||
|
||||
#endif /* EGLSURFACE_INCLUDED */
|
28
src/egl/main/egltypedefs.h
Normal file
28
src/egl/main/egltypedefs.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef EGLTYPEDEFS_INCLUDED
|
||||
#define EGLTYPEDEFS_INCLUDED
|
||||
|
||||
|
||||
#include <GLES/egl.h>
|
||||
|
||||
|
||||
typedef struct _egl_config _EGLConfig;
|
||||
|
||||
typedef struct _egl_context _EGLContext;
|
||||
|
||||
typedef struct _egl_display _EGLDisplay;
|
||||
|
||||
typedef struct _egl_driver _EGLDriver;
|
||||
|
||||
typedef struct _egl_mode _EGLMode;
|
||||
|
||||
typedef struct _egl_screen _EGLScreen;
|
||||
|
||||
typedef struct _egl_surface _EGLSurface;
|
||||
|
||||
|
||||
typedef void (*_EGLProc)();
|
||||
|
||||
typedef _EGLDriver *(*_EGLMain_t)(_EGLDisplay *dpy);
|
||||
|
||||
|
||||
#endif /* EGLTYPEDEFS_INCLUDED */
|
@@ -1169,15 +1169,15 @@ static void halveImage_float(GLint components, GLuint width, GLuint height,
|
||||
for (i = 0; i < newheight; i++) {
|
||||
for (j = 0; j < newwidth; j++) {
|
||||
for (k = 0; k < components; k++) {
|
||||
GLuint b;
|
||||
b = __GLU_SWAP_4_BYTES(t);
|
||||
s[0] = *(GLfloat*)&b;
|
||||
b = __GLU_SWAP_4_BYTES(t+group_size);
|
||||
s[0] += *(GLfloat*)&b;
|
||||
b = __GLU_SWAP_4_BYTES(t+ysize);
|
||||
s[0] += *(GLfloat*)&b;
|
||||
b = __GLU_SWAP_4_BYTES(t+ysize+group_size);
|
||||
s[0] += *(GLfloat*)&b;
|
||||
union { GLuint b; GLfloat f; } swapbuf;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(t);
|
||||
s[0] = swapbuf.f;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(t+group_size);
|
||||
s[0] += swapbuf.f;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(t+ysize);
|
||||
s[0] += swapbuf.f;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(t+ysize+group_size);
|
||||
s[0] += swapbuf.f;
|
||||
s[0] /= 4;
|
||||
s++; t += element_size;
|
||||
}
|
||||
@@ -1409,6 +1409,9 @@ static void scale_internal_ubyte(GLint components, GLint widthin,
|
||||
highy_float = convy_float;
|
||||
|
||||
for (i = 0; i < heightout; i++) {
|
||||
/* Clamp here to be sure we don't read beyond input buffer. */
|
||||
if (highy_int >= heightin)
|
||||
highy_int = heightin - 1;
|
||||
lowx_int = 0;
|
||||
lowx_float = 0;
|
||||
highx_int = convx_int;
|
||||
@@ -1450,7 +1453,7 @@ static void scale_internal_ubyte(GLint components, GLint widthin,
|
||||
totals[k] += (GLubyte)(*(temp_index)) * percent;
|
||||
}
|
||||
|
||||
/* calculate the value for pixels in the last row */
|
||||
/* calculate the value for pixels in the last row */
|
||||
y_percent = highy_float;
|
||||
percent = y_percent * (1-lowx_float);
|
||||
temp = (const char *)datain + xindex + highy_int * ysize;
|
||||
@@ -1623,6 +1626,9 @@ static void scale_internal_byte(GLint components, GLint widthin,
|
||||
highy_float = convy_float;
|
||||
|
||||
for (i = 0; i < heightout; i++) {
|
||||
/* Clamp here to be sure we don't read beyond input buffer. */
|
||||
if (highy_int >= heightin)
|
||||
highy_int = heightin - 1;
|
||||
lowx_int = 0;
|
||||
lowx_float = 0;
|
||||
highx_int = convx_int;
|
||||
@@ -1838,6 +1844,9 @@ static void scale_internal_ushort(GLint components, GLint widthin,
|
||||
highy_float = convy_float;
|
||||
|
||||
for (i = 0; i < heightout; i++) {
|
||||
/* Clamp here to be sure we don't read beyond input buffer. */
|
||||
if (highy_int >= heightin)
|
||||
highy_int = heightin - 1;
|
||||
lowx_int = 0;
|
||||
lowx_float = 0;
|
||||
highx_int = convx_int;
|
||||
@@ -2117,6 +2126,9 @@ static void scale_internal_short(GLint components, GLint widthin,
|
||||
highy_float = convy_float;
|
||||
|
||||
for (i = 0; i < heightout; i++) {
|
||||
/* Clamp here to be sure we don't read beyond input buffer. */
|
||||
if (highy_int >= heightin)
|
||||
highy_int = heightin - 1;
|
||||
lowx_int = 0;
|
||||
lowx_float = 0;
|
||||
highx_int = convx_int;
|
||||
@@ -2406,6 +2418,9 @@ static void scale_internal_uint(GLint components, GLint widthin,
|
||||
highy_float = convy_float;
|
||||
|
||||
for (i = 0; i < heightout; i++) {
|
||||
/* Clamp here to be sure we don't read beyond input buffer. */
|
||||
if (highy_int >= heightin)
|
||||
highy_int = heightin - 1;
|
||||
lowx_int = 0;
|
||||
lowx_float = 0;
|
||||
highx_int = convx_int;
|
||||
@@ -2692,6 +2707,9 @@ static void scale_internal_int(GLint components, GLint widthin,
|
||||
highy_float = convy_float;
|
||||
|
||||
for (i = 0; i < heightout; i++) {
|
||||
/* Clamp here to be sure we don't read beyond input buffer. */
|
||||
if (highy_int >= heightin)
|
||||
highy_int = heightin - 1;
|
||||
lowx_int = 0;
|
||||
lowx_float = 0;
|
||||
highx_int = convx_int;
|
||||
@@ -2962,7 +2980,7 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
int l, m;
|
||||
const char *left, *right;
|
||||
|
||||
GLuint swapbuf; /* unsigned buffer */
|
||||
union { GLuint b; GLfloat f; } swapbuf;
|
||||
|
||||
if (widthin == widthout*2 && heightin == heightout*2) {
|
||||
halveImage_float(components, widthin, heightin,
|
||||
@@ -2985,6 +3003,9 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
highy_float = convy_float;
|
||||
|
||||
for (i = 0; i < heightout; i++) {
|
||||
/* Clamp here to be sure we don't read beyond input buffer. */
|
||||
if (highy_int >= heightin)
|
||||
highy_int = heightin - 1;
|
||||
lowx_int = 0;
|
||||
lowx_float = 0;
|
||||
highx_int = convx_int;
|
||||
@@ -3008,8 +3029,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3020,8 +3041,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * y_percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * y_percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * y_percent;
|
||||
}
|
||||
@@ -3033,8 +3054,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3047,8 +3068,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3058,8 +3079,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * y_percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * y_percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * y_percent;
|
||||
}
|
||||
@@ -3070,8 +3091,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3084,10 +3105,10 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0; k < components;
|
||||
k++, left += element_size, right += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(left);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * (1-lowx_float);
|
||||
swapbuf = __GLU_SWAP_4_BYTES(right);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * highx_float;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(left);
|
||||
totals[k] += swapbuf.f * (1-lowx_float);
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(right);
|
||||
totals[k] += swapbuf.f * highx_float;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)left * (1-lowx_float)
|
||||
+ *(const GLfloat*)right * highx_float;
|
||||
@@ -3101,8 +3122,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3112,8 +3133,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * x_percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * x_percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * x_percent;
|
||||
}
|
||||
@@ -3124,8 +3145,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3138,8 +3159,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3149,8 +3170,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * y_percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * y_percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * y_percent;
|
||||
}
|
||||
@@ -3161,8 +3182,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3173,8 +3194,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf * percent;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f * percent;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index * percent;
|
||||
}
|
||||
@@ -3190,8 +3211,8 @@ static void scale_internal_float(GLint components, GLint widthin,
|
||||
for (k = 0, temp_index = temp; k < components;
|
||||
k++, temp_index += element_size) {
|
||||
if (myswap_bytes) {
|
||||
swapbuf = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += *(const GLfloat*)&swapbuf;
|
||||
swapbuf.b = __GLU_SWAP_4_BYTES(temp_index);
|
||||
totals[k] += swapbuf.f;
|
||||
} else {
|
||||
totals[k] += *(const GLfloat*)temp_index;
|
||||
}
|
||||
@@ -7376,19 +7397,17 @@ static void closestFit3D(GLenum target, GLint width, GLint height, GLint depth,
|
||||
GLint depthAtLevelOne= (depthPowerOf2 > 1) ?
|
||||
depthPowerOf2 >> 1 :
|
||||
depthPowerOf2;
|
||||
GLenum proxyTarget;
|
||||
GLenum proxyTarget = GL_PROXY_TEXTURE_3D;
|
||||
assert(widthAtLevelOne > 0);
|
||||
assert(heightAtLevelOne > 0);
|
||||
assert(depthAtLevelOne > 0);
|
||||
|
||||
/* does width x height x depth at level 1 & all their mipmaps fit? */
|
||||
if (target == GL_TEXTURE_3D || target == GL_PROXY_TEXTURE_3D) {
|
||||
proxyTarget = GL_PROXY_TEXTURE_3D;
|
||||
gluTexImage3D(proxyTarget, 1, /* must be non-zero */
|
||||
internalFormat,
|
||||
widthAtLevelOne,heightAtLevelOne,depthAtLevelOne,
|
||||
0,format,type,NULL);
|
||||
}
|
||||
assert(target == GL_TEXTURE_3D || target == GL_PROXY_TEXTURE_3D);
|
||||
gluTexImage3D(proxyTarget, 1, /* must be non-zero */
|
||||
internalFormat,
|
||||
widthAtLevelOne,heightAtLevelOne,depthAtLevelOne,
|
||||
0,format,type,NULL);
|
||||
glGetTexLevelParameteriv(proxyTarget, 1,GL_TEXTURE_WIDTH,&proxyWidth);
|
||||
/* does it fit??? */
|
||||
if (proxyWidth == 0) { /* nope, so try again with these sizes */
|
||||
|
@@ -1,31 +1,25 @@
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 4.0
|
||||
#
|
||||
# Copyright (C) 1999 Brian Paul All Rights Reserved.
|
||||
#
|
||||
# DOS/DJGPP Mesa Utility Toolkit
|
||||
# Version: 1.0
|
||||
#
|
||||
# Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
#
|
||||
# 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
|
||||
# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# DANIEL BORCA 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.
|
||||
|
||||
# DOS/DJGPP glut makefile v1.6 for Mesa
|
||||
#
|
||||
# Copyright (C) 2002 - Daniel Borca
|
||||
# Email : dborca@users.sourceforge.net
|
||||
# Web : http://www.geocities.com/dborca
|
||||
|
||||
|
||||
#
|
||||
# Available options:
|
||||
@@ -33,8 +27,6 @@
|
||||
# Environment variables:
|
||||
# CFLAGS
|
||||
#
|
||||
# MKGLUT absolute path to original GLUT.
|
||||
# default = $(TOP)/src/glut/glx
|
||||
# GLIDE path to Glide3 SDK; used to resolve DXEs.
|
||||
# default = $(TOP)/glide3
|
||||
#
|
||||
@@ -49,7 +41,6 @@
|
||||
|
||||
TOP = ../../..
|
||||
GLIDE ?= $(TOP)/glide3
|
||||
MKGLUT ?= $(TOP)/src/glut/glx
|
||||
LIBDIR = $(TOP)/lib
|
||||
GLUT_LIB = libglut.a
|
||||
GLUT_DXE = glut.dxe
|
||||
@@ -58,7 +49,7 @@ GLUT_IMP = libiglut.a
|
||||
export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH);$(LIBDIR);$(GLIDE)/lib
|
||||
|
||||
CC = gcc
|
||||
CFLAGS += -I- -I$(TOP)/include -I. -I$(MKGLUT) -IPC_HW
|
||||
CFLAGS += -I$(TOP)/include -I. -IPC_HW
|
||||
CFLAGS += -DGLUT_IMPORT_LIB
|
||||
|
||||
AR = ar
|
||||
@@ -73,6 +64,7 @@ UNLINK = $(RM) $(1)
|
||||
endif
|
||||
|
||||
CORE_SOURCES = \
|
||||
loop.c \
|
||||
callback.c \
|
||||
color.c \
|
||||
extens.c \
|
||||
@@ -82,7 +74,20 @@ CORE_SOURCES = \
|
||||
overlay.c \
|
||||
state.c \
|
||||
util.c \
|
||||
window.c
|
||||
window.c \
|
||||
f8x13.c \
|
||||
f9x15.c \
|
||||
hel10.c \
|
||||
hel12.c \
|
||||
hel18.c \
|
||||
tr10.c \
|
||||
tr24.c \
|
||||
mroman.c \
|
||||
roman.c \
|
||||
bitmap.c \
|
||||
stroke.c \
|
||||
teapot.c \
|
||||
shapes.c
|
||||
|
||||
PC_HW_SOURCES = \
|
||||
PC_HW/pc_hw.c \
|
||||
@@ -91,25 +96,7 @@ PC_HW_SOURCES = \
|
||||
PC_HW/pc_timer.c \
|
||||
PC_HW/pc_irq.S
|
||||
|
||||
MKGLUT_SOURCES = \
|
||||
$(MKGLUT)/glut_bitmap.c \
|
||||
$(MKGLUT)/glut_bwidth.c \
|
||||
$(MKGLUT)/glut_stroke.c \
|
||||
$(MKGLUT)/glut_swidth.c \
|
||||
$(MKGLUT)/glut_shapes.c \
|
||||
$(MKGLUT)/glut_teapot.c \
|
||||
$(MKGLUT)/glut_8x13.c \
|
||||
$(MKGLUT)/glut_9x15.c \
|
||||
$(MKGLUT)/glut_hel10.c \
|
||||
$(MKGLUT)/glut_hel12.c \
|
||||
$(MKGLUT)/glut_hel18.c \
|
||||
$(MKGLUT)/glut_tr10.c \
|
||||
$(MKGLUT)/glut_tr24.c \
|
||||
$(MKGLUT)/glut_roman.c \
|
||||
$(MKGLUT)/glut_mroman.c \
|
||||
$(MKGLUT)/glut_util.c
|
||||
|
||||
SOURCES = $(CORE_SOURCES) $(PC_HW_SOURCES) $(MKGLUT_SOURCES)
|
||||
SOURCES = $(CORE_SOURCES) $(PC_HW_SOURCES)
|
||||
|
||||
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
|
||||
|
||||
@@ -129,12 +116,11 @@ $(LIBDIR)/$(GLUT_DXE) $(LIBDIR)/$(GLUT_IMP): $(OBJECTS)
|
||||
ifeq ($(HAVEDXE3),)
|
||||
$(warning Missing DXE3 package... Skipping $(GLUT_DXE))
|
||||
else
|
||||
-dxe3gen -o $(LIBDIR)/$(GLUT_DXE) -Y $(LIBDIR)/$(GLUT_IMP) -D "MesaGLUT DJGPP" -E _glut -P gl.dxe -P glu.dxe -U $^
|
||||
-dxe3gen -o $(LIBDIR)/$(GLUT_DXE) -Y $(LIBDIR)/$(GLUT_IMP) -D "MesaGLUT DJGPP" -E _glut -P gl.dxe -U $^
|
||||
endif
|
||||
|
||||
clean:
|
||||
-$(call UNLINK,*.o)
|
||||
-$(call UNLINK,PC_HW/*.o)
|
||||
-$(call UNLINK,$(MKGLUT)/*.o)
|
||||
|
||||
-include depend
|
||||
|
115
src/glut/dos/bitmap.c
Normal file
115
src/glut/dos/bitmap.c
Normal file
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* 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
|
||||
* DANIEL BORCA 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 "internal.h"
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutBitmapCharacter (void *font, int c)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
|
||||
if (c >= bfp->num || !(bcp = bfp->table[c]))
|
||||
return;
|
||||
|
||||
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
|
||||
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glBitmap(bcp->width, bcp->height, bcp->xorig, bcp->yorig,
|
||||
bcp->xmove, 0, bcp->bitmap);
|
||||
|
||||
glPopClientAttrib();
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutBitmapString (void *font, const unsigned char *string)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
unsigned char c;
|
||||
|
||||
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
|
||||
|
||||
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
|
||||
while ((c = *(string++))) {
|
||||
if (c < bfp->num && (bcp = bfp->table[c]))
|
||||
glBitmap(bcp->width, bcp->height, bcp->xorig,
|
||||
bcp->yorig, bcp->xmove, 0, bcp->bitmap);
|
||||
}
|
||||
|
||||
glPopClientAttrib();
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutBitmapWidth (void *font, int c)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
|
||||
if (c >= bfp->num || !(bcp = bfp->table[c]))
|
||||
return 0;
|
||||
|
||||
return bcp->xmove;
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutBitmapLength (void *font, const unsigned char *string)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
const GLUTBitmapChar *bcp;
|
||||
unsigned char c;
|
||||
int length = 0;
|
||||
|
||||
while ((c = *(string++))) {
|
||||
if (c < bfp->num && (bcp = bfp->table[c]))
|
||||
length += bcp->xmove;
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
int APIENTRY
|
||||
glutBitmapHeight (void *font)
|
||||
{
|
||||
const GLUTBitmapFont *bfp = _glut_font(font);
|
||||
|
||||
return bfp->height;
|
||||
}
|
@@ -1,106 +1,103 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.4
|
||||
* Copyright (C) 1995-1998 Brian Paul
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
* 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:
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
* 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
|
||||
* DANIEL BORCA 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.6 for Mesa
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
#include "glutint.h"
|
||||
GLUTSShotCB _glut_timer_cb[MAX_TIMER_CB];
|
||||
|
||||
|
||||
GLUTSShotCB g_sscb[MAX_SSHOT_CB];
|
||||
|
||||
GLUTidleCB g_idle_func = NULL;
|
||||
GLUTidleCB _glut_idle_func = NULL;
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutDisplayFunc (GLUTdisplayCB func)
|
||||
{
|
||||
g_curwin->display = func;
|
||||
_glut_current->display = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutReshapeFunc (GLUTreshapeCB func)
|
||||
{
|
||||
g_curwin->reshape = func;
|
||||
_glut_current->reshape = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutKeyboardFunc (GLUTkeyboardCB func)
|
||||
{
|
||||
g_curwin->keyboard = func;
|
||||
_glut_current->keyboard = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMouseFunc (GLUTmouseCB func)
|
||||
{
|
||||
g_curwin->mouse = func;
|
||||
_glut_current->mouse = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMotionFunc (GLUTmotionCB func)
|
||||
{
|
||||
g_curwin->motion = func;
|
||||
_glut_current->motion = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutPassiveMotionFunc (GLUTpassiveCB func)
|
||||
{
|
||||
g_curwin->passive = func;
|
||||
_glut_current->passive = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutEntryFunc (GLUTentryCB func)
|
||||
{
|
||||
g_curwin->entry = func;
|
||||
_glut_current->entry = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutVisibilityFunc (GLUTvisibilityCB func)
|
||||
{
|
||||
g_curwin->visibility = func;
|
||||
_glut_current->visibility = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutWindowStatusFunc (GLUTwindowStatusCB func)
|
||||
{
|
||||
_glut_current->windowStatus = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutIdleFunc (GLUTidleCB func)
|
||||
{
|
||||
g_idle_func = func;
|
||||
_glut_idle_func = func;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,8 +107,8 @@ glutTimerFunc (unsigned int millis, GLUTtimerCB func, int value)
|
||||
int i;
|
||||
|
||||
if (millis > 0) {
|
||||
for (i = 0; i < MAX_SSHOT_CB; i++) {
|
||||
GLUTSShotCB *cb = &g_sscb[i];
|
||||
for (i = 0; i < MAX_TIMER_CB; i++) {
|
||||
GLUTSShotCB *cb = &_glut_timer_cb[i];
|
||||
if (cb->func == NULL) {
|
||||
cb->value = value;
|
||||
cb->func = func;
|
||||
@@ -126,53 +123,82 @@ glutTimerFunc (unsigned int millis, GLUTtimerCB func, int value)
|
||||
void APIENTRY
|
||||
glutSpecialFunc (GLUTspecialCB func)
|
||||
{
|
||||
g_curwin->special = func;
|
||||
_glut_current->special = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpaceballMotionFunc (GLUTspaceMotionCB func)
|
||||
{
|
||||
_glut_current->spaceMotion = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpaceballRotateFunc (GLUTspaceRotateCB func)
|
||||
{
|
||||
_glut_current->spaceRotate = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpaceballButtonFunc (GLUTspaceButtonCB func)
|
||||
{
|
||||
_glut_current->spaceButton = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutDialsFunc (GLUTdialsCB func)
|
||||
{
|
||||
_glut_current->dials = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutButtonBoxFunc (GLUTbuttonBoxCB func)
|
||||
{
|
||||
_glut_current->buttonBox = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutTabletMotionFunc (GLUTtabletMotionCB func)
|
||||
{
|
||||
_glut_current->tabletMotion = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutTabletButtonFunc (GLUTtabletButtonCB func)
|
||||
{
|
||||
_glut_current->tabletButton = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutJoystickFunc (GLUTjoystickCB func, int interval)
|
||||
{
|
||||
_glut_current->joystick = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutKeyboardUpFunc (GLUTkeyboardCB func)
|
||||
{
|
||||
_glut_current->keyboardUp = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutSpecialUpFunc (GLUTspecialCB func)
|
||||
{
|
||||
_glut_current->specialUp = func;
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY
|
||||
glutMouseWheelFunc (GLUTmouseWheelCB func)
|
||||
{
|
||||
_glut_current->mouseWheel = func;
|
||||
}
|
||||
|
@@ -1,34 +1,29 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.4
|
||||
* Copyright (C) 1995-1998 Brian Paul
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
* 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:
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
* 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
|
||||
* DANIEL BORCA 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.3 for Mesa
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#include "glutint.h"
|
||||
#include "GL/dmesa.h"
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
#define CLAMP(i) ((i) > 1.0F ? 1.0F : ((i) < 0.0F ? 0.0F : (i)))
|
||||
@@ -37,7 +32,7 @@
|
||||
void APIENTRY
|
||||
glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue)
|
||||
{
|
||||
if (g_display_mode & GLUT_INDEX) {
|
||||
if (_glut_default.mode & GLUT_INDEX) {
|
||||
if ((ndx >= 0) && (ndx < (256 - RESERVED_COLORS))) {
|
||||
DMesaSetCI(ndx, CLAMP(red), CLAMP(green), CLAMP(blue));
|
||||
}
|
||||
|
@@ -1,37 +1,31 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.4
|
||||
* Copyright (C) 1995-1998 Brian Paul
|
||||
* DOS/DJGPP Mesa Utility Toolkit
|
||||
* Version: 1.0
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
* Copyright (C) 2005 Daniel Borca All Rights Reserved.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
* 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:
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.5 for Mesa
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* Copyright (C) 2002 - Daniel Borca
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
* 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
|
||||
* DANIEL BORCA 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 <string.h>
|
||||
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "GL/dmesa.h"
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
int APIENTRY
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user