Compare commits
258 Commits
mesa-10.6.
...
embedded-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f221b8df75 | ||
|
|
45bd335b1c | ||
|
|
6127672e26 | ||
|
|
bb3752a434 | ||
|
|
56c896a2b8 | ||
|
|
afc72872be | ||
|
|
e511f40795 | ||
|
|
a53f53ece3 | ||
|
|
24812b3eaa | ||
|
|
42e0f2ec95 | ||
|
|
e4fcab7a35 | ||
|
|
cd6d79a82c | ||
|
|
a428744286 | ||
|
|
ccc6ef28ca | ||
|
|
3100749dd0 | ||
|
|
980e98d324 | ||
|
|
2204d5bb46 | ||
|
|
67d3c57c46 | ||
|
|
9e24ff7a0a | ||
|
|
e014d794f2 | ||
|
|
a9bd5a6860 | ||
|
|
94643c4780 | ||
|
|
993502aebc | ||
|
|
932e26e8f4 | ||
|
|
54f4c8d1a3 | ||
|
|
277d7a2a85 | ||
|
|
0a98671051 | ||
|
|
a47745e9fd | ||
|
|
69ce6b7db0 | ||
|
|
5d3ab07110 | ||
|
|
1613d48989 | ||
|
|
5a610a1974 | ||
|
|
afb339bf75 | ||
|
|
16ca6f8e93 | ||
|
|
41b5963f8d | ||
|
|
99199c0ece | ||
|
|
368d95a7dc | ||
|
|
0218da1433 | ||
|
|
6cb2411250 | ||
|
|
0d3a504b94 | ||
|
|
bde16645ca | ||
|
|
301f7e4408 | ||
|
|
173441d1a6 | ||
|
|
64b3e2fa16 | ||
|
|
6919c50029 | ||
|
|
a8512f7dda | ||
|
|
70217c70be | ||
|
|
9d4857a816 | ||
|
|
3f00e34097 | ||
|
|
3e48e6fce4 | ||
|
|
d1fa9af224 | ||
|
|
c20d946424 | ||
|
|
ff6068b217 | ||
|
|
ed1b6e98e2 | ||
|
|
b52901eb89 | ||
|
|
cff70d16aa | ||
|
|
bafbdcb703 | ||
|
|
50d1c2c921 | ||
|
|
a1fd12ab84 | ||
|
|
360bec8a6f | ||
|
|
6440630d79 | ||
|
|
02a6f4b56a | ||
|
|
f828410458 | ||
|
|
7b7af467dd | ||
|
|
3101d43a76 | ||
|
|
d95443f030 | ||
|
|
be49c0fef2 | ||
|
|
61d31cab97 | ||
|
|
7067815785 | ||
|
|
ad79ba8208 | ||
|
|
b8cdeaae3a | ||
|
|
4b930d3080 | ||
|
|
2b3cd85107 | ||
|
|
12acb24b60 | ||
|
|
b4bc6375d1 | ||
|
|
c91deeffc4 | ||
|
|
728dade650 | ||
|
|
c3ded1b33d | ||
|
|
080ae6edb5 | ||
|
|
b8bc33a6b1 | ||
|
|
1d7c610c2b | ||
|
|
70130333c2 | ||
|
|
c608a0fb2a | ||
|
|
7f35ecd070 | ||
|
|
ef9f2d4296 | ||
|
|
27b8f1d3ae | ||
|
|
c35fb58c35 | ||
|
|
eb998b80ea | ||
|
|
b77ca3d2b7 | ||
|
|
cdc64176f9 | ||
|
|
da69c37f98 | ||
|
|
661a236d09 | ||
|
|
b9f8f7f6a4 | ||
|
|
66f40571e1 | ||
|
|
6620693116 | ||
|
|
730cacfa01 | ||
|
|
2f05ae32c5 | ||
|
|
d9ed9e1a9a | ||
|
|
6133ba36ec | ||
|
|
4b5f9479eb | ||
|
|
75019b24d1 | ||
|
|
c9118dfaba | ||
|
|
a140417be9 | ||
|
|
ccf4e3e8f2 | ||
|
|
78e1fee39b | ||
|
|
75ccd62be8 | ||
|
|
cd9df92c9d | ||
|
|
cfe59bd3f9 | ||
|
|
62bc31dcae | ||
|
|
675f151c42 | ||
|
|
151cd27866 | ||
|
|
c8facc28cc | ||
|
|
086e00e086 | ||
|
|
49116e9fd2 | ||
|
|
9d0eff73b5 | ||
|
|
81c7427ddc | ||
|
|
9e3c6f3b8e | ||
|
|
18a5321288 | ||
|
|
4c864746d6 | ||
|
|
19b1476515 | ||
|
|
2005348110 | ||
|
|
634a7b2f00 | ||
|
|
d73e21620a | ||
|
|
d5cfbef5ad | ||
|
|
1d08fddfe6 | ||
|
|
447ea351dd | ||
|
|
0ebc838481 | ||
|
|
14a7a05251 | ||
|
|
c2edc07196 | ||
|
|
222a212569 | ||
|
|
78469e6e3d | ||
|
|
63d0a9055c | ||
|
|
27834f06b8 | ||
|
|
c262531518 | ||
|
|
1b2c02ae98 | ||
|
|
fb5f90d71b | ||
|
|
4fb1eb7be2 | ||
|
|
cf119744c3 | ||
|
|
b07ed0113a | ||
|
|
d6d8d1dfce | ||
|
|
f483ebddeb | ||
|
|
35fe61ce7b | ||
|
|
c3b1d1e63c | ||
|
|
38bfead7d3 | ||
|
|
56f57500b9 | ||
|
|
2ce0615ef1 | ||
|
|
559af8ace4 | ||
|
|
f73e37e154 | ||
|
|
ec5b054b8f | ||
|
|
8a63d4bc99 | ||
|
|
f58e67787f | ||
|
|
deb4d4de47 | ||
|
|
1449a2f759 | ||
|
|
f0b66442e8 | ||
|
|
8830b0a941 | ||
|
|
deb5fe3b68 | ||
|
|
1e1e71e3a7 | ||
|
|
53362d8858 | ||
|
|
af82796ed1 | ||
|
|
6ded963ac6 | ||
|
|
b4f35d5191 | ||
|
|
0b9434aafd | ||
|
|
fb02d9f4eb | ||
|
|
2b83583994 | ||
|
|
76415ea859 | ||
|
|
10d05983ef | ||
|
|
7c35ac6e82 | ||
|
|
ca9cccd81c | ||
|
|
ea9f98b04b | ||
|
|
8b4a34dcdb | ||
|
|
267bc32309 | ||
|
|
8618425250 | ||
|
|
24259ec2d0 | ||
|
|
97aa6f3734 | ||
|
|
6b723c7720 | ||
|
|
211f26ca95 | ||
|
|
df7cbe873e | ||
|
|
da8a7e15a6 | ||
|
|
f6546f8384 | ||
|
|
cd22e4b78c | ||
|
|
5ff65a62df | ||
|
|
fd55975710 | ||
|
|
c83b869ed2 | ||
|
|
592250e9fc | ||
|
|
cdb267a918 | ||
|
|
2c2bcf8268 | ||
|
|
695b197cb2 | ||
|
|
e17d611067 | ||
|
|
9df9883a7a | ||
|
|
22477c050e | ||
|
|
39afeb7cf0 | ||
|
|
9363bd862f | ||
|
|
83b936adb3 | ||
|
|
5134d4a98b | ||
|
|
2481eda853 | ||
|
|
6b31afc236 | ||
|
|
8fd39b4e8c | ||
|
|
094eed79c2 | ||
|
|
d20f1768a6 | ||
|
|
3e06eed70a | ||
|
|
3e13551969 | ||
|
|
3af2be61fd | ||
|
|
eb7eb6e171 | ||
|
|
e931e819f9 | ||
|
|
95936ee9ba | ||
|
|
157d9a5ac6 | ||
|
|
134930b627 | ||
|
|
a97ce86232 | ||
|
|
5ca95653c4 | ||
|
|
1f01a4b3b6 | ||
|
|
8645472e00 | ||
|
|
1929cacdbf | ||
|
|
65e30ac06a | ||
|
|
941efe8eda | ||
|
|
ea4b887ef7 | ||
|
|
ba8e63f05b | ||
|
|
117a2d76b6 | ||
|
|
ce75913702 | ||
|
|
cbc41d4332 | ||
|
|
40af4d7662 | ||
|
|
702b2802a0 | ||
|
|
44e4e437a0 | ||
|
|
366ca58ea6 | ||
|
|
90925c9777 | ||
|
|
f6b40da9a7 | ||
|
|
80798c8eab | ||
|
|
65a7a3852d | ||
|
|
cf8aede714 | ||
|
|
1e27ca69f8 | ||
|
|
9fcd566e60 | ||
|
|
78b5f5f44f | ||
|
|
8a82d9db15 | ||
|
|
fa747cdb0a | ||
|
|
fa50fae202 | ||
|
|
0fb48dba7c | ||
|
|
2f3585d4f1 | ||
|
|
7c7789c029 | ||
|
|
56ad63958b | ||
|
|
aa0109bf96 | ||
|
|
0201db5a22 | ||
|
|
1a1069c7e9 | ||
|
|
fc88680a39 | ||
|
|
ff89f4b639 | ||
|
|
7d5b5c0438 | ||
|
|
6ccaeaaa16 | ||
|
|
e4e72da501 | ||
|
|
67f87d2463 | ||
|
|
431c1740d5 | ||
|
|
fa3f447234 | ||
|
|
3a08052714 | ||
|
|
424096d581 | ||
|
|
2e5a88ab6a | ||
|
|
d520ff08d0 | ||
|
|
ef0e1dcc2e | ||
|
|
6412641b19 | ||
|
|
3ee066b48f | ||
|
|
33c0b3e233 | ||
|
|
658145bd82 |
3579
docs/subset.html
Normal file
3579
docs/subset.html
Normal file
File diff suppressed because it is too large
Load Diff
12
doxygen/.cvsignore
Normal file
12
doxygen/.cvsignore
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
*.tag
|
||||||
|
array_cache
|
||||||
|
core
|
||||||
|
core_subset
|
||||||
|
math
|
||||||
|
math_subset
|
||||||
|
miniglx
|
||||||
|
radeon_subset
|
||||||
|
swrast
|
||||||
|
swrast_setup
|
||||||
|
tnl
|
||||||
|
tnl_dd
|
||||||
@@ -6,4 +6,5 @@ See http://www.doxygen.org/ for more info.
|
|||||||
Either run 'make' (Unix) or 'doxy.bat' (Windows) to run doxygen
|
Either run 'make' (Unix) or 'doxy.bat' (Windows) to run doxygen
|
||||||
and generate souce code documentation.
|
and generate souce code documentation.
|
||||||
|
|
||||||
Then, load doxy/core.index.html into your web browser.
|
Then, load either doxy/core/index.html or doxy/core_subset/index.html into
|
||||||
|
your web browser.
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
# General configuration options
|
# General configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
PROJECT_NAME = "Mesa array_cache"
|
PROJECT_NAME = "Mesa array_cache"
|
||||||
PROJECT_NUMBER = 4.1
|
PROJECT_NUMBER =
|
||||||
OUTPUT_DIRECTORY = .
|
OUTPUT_DIRECTORY =
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
EXTRACT_ALL = YES
|
EXTRACT_ALL = NO
|
||||||
EXTRACT_PRIVATE = NO
|
EXTRACT_PRIVATE = NO
|
||||||
EXTRACT_STATIC = NO
|
EXTRACT_STATIC = NO
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
@@ -38,14 +38,14 @@ GENERATE_BUGLIST = YES
|
|||||||
ALIASES =
|
ALIASES =
|
||||||
ENABLED_SECTIONS =
|
ENABLED_SECTIONS =
|
||||||
MAX_INITIALIZER_LINES = 30
|
MAX_INITIALIZER_LINES = 30
|
||||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||||
SHOW_USED_FILES = YES
|
SHOW_USED_FILES = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to warning and progress messages
|
# configuration options related to warning and progress messages
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
QUIET = YES
|
QUIET = YES
|
||||||
WARNINGS = YES
|
WARNINGS = YES
|
||||||
WARN_IF_UNDOCUMENTED = YES
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
WARN_FORMAT =
|
WARN_FORMAT =
|
||||||
WARN_LOGFILE =
|
WARN_LOGFILE =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
# General configuration options
|
# General configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
PROJECT_NAME = "Mesa Core"
|
PROJECT_NAME = "Mesa Core"
|
||||||
PROJECT_NUMBER = 4.1
|
PROJECT_NUMBER =
|
||||||
OUTPUT_DIRECTORY =
|
OUTPUT_DIRECTORY =
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
EXTRACT_ALL = YES
|
EXTRACT_ALL = NO
|
||||||
EXTRACT_PRIVATE = NO
|
EXTRACT_PRIVATE = NO
|
||||||
EXTRACT_STATIC = NO
|
EXTRACT_STATIC = YES
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
HIDE_UNDOC_MEMBERS = NO
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
HIDE_UNDOC_CLASSES = NO
|
HIDE_UNDOC_CLASSES = NO
|
||||||
@@ -19,7 +19,7 @@ ALWAYS_DETAILED_SEC = NO
|
|||||||
INLINE_INHERITED_MEMB = NO
|
INLINE_INHERITED_MEMB = NO
|
||||||
FULL_PATH_NAMES = NO
|
FULL_PATH_NAMES = NO
|
||||||
STRIP_FROM_PATH =
|
STRIP_FROM_PATH =
|
||||||
INTERNAL_DOCS = NO
|
INTERNAL_DOCS = YES
|
||||||
STRIP_CODE_COMMENTS = YES
|
STRIP_CODE_COMMENTS = YES
|
||||||
CASE_SENSE_NAMES = YES
|
CASE_SENSE_NAMES = YES
|
||||||
SHORT_NAMES = NO
|
SHORT_NAMES = NO
|
||||||
@@ -38,24 +38,24 @@ GENERATE_BUGLIST = YES
|
|||||||
ALIASES =
|
ALIASES =
|
||||||
ENABLED_SECTIONS =
|
ENABLED_SECTIONS =
|
||||||
MAX_INITIALIZER_LINES = 30
|
MAX_INITIALIZER_LINES = 30
|
||||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||||
SHOW_USED_FILES = YES
|
SHOW_USED_FILES = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to warning and progress messages
|
# configuration options related to warning and progress messages
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
QUIET = YES
|
QUIET = YES
|
||||||
WARNINGS = YES
|
WARNINGS = YES
|
||||||
WARN_IF_UNDOCUMENTED = YES
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
WARN_FORMAT =
|
WARN_FORMAT =
|
||||||
WARN_LOGFILE =
|
WARN_LOGFILE =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to the input files
|
# configuration options related to the input files
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
INPUT = ../src/
|
INPUT = ../src/
|
||||||
FILE_PATTERNS = *.h *.c
|
FILE_PATTERNS = *.c *.h
|
||||||
RECURSIVE = NO
|
RECURSIVE = NO
|
||||||
EXCLUDE = ../src/glapitemp.h ../src/glapioffsets.h
|
EXCLUDE = ../src/glapitemp.h ../src/glapioffsets.h
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS = subset_*
|
||||||
EXAMPLE_PATH =
|
EXAMPLE_PATH =
|
||||||
EXAMPLE_PATTERNS =
|
EXAMPLE_PATTERNS =
|
||||||
EXAMPLE_RECURSIVE = NO
|
EXAMPLE_RECURSIVE = NO
|
||||||
@@ -65,16 +65,16 @@ FILTER_SOURCE_FILES = NO
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to source browsing
|
# configuration options related to source browsing
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
SOURCE_BROWSER = NO
|
SOURCE_BROWSER = YES
|
||||||
INLINE_SOURCES = NO
|
INLINE_SOURCES = NO
|
||||||
REFERENCED_BY_RELATION = YES
|
REFERENCED_BY_RELATION = YES
|
||||||
REFERENCES_RELATION = YES
|
REFERENCES_RELATION = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to the alphabetical class index
|
# configuration options related to the alphabetical class index
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
ALPHABETICAL_INDEX = YES
|
ALPHABETICAL_INDEX = NO
|
||||||
COLS_IN_ALPHA_INDEX = 5
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
IGNORE_PREFIX = _
|
IGNORE_PREFIX =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to the HTML output
|
# configuration options related to the HTML output
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
@@ -132,13 +132,13 @@ GENERATE_AUTOGEN_DEF = NO
|
|||||||
# Configuration options related to the preprocessor
|
# Configuration options related to the preprocessor
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
ENABLE_PREPROCESSING = YES
|
ENABLE_PREPROCESSING = YES
|
||||||
MACRO_EXPANSION = NO
|
MACRO_EXPANSION = YES
|
||||||
EXPAND_ONLY_PREDEF = NO
|
EXPAND_ONLY_PREDEF = YES
|
||||||
SEARCH_INCLUDES = YES
|
SEARCH_INCLUDES = YES
|
||||||
INCLUDE_PATH = ../include/
|
INCLUDE_PATH = ../include/
|
||||||
INCLUDE_FILE_PATTERNS =
|
INCLUDE_FILE_PATTERNS =
|
||||||
PREDEFINED =
|
PREDEFINED = _HAVE_FULL_GL=1
|
||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED = _glthread_DECLARE_STATIC_MUTEX
|
||||||
SKIP_FUNCTION_MACROS = YES
|
SKIP_FUNCTION_MACROS = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration::addtions related to external references
|
# Configuration::addtions related to external references
|
||||||
@@ -148,8 +148,7 @@ TAGFILES = tnl_dd.tag=../tnl_dd \
|
|||||||
math.tag=../math \
|
math.tag=../math \
|
||||||
swrast.tag=../swrast \
|
swrast.tag=../swrast \
|
||||||
swrast_setup.tag=../swrast_setup \
|
swrast_setup.tag=../swrast_setup \
|
||||||
tnl.tag=../tnl \
|
tnl.tag=../tnl
|
||||||
array_cache.tag=array_cache
|
|
||||||
GENERATE_TAGFILE = core.tag
|
GENERATE_TAGFILE = core.tag
|
||||||
ALLEXTERNALS = NO
|
ALLEXTERNALS = NO
|
||||||
PERL_PATH =
|
PERL_PATH =
|
||||||
|
|||||||
226
doxygen/core_subset.doxy
Normal file
226
doxygen/core_subset.doxy
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
# Doxyfile 0.1
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# General configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
PROJECT_NAME = "Mesa Core"
|
||||||
|
PROJECT_NUMBER =
|
||||||
|
OUTPUT_DIRECTORY =
|
||||||
|
OUTPUT_LANGUAGE = English
|
||||||
|
EXTRACT_ALL = NO
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_STATIC = YES
|
||||||
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
|
HIDE_UNDOC_CLASSES = NO
|
||||||
|
BRIEF_MEMBER_DESC = YES
|
||||||
|
REPEAT_BRIEF = YES
|
||||||
|
ALWAYS_DETAILED_SEC = NO
|
||||||
|
INLINE_INHERITED_MEMB = NO
|
||||||
|
FULL_PATH_NAMES = NO
|
||||||
|
STRIP_FROM_PATH =
|
||||||
|
INTERNAL_DOCS = YES
|
||||||
|
STRIP_CODE_COMMENTS = YES
|
||||||
|
CASE_SENSE_NAMES = YES
|
||||||
|
SHORT_NAMES = NO
|
||||||
|
HIDE_SCOPE_NAMES = NO
|
||||||
|
VERBATIM_HEADERS = YES
|
||||||
|
SHOW_INCLUDE_FILES = YES
|
||||||
|
JAVADOC_AUTOBRIEF = NO
|
||||||
|
INHERIT_DOCS = YES
|
||||||
|
INLINE_INFO = YES
|
||||||
|
SORT_MEMBER_DOCS = NO
|
||||||
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
|
TAB_SIZE = 8
|
||||||
|
GENERATE_TODOLIST = YES
|
||||||
|
GENERATE_TESTLIST = YES
|
||||||
|
GENERATE_BUGLIST = YES
|
||||||
|
ALIASES =
|
||||||
|
ENABLED_SECTIONS = subset
|
||||||
|
MAX_INITIALIZER_LINES = 30
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||||
|
SHOW_USED_FILES = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to warning and progress messages
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
QUIET = YES
|
||||||
|
WARNINGS = YES
|
||||||
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
|
WARN_FORMAT =
|
||||||
|
WARN_LOGFILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the input files
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
INPUT = ../src/
|
||||||
|
FILE_PATTERNS = \
|
||||||
|
accum.h \
|
||||||
|
attrib.h \
|
||||||
|
blend.[ch] \
|
||||||
|
buffers.[ch] \
|
||||||
|
dd.h \
|
||||||
|
debug.h \
|
||||||
|
depth.h \
|
||||||
|
dlist.h \
|
||||||
|
context.[ch] \
|
||||||
|
config.h \
|
||||||
|
colormac.h \
|
||||||
|
colortab.h \
|
||||||
|
enable.h \
|
||||||
|
enums.h \
|
||||||
|
eval.h \
|
||||||
|
extensions.h \
|
||||||
|
feedback.[ch] \
|
||||||
|
fog.h \
|
||||||
|
get.h \
|
||||||
|
glheader.h \
|
||||||
|
glthread.h \
|
||||||
|
hash.[ch] \
|
||||||
|
hint.h \
|
||||||
|
histogram.h \
|
||||||
|
image.[ch] \
|
||||||
|
imports.[ch] \
|
||||||
|
lines.[ch] \
|
||||||
|
light.h \
|
||||||
|
matrix.[ch] \
|
||||||
|
macros.h \
|
||||||
|
mmath.h \
|
||||||
|
mtypes.h \
|
||||||
|
pixel.h \
|
||||||
|
points.[ch] \
|
||||||
|
polygon.[ch] \
|
||||||
|
rastpos.[ch] \
|
||||||
|
simple_list.h \
|
||||||
|
state.[ch] \
|
||||||
|
stencil.[ch] \
|
||||||
|
subset_*.c \
|
||||||
|
texformat.h \
|
||||||
|
teximage.h \
|
||||||
|
texstate.h \
|
||||||
|
texstore.h \
|
||||||
|
texobj.[ch] \
|
||||||
|
texutil_tmp.h \
|
||||||
|
varray.h
|
||||||
|
RECURSIVE = NO
|
||||||
|
EXCLUDE =
|
||||||
|
EXCLUDE_PATTERNS =
|
||||||
|
EXAMPLE_PATH =
|
||||||
|
EXAMPLE_PATTERNS =
|
||||||
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
IMAGE_PATH =
|
||||||
|
INPUT_FILTER =
|
||||||
|
FILTER_SOURCE_FILES = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to source browsing
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SOURCE_BROWSER = YES
|
||||||
|
INLINE_SOURCES = NO
|
||||||
|
REFERENCED_BY_RELATION = YES
|
||||||
|
REFERENCES_RELATION = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the alphabetical class index
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ALPHABETICAL_INDEX = NO
|
||||||
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
|
IGNORE_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the HTML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
HTML_OUTPUT = core_subset
|
||||||
|
HTML_HEADER = header_subset.html
|
||||||
|
HTML_FOOTER =
|
||||||
|
HTML_STYLESHEET =
|
||||||
|
HTML_ALIGN_MEMBERS = YES
|
||||||
|
GENERATE_HTMLHELP = NO
|
||||||
|
GENERATE_CHI = NO
|
||||||
|
BINARY_TOC = NO
|
||||||
|
TOC_EXPAND = NO
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 4
|
||||||
|
GENERATE_TREEVIEW = NO
|
||||||
|
TREEVIEW_WIDTH = 250
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the LaTeX output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
LATEX_OUTPUT =
|
||||||
|
COMPACT_LATEX = NO
|
||||||
|
PAPER_TYPE = a4wide
|
||||||
|
EXTRA_PACKAGES =
|
||||||
|
LATEX_HEADER =
|
||||||
|
PDF_HYPERLINKS = NO
|
||||||
|
USE_PDFLATEX = NO
|
||||||
|
LATEX_BATCHMODE = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the RTF output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_RTF = NO
|
||||||
|
RTF_OUTPUT =
|
||||||
|
COMPACT_RTF = NO
|
||||||
|
RTF_HYPERLINKS = NO
|
||||||
|
RTF_STYLESHEET_FILE =
|
||||||
|
RTF_EXTENSIONS_FILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the man page output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_MAN = NO
|
||||||
|
MAN_OUTPUT =
|
||||||
|
MAN_EXTENSION =
|
||||||
|
MAN_LINKS = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the XML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_XML = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options for the AutoGen Definitions output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the preprocessor
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ENABLE_PREPROCESSING = YES
|
||||||
|
MACRO_EXPANSION = NO
|
||||||
|
EXPAND_ONLY_PREDEF = NO
|
||||||
|
SEARCH_INCLUDES = YES
|
||||||
|
INCLUDE_PATH = ../include/
|
||||||
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
PREDEFINED =
|
||||||
|
EXPAND_AS_DEFINED =
|
||||||
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to external references
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
TAGFILES = \
|
||||||
|
math_subset.tag=../math_subset \
|
||||||
|
miniglx.tag=../miniglx
|
||||||
|
GENERATE_TAGFILE = core_subset.tag
|
||||||
|
ALLEXTERNALS = NO
|
||||||
|
PERL_PATH =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the dot tool
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
CLASS_DIAGRAMS = NO
|
||||||
|
HAVE_DOT = NO
|
||||||
|
CLASS_GRAPH = YES
|
||||||
|
COLLABORATION_GRAPH = YES
|
||||||
|
TEMPLATE_RELATIONS = YES
|
||||||
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
|
INCLUDE_GRAPH = YES
|
||||||
|
INCLUDED_BY_GRAPH = YES
|
||||||
|
GRAPHICAL_HIERARCHY = YES
|
||||||
|
DOT_PATH =
|
||||||
|
DOTFILE_DIRS =
|
||||||
|
MAX_DOT_GRAPH_WIDTH = 1024
|
||||||
|
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||||
|
GENERATE_LEGEND = YES
|
||||||
|
DOT_CLEANUP = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to the search engine
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SEARCHENGINE = NO
|
||||||
|
CGI_NAME =
|
||||||
|
CGI_URL =
|
||||||
|
DOC_URL =
|
||||||
|
DOC_ABSPATH =
|
||||||
|
BIN_ABSPATH =
|
||||||
|
EXT_DOC_PATHS =
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<html><head><title>Mesa API docs</title>
|
<html><head><title>Mesa Source Code Documentation</title>
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
||||||
</head>
|
</head>
|
||||||
<body><center>
|
<body><center>
|
||||||
|
<a href="../core/index.html">Mesa Core</a>
|
||||||
<a href="../array_cache/index.html">array_cache</a>
|
<a href="../array_cache/index.html">array_cache</a>
|
||||||
<a href="../core/index.html">core</a>
|
|
||||||
<a href="../math/index.html">math</a>
|
<a href="../math/index.html">math</a>
|
||||||
<a href="../swrast/index.html">swrast</a>
|
<a href="../swrast/index.html">swrast</a>
|
||||||
<a href="../swrast_setup/index.html">swrast_setup</a>
|
<a href="../swrast_setup/index.html">swrast_setup</a>
|
||||||
|
|||||||
9
doxygen/header_subset.html
Normal file
9
doxygen/header_subset.html
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<html><head><title>Mesa Source Code Documentation</title>
|
||||||
|
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
||||||
|
</head>
|
||||||
|
<body><center>
|
||||||
|
<a href="../core_subset/index.html">Mesa Core</a>
|
||||||
|
<a href="../math_subset/index.html">math</a>
|
||||||
|
<a href="../miniglx/index.html">MiniGLX</a>
|
||||||
|
<a href="../radeon_subset/index.html">radeon_subset</a>
|
||||||
|
</center>
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
default:
|
default: subset
|
||||||
|
|
||||||
|
full:
|
||||||
doxygen tnl_dd.doxy
|
doxygen tnl_dd.doxy
|
||||||
doxygen array_cache.doxy
|
doxygen array_cache.doxy
|
||||||
doxygen math.doxy
|
doxygen math.doxy
|
||||||
@@ -13,9 +15,30 @@ default:
|
|||||||
doxygen swrast.doxy
|
doxygen swrast.doxy
|
||||||
doxygen swrast_setup.doxy
|
doxygen swrast_setup.doxy
|
||||||
doxygen tnl.doxy
|
doxygen tnl.doxy
|
||||||
|
doxygen core.doxy
|
||||||
|
|
||||||
|
subset:
|
||||||
|
doxygen core_subset.doxy
|
||||||
|
doxygen math_subset.doxy
|
||||||
|
doxygen miniglx.doxy
|
||||||
|
echo "Building again, to resolve tags"
|
||||||
|
doxygen core_subset.doxy
|
||||||
|
doxygen math_subset.doxy
|
||||||
|
doxygen miniglx.doxy
|
||||||
|
doxygen radeon_subset.doxy
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf array_cache core math swrast swrast_setup tnl_dd tnl
|
rm -rf \
|
||||||
|
array_cache \
|
||||||
|
core \
|
||||||
|
core_subset \
|
||||||
|
math \
|
||||||
|
math_subset \
|
||||||
|
swrast \
|
||||||
|
swrast_setup \
|
||||||
|
tnl_dd \
|
||||||
|
tnl \
|
||||||
|
miniglx \
|
||||||
|
radeon_subset
|
||||||
rm -rf *.tag
|
rm -rf *.tag
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# General configuration options
|
# General configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
PROJECT_NAME = "Mesa math"
|
PROJECT_NAME = "Mesa math module"
|
||||||
PROJECT_NUMBER = 4.1
|
PROJECT_NUMBER =
|
||||||
OUTPUT_DIRECTORY = .
|
OUTPUT_DIRECTORY = .
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
EXTRACT_ALL = YES
|
EXTRACT_ALL = YES
|
||||||
EXTRACT_PRIVATE = NO
|
EXTRACT_PRIVATE = NO
|
||||||
EXTRACT_STATIC = NO
|
EXTRACT_STATIC = YES
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
HIDE_UNDOC_MEMBERS = NO
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
HIDE_UNDOC_CLASSES = NO
|
HIDE_UNDOC_CLASSES = NO
|
||||||
@@ -73,7 +73,7 @@ REFERENCES_RELATION = YES
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to the alphabetical class index
|
# configuration options related to the alphabetical class index
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
ALPHABETICAL_INDEX = YES
|
ALPHABETICAL_INDEX = NO
|
||||||
COLS_IN_ALPHA_INDEX = 5
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
IGNORE_PREFIX =
|
IGNORE_PREFIX =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
|||||||
177
doxygen/math_subset.doxy
Normal file
177
doxygen/math_subset.doxy
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
# Doxyfile 0.1
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# General configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
PROJECT_NAME = "Mesa math module"
|
||||||
|
PROJECT_NUMBER =
|
||||||
|
OUTPUT_DIRECTORY = .
|
||||||
|
OUTPUT_LANGUAGE = English
|
||||||
|
EXTRACT_ALL = NO
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_STATIC = YES
|
||||||
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
|
HIDE_UNDOC_CLASSES = NO
|
||||||
|
BRIEF_MEMBER_DESC = YES
|
||||||
|
REPEAT_BRIEF = YES
|
||||||
|
ALWAYS_DETAILED_SEC = NO
|
||||||
|
INLINE_INHERITED_MEMB = NO
|
||||||
|
FULL_PATH_NAMES = NO
|
||||||
|
STRIP_FROM_PATH =
|
||||||
|
INTERNAL_DOCS = NO
|
||||||
|
STRIP_CODE_COMMENTS = YES
|
||||||
|
CASE_SENSE_NAMES = YES
|
||||||
|
SHORT_NAMES = NO
|
||||||
|
HIDE_SCOPE_NAMES = NO
|
||||||
|
VERBATIM_HEADERS = YES
|
||||||
|
SHOW_INCLUDE_FILES = YES
|
||||||
|
JAVADOC_AUTOBRIEF = NO
|
||||||
|
INHERIT_DOCS = YES
|
||||||
|
INLINE_INFO = YES
|
||||||
|
SORT_MEMBER_DOCS = NO
|
||||||
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
|
TAB_SIZE = 8
|
||||||
|
GENERATE_TODOLIST = YES
|
||||||
|
GENERATE_TESTLIST = YES
|
||||||
|
GENERATE_BUGLIST = YES
|
||||||
|
ALIASES =
|
||||||
|
ENABLED_SECTIONS =
|
||||||
|
MAX_INITIALIZER_LINES = 30
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||||
|
SHOW_USED_FILES = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to warning and progress messages
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
QUIET = YES
|
||||||
|
WARNINGS = YES
|
||||||
|
WARN_IF_UNDOCUMENTED = YES
|
||||||
|
WARN_FORMAT =
|
||||||
|
WARN_LOGFILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the input files
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
INPUT = ../src/math/
|
||||||
|
FILE_PATTERNS = m_matrix.[ch]
|
||||||
|
RECURSIVE = NO
|
||||||
|
EXCLUDE =
|
||||||
|
EXCLUDE_PATTERNS =
|
||||||
|
EXAMPLE_PATH =
|
||||||
|
EXAMPLE_PATTERNS =
|
||||||
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
IMAGE_PATH =
|
||||||
|
INPUT_FILTER =
|
||||||
|
FILTER_SOURCE_FILES = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to source browsing
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SOURCE_BROWSER = NO
|
||||||
|
INLINE_SOURCES = NO
|
||||||
|
REFERENCED_BY_RELATION = YES
|
||||||
|
REFERENCES_RELATION = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the alphabetical class index
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ALPHABETICAL_INDEX = NO
|
||||||
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
|
IGNORE_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the HTML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
HTML_OUTPUT = math_subset
|
||||||
|
HTML_HEADER = header_subset.html
|
||||||
|
HTML_FOOTER =
|
||||||
|
HTML_STYLESHEET =
|
||||||
|
HTML_ALIGN_MEMBERS = YES
|
||||||
|
GENERATE_HTMLHELP = NO
|
||||||
|
GENERATE_CHI = NO
|
||||||
|
BINARY_TOC = NO
|
||||||
|
TOC_EXPAND = NO
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 4
|
||||||
|
GENERATE_TREEVIEW = NO
|
||||||
|
TREEVIEW_WIDTH = 250
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the LaTeX output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
LATEX_OUTPUT =
|
||||||
|
COMPACT_LATEX = NO
|
||||||
|
PAPER_TYPE = a4wide
|
||||||
|
EXTRA_PACKAGES =
|
||||||
|
LATEX_HEADER =
|
||||||
|
PDF_HYPERLINKS = NO
|
||||||
|
USE_PDFLATEX = NO
|
||||||
|
LATEX_BATCHMODE = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the RTF output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_RTF = NO
|
||||||
|
RTF_OUTPUT =
|
||||||
|
COMPACT_RTF = NO
|
||||||
|
RTF_HYPERLINKS = NO
|
||||||
|
RTF_STYLESHEET_FILE =
|
||||||
|
RTF_EXTENSIONS_FILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the man page output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_MAN = NO
|
||||||
|
MAN_OUTPUT =
|
||||||
|
MAN_EXTENSION =
|
||||||
|
MAN_LINKS = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the XML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_XML = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options for the AutoGen Definitions output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the preprocessor
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ENABLE_PREPROCESSING = YES
|
||||||
|
MACRO_EXPANSION = NO
|
||||||
|
EXPAND_ONLY_PREDEF = NO
|
||||||
|
SEARCH_INCLUDES = YES
|
||||||
|
INCLUDE_PATH =
|
||||||
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
PREDEFINED =
|
||||||
|
EXPAND_AS_DEFINED =
|
||||||
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to external references
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
TAGFILES = core_subset.tag=../core_subset
|
||||||
|
GENERATE_TAGFILE = math_subset.tag
|
||||||
|
ALLEXTERNALS = NO
|
||||||
|
PERL_PATH =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the dot tool
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
CLASS_DIAGRAMS = YES
|
||||||
|
HAVE_DOT = NO
|
||||||
|
CLASS_GRAPH = YES
|
||||||
|
COLLABORATION_GRAPH = YES
|
||||||
|
TEMPLATE_RELATIONS = YES
|
||||||
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
|
INCLUDE_GRAPH = YES
|
||||||
|
INCLUDED_BY_GRAPH = YES
|
||||||
|
GRAPHICAL_HIERARCHY = YES
|
||||||
|
DOT_PATH =
|
||||||
|
DOTFILE_DIRS =
|
||||||
|
MAX_DOT_GRAPH_WIDTH = 1024
|
||||||
|
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||||
|
GENERATE_LEGEND = YES
|
||||||
|
DOT_CLEANUP = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to the search engine
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SEARCHENGINE = NO
|
||||||
|
CGI_NAME =
|
||||||
|
CGI_URL =
|
||||||
|
DOC_URL =
|
||||||
|
DOC_ABSPATH =
|
||||||
|
BIN_ABSPATH =
|
||||||
|
EXT_DOC_PATHS =
|
||||||
179
doxygen/miniglx.doxy
Normal file
179
doxygen/miniglx.doxy
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
# Doxyfile 0.1
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# General configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
PROJECT_NAME = "MiniGLX"
|
||||||
|
PROJECT_NUMBER =
|
||||||
|
OUTPUT_DIRECTORY =
|
||||||
|
OUTPUT_LANGUAGE = English
|
||||||
|
EXTRACT_ALL = NO
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_STATIC = YES
|
||||||
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
|
HIDE_UNDOC_CLASSES = NO
|
||||||
|
BRIEF_MEMBER_DESC = YES
|
||||||
|
REPEAT_BRIEF = YES
|
||||||
|
ALWAYS_DETAILED_SEC = NO
|
||||||
|
INLINE_INHERITED_MEMB = NO
|
||||||
|
FULL_PATH_NAMES = NO
|
||||||
|
STRIP_FROM_PATH =
|
||||||
|
INTERNAL_DOCS = YES
|
||||||
|
STRIP_CODE_COMMENTS = YES
|
||||||
|
CASE_SENSE_NAMES = YES
|
||||||
|
SHORT_NAMES = NO
|
||||||
|
HIDE_SCOPE_NAMES = NO
|
||||||
|
VERBATIM_HEADERS = NO
|
||||||
|
SHOW_INCLUDE_FILES = NO
|
||||||
|
JAVADOC_AUTOBRIEF = NO
|
||||||
|
INHERIT_DOCS = YES
|
||||||
|
INLINE_INFO = YES
|
||||||
|
SORT_MEMBER_DOCS = NO
|
||||||
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
|
TAB_SIZE = 8
|
||||||
|
GENERATE_TODOLIST = YES
|
||||||
|
GENERATE_TESTLIST = YES
|
||||||
|
GENERATE_BUGLIST = YES
|
||||||
|
ALIASES =
|
||||||
|
ENABLED_SECTIONS =
|
||||||
|
MAX_INITIALIZER_LINES = 30
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||||
|
SHOW_USED_FILES = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to warning and progress messages
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
QUIET = YES
|
||||||
|
WARNINGS = YES
|
||||||
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
|
WARN_FORMAT =
|
||||||
|
WARN_LOGFILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the input files
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
INPUT = ../src/miniglx/ ../include/GL/miniglx.h
|
||||||
|
FILE_PATTERNS = *.h *.c
|
||||||
|
RECURSIVE = NO
|
||||||
|
EXCLUDE = ../src/miniglx/glapi.c
|
||||||
|
EXCLUDE_PATTERNS =
|
||||||
|
EXAMPLE_PATH =
|
||||||
|
EXAMPLE_PATTERNS =
|
||||||
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
IMAGE_PATH =
|
||||||
|
INPUT_FILTER =
|
||||||
|
FILTER_SOURCE_FILES = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to source browsing
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SOURCE_BROWSER = NO
|
||||||
|
INLINE_SOURCES = NO
|
||||||
|
REFERENCED_BY_RELATION = YES
|
||||||
|
REFERENCES_RELATION = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the alphabetical class index
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ALPHABETICAL_INDEX = NO
|
||||||
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
|
IGNORE_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the HTML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
HTML_OUTPUT = miniglx
|
||||||
|
HTML_HEADER = header_subset.html
|
||||||
|
HTML_FOOTER =
|
||||||
|
HTML_STYLESHEET =
|
||||||
|
HTML_ALIGN_MEMBERS = YES
|
||||||
|
GENERATE_HTMLHELP = NO
|
||||||
|
GENERATE_CHI = NO
|
||||||
|
BINARY_TOC = NO
|
||||||
|
TOC_EXPAND = NO
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 4
|
||||||
|
GENERATE_TREEVIEW = NO
|
||||||
|
TREEVIEW_WIDTH = 250
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the LaTeX output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
LATEX_OUTPUT =
|
||||||
|
COMPACT_LATEX = NO
|
||||||
|
PAPER_TYPE = a4wide
|
||||||
|
EXTRA_PACKAGES =
|
||||||
|
LATEX_HEADER =
|
||||||
|
PDF_HYPERLINKS = NO
|
||||||
|
USE_PDFLATEX = NO
|
||||||
|
LATEX_BATCHMODE = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the RTF output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_RTF = NO
|
||||||
|
RTF_OUTPUT =
|
||||||
|
COMPACT_RTF = NO
|
||||||
|
RTF_HYPERLINKS = NO
|
||||||
|
RTF_STYLESHEET_FILE =
|
||||||
|
RTF_EXTENSIONS_FILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the man page output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_MAN = NO
|
||||||
|
MAN_OUTPUT =
|
||||||
|
MAN_EXTENSION =
|
||||||
|
MAN_LINKS = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the XML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_XML = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options for the AutoGen Definitions output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the preprocessor
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ENABLE_PREPROCESSING = YES
|
||||||
|
MACRO_EXPANSION = NO
|
||||||
|
EXPAND_ONLY_PREDEF = NO
|
||||||
|
SEARCH_INCLUDES = YES
|
||||||
|
INCLUDE_PATH = ../include/
|
||||||
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
PREDEFINED =
|
||||||
|
EXPAND_AS_DEFINED =
|
||||||
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to external references
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
TAGFILES = \
|
||||||
|
core_subset.tag=../core_subset \
|
||||||
|
math_subset.tag=../math_subset
|
||||||
|
GENERATE_TAGFILE = miniglx.tag
|
||||||
|
ALLEXTERNALS = NO
|
||||||
|
PERL_PATH =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the dot tool
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
CLASS_DIAGRAMS = NO
|
||||||
|
HAVE_DOT = NO
|
||||||
|
CLASS_GRAPH = YES
|
||||||
|
COLLABORATION_GRAPH = YES
|
||||||
|
TEMPLATE_RELATIONS = YES
|
||||||
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
|
INCLUDE_GRAPH = YES
|
||||||
|
INCLUDED_BY_GRAPH = YES
|
||||||
|
GRAPHICAL_HIERARCHY = YES
|
||||||
|
DOT_PATH =
|
||||||
|
DOTFILE_DIRS =
|
||||||
|
MAX_DOT_GRAPH_WIDTH = 1024
|
||||||
|
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||||
|
GENERATE_LEGEND = YES
|
||||||
|
DOT_CLEANUP = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to the search engine
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SEARCHENGINE = NO
|
||||||
|
CGI_NAME =
|
||||||
|
CGI_URL =
|
||||||
|
DOC_URL =
|
||||||
|
DOC_ABSPATH =
|
||||||
|
BIN_ABSPATH =
|
||||||
|
EXT_DOC_PATHS =
|
||||||
203
doxygen/radeon_subset.doxy
Normal file
203
doxygen/radeon_subset.doxy
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
# Doxyfile 0.1
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# General configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
PROJECT_NAME = "Radeon Subset Driver"
|
||||||
|
PROJECT_NUMBER =
|
||||||
|
OUTPUT_DIRECTORY =
|
||||||
|
OUTPUT_LANGUAGE = English
|
||||||
|
EXTRACT_ALL = NO
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_STATIC = YES
|
||||||
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
|
HIDE_UNDOC_CLASSES = NO
|
||||||
|
BRIEF_MEMBER_DESC = YES
|
||||||
|
REPEAT_BRIEF = YES
|
||||||
|
ALWAYS_DETAILED_SEC = NO
|
||||||
|
INLINE_INHERITED_MEMB = NO
|
||||||
|
FULL_PATH_NAMES = NO
|
||||||
|
STRIP_FROM_PATH =
|
||||||
|
INTERNAL_DOCS = YES
|
||||||
|
STRIP_CODE_COMMENTS = YES
|
||||||
|
CASE_SENSE_NAMES = YES
|
||||||
|
SHORT_NAMES = NO
|
||||||
|
HIDE_SCOPE_NAMES = NO
|
||||||
|
VERBATIM_HEADERS = NO
|
||||||
|
SHOW_INCLUDE_FILES = NO
|
||||||
|
JAVADOC_AUTOBRIEF = NO
|
||||||
|
INHERIT_DOCS = YES
|
||||||
|
INLINE_INFO = YES
|
||||||
|
SORT_MEMBER_DOCS = NO
|
||||||
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
|
TAB_SIZE = 8
|
||||||
|
GENERATE_TODOLIST = YES
|
||||||
|
GENERATE_TESTLIST = YES
|
||||||
|
GENERATE_BUGLIST = YES
|
||||||
|
ALIASES =
|
||||||
|
ENABLED_SECTIONS =
|
||||||
|
MAX_INITIALIZER_LINES = 30
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||||
|
SHOW_USED_FILES = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to warning and progress messages
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
QUIET = YES
|
||||||
|
WARNINGS = YES
|
||||||
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
|
WARN_FORMAT =
|
||||||
|
WARN_LOGFILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the input files
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
INPUT = \
|
||||||
|
../src/drv/common/mm.c \
|
||||||
|
../src/drv/common/mm.h \
|
||||||
|
../src/drv/radeon/radeon_context.c \
|
||||||
|
../src/drv/radeon/radeon_context.h \
|
||||||
|
../src/drv/radeon/radeon_ioctl.c \
|
||||||
|
../src/drv/radeon/radeon_ioctl.h \
|
||||||
|
../src/drv/radeon/radeon_lock.c \
|
||||||
|
../src/drv/radeon/radeon_lock.h \
|
||||||
|
../src/drv/radeon/radeon_screen.c \
|
||||||
|
../src/drv/radeon/radeon_screen.h \
|
||||||
|
../src/drv/radeon/radeon_state.c \
|
||||||
|
../src/drv/radeon/radeon_state.h \
|
||||||
|
../src/drv/radeon/radeon_state_init.c \
|
||||||
|
../src/drv/radeon/radeon_subset.h \
|
||||||
|
../src/drv/radeon/radeon_subset_bitmap.c \
|
||||||
|
../src/drv/radeon/radeon_subset_readpix.c \
|
||||||
|
../src/drv/radeon/radeon_subset_select.c \
|
||||||
|
../src/drv/radeon/radeon_subset_tex.c \
|
||||||
|
../src/drv/radeon/radeon_subset_vtx.c \
|
||||||
|
../src/drv/radeon/radeon_tcl.h \
|
||||||
|
../src/drv/radeon/radeon_tex.h \
|
||||||
|
../src/drv/radeon/radeon_vtxfmt.h \
|
||||||
|
../src/drv/radeon/server
|
||||||
|
FILE_PATTERNS = *.h *.c
|
||||||
|
RECURSIVE = NO
|
||||||
|
EXCLUDE =
|
||||||
|
EXCLUDE_PATTERNS =
|
||||||
|
EXAMPLE_PATH =
|
||||||
|
EXAMPLE_PATTERNS =
|
||||||
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
IMAGE_PATH =
|
||||||
|
INPUT_FILTER =
|
||||||
|
FILTER_SOURCE_FILES = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to source browsing
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SOURCE_BROWSER = NO
|
||||||
|
INLINE_SOURCES = NO
|
||||||
|
REFERENCED_BY_RELATION = YES
|
||||||
|
REFERENCES_RELATION = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the alphabetical class index
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ALPHABETICAL_INDEX = NO
|
||||||
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
|
IGNORE_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the HTML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
HTML_OUTPUT = radeon_subset
|
||||||
|
HTML_HEADER = header_subset.html
|
||||||
|
HTML_FOOTER =
|
||||||
|
HTML_STYLESHEET =
|
||||||
|
HTML_ALIGN_MEMBERS = YES
|
||||||
|
GENERATE_HTMLHELP = NO
|
||||||
|
GENERATE_CHI = NO
|
||||||
|
BINARY_TOC = NO
|
||||||
|
TOC_EXPAND = NO
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 4
|
||||||
|
GENERATE_TREEVIEW = NO
|
||||||
|
TREEVIEW_WIDTH = 250
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the LaTeX output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
LATEX_OUTPUT =
|
||||||
|
COMPACT_LATEX = NO
|
||||||
|
PAPER_TYPE = a4wide
|
||||||
|
EXTRA_PACKAGES =
|
||||||
|
LATEX_HEADER =
|
||||||
|
PDF_HYPERLINKS = NO
|
||||||
|
USE_PDFLATEX = NO
|
||||||
|
LATEX_BATCHMODE = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the RTF output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_RTF = NO
|
||||||
|
RTF_OUTPUT =
|
||||||
|
COMPACT_RTF = NO
|
||||||
|
RTF_HYPERLINKS = NO
|
||||||
|
RTF_STYLESHEET_FILE =
|
||||||
|
RTF_EXTENSIONS_FILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the man page output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_MAN = NO
|
||||||
|
MAN_OUTPUT =
|
||||||
|
MAN_EXTENSION =
|
||||||
|
MAN_LINKS = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options related to the XML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_XML = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# configuration options for the AutoGen Definitions output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the preprocessor
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ENABLE_PREPROCESSING = YES
|
||||||
|
MACRO_EXPANSION = NO
|
||||||
|
EXPAND_ONLY_PREDEF = NO
|
||||||
|
SEARCH_INCLUDES = YES
|
||||||
|
INCLUDE_PATH = ../include/
|
||||||
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
PREDEFINED =
|
||||||
|
EXPAND_AS_DEFINED =
|
||||||
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to external references
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
TAGFILES = \
|
||||||
|
core_subset.tag=../core_subset \
|
||||||
|
math_subset.tag=../math_subset \
|
||||||
|
miniglx.tag=../miniglx
|
||||||
|
GENERATE_TAGFILE = radeon_subset.tag
|
||||||
|
ALLEXTERNALS = NO
|
||||||
|
PERL_PATH =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the dot tool
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
CLASS_DIAGRAMS = NO
|
||||||
|
HAVE_DOT = NO
|
||||||
|
CLASS_GRAPH = YES
|
||||||
|
COLLABORATION_GRAPH = YES
|
||||||
|
TEMPLATE_RELATIONS = YES
|
||||||
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
|
INCLUDE_GRAPH = YES
|
||||||
|
INCLUDED_BY_GRAPH = YES
|
||||||
|
GRAPHICAL_HIERARCHY = YES
|
||||||
|
DOT_PATH =
|
||||||
|
DOTFILE_DIRS =
|
||||||
|
MAX_DOT_GRAPH_WIDTH = 1024
|
||||||
|
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||||
|
GENERATE_LEGEND = YES
|
||||||
|
DOT_CLEANUP = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration::addtions related to the search engine
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SEARCHENGINE = NO
|
||||||
|
CGI_NAME =
|
||||||
|
CGI_URL =
|
||||||
|
DOC_URL =
|
||||||
|
DOC_ABSPATH =
|
||||||
|
BIN_ABSPATH =
|
||||||
|
EXT_DOC_PATHS =
|
||||||
@@ -3,8 +3,8 @@
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# General configuration options
|
# General configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
PROJECT_NAME = "Mesa swrast"
|
PROJECT_NAME = "Mesa Software Rasterization (swrast)"
|
||||||
PROJECT_NUMBER = 4.1
|
PROJECT_NUMBER =
|
||||||
OUTPUT_DIRECTORY =
|
OUTPUT_DIRECTORY =
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
EXTRACT_ALL = NO
|
EXTRACT_ALL = NO
|
||||||
@@ -19,7 +19,7 @@ ALWAYS_DETAILED_SEC = NO
|
|||||||
INLINE_INHERITED_MEMB = NO
|
INLINE_INHERITED_MEMB = NO
|
||||||
FULL_PATH_NAMES = NO
|
FULL_PATH_NAMES = NO
|
||||||
STRIP_FROM_PATH =
|
STRIP_FROM_PATH =
|
||||||
INTERNAL_DOCS = NO
|
INTERNAL_DOCS = YES
|
||||||
STRIP_CODE_COMMENTS = YES
|
STRIP_CODE_COMMENTS = YES
|
||||||
CASE_SENSE_NAMES = YES
|
CASE_SENSE_NAMES = YES
|
||||||
SHORT_NAMES = NO
|
SHORT_NAMES = NO
|
||||||
@@ -38,22 +38,21 @@ GENERATE_BUGLIST = YES
|
|||||||
ALIASES =
|
ALIASES =
|
||||||
ENABLED_SECTIONS =
|
ENABLED_SECTIONS =
|
||||||
MAX_INITIALIZER_LINES = 30
|
MAX_INITIALIZER_LINES = 30
|
||||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||||
SHOW_USED_FILES = YES
|
SHOW_USED_FILES = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to warning and progress messages
|
# configuration options related to warning and progress messages
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
QUIET = YES
|
QUIET = YES
|
||||||
WARNINGS = YES
|
WARNINGS = YES
|
||||||
WARN_IF_UNDOCUMENTED = YES
|
WARN_IF_UNDOCUMENTED = NO
|
||||||
WARN_FORMAT =
|
WARN_FORMAT =
|
||||||
WARN_LOGFILE =
|
WARN_LOGFILE =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to the input files
|
# configuration options related to the input files
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
INPUT = ../src/swrast/
|
INPUT = ../src/swrast/
|
||||||
FILE_PATTERNS = *.c \
|
FILE_PATTERNS = *.c *.h
|
||||||
*.h
|
|
||||||
RECURSIVE = NO
|
RECURSIVE = NO
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS =
|
||||||
@@ -136,7 +135,7 @@ ENABLE_PREPROCESSING = YES
|
|||||||
MACRO_EXPANSION = NO
|
MACRO_EXPANSION = NO
|
||||||
EXPAND_ONLY_PREDEF = NO
|
EXPAND_ONLY_PREDEF = NO
|
||||||
SEARCH_INCLUDES = YES
|
SEARCH_INCLUDES = YES
|
||||||
INCLUDE_PATH =
|
INCLUDE_PATH = ../include/
|
||||||
INCLUDE_FILE_PATTERNS =
|
INCLUDE_FILE_PATTERNS =
|
||||||
PREDEFINED =
|
PREDEFINED =
|
||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
@@ -156,7 +155,7 @@ PERL_PATH =
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the dot tool
|
# Configuration options related to the dot tool
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
CLASS_DIAGRAMS = YES
|
CLASS_DIAGRAMS = NO
|
||||||
HAVE_DOT = NO
|
HAVE_DOT = NO
|
||||||
CLASS_GRAPH = YES
|
CLASS_GRAPH = YES
|
||||||
COLLABORATION_GRAPH = YES
|
COLLABORATION_GRAPH = YES
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# General configuration options
|
# General configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
PROJECT_NAME = "Mesa swrast_setup"
|
PROJECT_NAME = "Mesa swrast_setup"
|
||||||
PROJECT_NUMBER = 4.1
|
PROJECT_NUMBER =
|
||||||
OUTPUT_DIRECTORY =
|
OUTPUT_DIRECTORY =
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
EXTRACT_ALL = YES
|
EXTRACT_ALL = YES
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# General configuration options
|
# General configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
PROJECT_NAME = "Mesa tnl"
|
PROJECT_NAME = "Mesa Transform and Lighting (tnl)"
|
||||||
PROJECT_NUMBER = 4.1
|
PROJECT_NUMBER =
|
||||||
OUTPUT_DIRECTORY =
|
OUTPUT_DIRECTORY =
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
EXTRACT_ALL = YES
|
EXTRACT_ALL = YES
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# General configuration options
|
# General configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
PROJECT_NAME = "Mesa tnl_dd"
|
PROJECT_NAME = "Mesa tnl_dd"
|
||||||
PROJECT_NUMBER = 4.1
|
PROJECT_NUMBER =
|
||||||
OUTPUT_DIRECTORY =
|
OUTPUT_DIRECTORY =
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
EXTRACT_ALL = YES
|
EXTRACT_ALL = YES
|
||||||
@@ -52,7 +52,7 @@ WARN_LOGFILE =
|
|||||||
# configuration options related to the input files
|
# configuration options related to the input files
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
INPUT = ../src/tnl_dd/
|
INPUT = ../src/tnl_dd/
|
||||||
FILE_PATTERNS = *.h
|
FILE_PATTERNS = *.c *.h
|
||||||
RECURSIVE = YES
|
RECURSIVE = YES
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS =
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
/* $Id: gl.h,v 1.72 2002/10/17 19:39:31 kschultz Exp $ */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 4.1
|
* Version: 5.0.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -2646,6 +2645,13 @@ GLAPI void GLAPIENTRY glTracePointerRangeMESA( const GLvoid* first, const GLvoid
|
|||||||
#endif /* GL_APPLE_ycbcr_422 */
|
#endif /* GL_APPLE_ycbcr_422 */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GL_ATI_texture_env_combine3
|
||||||
|
#define GL_ATI_texture_env_combine3 1
|
||||||
|
#define GL_MODULATE_ADD_ATI 0x8744
|
||||||
|
#define GL_MODULATE_SIGNED_ADD_ATI 0x8745
|
||||||
|
#define GL_MODULATE_SUBTRACT_ATI 0x8746
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Begin system-specific stuff
|
* Begin system-specific stuff
|
||||||
|
|||||||
@@ -2423,6 +2423,11 @@ extern "C" {
|
|||||||
#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
|
#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef GL_ATI_texture_env_combine3
|
||||||
|
#define GL_MODULATE_ADD_ATI 0x8744
|
||||||
|
#define GL_MODULATE_SIGNED_ADD_ATI 0x8745
|
||||||
|
#define GL_MODULATE_SUBTRACT_ATI 0x8746
|
||||||
|
#endif
|
||||||
|
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
|
|
||||||
@@ -5016,6 +5021,9 @@ GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum);
|
|||||||
typedef void (APIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);
|
typedef void (APIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef GL_ATI_texture_env_combine3
|
||||||
|
#define GL_ATI_texture_env_combine3 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: glx.h,v 1.38 2002/10/14 13:52:27 brianp Exp $ */
|
/* $Id: glx.h,v 1.38.4.1 2003/02/23 19:37:15 keithw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -295,7 +295,7 @@ extern void glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
|
|||||||
|
|
||||||
|
|
||||||
/* GLX 1.4 and later */
|
/* GLX 1.4 and later */
|
||||||
extern void (*glXGetProcAddress(const GLubyte *procname))();
|
extern void (*glXGetProcAddress(const GLubyte *procname))( void );
|
||||||
|
|
||||||
|
|
||||||
#ifndef GLX_GLXEXT_LEGACY
|
#ifndef GLX_GLXEXT_LEGACY
|
||||||
|
|||||||
@@ -58,12 +58,12 @@ typedef struct __GLinterfaceRec __GLinterface;
|
|||||||
** and used by the "operating system".
|
** and used by the "operating system".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/**
|
||||||
** Mode and limit information for a context. This information is
|
* Mode and limit information for a context. This information is
|
||||||
** kept around in the context so that values can be used during
|
* kept around in the context so that values can be used during
|
||||||
** command execution, and for returning information about the
|
* command execution, and for returning information about the
|
||||||
** context to the application.
|
* context to the application.
|
||||||
*/
|
*/
|
||||||
typedef struct __GLcontextModesRec {
|
typedef struct __GLcontextModesRec {
|
||||||
GLboolean rgbMode;
|
GLboolean rgbMode;
|
||||||
GLboolean colorIndexMode;
|
GLboolean colorIndexMode;
|
||||||
|
|||||||
25
progs/demos/Makefile
Normal file
25
progs/demos/Makefile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
PROGS = gears \
|
||||||
|
glinfo \
|
||||||
|
texobj \
|
||||||
|
bounce \
|
||||||
|
terrain
|
||||||
|
|
||||||
|
|
||||||
|
##### RULES #####
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c
|
||||||
|
|
||||||
|
|
||||||
|
# make executable from .c file:
|
||||||
|
.c: $(LIB_DEP)
|
||||||
|
gcc -I../include -I../util -g $< -L../lib -lglut -lGL -lGLU -lm -o $@
|
||||||
|
|
||||||
|
|
||||||
|
default: $(PROGS)
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -f *.o *~ $(PROGS)
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: bounce.c,v 1.3 2000/08/16 20:36:34 brianp Exp $ */
|
/* $Id: bounce.c,v 1.3.8.2 2003/03/22 08:40:35 keithw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bouncing ball demo.
|
* Bouncing ball demo.
|
||||||
@@ -33,8 +33,8 @@ GLfloat Xmin = -4.0, Xmax = 4.0;
|
|||||||
GLfloat Ymin = -3.8, Ymax = 4.0;
|
GLfloat Ymin = -3.8, Ymax = 4.0;
|
||||||
GLfloat G = -0.1;
|
GLfloat G = -0.1;
|
||||||
|
|
||||||
static GLuint
|
static void
|
||||||
make_ball(void)
|
draw_ball(void)
|
||||||
{
|
{
|
||||||
GLuint list;
|
GLuint list;
|
||||||
GLfloat a, b;
|
GLfloat a, b;
|
||||||
@@ -43,9 +43,9 @@ make_ball(void)
|
|||||||
GLuint color;
|
GLuint color;
|
||||||
GLfloat x, y, z;
|
GLfloat x, y, z;
|
||||||
|
|
||||||
list = glGenLists(1);
|
/* list = glGenLists(1); */
|
||||||
|
|
||||||
glNewList(list, GL_COMPILE);
|
/* glNewList(list, GL_COMPILE); */
|
||||||
|
|
||||||
color = 0;
|
color = 0;
|
||||||
for (a = -90.0; a + da <= 90.0; a += da) {
|
for (a = -90.0; a + da <= 90.0; a += da) {
|
||||||
@@ -54,10 +54,10 @@ make_ball(void)
|
|||||||
for (b = 0.0; b <= 360.0; b += db) {
|
for (b = 0.0; b <= 360.0; b += db) {
|
||||||
|
|
||||||
if (color) {
|
if (color) {
|
||||||
glIndexi(RED);
|
/* glIndexi(RED); */
|
||||||
glColor3f(1, 0, 0);
|
glColor3f(1, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
glIndexi(WHITE);
|
/* glIndexi(WHITE); */
|
||||||
glColor3f(1, 1, 1);
|
glColor3f(1, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,11 +77,12 @@ make_ball(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glEndList();
|
/* glEndList(); */
|
||||||
|
|
||||||
return list;
|
/* return list; */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reshape(int width, int height)
|
reshape(int width, int height)
|
||||||
{
|
{
|
||||||
@@ -110,19 +111,19 @@ draw(void)
|
|||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
glIndexi(CYAN);
|
/* glIndexi(CYAN); */
|
||||||
glColor3f(0, 1, 1);
|
glColor3f(0, 1, 1);
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
for (i = -5; i <= 5; i++) {
|
for (i = -5; i <= 5; i++) {
|
||||||
glVertex2i(i, -5);
|
glVertex2f(i, -5);
|
||||||
glVertex2i(i, 5);
|
glVertex2f(i, 5);
|
||||||
}
|
}
|
||||||
for (i = -5; i <= 5; i++) {
|
for (i = -5; i <= 5; i++) {
|
||||||
glVertex2i(-5, i);
|
glVertex2f(-5, i);
|
||||||
glVertex2i(5, i);
|
glVertex2f(5, i);
|
||||||
}
|
}
|
||||||
for (i = -5; i <= 5; i++) {
|
for (i = -5; i <= 5; i++) {
|
||||||
glVertex2i(i, -5);
|
glVertex2f(i, -5);
|
||||||
glVertex2f(i * 1.15, -5.9);
|
glVertex2f(i * 1.15, -5.9);
|
||||||
}
|
}
|
||||||
glVertex2f(-5.3, -5.35);
|
glVertex2f(-5.3, -5.35);
|
||||||
@@ -138,7 +139,8 @@ draw(void)
|
|||||||
glRotatef(90.0, 1.0, 0.0, 0.0);
|
glRotatef(90.0, 1.0, 0.0, 0.0);
|
||||||
glRotatef(Zrot, 0.0, 0.0, 1.0);
|
glRotatef(Zrot, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
glCallList(Ball);
|
/* glCallList(Ball); */
|
||||||
|
draw_ball();
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
@@ -198,7 +200,7 @@ int main(int argc, char *argv[])
|
|||||||
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
|
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
|
||||||
|
|
||||||
glutCreateWindow("Bounce");
|
glutCreateWindow("Bounce");
|
||||||
Ball = make_ball();
|
/* Ball = make_ball(); */
|
||||||
glCullFace(GL_BACK);
|
glCullFace(GL_BACK);
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glDisable(GL_DITHER);
|
glDisable(GL_DITHER);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: gears.c,v 1.6 2000/04/06 02:22:59 brianp Exp $ */
|
/* $Id: gears.c,v 1.6.12.1 2003/02/23 19:25:07 keithw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 3-D gear wheels. This program is in the public domain.
|
* 3-D gear wheels. This program is in the public domain.
|
||||||
@@ -59,7 +59,7 @@ gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
|||||||
|
|
||||||
glShadeModel(GL_FLAT);
|
glShadeModel(GL_FLAT);
|
||||||
|
|
||||||
glNormal3f(0.0, 0.0, 1.0);
|
/* glNormal3f(0.0, 0.0, 1.0); */
|
||||||
|
|
||||||
/* draw front face */
|
/* draw front face */
|
||||||
glBegin(GL_QUAD_STRIP);
|
glBegin(GL_QUAD_STRIP);
|
||||||
@@ -87,7 +87,7 @@ gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
|||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glNormal3f(0.0, 0.0, -1.0);
|
/* glNormal3f(0.0, 0.0, -1.0); */
|
||||||
|
|
||||||
/* draw back face */
|
/* draw back face */
|
||||||
glBegin(GL_QUAD_STRIP);
|
glBegin(GL_QUAD_STRIP);
|
||||||
@@ -127,18 +127,18 @@ gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
|||||||
len = sqrt(u * u + v * v);
|
len = sqrt(u * u + v * v);
|
||||||
u /= len;
|
u /= len;
|
||||||
v /= len;
|
v /= len;
|
||||||
glNormal3f(v, -u, 0.0);
|
/* glNormal3f(v, -u, 0.0); */
|
||||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
|
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
|
||||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
|
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
|
||||||
glNormal3f(cos(angle), sin(angle), 0.0);
|
/* glNormal3f(cos(angle), sin(angle), 0.0); */
|
||||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
|
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
|
||||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
|
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
|
||||||
u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
|
u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
|
||||||
v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
|
v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
|
||||||
glNormal3f(v, -u, 0.0);
|
/* glNormal3f(v, -u, 0.0); */
|
||||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
||||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
||||||
glNormal3f(cos(angle), sin(angle), 0.0);
|
/* glNormal3f(cos(angle), sin(angle), 0.0); */
|
||||||
}
|
}
|
||||||
|
|
||||||
glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
|
glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
|
||||||
@@ -149,10 +149,11 @@ gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
|||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
/* draw inside radius cylinder */
|
/* draw inside radius cylinder */
|
||||||
|
glColor3f( .5, .5, .5 );
|
||||||
glBegin(GL_QUAD_STRIP);
|
glBegin(GL_QUAD_STRIP);
|
||||||
for (i = 0; i <= teeth; i++) {
|
for (i = 0; i <= teeth; i++) {
|
||||||
angle = i * 2.0 * M_PI / teeth;
|
angle = i * 2.0 * M_PI / teeth;
|
||||||
glNormal3f(-cos(angle), -sin(angle), 0.0);
|
/* glNormal3f(-cos(angle), -sin(angle), 0.0); */
|
||||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
||||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
||||||
}
|
}
|
||||||
@@ -167,6 +168,11 @@ static GLfloat angle = 0.0;
|
|||||||
static void
|
static void
|
||||||
draw(void)
|
draw(void)
|
||||||
{
|
{
|
||||||
|
static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0};
|
||||||
|
static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0};
|
||||||
|
static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
|
||||||
|
|
||||||
|
glClearColor( 1,0,1,1 );
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
@@ -177,19 +183,23 @@ draw(void)
|
|||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(-3.0, -2.0, 0.0);
|
glTranslatef(-3.0, -2.0, 0.0);
|
||||||
glRotatef(angle, 0.0, 0.0, 1.0);
|
glRotatef(angle, 0.0, 0.0, 1.0);
|
||||||
glCallList(gear1);
|
glColor3fv( red);
|
||||||
|
gear(1.0, 4.0, 1.0, 20, 0.7);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(3.1, -2.0, 0.0);
|
glTranslatef(3.1, -2.0, 0.0);
|
||||||
glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
|
glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
|
||||||
glCallList(gear2);
|
glColor3fv( green);
|
||||||
|
gear(0.5, 2.0, 2.0, 10, 0.7);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(-3.1, 4.2, 0.0);
|
glTranslatef(-3.1, 4.2, 0.0);
|
||||||
glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
|
glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
|
||||||
glCallList(gear3);
|
glColor3fv( blue);
|
||||||
|
gear(1.3, 2.0, 0.5, 10, 0.7);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
@@ -284,37 +294,15 @@ static void
|
|||||||
init(int argc, char *argv[])
|
init(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
|
static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
|
||||||
static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0};
|
|
||||||
static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0};
|
|
||||||
static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
|
|
||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
glLightfv(GL_LIGHT0, GL_POSITION, pos);
|
/* glLightfv(GL_LIGHT0, GL_POSITION, pos); */
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glEnable(GL_LIGHTING);
|
/* glEnable(GL_LIGHTING); */
|
||||||
glEnable(GL_LIGHT0);
|
/* glEnable(GL_LIGHT0); */
|
||||||
glEnable(GL_DEPTH_TEST);
|
/* glEnable(GL_DEPTH_TEST); */
|
||||||
|
|
||||||
/* make the gears */
|
/* glEnable(GL_NORMALIZE); */
|
||||||
gear1 = glGenLists(1);
|
|
||||||
glNewList(gear1, GL_COMPILE);
|
|
||||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
|
|
||||||
gear(1.0, 4.0, 1.0, 20, 0.7);
|
|
||||||
glEndList();
|
|
||||||
|
|
||||||
gear2 = glGenLists(1);
|
|
||||||
glNewList(gear2, GL_COMPILE);
|
|
||||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
|
|
||||||
gear(0.5, 2.0, 2.0, 10, 0.7);
|
|
||||||
glEndList();
|
|
||||||
|
|
||||||
gear3 = glGenLists(1);
|
|
||||||
glNewList(gear3, GL_COMPILE);
|
|
||||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
|
|
||||||
gear(1.3, 2.0, 0.5, 10, 0.7);
|
|
||||||
glEndList();
|
|
||||||
|
|
||||||
glEnable(GL_NORMALIZE);
|
|
||||||
|
|
||||||
for ( i=1; i<argc; i++ ) {
|
for ( i=1; i<argc; i++ ) {
|
||||||
if (strcmp(argv[i], "-info")==0) {
|
if (strcmp(argv[i], "-info")==0) {
|
||||||
@@ -345,7 +333,7 @@ int main(int argc, char *argv[])
|
|||||||
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
||||||
|
|
||||||
glutInitWindowPosition(0, 0);
|
glutInitWindowPosition(0, 0);
|
||||||
glutInitWindowSize(300, 300);
|
glutInitWindowSize(900, 900);
|
||||||
glutCreateWindow("Gears");
|
glutCreateWindow("Gears");
|
||||||
init(argc, argv);
|
init(argc, argv);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: isosurf.c,v 1.15 2002/10/18 17:47:35 kschultz Exp $ */
|
/* $Id: isosurf.c,v 1.15.4.2 2003/03/22 08:40:35 keithw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display an isosurface of 3-D wind speed volume.
|
* Display an isosurface of 3-D wind speed volume.
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
#define GL_GLEXT_LEGACY
|
#define GL_GLEXT_LEGACY
|
||||||
#include "GL/glut.h"
|
#include "GL/glut.h"
|
||||||
|
|
||||||
#include "readtex.c" /* I know, this is a hack. KW: me too. */
|
#include "readtex.c"
|
||||||
#define TEXTURE_FILE "../images/reflect.rgb"
|
#define TEXTURE_FILE "../images/reflect.rgb"
|
||||||
|
|
||||||
#define LIT 0x00000001
|
#define LIT 0x00000001
|
||||||
@@ -484,7 +484,7 @@ static void draw_surface( unsigned int with_state )
|
|||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col[j]);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col[j]);
|
||||||
glBegin( GL_TRIANGLES );
|
glBegin( GL_TRIANGLES );
|
||||||
for (k = 0 ; k < nr ; k++) {
|
for (k = 0 ; k < nr ; k++) {
|
||||||
glNormal3fv( &compressed_data[tri_indices[i+k]][3] );
|
glColor3fv( &compressed_data[tri_indices[i+k]][3] );
|
||||||
glVertex3fv( &compressed_data[tri_indices[i+k]][0] );
|
glVertex3fv( &compressed_data[tri_indices[i+k]][0] );
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
@@ -492,7 +492,7 @@ static void draw_surface( unsigned int with_state )
|
|||||||
} else {
|
} else {
|
||||||
glBegin( GL_TRIANGLES );
|
glBegin( GL_TRIANGLES );
|
||||||
for (i = 0 ; i < num_tri_verts ; i++) {
|
for (i = 0 ; i < num_tri_verts ; i++) {
|
||||||
glNormal3fv( &compressed_data[tri_indices[i]][3] );
|
glColor3fv( &compressed_data[tri_indices[i]][3] );
|
||||||
glVertex3fv( &compressed_data[tri_indices[i]][0] );
|
glVertex3fv( &compressed_data[tri_indices[i]][0] );
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
@@ -506,7 +506,7 @@ static void draw_surface( unsigned int with_state )
|
|||||||
*/
|
*/
|
||||||
glBegin( GL_POINTS );
|
glBegin( GL_POINTS );
|
||||||
for ( i = 0 ; i < numuniq ; i++ ) {
|
for ( i = 0 ; i < numuniq ; i++ ) {
|
||||||
glNormal3fv( &compressed_data[i][3] );
|
glColor3fv( &compressed_data[i][3] );
|
||||||
glVertex3fv( &compressed_data[i][0] );
|
glVertex3fv( &compressed_data[i][0] );
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
@@ -515,7 +515,7 @@ static void draw_surface( unsigned int with_state )
|
|||||||
case (GLVERTEX|STRIPS):
|
case (GLVERTEX|STRIPS):
|
||||||
glBegin( GL_TRIANGLE_STRIP );
|
glBegin( GL_TRIANGLE_STRIP );
|
||||||
for (i=0;i<numverts;i++) {
|
for (i=0;i<numverts;i++) {
|
||||||
glNormal3fv( &data[i][3] );
|
glColor3fv( &data[i][0] );
|
||||||
glVertex3fv( &data[i][0] );
|
glVertex3fv( &data[i][0] );
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
@@ -595,24 +595,24 @@ static void InitMaterials(void)
|
|||||||
static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
|
static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
|
||||||
static float lmodel_twoside[] = {GL_FALSE};
|
static float lmodel_twoside[] = {GL_FALSE};
|
||||||
|
|
||||||
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
|
/* glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); */
|
||||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
|
/* glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); */
|
||||||
glLightfv(GL_LIGHT0, GL_POSITION, position0);
|
/* glLightfv(GL_LIGHT0, GL_POSITION, position0); */
|
||||||
glEnable(GL_LIGHT0);
|
/* glEnable(GL_LIGHT0); */
|
||||||
|
|
||||||
glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
|
/* glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); */
|
||||||
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
|
/* glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); */
|
||||||
glLightfv(GL_LIGHT1, GL_POSITION, position1);
|
/* glLightfv(GL_LIGHT1, GL_POSITION, position1); */
|
||||||
glEnable(GL_LIGHT1);
|
/* glEnable(GL_LIGHT1); */
|
||||||
|
|
||||||
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
|
/* glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); */
|
||||||
glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
|
/* glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); */
|
||||||
|
|
||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_mat_shininess);
|
/* glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_mat_shininess); */
|
||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_specular);
|
/* glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_specular); */
|
||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse);
|
/* glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse); */
|
||||||
|
|
||||||
glPolygonStipple (halftone);
|
/* glPolygonStipple (halftone); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -736,65 +736,6 @@ static void ModeMenu(int m)
|
|||||||
print_flags("primitive", state & PRIMITIVE_MASK);
|
print_flags("primitive", state & PRIMITIVE_MASK);
|
||||||
print_flags("render style", state & RENDER_STYLE_MASK);
|
print_flags("render style", state & RENDER_STYLE_MASK);
|
||||||
|
|
||||||
if ((state & PRIMITIVE_MASK) != STRIPS &&
|
|
||||||
((state & RENDER_STYLE_MASK) == DRAW_ELTS ||
|
|
||||||
(state & RENDER_STYLE_MASK) == ARRAY_ELT ||
|
|
||||||
(state & PRIMITIVE_MASK) == POINTS))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "enabling small arrays\n");
|
|
||||||
/* Rendering any primitive with draw-element/array-element
|
|
||||||
* --> Can't do strips here as ordering has been lost in
|
|
||||||
* compaction process...
|
|
||||||
*/
|
|
||||||
glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numuniq,
|
|
||||||
compressed_data );
|
|
||||||
glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numuniq,
|
|
||||||
&compressed_data[0][3]);
|
|
||||||
#ifdef GL_EXT_compiled_vertex_array
|
|
||||||
if (allowed & LOCKED) {
|
|
||||||
if (state & LOCKED) {
|
|
||||||
glLockArraysEXT( 0, numuniq );
|
|
||||||
} else {
|
|
||||||
glUnlockArraysEXT();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else if ((state & PRIMITIVE_MASK) == TRIANGLES &&
|
|
||||||
(state & RENDER_STYLE_MASK) == DRAW_ARRAYS) {
|
|
||||||
fprintf(stderr, "enabling big arrays\n");
|
|
||||||
/* Only get here for TRIANGLES and drawarrays
|
|
||||||
*/
|
|
||||||
glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), (numverts-2) * 3,
|
|
||||||
expanded_data );
|
|
||||||
glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), (numverts-2) * 3,
|
|
||||||
&expanded_data[0][3]);
|
|
||||||
|
|
||||||
#ifdef GL_EXT_compiled_vertex_array
|
|
||||||
if (allowed & LOCKED) {
|
|
||||||
if (state & LOCKED) {
|
|
||||||
glLockArraysEXT( 0, (numverts-2)*3 );
|
|
||||||
} else {
|
|
||||||
glUnlockArraysEXT();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stderr, "enabling normal arrays\n");
|
|
||||||
glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numverts, data );
|
|
||||||
glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numverts, &data[0][3]);
|
|
||||||
#ifdef GL_EXT_compiled_vertex_array
|
|
||||||
if (allowed & LOCKED) {
|
|
||||||
if (state & LOCKED) {
|
|
||||||
glLockArraysEXT( 0, numverts );
|
|
||||||
} else {
|
|
||||||
glUnlockArraysEXT();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -827,9 +768,9 @@ static void Init(int argc, char *argv[])
|
|||||||
plane[3] = 0.0;
|
plane[3] = 0.0;
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 1.0, 0.0);
|
glClearColor(0.0, 0.0, 1.0, 0.0);
|
||||||
glEnable( GL_DEPTH_TEST );
|
/* glEnable( GL_DEPTH_TEST ); */
|
||||||
glEnable( GL_VERTEX_ARRAY_EXT );
|
/* glEnable( GL_VERTEX_ARRAY_EXT ); */
|
||||||
glEnable( GL_NORMAL_ARRAY_EXT );
|
/* glEnable( GL_NORMAL_ARRAY_EXT ); */
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
@@ -837,24 +778,24 @@ static void Init(int argc, char *argv[])
|
|||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glClipPlane(GL_CLIP_PLANE0, plane);
|
/* glClipPlane(GL_CLIP_PLANE0, plane); */
|
||||||
|
|
||||||
InitMaterials();
|
InitMaterials();
|
||||||
|
|
||||||
set_matrix();
|
set_matrix();
|
||||||
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
|
/* glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); */
|
||||||
|
|
||||||
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
|
/* glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); */
|
||||||
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
|
/* glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); */
|
||||||
|
|
||||||
|
|
||||||
/* Green fog is easy to see */
|
/* Green fog is easy to see */
|
||||||
glFogi(GL_FOG_MODE,GL_EXP2);
|
/* glFogi(GL_FOG_MODE,GL_EXP2); */
|
||||||
glFogfv(GL_FOG_COLOR,fogColor);
|
/* glFogfv(GL_FOG_COLOR,fogColor); */
|
||||||
glFogf(GL_FOG_DENSITY,0.15);
|
/* glFogf(GL_FOG_DENSITY,0.15); */
|
||||||
glHint(GL_FOG_HINT,GL_DONT_CARE);
|
/* glHint(GL_FOG_HINT,GL_DONT_CARE); */
|
||||||
|
|
||||||
{
|
{
|
||||||
static int firsttime = 1;
|
static int firsttime = 1;
|
||||||
@@ -864,15 +805,15 @@ static void Init(int argc, char *argv[])
|
|||||||
expand_arrays();
|
expand_arrays();
|
||||||
make_tri_indices();
|
make_tri_indices();
|
||||||
|
|
||||||
if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
|
/* if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) { */
|
||||||
printf("Error: couldn't load texture image\n");
|
/* printf("Error: couldn't load texture image\n"); */
|
||||||
exit(1);
|
/* exit(1); */
|
||||||
}
|
/* } */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ModeMenu(SHADE_SMOOTH|
|
ModeMenu(SHADE_SMOOTH|
|
||||||
LIT|
|
UNLIT|
|
||||||
POINT_FILTER|
|
POINT_FILTER|
|
||||||
NO_USER_CLIP|
|
NO_USER_CLIP|
|
||||||
NO_MATERIALS|
|
NO_MATERIALS|
|
||||||
@@ -1121,6 +1062,9 @@ int main(int argc, char **argv)
|
|||||||
glutSpecialFunc(SpecialKey);
|
glutSpecialFunc(SpecialKey);
|
||||||
glutDisplayFunc(Display);
|
glutDisplayFunc(Display);
|
||||||
|
|
||||||
|
/* Benchmark(5,0); */
|
||||||
|
/* Benchmark(5,0); */
|
||||||
|
/* Benchmark(5,0); */
|
||||||
glutMainLoop();
|
glutMainLoop();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ static GLfloat terraincolor[256 * 256][3];
|
|||||||
|
|
||||||
static int win = 0;
|
static int win = 0;
|
||||||
|
|
||||||
static int fog = 1;
|
static int fog = 0;
|
||||||
static int bfcull = 1;
|
static int bfcull = 1;
|
||||||
static int usetex = 1;
|
static int usetex = 1;
|
||||||
static int poutline = 0;
|
static int poutline = 0;
|
||||||
@@ -105,6 +105,21 @@ calcposobs(void)
|
|||||||
obs[1] = 0.0;
|
obs[1] = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
perspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
|
||||||
|
{
|
||||||
|
GLdouble xmin, xmax, ymin, ymax;
|
||||||
|
|
||||||
|
ymax = zNear * tan(fovy * M_PI / 360.0);
|
||||||
|
ymin = -ymax;
|
||||||
|
xmin = ymin * aspect;
|
||||||
|
xmax = ymax * aspect;
|
||||||
|
|
||||||
|
/* don't call glFrustum() because of error semantics (covglu) */
|
||||||
|
glFrustum(xmin, xmax, ymin, ymax, zNear, zFar);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reshape(int width, int height)
|
reshape(int width, int height)
|
||||||
{
|
{
|
||||||
@@ -113,7 +128,7 @@ reshape(int width, int height)
|
|||||||
glViewport(0, 0, (GLint) width, (GLint) height);
|
glViewport(0, 0, (GLint) width, (GLint) height);
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluPerspective(50.0, ((GLfloat) width / (GLfloat) height),
|
perspective(50.0, ((GLfloat) width / (GLfloat) height),
|
||||||
lenghtXmnt * stepYmnt * 0.01, lenghtXmnt * stepYmnt * 0.7);
|
lenghtXmnt * stepYmnt * 0.01, lenghtXmnt * stepYmnt * 0.7);
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
@@ -209,13 +224,25 @@ printstring(void *font, char *string)
|
|||||||
glutBitmapCharacter(font, string[i]);
|
glutBitmapCharacter(font, string[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
printhelp(void)
|
printhelp(void)
|
||||||
{
|
{
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glColor4f(0.0, 0.0, 0.0, 0.5);
|
glColor4f(0.0, 0.0, 0.0, 0.5);
|
||||||
glRecti(40, 40, 600, 440);
|
_subset_Rectf(40, 40, 600, 440);
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
glColor3f(1.0, 0.0, 0.0);
|
glColor3f(1.0, 0.0, 0.0);
|
||||||
@@ -351,6 +378,87 @@ dojoy(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez,
|
||||||
|
GLfloat centerx, GLfloat centery, GLfloat centerz,
|
||||||
|
GLfloat upx, GLfloat upy, GLfloat upz)
|
||||||
|
{
|
||||||
|
GLfloat m[16];
|
||||||
|
GLfloat x[3], y[3], z[3];
|
||||||
|
GLfloat mag;
|
||||||
|
|
||||||
|
/* Make rotation matrix */
|
||||||
|
|
||||||
|
/* Z vector */
|
||||||
|
z[0] = eyex - centerx;
|
||||||
|
z[1] = eyey - centery;
|
||||||
|
z[2] = eyez - centerz;
|
||||||
|
mag = sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
|
||||||
|
if (mag) { /* mpichler, 19950515 */
|
||||||
|
z[0] /= mag;
|
||||||
|
z[1] /= mag;
|
||||||
|
z[2] /= mag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Y vector */
|
||||||
|
y[0] = upx;
|
||||||
|
y[1] = upy;
|
||||||
|
y[2] = upz;
|
||||||
|
|
||||||
|
/* X vector = Y cross Z */
|
||||||
|
x[0] = y[1] * z[2] - y[2] * z[1];
|
||||||
|
x[1] = -y[0] * z[2] + y[2] * z[0];
|
||||||
|
x[2] = y[0] * z[1] - y[1] * z[0];
|
||||||
|
|
||||||
|
/* Recompute Y = Z cross X */
|
||||||
|
y[0] = z[1] * x[2] - z[2] * x[1];
|
||||||
|
y[1] = -z[0] * x[2] + z[2] * x[0];
|
||||||
|
y[2] = z[0] * x[1] - z[1] * x[0];
|
||||||
|
|
||||||
|
/* mpichler, 19950515 */
|
||||||
|
/* cross product gives area of parallelogram, which is < 1.0 for
|
||||||
|
* non-perpendicular unit-length vectors; so normalize x, y here
|
||||||
|
*/
|
||||||
|
|
||||||
|
mag = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
|
||||||
|
if (mag) {
|
||||||
|
x[0] /= mag;
|
||||||
|
x[1] /= mag;
|
||||||
|
x[2] /= mag;
|
||||||
|
}
|
||||||
|
|
||||||
|
mag = sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
|
||||||
|
if (mag) {
|
||||||
|
y[0] /= mag;
|
||||||
|
y[1] /= mag;
|
||||||
|
y[2] /= mag;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define M(row,col) m[col*4+row]
|
||||||
|
M(0, 0) = x[0];
|
||||||
|
M(0, 1) = x[1];
|
||||||
|
M(0, 2) = x[2];
|
||||||
|
M(0, 3) = 0.0;
|
||||||
|
M(1, 0) = y[0];
|
||||||
|
M(1, 1) = y[1];
|
||||||
|
M(1, 2) = y[2];
|
||||||
|
M(1, 3) = 0.0;
|
||||||
|
M(2, 0) = z[0];
|
||||||
|
M(2, 1) = z[1];
|
||||||
|
M(2, 2) = z[2];
|
||||||
|
M(2, 3) = 0.0;
|
||||||
|
M(3, 0) = 0.0;
|
||||||
|
M(3, 1) = 0.0;
|
||||||
|
M(3, 2) = 0.0;
|
||||||
|
M(3, 3) = 1.0;
|
||||||
|
#undef M
|
||||||
|
glMultMatrixf(m);
|
||||||
|
|
||||||
|
/* Translate Eye to Origin */
|
||||||
|
glTranslatef(-eyex, -eyey, -eyez);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drawscene(void)
|
drawscene(void)
|
||||||
{
|
{
|
||||||
@@ -359,24 +467,24 @@ drawscene(void)
|
|||||||
dojoy();
|
dojoy();
|
||||||
|
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
glEnable(GL_DEPTH_TEST);
|
/* glEnable(GL_DEPTH_TEST); */
|
||||||
|
|
||||||
if (usetex)
|
if (usetex)
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
else
|
else
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
if (fog)
|
/* if (fog) */
|
||||||
glEnable(GL_FOG);
|
/* glEnable(GL_FOG); */
|
||||||
else
|
/* else */
|
||||||
glDisable(GL_FOG);
|
/* glDisable(GL_FOG); */
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
||||||
calcposobs();
|
calcposobs();
|
||||||
gluLookAt(obs[0], obs[1], obs[2],
|
lookAt(obs[0], obs[1], obs[2],
|
||||||
obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
|
obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
|
||||||
0.0, 1.0, 0.0);
|
0.0, 1.0, 0.0);
|
||||||
|
|
||||||
@@ -384,8 +492,8 @@ drawscene(void)
|
|||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
glDisable(GL_DEPTH_TEST);
|
/* glDisable(GL_DEPTH_TEST); */
|
||||||
glDisable(GL_FOG);
|
/* glDisable(GL_FOG); */
|
||||||
glShadeModel(GL_FLAT);
|
glShadeModel(GL_FLAT);
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
@@ -549,7 +657,7 @@ calccolor(GLfloat height, GLfloat c[3])
|
|||||||
static void
|
static void
|
||||||
loadpic(void)
|
loadpic(void)
|
||||||
{
|
{
|
||||||
GLubyte bufferter[256 * 256], terrainpic[256 * 256];
|
GLubyte bufferter[256 * 256], terrainpic[256 * 256][4];
|
||||||
FILE *FilePic;
|
FILE *FilePic;
|
||||||
int i, tmp;
|
int i, tmp;
|
||||||
GLenum gluerr;
|
GLenum gluerr;
|
||||||
@@ -565,25 +673,23 @@ loadpic(void)
|
|||||||
terrain[i] = (bufferter[i] * (heightMnt / 255.0f));
|
terrain[i] = (bufferter[i] * (heightMnt / 255.0f));
|
||||||
calccolor((GLfloat) bufferter[i], terraincolor[i]);
|
calccolor((GLfloat) bufferter[i], terraincolor[i]);
|
||||||
tmp = (((int) bufferter[i]) + 96);
|
tmp = (((int) bufferter[i]) + 96);
|
||||||
terrainpic[i] = (tmp > 255) ? 255 : tmp;
|
terrainpic[i][0] = (tmp > 255) ? 255 : tmp;
|
||||||
|
terrainpic[i][1] = (tmp > 255) ? 255 : tmp;
|
||||||
|
terrainpic[i][2] = (tmp > 255) ? 255 : tmp;
|
||||||
|
terrainpic[i][0] = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, 256, 256, GL_LUMINANCE,
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_RGBA, 256, 256, GL_RGBA,
|
||||||
GL_UNSIGNED_BYTE,
|
GL_UNSIGNED_BYTE, (GLvoid *) terrainpic);
|
||||||
(GLvoid *) (&terrainpic[0])))) {
|
|
||||||
fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
GL_LINEAR_MIPMAP_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -593,21 +699,21 @@ init(void)
|
|||||||
float fogcolor[4] = { 0.6, 0.7, 0.7, 1.0 };
|
float fogcolor[4] = { 0.6, 0.7, 0.7, 1.0 };
|
||||||
|
|
||||||
glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
|
glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
|
||||||
glClearDepth(1.0);
|
/* glClearDepth(1.0); */
|
||||||
glDepthFunc(GL_LEQUAL);
|
/* glDepthFunc(GL_LEQUAL); */
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
glEnable(GL_DEPTH_TEST);
|
/* glEnable(GL_DEPTH_TEST); */
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
glEnable(GL_FOG);
|
/* glEnable(GL_FOG); */
|
||||||
glFogi(GL_FOG_MODE, GL_EXP2);
|
/* glFogi(GL_FOG_MODE, GL_EXP2); */
|
||||||
glFogfv(GL_FOG_COLOR, fogcolor);
|
/* glFogfv(GL_FOG_COLOR, fogcolor); */
|
||||||
glFogf(GL_FOG_DENSITY, 0.0007);
|
/* glFogf(GL_FOG_DENSITY, 0.0007); */
|
||||||
#ifdef FX
|
#ifdef FX
|
||||||
glHint(GL_FOG_HINT, GL_NICEST);
|
/* glHint(GL_FOG_HINT, GL_NICEST); */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
reshape(scrwidth, scrheight);
|
reshape(scrwidth, scrheight);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: texobj.c,v 1.6 2002/01/04 21:05:57 brianp Exp $ */
|
/* $Id: texobj.c,v 1.6.6.2 2003/03/22 08:40:35 keithw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Example of using the 1.1 texture object functions.
|
* Example of using the 1.1 texture object functions.
|
||||||
@@ -17,7 +17,7 @@ static GLuint Window = 0;
|
|||||||
|
|
||||||
static GLuint TexObj[2];
|
static GLuint TexObj[2];
|
||||||
static GLfloat Angle = 0.0f;
|
static GLfloat Angle = 0.0f;
|
||||||
static GLboolean UseObj = GL_FALSE;
|
static GLboolean UseObj = GL_TRUE;
|
||||||
|
|
||||||
|
|
||||||
#if defined(GL_VERSION_1_1) || defined(GL_VERSION_1_2)
|
#if defined(GL_VERSION_1_1) || defined(GL_VERSION_1_2)
|
||||||
@@ -34,7 +34,7 @@ static GLboolean UseObj = GL_FALSE;
|
|||||||
|
|
||||||
static void draw( void )
|
static void draw( void )
|
||||||
{
|
{
|
||||||
glDepthFunc(GL_EQUAL);
|
/* glDepthFunc(GL_EQUAL); */
|
||||||
/* glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );*/
|
/* glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );*/
|
||||||
glClear( GL_COLOR_BUFFER_BIT );
|
glClear( GL_COLOR_BUFFER_BIT );
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ static void draw( void )
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
glCallList( TexObj[0] );
|
/* glCallList( TexObj[0] ); */
|
||||||
}
|
}
|
||||||
glBegin( GL_POLYGON );
|
glBegin( GL_POLYGON );
|
||||||
glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
|
glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
|
||||||
@@ -70,7 +70,7 @@ static void draw( void )
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
glCallList( TexObj[1] );
|
/* glCallList( TexObj[1] ); */
|
||||||
}
|
}
|
||||||
glBegin( GL_POLYGON );
|
glBegin( GL_POLYGON );
|
||||||
glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
|
glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
|
||||||
@@ -147,7 +147,7 @@ static void init( void )
|
|||||||
0, 0, 2, 2, 2, 2, 0, 0,
|
0, 0, 2, 2, 2, 2, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
GLubyte tex[64][3];
|
GLubyte tex[64][4];
|
||||||
GLint i, j;
|
GLint i, j;
|
||||||
|
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ static void init( void )
|
|||||||
/* Setup texturing */
|
/* Setup texturing */
|
||||||
glEnable( GL_TEXTURE_2D );
|
glEnable( GL_TEXTURE_2D );
|
||||||
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
|
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
|
||||||
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
|
/* glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST ); */
|
||||||
|
|
||||||
|
|
||||||
/* generate texture object IDs */
|
/* generate texture object IDs */
|
||||||
@@ -166,19 +166,19 @@ static void init( void )
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TexObj[0] = glGenLists(2);
|
/* TexObj[0] = glGenLists(2); */
|
||||||
TexObj[1] = TexObj[0]+1;
|
/* TexObj[1] = TexObj[0]+1; */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup first texture object */
|
/* setup first texture object */
|
||||||
if (UseObj) {
|
if (UseObj) {
|
||||||
#ifdef TEXTURE_OBJECT
|
#ifdef TEXTURE_OBJECT
|
||||||
glBindTexture( GL_TEXTURE_2D, TexObj[0] );
|
glBindTexture( GL_TEXTURE_2D, TexObj[0] );
|
||||||
assert(glIsTexture(TexObj[0]));
|
/* assert(glIsTexture(TexObj[0])); */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
glNewList( TexObj[0], GL_COMPILE );
|
/* glNewList( TexObj[0], GL_COMPILE ); */
|
||||||
}
|
}
|
||||||
/* red on white */
|
/* red on white */
|
||||||
for (i=0;i<height;i++) {
|
for (i=0;i<height;i++) {
|
||||||
@@ -190,17 +190,18 @@ static void init( void )
|
|||||||
else {
|
else {
|
||||||
tex[p][0] = 255; tex[p][1] = 255; tex[p][2] = 255;
|
tex[p][0] = 255; tex[p][1] = 255; tex[p][2] = 255;
|
||||||
}
|
}
|
||||||
|
tex[p][3] = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
|
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
|
||||||
GL_RGB, GL_UNSIGNED_BYTE, tex );
|
GL_RGBA, GL_UNSIGNED_BYTE, tex );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
||||||
if (!UseObj) {
|
if (!UseObj) {
|
||||||
glEndList();
|
/* glEndList(); */
|
||||||
}
|
}
|
||||||
/* end of texture object */
|
/* end of texture object */
|
||||||
|
|
||||||
@@ -208,12 +209,12 @@ static void init( void )
|
|||||||
if (UseObj) {
|
if (UseObj) {
|
||||||
#ifdef TEXTURE_OBJECT
|
#ifdef TEXTURE_OBJECT
|
||||||
glBindTexture( GL_TEXTURE_2D, TexObj[1] );
|
glBindTexture( GL_TEXTURE_2D, TexObj[1] );
|
||||||
assert(glIsTexture(TexObj[1]));
|
/* assert(glIsTexture(TexObj[1])); */
|
||||||
#endif
|
#endif
|
||||||
assert(!glIsTexture(TexObj[1] + 999));
|
/* assert(!glIsTexture(TexObj[1] + 999)); */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
glNewList( TexObj[1], GL_COMPILE );
|
/* glNewList( TexObj[1], GL_COMPILE ); */
|
||||||
}
|
}
|
||||||
/* green on blue */
|
/* green on blue */
|
||||||
for (i=0;i<height;i++) {
|
for (i=0;i<height;i++) {
|
||||||
@@ -227,14 +228,14 @@ static void init( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
|
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
|
||||||
GL_RGB, GL_UNSIGNED_BYTE, tex );
|
GL_RGBA, GL_UNSIGNED_BYTE, tex );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
||||||
if (!UseObj) {
|
if (!UseObj) {
|
||||||
glEndList();
|
/* glEndList(); */
|
||||||
}
|
}
|
||||||
/* end texture object */
|
/* end texture object */
|
||||||
|
|
||||||
|
|||||||
@@ -498,7 +498,7 @@ main(int ac, char **av)
|
|||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|
||||||
glEnable(GL_FOG);
|
/* glEnable(GL_FOG); */
|
||||||
glFogi(GL_FOG_MODE, GL_EXP2);
|
glFogi(GL_FOG_MODE, GL_EXP2);
|
||||||
glFogfv(GL_FOG_COLOR, fogcolor);
|
glFogfv(GL_FOG_COLOR, fogcolor);
|
||||||
|
|
||||||
|
|||||||
30
progs/samples/Makefile
Normal file
30
progs/samples/Makefile
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
PROGS = prim \
|
||||||
|
star \
|
||||||
|
line \
|
||||||
|
point \
|
||||||
|
depth \
|
||||||
|
tri \
|
||||||
|
bitmap1 \
|
||||||
|
bitmap2
|
||||||
|
|
||||||
|
|
||||||
|
##### RULES #####
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c
|
||||||
|
|
||||||
|
|
||||||
|
# make executable from .c file:
|
||||||
|
.c: $(LIB_DEP)
|
||||||
|
gcc -I../include -g $< -L../lib -lglut -lGL -lGLU -lm -o $@
|
||||||
|
|
||||||
|
|
||||||
|
default: $(PROGS)
|
||||||
|
|
||||||
|
|
||||||
|
clean: clean_here
|
||||||
|
|
||||||
|
clean_here:
|
||||||
|
rm -f *.o *~ $(PROGS)
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ static void Init(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClearIndex(0.0);
|
/* glClearIndex(0.0); */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Reshape(int width, int height)
|
static void Reshape(int width, int height)
|
||||||
@@ -140,14 +140,14 @@ static void Draw(void)
|
|||||||
mapIA[0] = 1.0;
|
mapIA[0] = 1.0;
|
||||||
mapIA[1] = 1.0;
|
mapIA[1] = 1.0;
|
||||||
|
|
||||||
glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, mapIR);
|
/* glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, mapIR); */
|
||||||
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, mapI);
|
/* glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, mapI); */
|
||||||
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, mapI);
|
/* glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, mapI); */
|
||||||
glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, mapIA);
|
/* glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, mapIA); */
|
||||||
glPixelTransferi(GL_MAP_COLOR, GL_TRUE);
|
/* glPixelTransferi(GL_MAP_COLOR, GL_TRUE); */
|
||||||
|
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glRasterPos3fv(boxA);
|
glRasterPos2fv(boxA);
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 24);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 24);
|
||||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 8);
|
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 8);
|
||||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 2);
|
glPixelStorei(GL_UNPACK_SKIP_ROWS, 2);
|
||||||
@@ -162,28 +162,28 @@ static void Draw(void)
|
|||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glRasterPos3fv(boxB);
|
glRasterPos2fv(boxB);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
OpenGL_bits1);
|
OpenGL_bits1);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
OpenGL_bits2);
|
OpenGL_bits2);
|
||||||
|
|
||||||
SetColor(COLOR_YELLOW);
|
SetColor(COLOR_YELLOW);
|
||||||
glRasterPos3fv(boxC);
|
glRasterPos2fv(boxC);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
OpenGL_bits1);
|
OpenGL_bits1);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
OpenGL_bits2);
|
OpenGL_bits2);
|
||||||
|
|
||||||
SetColor(COLOR_CYAN);
|
SetColor(COLOR_CYAN);
|
||||||
glRasterPos3fv(boxD);
|
glRasterPos2fv(boxD);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
OpenGL_bits1);
|
OpenGL_bits1);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
OpenGL_bits2);
|
OpenGL_bits2);
|
||||||
|
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glRasterPos3fv(boxE);
|
glRasterPos2fv(boxE);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
OpenGL_bits1);
|
OpenGL_bits1);
|
||||||
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
|
||||||
|
|||||||
@@ -620,19 +620,19 @@ static void Init(void)
|
|||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClearIndex(0.0);
|
/* glClearIndex(0.0); */
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
|
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
for (i = 0; i < 7; i++) {
|
for (i = 0; i < 7; i++) {
|
||||||
exp_lists[i] = glGenLists(1);
|
/* exp_lists[i] = glGenLists(1); */
|
||||||
glNewList(exp_lists[i], GL_COMPILE);
|
/* glNewList(exp_lists[i], GL_COMPILE); */
|
||||||
glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
|
/* glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]); */
|
||||||
glEndList();
|
/* glEndList(); */
|
||||||
}
|
}
|
||||||
|
|
||||||
abuse = GL_FALSE;
|
abuse = GL_FALSE;
|
||||||
useLists = GL_TRUE;
|
useLists = GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Reshape(int width, int height)
|
static void Reshape(int width, int height)
|
||||||
@@ -696,10 +696,10 @@ static void Draw(void)
|
|||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
glRasterPos3i((j*3)%5, (j*3)%8, 0);
|
glRasterPos2i((j*3)%5, (j*3)%8);
|
||||||
|
|
||||||
if (useLists) {
|
if (useLists) {
|
||||||
glCallList(exp_lists[i]);
|
/* glCallList(exp_lists[i]); */
|
||||||
} else {
|
} else {
|
||||||
glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
|
glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
|
||||||
}
|
}
|
||||||
@@ -714,9 +714,9 @@ static void Draw(void)
|
|||||||
|
|
||||||
for (j = 0; j < 40; j++) {
|
for (j = 0; j < 40; j++) {
|
||||||
SetColor(COLOR_BLACK);
|
SetColor(COLOR_BLACK);
|
||||||
glRasterPos3i((j*3)%5, (j*3)%8, 0);
|
glRasterPos2i((j*3)%5, (j*3)%8);
|
||||||
if (useLists) {
|
if (useLists) {
|
||||||
glCallList(exp_lists[i]);
|
/* glCallList(exp_lists[i]); */
|
||||||
} else {
|
} else {
|
||||||
glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
|
glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ static void Init(void)
|
|||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClearIndex(0.0);
|
/* glClearIndex(0.0); */
|
||||||
|
|
||||||
if (!rgb) {
|
if (!rgb) {
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
@@ -71,7 +71,7 @@ static void Init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glPolygonStipple(stippleBits);
|
/* glPolygonStipple(stippleBits); */
|
||||||
|
|
||||||
antiAlias = GL_FALSE;
|
antiAlias = GL_FALSE;
|
||||||
stipple = GL_FALSE;
|
stipple = GL_FALSE;
|
||||||
@@ -135,11 +135,11 @@ static void Draw(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
glBegin(GL_TRIANGLES);
|
glBegin(GL_TRIANGLES);
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexi(ci1);
|
glColor3fv(RGBMap[COLOR_BLUE]);
|
||||||
glVertex3f( 0.9, -0.9, -30.0);
|
glVertex3f( 0.9, -0.9, -30.0);
|
||||||
glVertex3f( 0.9, 0.9, -30.0);
|
glVertex3f( 0.9, 0.9, -30.0);
|
||||||
glVertex3f(-0.9, 0.0, -30.0);
|
glVertex3f(-0.9, 0.0, -30.0);
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexi(ci2);
|
glColor3fv(RGBMap[COLOR_GREEN]);
|
||||||
glVertex3f(-0.9, -0.9, -40.0);
|
glVertex3f(-0.9, -0.9, -40.0);
|
||||||
glVertex3f(-0.9, 0.9, -40.0);
|
glVertex3f(-0.9, 0.9, -40.0);
|
||||||
glVertex3f( 0.9, 0.0, -25.0);
|
glVertex3f( 0.9, 0.0, -25.0);
|
||||||
|
|||||||
@@ -141,13 +141,13 @@ static void Draw(void)
|
|||||||
for (i = 0; i < 360; i += 5) {
|
for (i = 0; i < 360; i += 5) {
|
||||||
glRotatef(5.0, 0,0,1);
|
glRotatef(5.0, 0,0,1);
|
||||||
|
|
||||||
(rgb) ? glColor3f(1.0, 1.0, 0.0) : glIndexi(ci);
|
glColor3f(1.0, 1.0, 0.0);
|
||||||
glBegin(GL_LINE_STRIP);
|
glBegin(GL_LINE_STRIP);
|
||||||
glVertex3fv(pntA);
|
glVertex3fv(pntA);
|
||||||
glVertex3fv(pntB);
|
glVertex3fv(pntB);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glPointSize(1);
|
/* glPointSize(1); */
|
||||||
|
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glBegin(GL_POINTS);
|
glBegin(GL_POINTS);
|
||||||
@@ -199,7 +199,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
|
glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
|
||||||
|
|
||||||
windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
|
windType = GLUT_RGB;
|
||||||
windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
|
windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
|
||||||
glutInitDisplayMode(windType);
|
glutInitDisplayMode(windType);
|
||||||
|
|
||||||
|
|||||||
@@ -151,11 +151,11 @@ static void Draw(void)
|
|||||||
glDisable(GL_POINT_SMOOTH);
|
glDisable(GL_POINT_SMOOTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
glPointSize(size);
|
/* glPointSize(size); */
|
||||||
if (mode) {
|
if (mode) {
|
||||||
(rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_ANTI_ALIAS_RED);
|
glColor3f(1.0, 0.0, 0.0);
|
||||||
} else {
|
} else {
|
||||||
(rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_RED);
|
glColor3f(1.0, 0.0, 0.0);
|
||||||
}
|
}
|
||||||
glBegin(GL_POINTS);
|
glBegin(GL_POINTS);
|
||||||
glVertex3fv(point);
|
glVertex3fv(point);
|
||||||
@@ -164,7 +164,7 @@ static void Draw(void)
|
|||||||
glDisable(GL_POINT_SMOOTH);
|
glDisable(GL_POINT_SMOOTH);
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
glPointSize(1);
|
/* glPointSize(1); */
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glBegin(GL_POINTS);
|
glBegin(GL_POINTS);
|
||||||
glVertex3fv(point);
|
glVertex3fv(point);
|
||||||
|
|||||||
@@ -52,27 +52,27 @@ static void Reshape(int width, int height)
|
|||||||
windH = (GLint)height;
|
windH = (GLint)height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RotateColorMask(void)
|
static void RotateRestoreColorMask( int rotate )
|
||||||
{
|
{
|
||||||
static GLint rotation = 0;
|
static GLint rotation = 0;
|
||||||
|
|
||||||
rotation = (rotation + 1) & 0x3;
|
if (rotate) rotation = (rotation + 1) & 0x3;
|
||||||
switch (rotation) {
|
switch (rotation) {
|
||||||
case 0:
|
case 0:
|
||||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
glIndexMask( 0xff );
|
/* glIndexMask( 0xff ); */
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
|
glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
glIndexMask(0xFE);
|
/* glIndexMask(0xFE); */
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
|
glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
|
||||||
glIndexMask(0xFD);
|
/* glIndexMask(0xFD); */
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
|
glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
|
||||||
glIndexMask(0xFB);
|
/* glIndexMask(0xFB); */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,7 +90,7 @@ static void Key(unsigned char key, int x, int y)
|
|||||||
mode2 = !mode2;
|
mode2 = !mode2;
|
||||||
break;
|
break;
|
||||||
case '3':
|
case '3':
|
||||||
RotateColorMask();
|
RotateRestoreColorMask( 1 );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
@@ -126,18 +126,18 @@ static void Point(void)
|
|||||||
|
|
||||||
glBegin(GL_POINTS);
|
glBegin(GL_POINTS);
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
for (i = 1; i < 8; i++) {
|
for (i = 1; i < 8; i++) {
|
||||||
GLint j = i * 2;
|
GLint j = i * 2;
|
||||||
SetColor(COLOR_BLACK+i);
|
SetColor(COLOR_BLACK+i);
|
||||||
glVertex2i(-j, -j);
|
glVertex2f(-j, -j);
|
||||||
glVertex2i(-j, 0);
|
glVertex2f(-j, 0);
|
||||||
glVertex2i(-j, j);
|
glVertex2f(-j, j);
|
||||||
glVertex2i(0, j);
|
glVertex2f(0, j);
|
||||||
glVertex2i(j, j);
|
glVertex2f(j, j);
|
||||||
glVertex2i(j, 0);
|
glVertex2f(j, 0);
|
||||||
glVertex2i(j, -j);
|
glVertex2f(j, -j);
|
||||||
glVertex2i(0, -j);
|
glVertex2f(0, -j);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
@@ -152,8 +152,8 @@ static void Lines(void)
|
|||||||
for (i = 1; i < 8; i++) {
|
for (i = 1; i < 8; i++) {
|
||||||
SetColor(COLOR_BLACK+i);
|
SetColor(COLOR_BLACK+i);
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
glVertex2i(-boxW/4, -boxH/4);
|
glVertex2f(-boxW/4, -boxH/4);
|
||||||
glVertex2i(boxW/4, boxH/4);
|
glVertex2f(boxW/4, boxH/4);
|
||||||
glEnd();
|
glEnd();
|
||||||
glTranslatef(4, 0, 0);
|
glTranslatef(4, 0, 0);
|
||||||
}
|
}
|
||||||
@@ -161,7 +161,7 @@ static void Lines(void)
|
|||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ static void LineStrip(void)
|
|||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_LINE_STRIP);
|
glBegin(GL_LINE_STRIP);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,11 +218,11 @@ static void LineLoop(void)
|
|||||||
|
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glBegin(GL_POINTS);
|
glBegin(GL_POINTS);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,16 +231,16 @@ static void Bitmap(void)
|
|||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glVertex2i(-boxW/2, 0);
|
glVertex2f(-boxW/2, 0);
|
||||||
glVertex2i(boxW/2, 0);
|
glVertex2f(boxW/2, 0);
|
||||||
glVertex2i(0, -boxH/2);
|
glVertex2f(0, -boxH/2);
|
||||||
glVertex2i(0, boxH/2);
|
glVertex2f(0, boxH/2);
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glVertex2i(0, -3);
|
glVertex2f(0, -3);
|
||||||
glVertex2i(0, -3+OPENGL_HEIGHT);
|
glVertex2f(0, -3+OPENGL_HEIGHT);
|
||||||
SetColor(COLOR_BLUE);
|
SetColor(COLOR_BLUE);
|
||||||
glVertex2i(0, -3);
|
glVertex2f(0, -3);
|
||||||
glVertex2i(OPENGL_WIDTH, -3);
|
glVertex2f(OPENGL_WIDTH, -3);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
@@ -257,23 +257,23 @@ static void Triangles(void)
|
|||||||
|
|
||||||
glBegin(GL_TRIANGLES);
|
glBegin(GL_TRIANGLES);
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glVertex2i(-boxW/4, -boxH/4);
|
glVertex2f(-boxW/4, -boxH/4);
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glVertex2i(-boxW/8, -boxH/16);
|
glVertex2f(-boxW/8, -boxH/16);
|
||||||
SetColor(COLOR_BLUE);
|
SetColor(COLOR_BLUE);
|
||||||
glVertex2i(boxW/8, -boxH/16);
|
glVertex2f(boxW/8, -boxH/16);
|
||||||
|
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glVertex2i(-boxW/4, boxH/4);
|
glVertex2f(-boxW/4, boxH/4);
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glVertex2i(-boxW/8, boxH/16);
|
glVertex2f(-boxW/8, boxH/16);
|
||||||
SetColor(COLOR_BLUE);
|
SetColor(COLOR_BLUE);
|
||||||
glVertex2i(boxW/8, boxH/16);
|
glVertex2f(boxW/8, boxH/16);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_TRIANGLES);
|
glBegin(GL_TRIANGLES);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glVertex2i(-100, 100);
|
glVertex2f(-100, 100);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,28 +282,28 @@ static void TriangleStrip(void)
|
|||||||
|
|
||||||
glBegin(GL_TRIANGLE_STRIP);
|
glBegin(GL_TRIANGLE_STRIP);
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glVertex2i(-boxW/4, -boxH/4);
|
glVertex2f(-boxW/4, -boxH/4);
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glVertex2i(-boxW/4, boxH/4);
|
glVertex2f(-boxW/4, boxH/4);
|
||||||
SetColor(COLOR_BLUE);
|
SetColor(COLOR_BLUE);
|
||||||
glVertex2i(0, -boxH/4);
|
glVertex2f(0, -boxH/4);
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glVertex2i(0, boxH/4);
|
glVertex2f(0, boxH/4);
|
||||||
SetColor(COLOR_CYAN);
|
SetColor(COLOR_CYAN);
|
||||||
glVertex2i(boxW/4, -boxH/4);
|
glVertex2f(boxW/4, -boxH/4);
|
||||||
SetColor(COLOR_YELLOW);
|
SetColor(COLOR_YELLOW);
|
||||||
glVertex2i(boxW/4, boxH/4);
|
glVertex2f(boxW/4, boxH/4);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_TRIANGLE_STRIP);
|
glBegin(GL_TRIANGLE_STRIP);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glVertex2i(-100, 100);
|
glVertex2f(-100, 100);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TriangleFan(void)
|
static void TriangleFan(void)
|
||||||
{
|
{
|
||||||
GLint vx[8][2];
|
GLfloat vx[8][2];
|
||||||
GLint x0, y0, x1, y1, x2, y2, x3, y3;
|
GLint x0, y0, x1, y1, x2, y2, x3, y3;
|
||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
@@ -327,16 +327,16 @@ static void TriangleFan(void)
|
|||||||
|
|
||||||
glBegin(GL_TRIANGLE_FAN);
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
SetColor(COLOR_WHITE-i);
|
SetColor(COLOR_WHITE-i);
|
||||||
glVertex2iv(vx[i]);
|
glVertex2fv(vx[i]);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_TRIANGLE_FAN);
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glVertex2i(-100, 100);
|
glVertex2f(-100, 100);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,12 +344,12 @@ static void Rect(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
|
/* glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4); */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PolygonFunc(void)
|
static void PolygonFunc(void)
|
||||||
{
|
{
|
||||||
GLint vx[8][2];
|
GLfloat vx[8][2];
|
||||||
GLint x0, y0, x1, y1, x2, y2, x3, y3;
|
GLint x0, y0, x1, y1, x2, y2, x3, y3;
|
||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
@@ -374,13 +374,13 @@ static void PolygonFunc(void)
|
|||||||
glBegin(GL_POLYGON);
|
glBegin(GL_POLYGON);
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
SetColor(COLOR_WHITE-i);
|
SetColor(COLOR_WHITE-i);
|
||||||
glVertex2iv(vx[i]);
|
glVertex2fv(vx[i]);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_POLYGON);
|
glBegin(GL_POLYGON);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glVertex2i(100, 100);
|
glVertex2f(100, 100);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,28 +389,28 @@ static void Quads(void)
|
|||||||
|
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glVertex2i(-boxW/4, -boxH/4);
|
glVertex2f(-boxW/4, -boxH/4);
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glVertex2i(-boxW/8, -boxH/16);
|
glVertex2f(-boxW/8, -boxH/16);
|
||||||
SetColor(COLOR_BLUE);
|
SetColor(COLOR_BLUE);
|
||||||
glVertex2i(boxW/8, -boxH/16);
|
glVertex2f(boxW/8, -boxH/16);
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glVertex2i(boxW/4, -boxH/4);
|
glVertex2f(boxW/4, -boxH/4);
|
||||||
|
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glVertex2i(-boxW/4, boxH/4);
|
glVertex2f(-boxW/4, boxH/4);
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glVertex2i(-boxW/8, boxH/16);
|
glVertex2f(-boxW/8, boxH/16);
|
||||||
SetColor(COLOR_BLUE);
|
SetColor(COLOR_BLUE);
|
||||||
glVertex2i(boxW/8, boxH/16);
|
glVertex2f(boxW/8, boxH/16);
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glVertex2i(boxW/4, boxH/4);
|
glVertex2f(boxW/4, boxH/4);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glVertex2i(100, 100);
|
glVertex2f(100, 100);
|
||||||
glVertex2i(-100, 100);
|
glVertex2f(-100, 100);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -419,41 +419,43 @@ static void QuadStrip(void)
|
|||||||
|
|
||||||
glBegin(GL_QUAD_STRIP);
|
glBegin(GL_QUAD_STRIP);
|
||||||
SetColor(COLOR_GREEN);
|
SetColor(COLOR_GREEN);
|
||||||
glVertex2i(-boxW/4, -boxH/4);
|
glVertex2f(-boxW/4, -boxH/4);
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
glVertex2i(-boxW/4, boxH/4);
|
glVertex2f(-boxW/4, boxH/4);
|
||||||
SetColor(COLOR_BLUE);
|
SetColor(COLOR_BLUE);
|
||||||
glVertex2i(0, -boxH/4);
|
glVertex2f(0, -boxH/4);
|
||||||
SetColor(COLOR_WHITE);
|
SetColor(COLOR_WHITE);
|
||||||
glVertex2i(0, boxH/4);
|
glVertex2f(0, boxH/4);
|
||||||
SetColor(COLOR_CYAN);
|
SetColor(COLOR_CYAN);
|
||||||
glVertex2i(boxW/4, -boxH/4);
|
glVertex2f(boxW/4, -boxH/4);
|
||||||
SetColor(COLOR_YELLOW);
|
SetColor(COLOR_YELLOW);
|
||||||
glVertex2i(boxW/4, boxH/4);
|
glVertex2f(boxW/4, boxH/4);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glBegin(GL_QUAD_STRIP);
|
glBegin(GL_QUAD_STRIP);
|
||||||
glVertex2i(0, 0);
|
glVertex2f(0, 0);
|
||||||
glVertex2i(100, 100);
|
glVertex2f(100, 100);
|
||||||
glVertex2i(-100, 100);
|
glVertex2f(-100, 100);
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Draw(void)
|
static void Draw(void)
|
||||||
{
|
{
|
||||||
|
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||||
|
|
||||||
glViewport(0, 0, windW, windH);
|
glViewport(0, 0, windW, windH);
|
||||||
glDisable(GL_SCISSOR_TEST);
|
glDisable(GL_SCISSOR_TEST);
|
||||||
|
|
||||||
glPushAttrib(GL_COLOR_BUFFER_BIT);
|
/* glPushAttrib(GL_COLOR_BUFFER_BIT); */
|
||||||
|
|
||||||
glColorMask(1, 1, 1, 1);
|
glColorMask(1, 1, 1, 1);
|
||||||
glIndexMask(~0);
|
/* glIndexMask(~0); */
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
glPopAttrib();
|
/* glPopAttrib(); */
|
||||||
|
RotateRestoreColorMask( 0 );
|
||||||
|
|
||||||
if (mode1) {
|
if (mode1) {
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
@@ -461,11 +463,11 @@ static void Draw(void)
|
|||||||
glShadeModel(GL_FLAT);
|
glShadeModel(GL_FLAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode2) {
|
/* if (mode2) { */
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
/* glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); */
|
||||||
} else {
|
/* } else { */
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
/* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */
|
||||||
}
|
/* } */
|
||||||
|
|
||||||
Viewport(0, 0); Point();
|
Viewport(0, 0); Point();
|
||||||
Viewport(0, 1); Lines();
|
Viewport(0, 1); Lines();
|
||||||
@@ -478,10 +480,13 @@ static void Draw(void)
|
|||||||
Viewport(1, 2); Triangles();
|
Viewport(1, 2); Triangles();
|
||||||
Viewport(1, 3); TriangleStrip();
|
Viewport(1, 3); TriangleStrip();
|
||||||
|
|
||||||
|
|
||||||
Viewport(2, 0); Rect();
|
Viewport(2, 0); Rect();
|
||||||
Viewport(2, 1); PolygonFunc();
|
Viewport(2, 1); PolygonFunc();
|
||||||
Viewport(2, 2); Quads();
|
Viewport(2, 2); Quads();
|
||||||
Viewport(2, 3); QuadStrip();
|
Viewport(2, 3); QuadStrip();
|
||||||
|
if (0) {
|
||||||
|
}
|
||||||
|
|
||||||
glFlush();
|
glFlush();
|
||||||
|
|
||||||
|
|||||||
@@ -255,7 +255,6 @@ static void Key(unsigned char key, int x, int y)
|
|||||||
|
|
||||||
void Draw(void)
|
void Draw(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
MoveStars();
|
MoveStars();
|
||||||
ShowStars();
|
ShowStars();
|
||||||
if (nitro > 0) {
|
if (nitro > 0) {
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ static void SetColor(int c)
|
|||||||
{
|
{
|
||||||
if (glutGet(GLUT_WINDOW_RGBA))
|
if (glutGet(GLUT_WINDOW_RGBA))
|
||||||
glColor3fv(RGBMap[c]);
|
glColor3fv(RGBMap[c]);
|
||||||
else
|
/* else */
|
||||||
glIndexf(c);
|
/* glIndexf(c); */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InitMap(void)
|
static void InitMap(void)
|
||||||
|
|||||||
@@ -278,12 +278,12 @@ static void Draw(void)
|
|||||||
EndPrim();
|
EndPrim();
|
||||||
|
|
||||||
if (showVerticies) {
|
if (showVerticies) {
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1);
|
glColor3fv(RGBMap[COLOR_RED]);
|
||||||
glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2);
|
/* glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2); */
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2);
|
glColor3fv(RGBMap[COLOR_GREEN]);
|
||||||
glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2);
|
/* glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2); */
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3);
|
glColor3fv(RGBMap[COLOR_BLUE]);
|
||||||
glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2);
|
/* glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2); */
|
||||||
}
|
}
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
@@ -306,7 +306,7 @@ static void Draw(void)
|
|||||||
glScalef(zoom, zoom, zoom);
|
glScalef(zoom, zoom, zoom);
|
||||||
glRotatef(zRotation, 0,0,1);
|
glRotatef(zRotation, 0,0,1);
|
||||||
|
|
||||||
glPointSize(10);
|
/* glPointSize(10); */
|
||||||
glLineWidth(5);
|
glLineWidth(5);
|
||||||
glEnable(GL_POINT_SMOOTH);
|
glEnable(GL_POINT_SMOOTH);
|
||||||
glEnable(GL_LINE_STIPPLE);
|
glEnable(GL_LINE_STIPPLE);
|
||||||
@@ -314,15 +314,15 @@ static void Draw(void)
|
|||||||
|
|
||||||
SetColor(COLOR_RED);
|
SetColor(COLOR_RED);
|
||||||
BeginPrim();
|
BeginPrim();
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1);
|
glColor3fv(RGBMap[COLOR_RED]);
|
||||||
glVertex3fv(p0);
|
glVertex3fv(p0);
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2);
|
glColor3fv(RGBMap[COLOR_GREEN]);
|
||||||
glVertex3fv(p1);
|
glVertex3fv(p1);
|
||||||
(rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3);
|
glColor3fv(RGBMap[COLOR_BLUE]);
|
||||||
glVertex3fv(p2);
|
glVertex3fv(p2);
|
||||||
EndPrim();
|
EndPrim();
|
||||||
|
|
||||||
glPointSize(1);
|
/* glPointSize(1); */
|
||||||
glLineWidth(1);
|
glLineWidth(1);
|
||||||
glDisable(GL_POINT_SMOOTH);
|
glDisable(GL_POINT_SMOOTH);
|
||||||
glDisable(GL_LINE_STIPPLE);
|
glDisable(GL_LINE_STIPPLE);
|
||||||
|
|||||||
@@ -6,26 +6,9 @@
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -g -I../include
|
CFLAGS = -g -I../include
|
||||||
LIBS = -L../lib -lglut -lGLU -lGL -L/usr/X11R6/lib -lX11 -lXext -lm
|
LIBS = -L../lib -lGL -lGLU -lglut -lm
|
||||||
|
|
||||||
PROGS = antialias \
|
PROGS = miniglxtest miniglxsample manytex texline
|
||||||
cva \
|
|
||||||
dinoshade \
|
|
||||||
fogcoord \
|
|
||||||
getprocaddress \
|
|
||||||
manytex \
|
|
||||||
multipal \
|
|
||||||
projtex \
|
|
||||||
seccolor \
|
|
||||||
sharedtex \
|
|
||||||
stencilwrap \
|
|
||||||
texline \
|
|
||||||
texwrap \
|
|
||||||
vptest1 \
|
|
||||||
vptest2 \
|
|
||||||
vptest3 \
|
|
||||||
vptorus \
|
|
||||||
vpwarpmesh
|
|
||||||
|
|
||||||
|
|
||||||
##### RULES #####
|
##### RULES #####
|
||||||
@@ -45,10 +28,3 @@ clean:
|
|||||||
rm -f $(PROGS)
|
rm -f $(PROGS)
|
||||||
rm -f *.o
|
rm -f *.o
|
||||||
|
|
||||||
|
|
||||||
# auto code generation
|
|
||||||
getprocaddress: getprocaddress.c getproclist.h
|
|
||||||
|
|
||||||
getproclist.h: ../bin/APIspec getprocaddress.c getprocaddress.py
|
|
||||||
python getprocaddress.py > getproclist.h
|
|
||||||
|
|
||||||
|
|||||||
478
progs/tests/glfbdevtest.c
Normal file
478
progs/tests/glfbdevtest.c
Normal file
@@ -0,0 +1,478 @@
|
|||||||
|
/* $Id: glfbdevtest.c,v 1.1.4.5 2002/11/27 00:26:59 brianp Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test the GLFBDev interface. Only tested with radeonfb driver!!!!
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <linux/fb.h>
|
||||||
|
#include <linux/kd.h>
|
||||||
|
#include <linux/vt.h>
|
||||||
|
#include <GL/glut.h>
|
||||||
|
#include "GL/glfbdev.h"
|
||||||
|
|
||||||
|
#define DEFAULT_DEPTH 8
|
||||||
|
|
||||||
|
static struct fb_fix_screeninfo FixedInfo;
|
||||||
|
static struct fb_var_screeninfo VarInfo, OrigVarInfo;
|
||||||
|
static int DesiredDepth = 0;
|
||||||
|
static int OriginalVT = -1;
|
||||||
|
static int ConsoleFD = -1;
|
||||||
|
static int FrameBufferFD = -1;
|
||||||
|
static caddr_t FrameBuffer = (caddr_t) -1;
|
||||||
|
static caddr_t MMIOAddress = (caddr_t) -1;
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_fixed_info(const struct fb_fix_screeninfo *fixed, const char *s)
|
||||||
|
{
|
||||||
|
static const char *visuals[] = {
|
||||||
|
"MONO01", "MONO10", "TRUECOLOR", "PSEUDOCOLOR",
|
||||||
|
"DIRECTCOLOR", "STATIC_PSEUDOCOLOR"
|
||||||
|
};
|
||||||
|
|
||||||
|
printf("%s info -----------------------\n", s);
|
||||||
|
printf("id = %16s\n", fixed->id);
|
||||||
|
printf("smem_start = 0x%x\n", fixed->smem_start);
|
||||||
|
printf("smem_len = %d (0x%x)\n", fixed->smem_len, fixed->smem_len);
|
||||||
|
printf("type = 0x%x\n", fixed->type);
|
||||||
|
printf("type_aux = 0x%x\n", fixed->type_aux);
|
||||||
|
printf("visual = 0x%x (%s)\n", fixed->visual, visuals[fixed->visual]);
|
||||||
|
printf("xpanstep = %d\n", fixed->xpanstep);
|
||||||
|
printf("ypanstep = %d\n", fixed->ypanstep);
|
||||||
|
printf("ywrapstep = %d\n", fixed->ywrapstep);
|
||||||
|
printf("line_length = %d\n", fixed->line_length);
|
||||||
|
printf("mmio_start = 0x%x\n", fixed->mmio_start);
|
||||||
|
printf("mmio_len = %d (0x%x)\n", fixed->mmio_len, fixed->mmio_len);
|
||||||
|
printf("accel = 0x%x\n", fixed->accel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_var_info(const struct fb_var_screeninfo *var, const char *s)
|
||||||
|
{
|
||||||
|
printf("%s info -----------------------\n", s);
|
||||||
|
printf("xres = %d\n", var->xres);
|
||||||
|
printf("yres = %d\n", var->yres);
|
||||||
|
printf("xres_virtual = %d\n", var->xres_virtual);
|
||||||
|
printf("yres_virtual = %d\n", var->yres_virtual);
|
||||||
|
printf("xoffset = %d\n", var->xoffset);
|
||||||
|
printf("yoffset = %d\n", var->yoffset);
|
||||||
|
printf("bits_per_pixel = %d\n", var->bits_per_pixel);
|
||||||
|
printf("grayscale = %d\n", var->grayscale);
|
||||||
|
|
||||||
|
printf("red.offset = %d length = %d msb_right = %d\n",
|
||||||
|
var->red.offset, var->red.length, var->red.msb_right);
|
||||||
|
printf("green.offset = %d length = %d msb_right = %d\n",
|
||||||
|
var->green.offset, var->green.length, var->green.msb_right);
|
||||||
|
printf("blue.offset = %d length = %d msb_right = %d\n",
|
||||||
|
var->blue.offset, var->blue.length, var->blue.msb_right);
|
||||||
|
printf("transp.offset = %d length = %d msb_right = %d\n",
|
||||||
|
var->transp.offset, var->transp.length, var->transp.msb_right);
|
||||||
|
|
||||||
|
printf("nonstd = %d\n", var->nonstd);
|
||||||
|
printf("activate = %d\n", var->activate);
|
||||||
|
printf("height = %d mm\n", var->height);
|
||||||
|
printf("width = %d mm\n", var->width);
|
||||||
|
printf("accel_flags = 0x%x\n", var->accel_flags);
|
||||||
|
printf("pixclock = %d\n", var->pixclock);
|
||||||
|
printf("left_margin = %d\n", var->left_margin);
|
||||||
|
printf("right_margin = %d\n", var->right_margin);
|
||||||
|
printf("upper_margin = %d\n", var->upper_margin);
|
||||||
|
printf("lower_margin = %d\n", var->lower_margin);
|
||||||
|
printf("hsync_len = %d\n", var->hsync_len);
|
||||||
|
printf("vsync_len = %d\n", var->vsync_len);
|
||||||
|
printf("sync = %d\n", var->sync);
|
||||||
|
printf("vmode = %d\n", var->vmode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
signal_handler(int signumber)
|
||||||
|
{
|
||||||
|
signal(signumber, SIG_IGN); /* prevent recursion! */
|
||||||
|
fprintf(stderr, "error: got signal %d (exiting)\n", signumber);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
initialize_fbdev( void )
|
||||||
|
{
|
||||||
|
char ttystr[1000];
|
||||||
|
int fd, vtnumber, ttyfd;
|
||||||
|
int sz;
|
||||||
|
|
||||||
|
if (geteuid()) {
|
||||||
|
fprintf(stderr, "error: you need to be root\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* open the framebuffer device */
|
||||||
|
FrameBufferFD = open("/dev/fb0", O_RDWR);
|
||||||
|
if (FrameBufferFD < 0) {
|
||||||
|
fprintf(stderr, "Error opening /dev/fb0: %s\n", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* open /dev/tty0 and get the vt number */
|
||||||
|
if ((fd = open("/dev/tty0", O_WRONLY, 0)) < 0) {
|
||||||
|
fprintf(stderr, "error opening /dev/tty0\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (ioctl(fd, VT_OPENQRY, &vtnumber) < 0 || vtnumber < 0) {
|
||||||
|
fprintf(stderr, "error: couldn't get a free vt\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
/* open the console tty */
|
||||||
|
sprintf(ttystr, "/dev/tty%d", vtnumber); /* /dev/tty1-64 */
|
||||||
|
ConsoleFD = open(ttystr, O_RDWR | O_NDELAY, 0);
|
||||||
|
if (ConsoleFD < 0) {
|
||||||
|
fprintf(stderr, "error couldn't open console fd\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save current vt number */
|
||||||
|
{
|
||||||
|
struct vt_stat vts;
|
||||||
|
if (ioctl(ConsoleFD, VT_GETSTATE, &vts) == 0)
|
||||||
|
OriginalVT = vts.v_active;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disconnect from controlling tty */
|
||||||
|
ttyfd = open("/dev/tty", O_RDWR);
|
||||||
|
if (ttyfd >= 0) {
|
||||||
|
ioctl(ttyfd, TIOCNOTTY, 0);
|
||||||
|
close(ttyfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* some magic to restore the vt when we exit */
|
||||||
|
{
|
||||||
|
struct vt_mode vt;
|
||||||
|
if (ioctl(ConsoleFD, VT_ACTIVATE, vtnumber) != 0)
|
||||||
|
printf("ioctl VT_ACTIVATE: %s\n", strerror(errno));
|
||||||
|
if (ioctl(ConsoleFD, VT_WAITACTIVE, vtnumber) != 0)
|
||||||
|
printf("ioctl VT_WAITACTIVE: %s\n", strerror(errno));
|
||||||
|
|
||||||
|
if (ioctl(ConsoleFD, VT_GETMODE, &vt) < 0) {
|
||||||
|
fprintf(stderr, "error: ioctl VT_GETMODE: %s\n", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
vt.mode = VT_PROCESS;
|
||||||
|
vt.relsig = SIGUSR1;
|
||||||
|
vt.acqsig = SIGUSR1;
|
||||||
|
if (ioctl(ConsoleFD, VT_SETMODE, &vt) < 0) {
|
||||||
|
fprintf(stderr, "error: ioctl(VT_SETMODE) failed: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* go into graphics mode */
|
||||||
|
if (ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0) {
|
||||||
|
fprintf(stderr, "error: ioctl(KDSETMODE, KD_GRAPHICS) failed: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* open the framebuffer device */
|
||||||
|
FrameBufferFD = open("/dev/fb0", O_RDWR);
|
||||||
|
if (FrameBufferFD < 0) {
|
||||||
|
fprintf(stderr, "Error opening /dev/fb0: %s\n", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get the fixed screen info */
|
||||||
|
if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) {
|
||||||
|
fprintf(stderr, "error: ioctl(FBIOGET_FSCREENINFO) failed: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
print_fixed_info(&FixedInfo, "Fixed");
|
||||||
|
|
||||||
|
|
||||||
|
/* get the variable screen info */
|
||||||
|
if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &OrigVarInfo)) {
|
||||||
|
fprintf(stderr, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
print_var_info(&OrigVarInfo, "Orig Var");
|
||||||
|
|
||||||
|
/* operate on a copy */
|
||||||
|
VarInfo = OrigVarInfo;
|
||||||
|
|
||||||
|
/* set the depth, resolution, etc */
|
||||||
|
DesiredDepth = 32;
|
||||||
|
if (DesiredDepth)
|
||||||
|
VarInfo.bits_per_pixel = DesiredDepth;
|
||||||
|
|
||||||
|
if (VarInfo.bits_per_pixel == 16) {
|
||||||
|
VarInfo.red.offset = 11;
|
||||||
|
VarInfo.green.offset = 5;
|
||||||
|
VarInfo.blue.offset = 0;
|
||||||
|
VarInfo.red.length = 5;
|
||||||
|
VarInfo.green.length = 6;
|
||||||
|
VarInfo.blue.length = 5;
|
||||||
|
VarInfo.transp.offset = 0;
|
||||||
|
VarInfo.transp.length = 0;
|
||||||
|
}
|
||||||
|
else if (VarInfo.bits_per_pixel == 32) {
|
||||||
|
VarInfo.red.offset = 16;
|
||||||
|
VarInfo.green.offset = 8;
|
||||||
|
VarInfo.blue.offset = 0;
|
||||||
|
VarInfo.transp.offset = 24;
|
||||||
|
VarInfo.red.length = 8;
|
||||||
|
VarInfo.green.length = 8;
|
||||||
|
VarInfo.blue.length = 8;
|
||||||
|
VarInfo.transp.length = 8;
|
||||||
|
}
|
||||||
|
/* timing values taken from /etc/fb.modes (1280x1024 @ 75Hz) */
|
||||||
|
VarInfo.xres_virtual = VarInfo.xres = 1280;
|
||||||
|
VarInfo.yres_virtual = VarInfo.yres = 1024;
|
||||||
|
VarInfo.pixclock = 7408;
|
||||||
|
VarInfo.left_margin = 248;
|
||||||
|
VarInfo.right_margin = 16;
|
||||||
|
VarInfo.upper_margin = 38;
|
||||||
|
VarInfo.lower_margin = 1;
|
||||||
|
VarInfo.hsync_len = 144;
|
||||||
|
VarInfo.vsync_len = 3;
|
||||||
|
|
||||||
|
VarInfo.xoffset = 0;
|
||||||
|
VarInfo.yoffset = 0;
|
||||||
|
VarInfo.nonstd = 0;
|
||||||
|
VarInfo.vmode &= ~FB_VMODE_YWRAP; /* turn off scrolling */
|
||||||
|
|
||||||
|
/* set new variable screen info */
|
||||||
|
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo)) {
|
||||||
|
fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
print_var_info(&VarInfo, "New Var");
|
||||||
|
|
||||||
|
if (FixedInfo.visual != FB_VISUAL_TRUECOLOR &&
|
||||||
|
FixedInfo.visual != FB_VISUAL_DIRECTCOLOR) {
|
||||||
|
fprintf(stderr, "non-TRUE/DIRECT-COLOR visuals (0x%x) not supported by this demo.\n", FixedInfo.visual);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize colormap */
|
||||||
|
if (FixedInfo.visual == FB_VISUAL_DIRECTCOLOR) {
|
||||||
|
struct fb_cmap cmap;
|
||||||
|
unsigned short red[256], green[256], blue[256];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* we're assuming 256 entries here */
|
||||||
|
printf("initializing directcolor colormap\n");
|
||||||
|
cmap.start = 0;
|
||||||
|
cmap.len = 256;
|
||||||
|
cmap.red = red;
|
||||||
|
cmap.green = green;
|
||||||
|
cmap.blue = blue;
|
||||||
|
cmap.transp = NULL;
|
||||||
|
for (i = 0; i < cmap.len; i++) {
|
||||||
|
red[i] = green[i] = blue[i] = (i << 8) | i;
|
||||||
|
}
|
||||||
|
if (ioctl(FrameBufferFD, FBIOPUTCMAP, (void *) &cmap) < 0) {
|
||||||
|
fprintf(stderr, "ioctl(FBIOPUTCMAP) failed [%d]\n", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* fbdev says the frame buffer is at offset zero, and the mmio region
|
||||||
|
* is immediately after.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* mmap the framebuffer into our address space */
|
||||||
|
FrameBuffer = (caddr_t) mmap(0, /* start */
|
||||||
|
FixedInfo.smem_len, /* bytes */
|
||||||
|
PROT_READ | PROT_WRITE, /* prot */
|
||||||
|
MAP_SHARED, /* flags */
|
||||||
|
FrameBufferFD, /* fd */
|
||||||
|
0 /* offset */);
|
||||||
|
if (FrameBuffer == (caddr_t) - 1) {
|
||||||
|
fprintf(stderr, "error: unable to mmap framebuffer: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
printf("FrameBuffer = %p\n", FrameBuffer);
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* mmap the MMIO region into our address space */
|
||||||
|
MMIOAddress = (caddr_t) mmap(0, /* start */
|
||||||
|
FixedInfo.mmio_len, /* bytes */
|
||||||
|
PROT_READ | PROT_WRITE, /* prot */
|
||||||
|
MAP_SHARED, /* flags */
|
||||||
|
FrameBufferFD, /* fd */
|
||||||
|
FixedInfo.smem_len /* offset */);
|
||||||
|
if (MMIOAddress == (caddr_t) - 1) {
|
||||||
|
fprintf(stderr, "error: unable to mmap mmio region: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
}
|
||||||
|
printf("MMIOAddress = %p\n", MMIOAddress);
|
||||||
|
|
||||||
|
/* try out some simple MMIO register reads */
|
||||||
|
if (1)
|
||||||
|
{
|
||||||
|
typedef unsigned int CARD32;
|
||||||
|
typedef unsigned char CARD8;
|
||||||
|
#define RADEON_CONFIG_MEMSIZE 0x00f8
|
||||||
|
#define RADEON_MEM_SDRAM_MODE_REG 0x0158
|
||||||
|
#define MMIO_IN32(base, offset) \
|
||||||
|
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset))
|
||||||
|
#define INREG(addr) MMIO_IN32(MMIOAddress, addr)
|
||||||
|
int sz, type;
|
||||||
|
const char *typeStr[] = {"SDR", "DDR", "64-bit SDR"};
|
||||||
|
sz = INREG(RADEON_CONFIG_MEMSIZE);
|
||||||
|
type = INREG(RADEON_MEM_SDRAM_MODE_REG);
|
||||||
|
printf("RADEON_CONFIG_MEMSIZE = %d (%d MB)\n", sz, sz / 1024 / 1024);
|
||||||
|
printf("RADEON_MEM_SDRAM_MODE_REG >> 30 = %d (%s)\n",
|
||||||
|
type >> 30, typeStr[type>>30]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
shutdown_fbdev( void )
|
||||||
|
{
|
||||||
|
struct vt_mode VT;
|
||||||
|
|
||||||
|
printf("cleaning up...\n");
|
||||||
|
/* restore original variable screen info */
|
||||||
|
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &OrigVarInfo)) {
|
||||||
|
fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
munmap(MMIOAddress, FixedInfo.mmio_len);
|
||||||
|
munmap(FrameBuffer, FixedInfo.smem_len);
|
||||||
|
close(FrameBufferFD);
|
||||||
|
|
||||||
|
/* restore text mode */
|
||||||
|
ioctl(ConsoleFD, KDSETMODE, KD_TEXT);
|
||||||
|
|
||||||
|
/* set vt */
|
||||||
|
if (ioctl(ConsoleFD, VT_GETMODE, &VT) != -1) {
|
||||||
|
VT.mode = VT_AUTO;
|
||||||
|
ioctl(ConsoleFD, VT_SETMODE, &VT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* restore original vt */
|
||||||
|
if (OriginalVT >= 0) {
|
||||||
|
ioctl(ConsoleFD, VT_ACTIVATE, OriginalVT);
|
||||||
|
OriginalVT = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(ConsoleFD);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
gltest( void )
|
||||||
|
{
|
||||||
|
static const int attribs[] = {
|
||||||
|
GLFBDEV_DOUBLE_BUFFER,
|
||||||
|
GLFBDEV_DEPTH_SIZE, 16,
|
||||||
|
GLFBDEV_NONE
|
||||||
|
};
|
||||||
|
GLFBDevContextPtr ctx;
|
||||||
|
GLFBDevBufferPtr buf;
|
||||||
|
GLFBDevVisualPtr vis;
|
||||||
|
int bytes, r, g, b, a;
|
||||||
|
float ang;
|
||||||
|
|
||||||
|
printf("GLFBDEV_VENDOR = %s\n", glFBDevGetString(GLFBDEV_VENDOR));
|
||||||
|
printf("GLFBDEV_VERSION = %s\n", glFBDevGetString(GLFBDEV_VERSION));
|
||||||
|
|
||||||
|
/* framebuffer size */
|
||||||
|
bytes = VarInfo.xres_virtual * VarInfo.yres_virtual * VarInfo.bits_per_pixel / 8;
|
||||||
|
|
||||||
|
vis = glFBDevCreateVisual( &FixedInfo, &VarInfo, attribs );
|
||||||
|
assert(vis);
|
||||||
|
|
||||||
|
buf = glFBDevCreateBuffer( &FixedInfo, &VarInfo, vis, FrameBuffer, NULL, bytes );
|
||||||
|
assert(buf);
|
||||||
|
|
||||||
|
ctx = glFBDevCreateContext( vis, NULL );
|
||||||
|
assert(buf);
|
||||||
|
|
||||||
|
b = glFBDevMakeCurrent( ctx, buf, buf );
|
||||||
|
assert(b);
|
||||||
|
|
||||||
|
/*printf("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS));*/
|
||||||
|
glGetIntegerv(GL_RED_BITS, &r);
|
||||||
|
glGetIntegerv(GL_GREEN_BITS, &g);
|
||||||
|
glGetIntegerv(GL_BLUE_BITS, &b);
|
||||||
|
glGetIntegerv(GL_ALPHA_BITS, &a);
|
||||||
|
printf("RED_BITS=%d GREEN_BITS=%d BLUE_BITS=%d ALPHA_BITS=%d\n",
|
||||||
|
r, g, b, a);
|
||||||
|
|
||||||
|
glClearColor(0.5, 0.5, 1.0, 0);
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
glFrustum(-1, 1, -1, 1, 2, 30);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glLoadIdentity();
|
||||||
|
glTranslatef(0, 0, -15);
|
||||||
|
glViewport(0, 0, VarInfo.xres_virtual, VarInfo.yres_virtual);
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glEnable(GL_LIGHT0);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
for (ang = 0; ang <= 180; ang += 15) {
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(ang, 1, 0, 0);
|
||||||
|
glutSolidTorus(1, 3, 40, 20);
|
||||||
|
glPopMatrix();
|
||||||
|
glFBDevSwapBuffers(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clean up */
|
||||||
|
b = glFBDevMakeCurrent( NULL, NULL, NULL);
|
||||||
|
assert(b);
|
||||||
|
|
||||||
|
glFBDevDestroyContext(ctx);
|
||||||
|
glFBDevDestroyBuffer(buf);
|
||||||
|
glFBDevDestroyVisual(vis);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main( int argc, char *argv[] )
|
||||||
|
{
|
||||||
|
signal(SIGUSR1, signal_handler); /* exit if someone tries a vt switch */
|
||||||
|
signal(SIGSEGV, signal_handler); /* catch segfaults */
|
||||||
|
|
||||||
|
initialize_fbdev();
|
||||||
|
gltest();
|
||||||
|
shutdown_fbdev();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: manytex.c,v 1.4 2002/10/18 17:47:36 kschultz Exp $ */
|
/* $Id: manytex.c,v 1.4.4.1 2003/03/22 08:46:22 keithw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* test handling of many texture maps
|
* test handling of many texture maps
|
||||||
@@ -191,8 +191,8 @@ static void Init( void )
|
|||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, TextureID[i]);
|
glBindTexture(GL_TEXTURE_2D, TextureID[i]);
|
||||||
|
|
||||||
if (i < LowPriorityCount)
|
/* if (i < LowPriorityCount) */
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.5F);
|
/* glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.5F); */
|
||||||
|
|
||||||
if (RandomSize) {
|
if (RandomSize) {
|
||||||
#if 0
|
#if 0
|
||||||
|
|||||||
127
progs/tests/miniglxsample.c
Normal file
127
progs/tests/miniglxsample.c
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
|
||||||
|
#define USE_MINIGLX 1 /* 1 = use Mini GLX, 0 = use Xlib/GLX */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
|
||||||
|
#if USE_MINIGLX
|
||||||
|
#include <GL/miniglx.h>
|
||||||
|
#else
|
||||||
|
#include <GL/glx.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a simple double-buffered RGBA window.
|
||||||
|
*/
|
||||||
|
static Window
|
||||||
|
MakeWindow(Display * dpy, unsigned int width, unsigned int height)
|
||||||
|
{
|
||||||
|
int visAttributes[] = {
|
||||||
|
GLX_RGBA,
|
||||||
|
GLX_RED_SIZE, 1,
|
||||||
|
GLX_GREEN_SIZE, 1,
|
||||||
|
GLX_BLUE_SIZE, 1,
|
||||||
|
GLX_DOUBLEBUFFER,
|
||||||
|
None
|
||||||
|
};
|
||||||
|
XSetWindowAttributes attr;
|
||||||
|
unsigned long attrMask;
|
||||||
|
Window root;
|
||||||
|
Window win;
|
||||||
|
GLXContext ctx;
|
||||||
|
XVisualInfo *visinfo;
|
||||||
|
|
||||||
|
root = RootWindow(dpy, 0);
|
||||||
|
|
||||||
|
/* Choose GLX visual / pixel format */
|
||||||
|
visinfo = glXChooseVisual(dpy, 0, visAttributes);
|
||||||
|
if (!visinfo) {
|
||||||
|
printf("Error: couldn't get an RGB, Double-buffered visual\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the window */
|
||||||
|
attr.background_pixel = 0;
|
||||||
|
attr.border_pixel = 0;
|
||||||
|
attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone);
|
||||||
|
attrMask = CWBackPixel | CWBorderPixel | CWColormap;
|
||||||
|
win = XCreateWindow(dpy, root, 0, 0, width, height,
|
||||||
|
0, visinfo->depth, InputOutput,
|
||||||
|
visinfo->visual, attrMask, &attr);
|
||||||
|
if (!win) {
|
||||||
|
printf("Error: XCreateWindow failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Display the window */
|
||||||
|
XMapWindow(dpy, win);
|
||||||
|
|
||||||
|
/* Create GLX rendering context */
|
||||||
|
ctx = glXCreateContext(dpy, visinfo, NULL, True);
|
||||||
|
if (!ctx) {
|
||||||
|
printf("Error: glXCreateContext failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bind the rendering context and window */
|
||||||
|
glXMakeCurrent(dpy, win, ctx);
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw a few frames of a rotating square.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
DrawFrames(Display * dpy, Window win)
|
||||||
|
{
|
||||||
|
int angle;
|
||||||
|
glShadeModel(GL_FLAT);
|
||||||
|
glClearColor(0.5, 0.5, 0.5, 1.0);
|
||||||
|
for (angle = 0; angle < 360; angle += 10) {
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glColor3f(1.0, 1.0, 0.0);
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(angle, 0, 0, 1);
|
||||||
|
_subset_Rectf(-0.8, -0.8, 0.8, 0.8);
|
||||||
|
glPopMatrix();
|
||||||
|
glXSwapBuffers(dpy, win);
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
Display *dpy;
|
||||||
|
Window win;
|
||||||
|
|
||||||
|
dpy = XOpenDisplay(NULL);
|
||||||
|
if (!dpy) {
|
||||||
|
printf("Error: XOpenDisplay failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
win = MakeWindow(dpy, 300, 300);
|
||||||
|
|
||||||
|
DrawFrames(dpy, win);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
196
progs/tests/miniglxtest.c
Normal file
196
progs/tests/miniglxtest.c
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
/* $Id: miniglxtest.c,v 1.1.4.9 2003/03/24 18:46:57 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test the mini GLX interface.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#define USE_MINI_GLX 1
|
||||||
|
#if USE_MINI_GLX
|
||||||
|
#include <GL/miniglx.h>
|
||||||
|
#else
|
||||||
|
#include <GL/glx.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FRONTBUFFER 1
|
||||||
|
#define NR 6
|
||||||
|
#define DO_SLEEPS 1
|
||||||
|
#define NR_DISPLAYS 2
|
||||||
|
|
||||||
|
GLXContext ctx;
|
||||||
|
|
||||||
|
|
||||||
|
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( Display *dpy, Window w, int rot )
|
||||||
|
{
|
||||||
|
printf("Redraw event\n");
|
||||||
|
|
||||||
|
#if 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 );
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
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();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FRONTBUFFER
|
||||||
|
glFlush();
|
||||||
|
#else
|
||||||
|
glXSwapBuffers( dpy, w );
|
||||||
|
#endif
|
||||||
|
glFinish();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Window make_rgb_db_window( Display *dpy,
|
||||||
|
unsigned int width, unsigned int height )
|
||||||
|
{
|
||||||
|
int attrib[] = { GLX_RGBA,
|
||||||
|
GLX_RED_SIZE, 1,
|
||||||
|
GLX_GREEN_SIZE, 1,
|
||||||
|
GLX_BLUE_SIZE, 1,
|
||||||
|
#if !FRONT_BUFFER
|
||||||
|
GLX_DOUBLEBUFFER,
|
||||||
|
#endif
|
||||||
|
None };
|
||||||
|
int scrnum;
|
||||||
|
XSetWindowAttributes attr;
|
||||||
|
unsigned long mask;
|
||||||
|
Window root;
|
||||||
|
Window win;
|
||||||
|
XVisualInfo *visinfo;
|
||||||
|
|
||||||
|
scrnum = 0;
|
||||||
|
root = RootWindow( dpy, scrnum );
|
||||||
|
|
||||||
|
visinfo = glXChooseVisual( dpy, scrnum, attrib );
|
||||||
|
if (!visinfo) {
|
||||||
|
printf("Error: couldn't get an RGB, Double-buffered visual\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = glXCreateContext( dpy, visinfo, NULL, True );
|
||||||
|
if (!ctx) {
|
||||||
|
printf("Error: glXCreateContext failed\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;
|
||||||
|
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
|
||||||
|
|
||||||
|
win = XCreateWindow( dpy, root, 0, 0, width, height,
|
||||||
|
0, visinfo->depth, InputOutput,
|
||||||
|
visinfo->visual, mask, &attr );
|
||||||
|
if (!win) {
|
||||||
|
printf("Error: XCreateWindow failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
glXMakeCurrent( dpy, win, ctx );
|
||||||
|
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void event_loop( Display *dpy, Window win )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf("Hang on... drawing %d frames\n", NR);
|
||||||
|
for (i = 0; i < NR; i++) {
|
||||||
|
redraw( dpy, win, i*10 );
|
||||||
|
if (DO_SLEEPS) {
|
||||||
|
printf("sleep(1)\n");
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int foo( )
|
||||||
|
{
|
||||||
|
Display *dpy;
|
||||||
|
Window win;
|
||||||
|
|
||||||
|
dpy = XOpenDisplay(NULL);
|
||||||
|
if (!dpy) {
|
||||||
|
printf("Error: XOpenDisplay failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
win = make_rgb_db_window( dpy, 800, 600);
|
||||||
|
|
||||||
|
srand(getpid());
|
||||||
|
|
||||||
|
glShadeModel( GL_FLAT );
|
||||||
|
glClearColor( 0.5, 0.5, 0.5, 1.0 );
|
||||||
|
|
||||||
|
XMapWindow( dpy, win );
|
||||||
|
|
||||||
|
{
|
||||||
|
XEvent e;
|
||||||
|
while (1) {
|
||||||
|
XNextEvent( dpy, &e );
|
||||||
|
if (e.type == MapNotify && e.xmap.window == win) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
event_loop( dpy, win );
|
||||||
|
|
||||||
|
glXDestroyContext( dpy, ctx );
|
||||||
|
XDestroyWindow( dpy, win );
|
||||||
|
|
||||||
|
XCloseDisplay( dpy );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0 ; i < NR_DISPLAYS ; i++) {
|
||||||
|
if (foo() != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: texline.c,v 1.4 2002/08/17 00:30:36 brianp Exp $ */
|
/* $Id: texline.c,v 1.4.6.1 2003/03/22 08:46:22 keithw Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test textured lines.
|
* Test textured lines.
|
||||||
@@ -59,7 +59,7 @@ static void Display( void )
|
|||||||
y = t * 2.0 - 1.0;
|
y = t * 2.0 - 1.0;
|
||||||
if (!Texture)
|
if (!Texture)
|
||||||
glColor3f(1, 0, 1);
|
glColor3f(1, 0, 1);
|
||||||
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, t, s);
|
/* glMultiTexCoord2fARB(GL_TEXTURE1_ARB, t, s); */
|
||||||
glTexCoord2f(s, t);
|
glTexCoord2f(s, t);
|
||||||
glVertex2f(x, y);
|
glVertex2f(x, y);
|
||||||
}
|
}
|
||||||
@@ -73,12 +73,12 @@ static void Display( void )
|
|||||||
if (!Texture)
|
if (!Texture)
|
||||||
glColor3f(1, 0, 1);
|
glColor3f(1, 0, 1);
|
||||||
glTexCoord2f(t, 0.0);
|
glTexCoord2f(t, 0.0);
|
||||||
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, t);
|
/* glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, t); */
|
||||||
glVertex2f(x, -1.0);
|
glVertex2f(x, -1.0);
|
||||||
if (!Texture)
|
if (!Texture)
|
||||||
glColor3f(0, 1, 0);
|
glColor3f(0, 1, 0);
|
||||||
glTexCoord2f(t, 1.0);
|
glTexCoord2f(t, 1.0);
|
||||||
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, t);
|
/* glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, t); */
|
||||||
glVertex2f(x, 1.0);
|
glVertex2f(x, 1.0);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
@@ -127,22 +127,22 @@ static void Key( unsigned char key, int x, int y )
|
|||||||
if (Texture > 2)
|
if (Texture > 2)
|
||||||
Texture = 0;
|
Texture = 0;
|
||||||
if (Texture == 0) {
|
if (Texture == 0) {
|
||||||
glActiveTextureARB(GL_TEXTURE0_ARB);
|
/* glActiveTextureARB(GL_TEXTURE0_ARB); */
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
/* glActiveTextureARB(GL_TEXTURE1_ARB); */
|
||||||
|
/* glDisable(GL_TEXTURE_2D); */
|
||||||
}
|
}
|
||||||
else if (Texture == 1) {
|
else if (Texture == 1) {
|
||||||
glActiveTextureARB(GL_TEXTURE0_ARB);
|
/* glActiveTextureARB(GL_TEXTURE0_ARB); */
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
/* glActiveTextureARB(GL_TEXTURE1_ARB); */
|
||||||
glDisable(GL_TEXTURE_2D);
|
/* glDisable(GL_TEXTURE_2D); */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
glActiveTextureARB(GL_TEXTURE0_ARB);
|
/* glActiveTextureARB(GL_TEXTURE0_ARB); */
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
/* glActiveTextureARB(GL_TEXTURE1_ARB); */
|
||||||
|
/* glEnable(GL_TEXTURE_2D); */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
@@ -212,8 +212,8 @@ static void SpecialKey( int key, int x, int y )
|
|||||||
static void Init( int argc, char *argv[] )
|
static void Init( int argc, char *argv[] )
|
||||||
{
|
{
|
||||||
GLuint u;
|
GLuint u;
|
||||||
for (u = 0; u < 2; u++) {
|
for (u = 0; u < 1; u++) {
|
||||||
glActiveTextureARB(GL_TEXTURE0_ARB + u);
|
/* glActiveTextureARB(GL_TEXTURE0_ARB + u); */
|
||||||
glBindTexture(GL_TEXTURE_2D, 10+u);
|
glBindTexture(GL_TEXTURE_2D, 10+u);
|
||||||
if (u == 0)
|
if (u == 0)
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
|||||||
35
progs/xdemos/Makefile
Normal file
35
progs/xdemos/Makefile
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
# Simple makefile for compiling test programs on Linux
|
||||||
|
# These programs aren't intended to be included with the normal
|
||||||
|
# distro. They're not too interesting but they're good for testing.
|
||||||
|
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -g -I../include
|
||||||
|
LIBS = -L../lib -lGL -lm
|
||||||
|
|
||||||
|
PROGS = glxgears
|
||||||
|
|
||||||
|
|
||||||
|
##### RULES #####
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c
|
||||||
|
|
||||||
|
.c:
|
||||||
|
$(CC) $(CFLAGS) $< $(LIBS) -o $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##### TARGETS #####
|
||||||
|
|
||||||
|
default: $(PROGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(PROGS)
|
||||||
|
rm -f *.o
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -33,10 +33,16 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#define USE_MINI_GLX 1
|
||||||
|
#if USE_MINI_GLX
|
||||||
|
#include <GL/miniglx.h>
|
||||||
|
#else
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
#include <GL/gl.h>
|
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define BENCHMARK
|
#define BENCHMARK
|
||||||
@@ -346,13 +352,18 @@ make_window( Display *dpy, const char *name,
|
|||||||
attr.background_pixel = 0;
|
attr.background_pixel = 0;
|
||||||
attr.border_pixel = 0;
|
attr.border_pixel = 0;
|
||||||
attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
|
attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
|
||||||
attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
|
attr.event_mask = StructureNotifyMask | ExposureMask
|
||||||
|
#if !USE_MINI_GLX
|
||||||
|
| KeyPressMask
|
||||||
|
#endif
|
||||||
|
;
|
||||||
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
|
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
|
||||||
|
|
||||||
win = XCreateWindow( dpy, root, 0, 0, width, height,
|
win = XCreateWindow( dpy, root, 0, 0, width, height,
|
||||||
0, visinfo->depth, InputOutput,
|
0, visinfo->depth, InputOutput,
|
||||||
visinfo->visual, mask, &attr );
|
visinfo->visual, mask, &attr );
|
||||||
|
|
||||||
|
#if !USE_MINI_GLX
|
||||||
/* set hints and properties */
|
/* set hints and properties */
|
||||||
{
|
{
|
||||||
XSizeHints sizehints;
|
XSizeHints sizehints;
|
||||||
@@ -365,6 +376,7 @@ make_window( Display *dpy, const char *name,
|
|||||||
XSetStandardProperties(dpy, win, name, name,
|
XSetStandardProperties(dpy, win, name, name,
|
||||||
None, (char **)NULL, 0, &sizehints);
|
None, (char **)NULL, 0, &sizehints);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ctx = glXCreateContext( dpy, visinfo, NULL, True );
|
ctx = glXCreateContext( dpy, visinfo, NULL, True );
|
||||||
if (!ctx) {
|
if (!ctx) {
|
||||||
@@ -382,7 +394,12 @@ make_window( Display *dpy, const char *name,
|
|||||||
static void
|
static void
|
||||||
event_loop(Display *dpy, Window win)
|
event_loop(Display *dpy, Window win)
|
||||||
{
|
{
|
||||||
|
#if USE_MINI_GLX
|
||||||
|
reshape(300, 300);
|
||||||
|
#endif
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
#if !USE_MINI_GLX
|
||||||
while (XPending(dpy) > 0) {
|
while (XPending(dpy) > 0) {
|
||||||
XEvent event;
|
XEvent event;
|
||||||
XNextEvent(dpy, &event);
|
XNextEvent(dpy, &event);
|
||||||
@@ -421,6 +438,7 @@ event_loop(Display *dpy, Window win)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* next frame */
|
/* next frame */
|
||||||
angle += 2.0;
|
angle += 2.0;
|
||||||
|
|||||||
37
src/dri-es/Makefile
Normal file
37
src/dri-es/Makefile
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# $Id: Makefile,v 1.1.2.2 2003/03/04 17:29:55 keithw Exp $
|
||||||
|
|
||||||
|
# Mesa 3-D graphics library
|
||||||
|
# Version: 5.0
|
||||||
|
# Copyright (C) 1995-2002 Brian Paul
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MESA = ../..
|
||||||
|
default: dri.a
|
||||||
|
include $(MESA)/Makefile.include
|
||||||
|
|
||||||
|
INCLUDES = -I/usr/X11R6/include -I/usr/X11R6/include/X11/extensions -I$(MESA)/include -I. -I..
|
||||||
|
DEFINES =
|
||||||
|
|
||||||
|
C_SOURCES = dri_glx.c \
|
||||||
|
dri_util.c \
|
||||||
|
xf86drm.c \
|
||||||
|
xf86drmHash.c \
|
||||||
|
xf86drmRandom.c \
|
||||||
|
xf86drmSL.c
|
||||||
|
|
||||||
|
ASM_SOURCES =
|
||||||
|
|
||||||
|
OBJECTS = $(C_SOURCES:.c=.o) \
|
||||||
|
$(ASM_SOURCES:.S=.o)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##### TARGETS #####
|
||||||
|
|
||||||
|
dri.a: $(OBJECTS) Makefile
|
||||||
|
rm -f $@ && ar rcv $@ $(OBJECTS) && ranlib $@
|
||||||
|
|
||||||
|
##### DEPENDENCIES #####
|
||||||
|
|
||||||
|
-include $(C_SOURCES:.c=.d)
|
||||||
472
src/dri-es/dri_glx.c
Normal file
472
src/dri-es/dri_glx.c
Normal file
@@ -0,0 +1,472 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
|
||||||
|
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
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, 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 PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
/* $XFree86: xc/lib/GL/dri/dri_glx.c,v 1.10 2001/08/27 17:40:57 dawes Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <kevin@precisioninsight.com>
|
||||||
|
* Brian Paul <brian@precisioninsight.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <X11/Xlibint.h>
|
||||||
|
#include <X11/extensions/Xext.h>
|
||||||
|
#include "extutil.h"
|
||||||
|
#include "glxclient.h"
|
||||||
|
#include "xf86dri.h"
|
||||||
|
#include "sarea.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include "dri_glx.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BUILT_IN_DRI_DRIVER
|
||||||
|
|
||||||
|
extern void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
|
||||||
|
int numConfigs, __GLXvisualConfig *config);
|
||||||
|
|
||||||
|
|
||||||
|
#else /* BUILT_IN_DRI_DRIVER */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef DEFAULT_DRIVER_DIR
|
||||||
|
/* this is normally defined in the Imakefile */
|
||||||
|
#define DEFAULT_DRIVER_DIR "/usr/X11R6/lib/modules/dri"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static __DRIdriver *Drivers = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* printf wrappers
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void InfoMessageF(const char *f, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
const char *env;
|
||||||
|
|
||||||
|
if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) {
|
||||||
|
fprintf(stderr, "libGL: ");
|
||||||
|
va_start(args, f);
|
||||||
|
vfprintf(stderr, f, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ErrorMessageF(const char *f, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
if (getenv("LIBGL_DEBUG")) {
|
||||||
|
fprintf(stderr, "libGL error: ");
|
||||||
|
va_start(args, f);
|
||||||
|
vfprintf(stderr, f, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We'll save a pointer to this function when we couldn't find a
|
||||||
|
* direct rendering driver for a given screen.
|
||||||
|
*/
|
||||||
|
static void *DummyCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
|
||||||
|
int numConfigs, __GLXvisualConfig *config)
|
||||||
|
{
|
||||||
|
(void) dpy;
|
||||||
|
(void) scrn;
|
||||||
|
(void) psc;
|
||||||
|
(void) numConfigs;
|
||||||
|
(void) config;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extract the ith directory path out of a colon-separated list of
|
||||||
|
* paths.
|
||||||
|
* Input:
|
||||||
|
* index - index of path to extract (starting at zero)
|
||||||
|
* paths - the colon-separated list of paths
|
||||||
|
* dirLen - max length of result to store in <dir>
|
||||||
|
* Output:
|
||||||
|
* dir - the extracted directory path, dir[0] will be zero when
|
||||||
|
* extraction fails.
|
||||||
|
*/
|
||||||
|
static void ExtractDir(int index, const char *paths, int dirLen, char *dir)
|
||||||
|
{
|
||||||
|
int i, len;
|
||||||
|
const char *start, *end;
|
||||||
|
|
||||||
|
/* find ith colon */
|
||||||
|
start = paths;
|
||||||
|
i = 0;
|
||||||
|
while (i < index) {
|
||||||
|
if (*start == ':') {
|
||||||
|
i++;
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
else if (*start == 0) {
|
||||||
|
/* end of string and couldn't find ith colon */
|
||||||
|
dir[0] = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*start == ':')
|
||||||
|
start++;
|
||||||
|
|
||||||
|
/* find next colon, or end of string */
|
||||||
|
end = start + 1;
|
||||||
|
while (*end != ':' && *end != 0) {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* copy string between <start> and <end> into result string */
|
||||||
|
len = end - start;
|
||||||
|
if (len > dirLen - 1)
|
||||||
|
len = dirLen - 1;
|
||||||
|
strncpy(dir, start, len);
|
||||||
|
dir[len] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to dlopen() the named driver. This function adds the
|
||||||
|
* "_dri.so" suffix to the driver name and searches the
|
||||||
|
* directories specified by the LIBGL_DRIVERS_PATH env var
|
||||||
|
* in order to find the driver.
|
||||||
|
* Input:
|
||||||
|
* driverName - a name like "tdfx", "i810", "mga", etc.
|
||||||
|
* Return:
|
||||||
|
* handle from dlopen, or NULL if driver file not found.
|
||||||
|
*/
|
||||||
|
static __DRIdriver *OpenDriver(const char *driverName)
|
||||||
|
{
|
||||||
|
char *libPaths = NULL;
|
||||||
|
int i;
|
||||||
|
__DRIdriver *driver;
|
||||||
|
|
||||||
|
/* First, search Drivers list to see if we've already opened this driver */
|
||||||
|
for (driver = Drivers; driver; driver = driver->next) {
|
||||||
|
if (strcmp(driver->name, driverName) == 0) {
|
||||||
|
/* found it */
|
||||||
|
return driver;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (geteuid() == getuid()) {
|
||||||
|
/* don't allow setuid apps to use LIBGL_DRIVERS_PATH */
|
||||||
|
libPaths = getenv("LIBGL_DRIVERS_PATH");
|
||||||
|
if (!libPaths)
|
||||||
|
libPaths = getenv("LIBGL_DRIVERS_DIR"); /* deprecated */
|
||||||
|
}
|
||||||
|
if (!libPaths)
|
||||||
|
libPaths = DEFAULT_DRIVER_DIR;
|
||||||
|
|
||||||
|
for (i = 0; ; i++) {
|
||||||
|
char libDir[1000], realDriverName[200];
|
||||||
|
void *handle;
|
||||||
|
ExtractDir(i, libPaths, 1000, libDir);
|
||||||
|
if (!libDir[0])
|
||||||
|
break; /* ran out of paths to search */
|
||||||
|
snprintf(realDriverName, 200, "%s/%s_dri.so", libDir, driverName);
|
||||||
|
InfoMessageF("OpenDriver: trying %s\n", realDriverName);
|
||||||
|
handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
|
||||||
|
if (handle) {
|
||||||
|
/* allocate __DRIdriver struct */
|
||||||
|
driver = (__DRIdriver *) Xmalloc(sizeof(__DRIdriver));
|
||||||
|
if (!driver)
|
||||||
|
return NULL; /* out of memory! */
|
||||||
|
/* init the struct */
|
||||||
|
driver->name = __glXstrdup(driverName);
|
||||||
|
if (!driver->name) {
|
||||||
|
Xfree(driver);
|
||||||
|
return NULL; /* out of memory! */
|
||||||
|
}
|
||||||
|
driver->createScreenFunc = (CreateScreenFunc)
|
||||||
|
dlsym(handle, "__driCreateScreen");
|
||||||
|
if (!driver->createScreenFunc) {
|
||||||
|
/* If the driver doesn't have this symbol then something's
|
||||||
|
* really, really wrong.
|
||||||
|
*/
|
||||||
|
ErrorMessageF("__driCreateScreen() not defined in %s_dri.so!\n",
|
||||||
|
driverName);
|
||||||
|
Xfree(driver);
|
||||||
|
dlclose(handle);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
driver->registerExtensionsFunc = (RegisterExtensionsFunc)
|
||||||
|
dlsym(handle, "__driRegisterExtensions");
|
||||||
|
driver->handle = handle;
|
||||||
|
/* put at head of linked list */
|
||||||
|
driver->next = Drivers;
|
||||||
|
Drivers = driver;
|
||||||
|
return driver;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ErrorMessageF("dlopen %s failed (%s)\n", realDriverName, dlerror());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorMessageF("unable to find driver: %s_dri.so\n", driverName);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Given a display pointer and screen number, determine the name of
|
||||||
|
* the DRI driver for the screen. (I.e. "r128", "tdfx", etc).
|
||||||
|
* Return True for success, False for failure.
|
||||||
|
*/
|
||||||
|
static Bool GetDriverName(Display *dpy, int scrNum, char **driverName)
|
||||||
|
{
|
||||||
|
int directCapable;
|
||||||
|
Bool b;
|
||||||
|
int driverMajor, driverMinor, driverPatch;
|
||||||
|
|
||||||
|
*driverName = NULL;
|
||||||
|
|
||||||
|
if (!XF86DRIQueryDirectRenderingCapable(dpy, scrNum, &directCapable)) {
|
||||||
|
ErrorMessageF("XF86DRIQueryDirectRenderingCapable failed");
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
if (!directCapable) {
|
||||||
|
ErrorMessageF("XF86DRIQueryDirectRenderingCapable returned false");
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
b = XF86DRIGetClientDriverName(dpy, scrNum, &driverMajor, &driverMinor,
|
||||||
|
&driverPatch, driverName);
|
||||||
|
if (!b) {
|
||||||
|
ErrorMessageF("Cannot determine driver name for screen %d\n", scrNum);
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
InfoMessageF("XF86DRIGetClientDriverName: %d.%d.%d %s (screen %d)\n",
|
||||||
|
driverMajor, driverMinor, driverPatch, *driverName, scrNum);
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Given a display pointer and screen number, return a __DRIdriver handle.
|
||||||
|
* Return NULL if anything goes wrong.
|
||||||
|
*/
|
||||||
|
__DRIdriver *driGetDriver(Display *dpy, int scrNum)
|
||||||
|
{
|
||||||
|
char *driverName;
|
||||||
|
|
||||||
|
if (GetDriverName(dpy, scrNum, &driverName)) {
|
||||||
|
return OpenDriver(driverName);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* BUILT_IN_DRI_DRIVER */
|
||||||
|
|
||||||
|
|
||||||
|
/* This function isn't currently used.
|
||||||
|
*/
|
||||||
|
static void driDestroyDisplay(Display *dpy, void *private)
|
||||||
|
{
|
||||||
|
__DRIdisplayPrivate *pdpyp = (__DRIdisplayPrivate *)private;
|
||||||
|
|
||||||
|
if (pdpyp) {
|
||||||
|
const int numScreens = ScreenCount(dpy);
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < numScreens; i++) {
|
||||||
|
if (pdpyp->libraryHandles[i])
|
||||||
|
dlclose(pdpyp->libraryHandles[i]);
|
||||||
|
}
|
||||||
|
Xfree(pdpyp->libraryHandles);
|
||||||
|
Xfree(pdpyp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate, initialize and return a __DRIdisplayPrivate object.
|
||||||
|
* This is called from __glXInitialize() when we are given a new
|
||||||
|
* display pointer.
|
||||||
|
*/
|
||||||
|
void *driCreateDisplay(Display *dpy, __DRIdisplay *pdisp)
|
||||||
|
{
|
||||||
|
const int numScreens = ScreenCount(dpy);
|
||||||
|
__DRIdisplayPrivate *pdpyp;
|
||||||
|
int eventBase, errorBase;
|
||||||
|
int major, minor, patch;
|
||||||
|
int scrn;
|
||||||
|
|
||||||
|
/* Initialize these fields to NULL in case we fail.
|
||||||
|
* If we don't do this we may later get segfaults trying to free random
|
||||||
|
* addresses when the display is closed.
|
||||||
|
*/
|
||||||
|
pdisp->private = NULL;
|
||||||
|
pdisp->destroyDisplay = NULL;
|
||||||
|
pdisp->createScreen = NULL;
|
||||||
|
|
||||||
|
if (!XF86DRIQueryExtension(dpy, &eventBase, &errorBase)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!XF86DRIQueryVersion(dpy, &major, &minor, &patch)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pdpyp = (__DRIdisplayPrivate *)Xmalloc(sizeof(__DRIdisplayPrivate));
|
||||||
|
if (!pdpyp) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pdpyp->driMajor = major;
|
||||||
|
pdpyp->driMinor = minor;
|
||||||
|
pdpyp->driPatch = patch;
|
||||||
|
|
||||||
|
pdisp->destroyDisplay = driDestroyDisplay;
|
||||||
|
|
||||||
|
/* allocate array of pointers to createScreen funcs */
|
||||||
|
pdisp->createScreen = (CreateScreenFunc *) Xmalloc(numScreens * sizeof(void *));
|
||||||
|
if (!pdisp->createScreen) {
|
||||||
|
XFree(pdpyp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allocate array of library handles */
|
||||||
|
pdpyp->libraryHandles = (void **) Xmalloc(numScreens * sizeof(void*));
|
||||||
|
if (!pdpyp->libraryHandles) {
|
||||||
|
Xfree(pdisp->createScreen);
|
||||||
|
XFree(pdpyp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BUILT_IN_DRI_DRIVER
|
||||||
|
/* we'll statically bind to the built-in __driCreateScreen function */
|
||||||
|
for (scrn = 0; scrn < numScreens; scrn++) {
|
||||||
|
pdisp->createScreen[scrn] = __driCreateScreen;
|
||||||
|
pdpyp->libraryHandles[scrn] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* dynamically discover DRI drivers for all screens, saving each
|
||||||
|
* driver's "__driCreateScreen" function pointer. That's the bootstrap
|
||||||
|
* entrypoint for all DRI drivers.
|
||||||
|
*/
|
||||||
|
__glXRegisterExtensions();
|
||||||
|
for (scrn = 0; scrn < numScreens; scrn++) {
|
||||||
|
__DRIdriver *driver = driGetDriver(dpy, scrn);
|
||||||
|
if (driver) {
|
||||||
|
pdisp->createScreen[scrn] = driver->createScreenFunc;
|
||||||
|
pdpyp->libraryHandles[scrn] = driver->handle;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pdisp->createScreen[scrn] = DummyCreateScreen;
|
||||||
|
pdpyp->libraryHandles[scrn] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (void *)pdpyp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Here we'll query the DRI driver for each screen and let each
|
||||||
|
** driver register its GL extension functions. We only have to
|
||||||
|
** do this once.
|
||||||
|
**
|
||||||
|
** In older versions of libGL (prior to October 2002) we _always_
|
||||||
|
** called this function during libGL start-up. Now, we only call
|
||||||
|
** it from glXGetProcAddress() as a last resort.
|
||||||
|
**
|
||||||
|
** Two key things changed along the way:
|
||||||
|
** 1. _glapi_get_proc_address() now generates new dispatch stub functions
|
||||||
|
** anytime it gets an unknown "gl*" function name. I.e. we always return
|
||||||
|
** a valid function address and later patch it up to use the correct
|
||||||
|
** dispatch offset.
|
||||||
|
** 2. The GL API dispatch table is a fixed size (with plenty of extra slots).
|
||||||
|
** This means we don't have to register all new functions before we create
|
||||||
|
** the first dispatch table.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
__glXRegisterExtensions(void)
|
||||||
|
{
|
||||||
|
#ifndef BUILT_IN_DRI_DRIVER
|
||||||
|
static GLboolean alreadyCalled = GL_FALSE;
|
||||||
|
int displayNum, maxDisplays;
|
||||||
|
|
||||||
|
if (alreadyCalled)
|
||||||
|
return;
|
||||||
|
alreadyCalled = GL_TRUE;
|
||||||
|
|
||||||
|
if (getenv("LIBGL_MULTIHEAD")) {
|
||||||
|
/* we'd like to always take this path but doing so causes a second
|
||||||
|
* or more of delay while the XOpenDisplay() function times out.
|
||||||
|
*/
|
||||||
|
maxDisplays = 10; /* infinity, really */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* just open the :0 display */
|
||||||
|
maxDisplays = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (displayNum = 0; displayNum < maxDisplays; displayNum++) {
|
||||||
|
char displayName[200];
|
||||||
|
Display *dpy;
|
||||||
|
snprintf(displayName, 199, ":%d.0", displayNum);
|
||||||
|
dpy = XOpenDisplay(displayName);
|
||||||
|
if (dpy) {
|
||||||
|
const int numScreens = ScreenCount(dpy);
|
||||||
|
int screenNum;
|
||||||
|
for (screenNum = 0; screenNum < numScreens; screenNum++) {
|
||||||
|
__DRIdriver *driver = driGetDriver(dpy, screenNum);
|
||||||
|
if (driver && driver->registerExtensionsFunc) {
|
||||||
|
(*driver->registerExtensionsFunc)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XCloseDisplay(dpy);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
59
src/dri-es/dri_glx.h
Normal file
59
src/dri-es/dri_glx.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
|
||||||
|
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
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, 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 PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <kevin@precisioninsight.com>
|
||||||
|
* Brian Paul <brian@precisioninsight.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DRI_GLX_H_
|
||||||
|
#define _DRI_GLX_H_
|
||||||
|
|
||||||
|
|
||||||
|
struct __DRIdisplayPrivateRec {
|
||||||
|
/*
|
||||||
|
** XFree86-DRI version information
|
||||||
|
*/
|
||||||
|
int driMajor;
|
||||||
|
int driMinor;
|
||||||
|
int driPatch;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Array of library handles [indexed by screen number]
|
||||||
|
*/
|
||||||
|
void **libraryHandles;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct __DRIdisplayPrivateRec __DRIdisplayPrivate;
|
||||||
|
typedef struct __DRIscreenPrivateRec __DRIscreenPrivate;
|
||||||
|
typedef struct __DRIvisualPrivateRec __DRIvisualPrivate;
|
||||||
|
typedef struct __DRIcontextPrivateRec __DRIcontextPrivate;
|
||||||
|
typedef struct __DRIdrawablePrivateRec __DRIdrawablePrivate;
|
||||||
|
|
||||||
|
#endif /* _DRI_GLX_H_ */
|
||||||
1109
src/dri-es/dri_util.c
Normal file
1109
src/dri-es/dri_util.c
Normal file
File diff suppressed because it is too large
Load Diff
375
src/dri-es/dri_util.h
Normal file
375
src/dri-es/dri_util.h
Normal file
@@ -0,0 +1,375 @@
|
|||||||
|
/* $XFree86$ */
|
||||||
|
/**************************************************************************
|
||||||
|
|
||||||
|
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
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, 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 PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <kevin@precisioninsight.com>
|
||||||
|
* Brian Paul <brian@precisioninsight.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This module acts as glue between GLX and the actual hardware driver.
|
||||||
|
* A DRI driver doesn't really _have_ to use any of this - it's optional.
|
||||||
|
* But, some useful stuff is done here that otherwise would have to be
|
||||||
|
* duplicated in most drivers.
|
||||||
|
*
|
||||||
|
* Basically, these utility functions take care of some of the dirty details
|
||||||
|
* of screen initialization, context creation, context binding, DRM setup,
|
||||||
|
* etc.
|
||||||
|
*
|
||||||
|
* These functions are compiled into each DRI driver so libGL.so knows
|
||||||
|
* nothing about them.
|
||||||
|
*
|
||||||
|
* Look for more comments in the dri_util.c file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _DRI_UTIL_H_
|
||||||
|
#define _DRI_UTIL_H_
|
||||||
|
|
||||||
|
#define CAPI /* XXX this should be globally defined somewhere */
|
||||||
|
|
||||||
|
#include "glxclient.h" /* for GLXDrawable */
|
||||||
|
#include "xf86dri.h" /* for XF86DRIClipRectPtr */
|
||||||
|
#include "sarea.h" /* for XF86DRISAREAPtr */
|
||||||
|
#include "GL/internal/glcore.h" /* for __GLcontextModes */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct __DRIdisplayPrivateRec __DRIdisplayPrivate;
|
||||||
|
typedef struct __DRIscreenPrivateRec __DRIscreenPrivate;
|
||||||
|
typedef struct __DRIcontextPrivateRec __DRIcontextPrivate;
|
||||||
|
typedef struct __DRIdrawablePrivateRec __DRIdrawablePrivate;
|
||||||
|
|
||||||
|
|
||||||
|
#define DRI_VALIDATE_DRAWABLE_INFO_ONCE(pDrawPriv) \
|
||||||
|
do { \
|
||||||
|
if (*(pDrawPriv->pStamp) != pDrawPriv->lastStamp) { \
|
||||||
|
__driUtilUpdateDrawableInfo(pDrawPriv); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define DRI_VALIDATE_DRAWABLE_INFO(psp, pdp) \
|
||||||
|
do { \
|
||||||
|
while (*(pdp->pStamp) != pdp->lastStamp) { \
|
||||||
|
DRM_UNLOCK(psp->fd, &psp->pSAREA->lock, \
|
||||||
|
pdp->driContextPriv->hHWContext); \
|
||||||
|
\
|
||||||
|
DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); \
|
||||||
|
DRI_VALIDATE_DRAWABLE_INFO_ONCE(pdp); \
|
||||||
|
DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); \
|
||||||
|
\
|
||||||
|
DRM_LIGHT_LOCK(psp->fd, &psp->pSAREA->lock, \
|
||||||
|
pdp->driContextPriv->hHWContext); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Each DRI driver must have one of these structs with all the pointers
|
||||||
|
* set to appropriate functions within the driver.
|
||||||
|
* When glXCreateContext is called, for example, it'll call a helper
|
||||||
|
* function dri_util.c which in turn will jump through the CreateContext
|
||||||
|
* pointer in this structure.
|
||||||
|
*/
|
||||||
|
struct __DriverAPIRec {
|
||||||
|
GLboolean (*InitDriver)(__DRIscreenPrivate *driScrnPriv);
|
||||||
|
void (*DestroyScreen)(__DRIscreenPrivate *driScrnPriv);
|
||||||
|
GLboolean (*CreateContext)(const __GLcontextModes *glVis,
|
||||||
|
__DRIcontextPrivate *driContextPriv,
|
||||||
|
void *sharedContextPrivate);
|
||||||
|
void (*DestroyContext)(__DRIcontextPrivate *driContextPriv);
|
||||||
|
GLboolean (*CreateBuffer)(__DRIscreenPrivate *driScrnPriv,
|
||||||
|
__DRIdrawablePrivate *driDrawPriv,
|
||||||
|
const __GLcontextModes *glVis,
|
||||||
|
GLboolean pixmapBuffer);
|
||||||
|
void (*DestroyBuffer)(__DRIdrawablePrivate *driDrawPriv);
|
||||||
|
void (*SwapBuffers)(__DRIdrawablePrivate *driDrawPriv);
|
||||||
|
GLboolean (*MakeCurrent)(__DRIcontextPrivate *driContextPriv,
|
||||||
|
__DRIdrawablePrivate *driDrawPriv,
|
||||||
|
__DRIdrawablePrivate *driReadPriv);
|
||||||
|
GLboolean (*UnbindContext)(__DRIcontextPrivate *driContextPriv);
|
||||||
|
GLboolean (*OpenFullScreen)(__DRIcontextPrivate *driContextPriv);
|
||||||
|
GLboolean (*CloseFullScreen)(__DRIcontextPrivate *driContextPriv);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct __DRIdrawablePrivateRec {
|
||||||
|
/*
|
||||||
|
** Kernel drawable handle (not currently used).
|
||||||
|
*/
|
||||||
|
drmDrawable hHWDrawable;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Driver's private drawable information. This structure is opaque.
|
||||||
|
*/
|
||||||
|
void *driverPrivate;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** X's drawable ID associated with this private drawable.
|
||||||
|
*/
|
||||||
|
GLXDrawable draw;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Reference count for number of context's currently bound to this
|
||||||
|
** drawable. Once the refcount reaches 0, the drawable can be
|
||||||
|
** destroyed. This behavior will change with GLX 1.3.
|
||||||
|
*/
|
||||||
|
int refcount;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Index of this drawable's information in the SAREA.
|
||||||
|
*/
|
||||||
|
unsigned int index;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Pointer to the "drawable has changed ID" stamp in the SAREA.
|
||||||
|
*/
|
||||||
|
unsigned int *pStamp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Last value of the stamp. If this differs from the value stored
|
||||||
|
** at *pStamp, then the drawable information has been modified by
|
||||||
|
** the X server, and the drawable information (below) should be
|
||||||
|
** retrieved from the X server.
|
||||||
|
*/
|
||||||
|
unsigned int lastStamp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Drawable information used in software fallbacks.
|
||||||
|
*/
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int w;
|
||||||
|
int h;
|
||||||
|
int numClipRects;
|
||||||
|
XF86DRIClipRectPtr pClipRects;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Information about the back and depthbuffer where different
|
||||||
|
** from above.
|
||||||
|
*/
|
||||||
|
int backX;
|
||||||
|
int backY;
|
||||||
|
int backClipRectType;
|
||||||
|
int numBackClipRects;
|
||||||
|
XF86DRIClipRectPtr pBackClipRects;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Pointer to context to which this drawable is currently bound.
|
||||||
|
*/
|
||||||
|
__DRIcontextPrivate *driContextPriv;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Pointer to screen on which this drawable was created.
|
||||||
|
*/
|
||||||
|
__DRIscreenPrivate *driScreenPriv;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Basically just need these for when the locking code needs to call
|
||||||
|
** __driUtilUpdateDrawableInfo() which calls XF86DRIGetDrawableInfo().
|
||||||
|
*/
|
||||||
|
Display *display;
|
||||||
|
int screen;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Called via glXSwapBuffers().
|
||||||
|
*/
|
||||||
|
void (*swapBuffers)( __DRIdrawablePrivate *dPriv );
|
||||||
|
};
|
||||||
|
|
||||||
|
struct __DRIcontextPrivateRec {
|
||||||
|
/*
|
||||||
|
** Kernel context handle used to access the device lock.
|
||||||
|
*/
|
||||||
|
XID contextID;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Kernel context handle used to access the device lock.
|
||||||
|
*/
|
||||||
|
drmContext hHWContext;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Device driver's private context data. This structure is opaque.
|
||||||
|
*/
|
||||||
|
void *driverPrivate;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This context's display pointer.
|
||||||
|
*/
|
||||||
|
Display *display;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Pointer to drawable currently bound to this context.
|
||||||
|
*/
|
||||||
|
__DRIdrawablePrivate *driDrawablePriv;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Pointer to screen on which this context was created.
|
||||||
|
*/
|
||||||
|
__DRIscreenPrivate *driScreenPriv;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct __DRIscreenPrivateRec {
|
||||||
|
/*
|
||||||
|
** Display for this screen
|
||||||
|
*/
|
||||||
|
Display *display;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Current screen's number
|
||||||
|
*/
|
||||||
|
int myNum;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Callback functions into the hardware-specific DRI driver code.
|
||||||
|
*/
|
||||||
|
struct __DriverAPIRec DriverAPI;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** DDX / 2D driver version information.
|
||||||
|
*/
|
||||||
|
int ddxMajor;
|
||||||
|
int ddxMinor;
|
||||||
|
int ddxPatch;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** DRI X extension version information.
|
||||||
|
*/
|
||||||
|
int driMajor;
|
||||||
|
int driMinor;
|
||||||
|
int driPatch;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** DRM (kernel module) version information.
|
||||||
|
*/
|
||||||
|
int drmMajor;
|
||||||
|
int drmMinor;
|
||||||
|
int drmPatch;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** ID used when the client sets the drawable lock. The X server
|
||||||
|
** uses this value to detect if the client has died while holding
|
||||||
|
** the drawable lock.
|
||||||
|
*/
|
||||||
|
int drawLockID;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** File descriptor returned when the kernel device driver is opened.
|
||||||
|
** It is used to:
|
||||||
|
** - authenticate client to kernel
|
||||||
|
** - map the frame buffer, SAREA, etc.
|
||||||
|
** - close the kernel device driver
|
||||||
|
*/
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** SAREA pointer used to access:
|
||||||
|
** - the device lock
|
||||||
|
** - the device-independent per-drawable and per-context(?) information
|
||||||
|
*/
|
||||||
|
XF86DRISAREAPtr pSAREA;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Direct frame buffer access information used for software
|
||||||
|
** fallbacks.
|
||||||
|
*/
|
||||||
|
unsigned char *pFB;
|
||||||
|
int fbSize;
|
||||||
|
int fbOrigin;
|
||||||
|
int fbStride;
|
||||||
|
int fbWidth;
|
||||||
|
int fbHeight;
|
||||||
|
int fbBPP;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Device-dependent private information (stored in the SAREA). This
|
||||||
|
** data is accessed by the client driver only.
|
||||||
|
*/
|
||||||
|
void *pDevPriv;
|
||||||
|
int devPrivSize;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Dummy context to which drawables are bound when not bound to any
|
||||||
|
** other context. A dummy hHWContext is created for this context,
|
||||||
|
** and is used by the GL core when a HW lock is required but the
|
||||||
|
** drawable is not currently bound (e.g., potentially during a
|
||||||
|
** SwapBuffers request). The dummy context is created when the
|
||||||
|
** first "real" context is created on this screen.
|
||||||
|
*/
|
||||||
|
__DRIcontextPrivate dummyContextPriv;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Hash table to hold the drawable information for this screen.
|
||||||
|
*/
|
||||||
|
void *drawHash;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Device-dependent private information (not stored in the SAREA).
|
||||||
|
** This pointer is never touched by the DRI layer.
|
||||||
|
*/
|
||||||
|
void *private;
|
||||||
|
|
||||||
|
/* If we're in full screen mode (via DRIOpenFullScreen), this points
|
||||||
|
to the drawable that was bound. Otherwise, this is NULL. */
|
||||||
|
__DRIdrawablePrivate *fullscreen;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Number of visuals (configs) for this screen, and a pointer to them.
|
||||||
|
*/
|
||||||
|
int numConfigs;
|
||||||
|
__GLXvisualConfig *configs;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void
|
||||||
|
__driUtilMessage(const char *f, ...);
|
||||||
|
|
||||||
|
|
||||||
|
extern void
|
||||||
|
__driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp);
|
||||||
|
|
||||||
|
|
||||||
|
extern __DRIscreenPrivate *
|
||||||
|
__driUtilCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
|
||||||
|
int numConfigs, __GLXvisualConfig *config,
|
||||||
|
const struct __DriverAPIRec *driverAPI);
|
||||||
|
|
||||||
|
/* This must be implemented in each driver */
|
||||||
|
extern void *
|
||||||
|
__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
|
||||||
|
int numConfigs, __GLXvisualConfig *config);
|
||||||
|
|
||||||
|
|
||||||
|
/* This is optionally implemented in each driver */
|
||||||
|
extern void
|
||||||
|
__driRegisterExtensions( void );
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _DRI_UTIL_H_ */
|
||||||
474
src/dri-es/drm.h
Normal file
474
src/dri-es/drm.h
Normal file
@@ -0,0 +1,474 @@
|
|||||||
|
/* drm.h -- Header for Direct Rendering Manager -*- linux-c -*-
|
||||||
|
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
|
||||||
|
*
|
||||||
|
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
||||||
|
* 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* VA LINUX SYSTEMS AND/OR ITS 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.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
|
*
|
||||||
|
* Acknowledgements:
|
||||||
|
* Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DRM_H_
|
||||||
|
#define _DRM_H_
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <asm/ioctl.h> /* For _IO* macros */
|
||||||
|
#define DRM_IOCTL_NR(n) _IOC_NR(n)
|
||||||
|
#define DRM_IOC_VOID _IOC_NONE
|
||||||
|
#define DRM_IOC_READ _IOC_READ
|
||||||
|
#define DRM_IOC_WRITE _IOC_WRITE
|
||||||
|
#define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE
|
||||||
|
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
|
||||||
|
#elif defined(__FreeBSD__) || defined(__NetBSD__)
|
||||||
|
#if defined(__FreeBSD__) && defined(XFree86Server)
|
||||||
|
/* Prevent name collision when including sys/ioccom.h */
|
||||||
|
#undef ioctl
|
||||||
|
#include <sys/ioccom.h>
|
||||||
|
#define ioctl(a,b,c) xf86ioctl(a,b,c)
|
||||||
|
#else
|
||||||
|
#include <sys/ioccom.h>
|
||||||
|
#endif /* __FreeBSD__ && xf86ioctl */
|
||||||
|
#define DRM_IOCTL_NR(n) ((n) & 0xff)
|
||||||
|
#define DRM_IOC_VOID IOC_VOID
|
||||||
|
#define DRM_IOC_READ IOC_OUT
|
||||||
|
#define DRM_IOC_WRITE IOC_IN
|
||||||
|
#define DRM_IOC_READWRITE IOC_INOUT
|
||||||
|
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define XFREE86_VERSION(major,minor,patch,snap) \
|
||||||
|
((major << 16) | (minor << 8) | patch)
|
||||||
|
|
||||||
|
#ifndef CONFIG_XFREE86_VERSION
|
||||||
|
#define CONFIG_XFREE86_VERSION XFREE86_VERSION(4,1,0,0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0)
|
||||||
|
#define DRM_PROC_DEVICES "/proc/devices"
|
||||||
|
#define DRM_PROC_MISC "/proc/misc"
|
||||||
|
#define DRM_PROC_DRM "/proc/drm"
|
||||||
|
#define DRM_DEV_DRM "/dev/drm"
|
||||||
|
#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
|
||||||
|
#define DRM_DEV_UID 0
|
||||||
|
#define DRM_DEV_GID 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_XFREE86_VERSION >= XFREE86_VERSION(4,1,0,0)
|
||||||
|
#define DRM_MAJOR 226
|
||||||
|
#define DRM_MAX_MINOR 15
|
||||||
|
#endif
|
||||||
|
#define DRM_NAME "drm" /* Name in kernel, /dev, and /proc */
|
||||||
|
#define DRM_MIN_ORDER 5 /* At least 2^5 bytes = 32 bytes */
|
||||||
|
#define DRM_MAX_ORDER 22 /* Up to 2^22 bytes = 4MB */
|
||||||
|
#define DRM_RAM_PERCENT 10 /* How much system ram can we lock? */
|
||||||
|
|
||||||
|
#define _DRM_LOCK_HELD 0x80000000 /* Hardware lock is held */
|
||||||
|
#define _DRM_LOCK_CONT 0x40000000 /* Hardware lock is contended */
|
||||||
|
#define _DRM_LOCK_IS_HELD(lock) ((lock) & _DRM_LOCK_HELD)
|
||||||
|
#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT)
|
||||||
|
#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT))
|
||||||
|
|
||||||
|
typedef unsigned long drm_handle_t;
|
||||||
|
typedef unsigned int drm_context_t;
|
||||||
|
typedef unsigned int drm_drawable_t;
|
||||||
|
typedef unsigned int drm_magic_t;
|
||||||
|
|
||||||
|
/* Warning: If you change this structure, make sure you change
|
||||||
|
* XF86DRIClipRectRec in the server as well */
|
||||||
|
|
||||||
|
/* KW: Actually it's illegal to change either for
|
||||||
|
* backwards-compatibility reasons.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct drm_clip_rect {
|
||||||
|
unsigned short x1;
|
||||||
|
unsigned short y1;
|
||||||
|
unsigned short x2;
|
||||||
|
unsigned short y2;
|
||||||
|
} drm_clip_rect_t;
|
||||||
|
|
||||||
|
typedef struct drm_tex_region {
|
||||||
|
unsigned char next;
|
||||||
|
unsigned char prev;
|
||||||
|
unsigned char in_use;
|
||||||
|
unsigned char padding;
|
||||||
|
unsigned int age;
|
||||||
|
} drm_tex_region_t;
|
||||||
|
|
||||||
|
typedef struct drm_version {
|
||||||
|
int version_major; /* Major version */
|
||||||
|
int version_minor; /* Minor version */
|
||||||
|
int version_patchlevel;/* Patch level */
|
||||||
|
size_t name_len; /* Length of name buffer */
|
||||||
|
char *name; /* Name of driver */
|
||||||
|
size_t date_len; /* Length of date buffer */
|
||||||
|
char *date; /* User-space buffer to hold date */
|
||||||
|
size_t desc_len; /* Length of desc buffer */
|
||||||
|
char *desc; /* User-space buffer to hold desc */
|
||||||
|
} drm_version_t;
|
||||||
|
|
||||||
|
typedef struct drm_unique {
|
||||||
|
size_t unique_len; /* Length of unique */
|
||||||
|
char *unique; /* Unique name for driver instantiation */
|
||||||
|
} drm_unique_t;
|
||||||
|
|
||||||
|
typedef struct drm_list {
|
||||||
|
int count; /* Length of user-space structures */
|
||||||
|
drm_version_t *version;
|
||||||
|
} drm_list_t;
|
||||||
|
|
||||||
|
typedef struct drm_block {
|
||||||
|
int unused;
|
||||||
|
} drm_block_t;
|
||||||
|
|
||||||
|
typedef struct drm_control {
|
||||||
|
enum {
|
||||||
|
DRM_ADD_COMMAND,
|
||||||
|
DRM_RM_COMMAND,
|
||||||
|
DRM_INST_HANDLER,
|
||||||
|
DRM_UNINST_HANDLER
|
||||||
|
} func;
|
||||||
|
int irq;
|
||||||
|
} drm_control_t;
|
||||||
|
|
||||||
|
typedef enum drm_map_type {
|
||||||
|
_DRM_FRAME_BUFFER = 0, /* WC (no caching), no core dump */
|
||||||
|
_DRM_REGISTERS = 1, /* no caching, no core dump */
|
||||||
|
_DRM_SHM = 2, /* shared, cached */
|
||||||
|
_DRM_AGP = 3, /* AGP/GART */
|
||||||
|
_DRM_SCATTER_GATHER = 4 /* Scatter/gather memory for PCI DMA */
|
||||||
|
} drm_map_type_t;
|
||||||
|
|
||||||
|
typedef enum drm_map_flags {
|
||||||
|
_DRM_RESTRICTED = 0x01, /* Cannot be mapped to user-virtual */
|
||||||
|
_DRM_READ_ONLY = 0x02,
|
||||||
|
_DRM_LOCKED = 0x04, /* shared, cached, locked */
|
||||||
|
_DRM_KERNEL = 0x08, /* kernel requires access */
|
||||||
|
_DRM_WRITE_COMBINING = 0x10, /* use write-combining if available */
|
||||||
|
_DRM_CONTAINS_LOCK = 0x20, /* SHM page that contains lock */
|
||||||
|
_DRM_REMOVABLE = 0x40 /* Removable mapping */
|
||||||
|
} drm_map_flags_t;
|
||||||
|
|
||||||
|
typedef struct drm_ctx_priv_map {
|
||||||
|
unsigned int ctx_id; /* Context requesting private mapping */
|
||||||
|
void *handle; /* Handle of map */
|
||||||
|
} drm_ctx_priv_map_t;
|
||||||
|
|
||||||
|
typedef struct drm_map {
|
||||||
|
unsigned long offset; /* Requested physical address (0 for SAREA)*/
|
||||||
|
unsigned long size; /* Requested physical size (bytes) */
|
||||||
|
drm_map_type_t type; /* Type of memory to map */
|
||||||
|
drm_map_flags_t flags; /* Flags */
|
||||||
|
void *handle; /* User-space: "Handle" to pass to mmap */
|
||||||
|
/* Kernel-space: kernel-virtual address */
|
||||||
|
int mtrr; /* MTRR slot used */
|
||||||
|
/* Private data */
|
||||||
|
} drm_map_t;
|
||||||
|
|
||||||
|
typedef struct drm_client {
|
||||||
|
int idx; /* Which client desired? */
|
||||||
|
int auth; /* Is client authenticated? */
|
||||||
|
unsigned long pid; /* Process id */
|
||||||
|
unsigned long uid; /* User id */
|
||||||
|
unsigned long magic; /* Magic */
|
||||||
|
unsigned long iocs; /* Ioctl count */
|
||||||
|
} drm_client_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
_DRM_STAT_LOCK,
|
||||||
|
_DRM_STAT_OPENS,
|
||||||
|
_DRM_STAT_CLOSES,
|
||||||
|
_DRM_STAT_IOCTLS,
|
||||||
|
_DRM_STAT_LOCKS,
|
||||||
|
_DRM_STAT_UNLOCKS,
|
||||||
|
_DRM_STAT_VALUE, /* Generic value */
|
||||||
|
_DRM_STAT_BYTE, /* Generic byte counter (1024bytes/K) */
|
||||||
|
_DRM_STAT_COUNT, /* Generic non-byte counter (1000/k) */
|
||||||
|
|
||||||
|
_DRM_STAT_IRQ, /* IRQ */
|
||||||
|
_DRM_STAT_PRIMARY, /* Primary DMA bytes */
|
||||||
|
_DRM_STAT_SECONDARY, /* Secondary DMA bytes */
|
||||||
|
_DRM_STAT_DMA, /* DMA */
|
||||||
|
_DRM_STAT_SPECIAL, /* Special DMA (e.g., priority or polled) */
|
||||||
|
_DRM_STAT_MISSED /* Missed DMA opportunity */
|
||||||
|
|
||||||
|
/* Add to the *END* of the list */
|
||||||
|
} drm_stat_type_t;
|
||||||
|
|
||||||
|
typedef struct drm_stats {
|
||||||
|
unsigned long count;
|
||||||
|
struct {
|
||||||
|
unsigned long value;
|
||||||
|
drm_stat_type_t type;
|
||||||
|
} data[15];
|
||||||
|
} drm_stats_t;
|
||||||
|
|
||||||
|
typedef enum drm_lock_flags {
|
||||||
|
_DRM_LOCK_READY = 0x01, /* Wait until hardware is ready for DMA */
|
||||||
|
_DRM_LOCK_QUIESCENT = 0x02, /* Wait until hardware quiescent */
|
||||||
|
_DRM_LOCK_FLUSH = 0x04, /* Flush this context's DMA queue first */
|
||||||
|
_DRM_LOCK_FLUSH_ALL = 0x08, /* Flush all DMA queues first */
|
||||||
|
/* These *HALT* flags aren't supported yet
|
||||||
|
-- they will be used to support the
|
||||||
|
full-screen DGA-like mode. */
|
||||||
|
_DRM_HALT_ALL_QUEUES = 0x10, /* Halt all current and future queues */
|
||||||
|
_DRM_HALT_CUR_QUEUES = 0x20 /* Halt all current queues */
|
||||||
|
} drm_lock_flags_t;
|
||||||
|
|
||||||
|
typedef struct drm_lock {
|
||||||
|
int context;
|
||||||
|
drm_lock_flags_t flags;
|
||||||
|
} drm_lock_t;
|
||||||
|
|
||||||
|
typedef enum drm_dma_flags { /* These values *MUST* match xf86drm.h */
|
||||||
|
/* Flags for DMA buffer dispatch */
|
||||||
|
_DRM_DMA_BLOCK = 0x01, /* Block until buffer dispatched.
|
||||||
|
Note, the buffer may not yet have
|
||||||
|
been processed by the hardware --
|
||||||
|
getting a hardware lock with the
|
||||||
|
hardware quiescent will ensure
|
||||||
|
that the buffer has been
|
||||||
|
processed. */
|
||||||
|
_DRM_DMA_WHILE_LOCKED = 0x02, /* Dispatch while lock held */
|
||||||
|
_DRM_DMA_PRIORITY = 0x04, /* High priority dispatch */
|
||||||
|
|
||||||
|
/* Flags for DMA buffer request */
|
||||||
|
_DRM_DMA_WAIT = 0x10, /* Wait for free buffers */
|
||||||
|
_DRM_DMA_SMALLER_OK = 0x20, /* Smaller-than-requested buffers ok */
|
||||||
|
_DRM_DMA_LARGER_OK = 0x40 /* Larger-than-requested buffers ok */
|
||||||
|
} drm_dma_flags_t;
|
||||||
|
|
||||||
|
typedef struct drm_buf_desc {
|
||||||
|
int count; /* Number of buffers of this size */
|
||||||
|
int size; /* Size in bytes */
|
||||||
|
int low_mark; /* Low water mark */
|
||||||
|
int high_mark; /* High water mark */
|
||||||
|
enum {
|
||||||
|
_DRM_PAGE_ALIGN = 0x01, /* Align on page boundaries for DMA */
|
||||||
|
_DRM_AGP_BUFFER = 0x02, /* Buffer is in agp space */
|
||||||
|
_DRM_SG_BUFFER = 0x04 /* Scatter/gather memory buffer */
|
||||||
|
} flags;
|
||||||
|
unsigned long agp_start; /* Start address of where the agp buffers
|
||||||
|
* are in the agp aperture */
|
||||||
|
} drm_buf_desc_t;
|
||||||
|
|
||||||
|
typedef struct drm_buf_info {
|
||||||
|
int count; /* Entries in list */
|
||||||
|
drm_buf_desc_t *list;
|
||||||
|
} drm_buf_info_t;
|
||||||
|
|
||||||
|
typedef struct drm_buf_free {
|
||||||
|
int count;
|
||||||
|
int *list;
|
||||||
|
} drm_buf_free_t;
|
||||||
|
|
||||||
|
typedef struct drm_buf_pub {
|
||||||
|
int idx; /* Index into master buflist */
|
||||||
|
int total; /* Buffer size */
|
||||||
|
int used; /* Amount of buffer in use (for DMA) */
|
||||||
|
void *address; /* Address of buffer */
|
||||||
|
} drm_buf_pub_t;
|
||||||
|
|
||||||
|
typedef struct drm_buf_map {
|
||||||
|
int count; /* Length of buflist */
|
||||||
|
void *virtual; /* Mmaped area in user-virtual */
|
||||||
|
drm_buf_pub_t *list; /* Buffer information */
|
||||||
|
} drm_buf_map_t;
|
||||||
|
|
||||||
|
typedef struct drm_dma {
|
||||||
|
/* Indices here refer to the offset into
|
||||||
|
buflist in drm_buf_get_t. */
|
||||||
|
int context; /* Context handle */
|
||||||
|
int send_count; /* Number of buffers to send */
|
||||||
|
int *send_indices; /* List of handles to buffers */
|
||||||
|
int *send_sizes; /* Lengths of data to send */
|
||||||
|
drm_dma_flags_t flags; /* Flags */
|
||||||
|
int request_count; /* Number of buffers requested */
|
||||||
|
int request_size; /* Desired size for buffers */
|
||||||
|
int *request_indices; /* Buffer information */
|
||||||
|
int *request_sizes;
|
||||||
|
int granted_count; /* Number of buffers granted */
|
||||||
|
} drm_dma_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
_DRM_CONTEXT_PRESERVED = 0x01,
|
||||||
|
_DRM_CONTEXT_2DONLY = 0x02
|
||||||
|
} drm_ctx_flags_t;
|
||||||
|
|
||||||
|
typedef struct drm_ctx {
|
||||||
|
drm_context_t handle;
|
||||||
|
drm_ctx_flags_t flags;
|
||||||
|
} drm_ctx_t;
|
||||||
|
|
||||||
|
typedef struct drm_ctx_res {
|
||||||
|
int count;
|
||||||
|
drm_ctx_t *contexts;
|
||||||
|
} drm_ctx_res_t;
|
||||||
|
|
||||||
|
typedef struct drm_draw {
|
||||||
|
drm_drawable_t handle;
|
||||||
|
} drm_draw_t;
|
||||||
|
|
||||||
|
typedef struct drm_auth {
|
||||||
|
drm_magic_t magic;
|
||||||
|
} drm_auth_t;
|
||||||
|
|
||||||
|
typedef struct drm_irq_busid {
|
||||||
|
int irq;
|
||||||
|
int busnum;
|
||||||
|
int devnum;
|
||||||
|
int funcnum;
|
||||||
|
} drm_irq_busid_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
_DRM_VBLANK_ABSOLUTE = 0x0, /* Wait for specific vblank sequence number */
|
||||||
|
_DRM_VBLANK_RELATIVE = 0x1, /* Wait for given number of vblanks */
|
||||||
|
_DRM_VBLANK_SIGNAL = 0x40000000 /* Send signal instead of blocking */
|
||||||
|
} drm_vblank_seq_type_t;
|
||||||
|
|
||||||
|
#define _DRM_VBLANK_FLAGS_MASK _DRM_VBLANK_SIGNAL
|
||||||
|
|
||||||
|
struct drm_wait_vblank_request {
|
||||||
|
drm_vblank_seq_type_t type;
|
||||||
|
unsigned int sequence;
|
||||||
|
unsigned long signal;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_wait_vblank_reply {
|
||||||
|
drm_vblank_seq_type_t type;
|
||||||
|
unsigned int sequence;
|
||||||
|
long tval_sec;
|
||||||
|
long tval_usec;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union drm_wait_vblank {
|
||||||
|
struct drm_wait_vblank_request request;
|
||||||
|
struct drm_wait_vblank_reply reply;
|
||||||
|
} drm_wait_vblank_t;
|
||||||
|
|
||||||
|
typedef struct drm_agp_mode {
|
||||||
|
unsigned long mode;
|
||||||
|
} drm_agp_mode_t;
|
||||||
|
|
||||||
|
/* For drm_agp_alloc -- allocated a buffer */
|
||||||
|
typedef struct drm_agp_buffer {
|
||||||
|
unsigned long size; /* In bytes -- will round to page boundary */
|
||||||
|
unsigned long handle; /* Used for BIND/UNBIND ioctls */
|
||||||
|
unsigned long type; /* Type of memory to allocate */
|
||||||
|
unsigned long physical; /* Physical used by i810 */
|
||||||
|
} drm_agp_buffer_t;
|
||||||
|
|
||||||
|
/* For drm_agp_bind */
|
||||||
|
typedef struct drm_agp_binding {
|
||||||
|
unsigned long handle; /* From drm_agp_buffer */
|
||||||
|
unsigned long offset; /* In bytes -- will round to page boundary */
|
||||||
|
} drm_agp_binding_t;
|
||||||
|
|
||||||
|
typedef struct drm_agp_info {
|
||||||
|
int agp_version_major;
|
||||||
|
int agp_version_minor;
|
||||||
|
unsigned long mode;
|
||||||
|
unsigned long aperture_base; /* physical address */
|
||||||
|
unsigned long aperture_size; /* bytes */
|
||||||
|
unsigned long memory_allowed; /* bytes */
|
||||||
|
unsigned long memory_used;
|
||||||
|
|
||||||
|
/* PCI information */
|
||||||
|
unsigned short id_vendor;
|
||||||
|
unsigned short id_device;
|
||||||
|
} drm_agp_info_t;
|
||||||
|
|
||||||
|
typedef struct drm_scatter_gather {
|
||||||
|
unsigned long size; /* In bytes -- will round to page boundary */
|
||||||
|
unsigned long handle; /* Used for mapping / unmapping */
|
||||||
|
} drm_scatter_gather_t;
|
||||||
|
|
||||||
|
#define DRM_IOCTL_BASE 'd'
|
||||||
|
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
|
||||||
|
#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
|
||||||
|
#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
|
||||||
|
#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_VERSION DRM_IOWR(0x00, drm_version_t)
|
||||||
|
#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm_unique_t)
|
||||||
|
#define DRM_IOCTL_GET_MAGIC DRM_IOR( 0x02, drm_auth_t)
|
||||||
|
#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, drm_irq_busid_t)
|
||||||
|
#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, drm_map_t)
|
||||||
|
#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, drm_client_t)
|
||||||
|
#define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, drm_stats_t)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm_unique_t)
|
||||||
|
#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, drm_auth_t)
|
||||||
|
#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, drm_block_t)
|
||||||
|
#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, drm_block_t)
|
||||||
|
#define DRM_IOCTL_CONTROL DRM_IOW( 0x14, drm_control_t)
|
||||||
|
#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, drm_map_t)
|
||||||
|
#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, drm_buf_desc_t)
|
||||||
|
#define DRM_IOCTL_MARK_BUFS DRM_IOW( 0x17, drm_buf_desc_t)
|
||||||
|
#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm_buf_info_t)
|
||||||
|
#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm_buf_map_t)
|
||||||
|
#define DRM_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm_buf_free_t)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_RM_MAP DRM_IOW( 0x1b, drm_map_t)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, drm_ctx_priv_map_t)
|
||||||
|
#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, drm_ctx_priv_map_t)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, drm_ctx_t)
|
||||||
|
#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, drm_ctx_t)
|
||||||
|
#define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, drm_ctx_t)
|
||||||
|
#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, drm_ctx_t)
|
||||||
|
#define DRM_IOCTL_SWITCH_CTX DRM_IOW( 0x24, drm_ctx_t)
|
||||||
|
#define DRM_IOCTL_NEW_CTX DRM_IOW( 0x25, drm_ctx_t)
|
||||||
|
#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, drm_ctx_res_t)
|
||||||
|
#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, drm_draw_t)
|
||||||
|
#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, drm_draw_t)
|
||||||
|
#define DRM_IOCTL_DMA DRM_IOWR(0x29, drm_dma_t)
|
||||||
|
#define DRM_IOCTL_LOCK DRM_IOW( 0x2a, drm_lock_t)
|
||||||
|
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, drm_lock_t)
|
||||||
|
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, drm_lock_t)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
|
||||||
|
#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
|
||||||
|
#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, drm_agp_mode_t)
|
||||||
|
#define DRM_IOCTL_AGP_INFO DRM_IOR( 0x33, drm_agp_info_t)
|
||||||
|
#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, drm_agp_buffer_t)
|
||||||
|
#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, drm_agp_buffer_t)
|
||||||
|
#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, drm_agp_binding_t)
|
||||||
|
#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, drm_agp_binding_t)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_SG_ALLOC DRM_IOW( 0x38, drm_scatter_gather_t)
|
||||||
|
#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, drm_scatter_gather_t)
|
||||||
|
|
||||||
|
#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, drm_wait_vblank_t)
|
||||||
|
|
||||||
|
/* Device specfic ioctls should only be in their respective headers
|
||||||
|
* The device specific ioctl range is 0x40 to 0x79. */
|
||||||
|
#define DRM_COMMAND_BASE 0x40
|
||||||
|
|
||||||
|
#endif
|
||||||
224
src/dri-es/extutil.h
Normal file
224
src/dri-es/extutil.h
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
/*
|
||||||
|
* $Xorg: extutil.h,v 1.4 2001/02/09 02:03:24 xorgcvs Exp $
|
||||||
|
*
|
||||||
|
Copyright 1989, 1998 The Open Group
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
the above copyright notice appear in all copies and that both that
|
||||||
|
copyright notice and this permission notice appear in supporting
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
OPEN GROUP 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.
|
||||||
|
|
||||||
|
Except as contained in this notice, the name of The Open Group shall not be
|
||||||
|
used in advertising or otherwise to promote the sale, use or other dealings
|
||||||
|
in this Software without prior written authorization from The Open Group.
|
||||||
|
*
|
||||||
|
* Author: Jim Fulton, MIT The Open Group
|
||||||
|
*
|
||||||
|
* Xlib Extension-Writing Utilities
|
||||||
|
*
|
||||||
|
* This package contains utilities for writing the client API for various
|
||||||
|
* protocol extensions. THESE INTERFACES ARE NOT PART OF THE X STANDARD AND
|
||||||
|
* ARE SUBJECT TO CHANGE!
|
||||||
|
*/
|
||||||
|
/* $XFree86: xc/include/extensions/extutil.h,v 1.9 2001/12/14 19:53:28 dawes Exp $ */
|
||||||
|
|
||||||
|
#ifndef _EXTUTIL_H_
|
||||||
|
#define _EXTUTIL_H_
|
||||||
|
|
||||||
|
#include <X11/extensions/Xext.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to keep a list of open displays since the Xlib display list isn't
|
||||||
|
* public. We also have to per-display info in a separate block since it isn't
|
||||||
|
* stored directly in the Display structure.
|
||||||
|
*/
|
||||||
|
typedef struct _XExtDisplayInfo {
|
||||||
|
struct _XExtDisplayInfo *next; /* keep a linked list */
|
||||||
|
Display *display; /* which display this is */
|
||||||
|
XExtCodes *codes; /* the extension protocol codes */
|
||||||
|
XPointer data; /* extra data for extension to use */
|
||||||
|
} XExtDisplayInfo;
|
||||||
|
|
||||||
|
typedef struct _XExtensionInfo {
|
||||||
|
XExtDisplayInfo *head; /* start of list */
|
||||||
|
XExtDisplayInfo *cur; /* most recently used */
|
||||||
|
int ndisplays; /* number of displays */
|
||||||
|
} XExtensionInfo;
|
||||||
|
|
||||||
|
typedef struct _XExtensionHooks {
|
||||||
|
int (*create_gc)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
GC /* gc */,
|
||||||
|
XExtCodes* /* codes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
int (*copy_gc)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
GC /* gc */,
|
||||||
|
XExtCodes* /* codes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
int (*flush_gc)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
GC /* gc */,
|
||||||
|
XExtCodes* /* codes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
int (*free_gc)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
GC /* gc */,
|
||||||
|
XExtCodes* /* codes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
int (*create_font)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
XFontStruct* /* fs */,
|
||||||
|
XExtCodes* /* codes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
int (*free_font)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
XFontStruct* /* fs */,
|
||||||
|
XExtCodes* /* codes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
int (*close_display)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
XExtCodes* /* codes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
Bool (*wire_to_event)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
XEvent* /* re */,
|
||||||
|
xEvent* /* event */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
Status (*event_to_wire)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
XEvent* /* re */,
|
||||||
|
xEvent* /* event */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
int (*error)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
xError* /* err */,
|
||||||
|
XExtCodes* /* codes */,
|
||||||
|
int* /* ret_code */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
char *(*error_string)(
|
||||||
|
#if NeedNestedPrototypes
|
||||||
|
Display* /* display */,
|
||||||
|
int /* code */,
|
||||||
|
XExtCodes* /* codes */,
|
||||||
|
char* /* buffer */,
|
||||||
|
int /* nbytes */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
} XExtensionHooks;
|
||||||
|
|
||||||
|
extern XExtensionInfo *XextCreateExtension(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
void
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
extern void XextDestroyExtension(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
XExtensionInfo* /* info */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
extern XExtDisplayInfo *XextAddDisplay(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
XExtensionInfo* /* extinfo */,
|
||||||
|
Display* /* dpy */,
|
||||||
|
char* /* ext_name */,
|
||||||
|
XExtensionHooks* /* hooks */,
|
||||||
|
int /* nevents */,
|
||||||
|
XPointer /* data */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
extern int XextRemoveDisplay(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
XExtensionInfo* /* extinfo */,
|
||||||
|
Display* /* dpy */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
extern XExtDisplayInfo *XextFindDisplay(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
XExtensionInfo* /* extinfo */,
|
||||||
|
Display* /* dpy */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
#define XextHasExtension(i) ((i) && ((i)->codes))
|
||||||
|
#define XextCheckExtension(dpy,i,name,val) \
|
||||||
|
if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return val; }
|
||||||
|
#define XextSimpleCheckExtension(dpy,i,name) \
|
||||||
|
if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* helper macros to generate code that is common to all extensions; caller
|
||||||
|
* should prefix it with static if extension source is in one file; this
|
||||||
|
* could be a utility function, but have to stack 6 unused arguments for
|
||||||
|
* something that is called many, many times would be bad.
|
||||||
|
*/
|
||||||
|
#define XEXT_GENERATE_FIND_DISPLAY(proc,extinfo,extname,hooks,nev,data) \
|
||||||
|
XExtDisplayInfo *proc (Display *dpy) \
|
||||||
|
{ \
|
||||||
|
XExtDisplayInfo *dpyinfo; \
|
||||||
|
if (!extinfo) { if (!(extinfo = XextCreateExtension())) return NULL; } \
|
||||||
|
if (!(dpyinfo = XextFindDisplay (extinfo, dpy))) \
|
||||||
|
dpyinfo = XextAddDisplay (extinfo,dpy,extname,hooks,nev,data); \
|
||||||
|
return dpyinfo; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define XEXT_FIND_DISPLAY_PROTO(proc) \
|
||||||
|
XExtDisplayInfo *proc(Display *dpy)
|
||||||
|
|
||||||
|
#define XEXT_GENERATE_CLOSE_DISPLAY(proc,extinfo) \
|
||||||
|
int proc (Display *dpy, XExtCodes *codes) \
|
||||||
|
{ \
|
||||||
|
return XextRemoveDisplay (extinfo, dpy); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define XEXT_CLOSE_DISPLAY_PROTO(proc) \
|
||||||
|
int proc(Display *dpy, XExtCodes *codes)
|
||||||
|
|
||||||
|
#define XEXT_GENERATE_ERROR_STRING(proc,extname,nerr,errl) \
|
||||||
|
char *proc (Display *dpy, int code, XExtCodes *codes, char *buf, int n) \
|
||||||
|
{ \
|
||||||
|
code -= codes->first_error; \
|
||||||
|
if (code >= 0 && code < nerr) { \
|
||||||
|
char tmp[256]; \
|
||||||
|
sprintf (tmp, "%s.%d", extname, code); \
|
||||||
|
XGetErrorDatabaseText (dpy, "XProtoError", tmp, errl[code], buf, n); \
|
||||||
|
return buf; \
|
||||||
|
} \
|
||||||
|
return (char *)0; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define XEXT_ERROR_STRING_PROTO(proc) \
|
||||||
|
char *proc(Display *dpy, int code, XExtCodes *codes, char *buf, int n)
|
||||||
|
#endif
|
||||||
678
src/dri-es/glxclient.h
Normal file
678
src/dri-es/glxclient.h
Normal file
@@ -0,0 +1,678 @@
|
|||||||
|
/*
|
||||||
|
** 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.1 (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-2000 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.
|
||||||
|
*/
|
||||||
|
/* $XFree86: xc/lib/GL/glx/glxclient.h,v 1.14 2002/02/22 21:32:53 dawes Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Direct rendering support added by Precision Insight, Inc.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <kevin@precisioninsight.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _GLX_client_h_
|
||||||
|
#define _GLX_client_h_
|
||||||
|
#define NEED_REPLIES
|
||||||
|
#define NEED_EVENTS
|
||||||
|
#include <X11/Xproto.h>
|
||||||
|
#include <X11/Xlibint.h>
|
||||||
|
#define GLX_GLXEXT_PROTOTYPES
|
||||||
|
#include <GL/glx.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "GL/glxint.h"
|
||||||
|
#include "GL/glxproto.h"
|
||||||
|
#include "glapitable.h"
|
||||||
|
#ifdef NEED_GL_FUNCS_WRAPPED
|
||||||
|
#include "indirect.h"
|
||||||
|
#endif
|
||||||
|
#ifdef XTHREADS
|
||||||
|
#include "Xthreads.h"
|
||||||
|
#endif
|
||||||
|
#ifdef GLX_BUILT_IN_XMESA
|
||||||
|
#include "realglx.h" /* just silences prototype warnings */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GLX_MAJOR_VERSION 1 /* current version numbers */
|
||||||
|
#define GLX_MINOR_VERSION 2
|
||||||
|
|
||||||
|
#define __GL_BOOLEAN_ARRAY (GL_BYTE - 1)
|
||||||
|
|
||||||
|
#define __GLX_MAX_TEXTURE_UNITS 32
|
||||||
|
|
||||||
|
typedef struct __GLXcontextRec __GLXcontext;
|
||||||
|
typedef struct __GLXdisplayPrivateRec __GLXdisplayPrivate;
|
||||||
|
typedef struct _glapi_table __GLapi;
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following structures define the interface between the GLX client
|
||||||
|
** side library and the DRI (direct rendering infrastructure).
|
||||||
|
*/
|
||||||
|
typedef struct __DRIdisplayRec __DRIdisplay;
|
||||||
|
typedef struct __DRIscreenRec __DRIscreen;
|
||||||
|
typedef struct __DRIcontextRec __DRIcontext;
|
||||||
|
typedef struct __DRIdrawableRec __DRIdrawable;
|
||||||
|
typedef struct __DRIdriverRec __DRIdriver;
|
||||||
|
|
||||||
|
extern __DRIscreen *__glXFindDRIScreen(Display *dpy, int scrn);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Display dependent methods. This structure is initialized during the
|
||||||
|
** driCreateDisplay() call.
|
||||||
|
*/
|
||||||
|
struct __DRIdisplayRec {
|
||||||
|
/*
|
||||||
|
** Method to destroy the private DRI display data.
|
||||||
|
*/
|
||||||
|
void (*destroyDisplay)(Display *dpy, void *displayPrivate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Methods to create the private DRI screen data and initialize the
|
||||||
|
** screen dependent methods.
|
||||||
|
** This is an array [indexed by screen number] of function pointers.
|
||||||
|
*/
|
||||||
|
void *(**createScreen)(Display *dpy, int scrn, __DRIscreen *psc,
|
||||||
|
int numConfigs, __GLXvisualConfig *config);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Opaque pointer to private per display direct rendering data.
|
||||||
|
** NULL if direct rendering is not supported on this display. Never
|
||||||
|
** dereferenced in libGL.
|
||||||
|
*/
|
||||||
|
void *private;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Screen dependent methods. This structure is initialized during the
|
||||||
|
** (*createScreen)() call.
|
||||||
|
*/
|
||||||
|
struct __DRIscreenRec {
|
||||||
|
/*
|
||||||
|
** Method to destroy the private DRI screen data.
|
||||||
|
*/
|
||||||
|
void (*destroyScreen)(Display *dpy, int scrn, void *screenPrivate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Method to create the private DRI context data and initialize the
|
||||||
|
** context dependent methods.
|
||||||
|
*/
|
||||||
|
void *(*createContext)(Display *dpy, XVisualInfo *vis, void *sharedPrivate,
|
||||||
|
__DRIcontext *pctx);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Method to create the private DRI drawable data and initialize the
|
||||||
|
** drawable dependent methods.
|
||||||
|
*/
|
||||||
|
void *(*createDrawable)(Display *dpy, int scrn, GLXDrawable draw,
|
||||||
|
VisualID vid, __DRIdrawable *pdraw);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Method to return a pointer to the DRI drawable data.
|
||||||
|
*/
|
||||||
|
__DRIdrawable *(*getDrawable)(Display *dpy, GLXDrawable draw,
|
||||||
|
void *drawablePrivate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** XXX in the future, implement this:
|
||||||
|
void *(*createPBuffer)(Display *dpy, int scrn, GLXPbuffer pbuffer,
|
||||||
|
GLXFBConfig config, __DRIdrawable *pdraw);
|
||||||
|
**/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Opaque pointer to private per screen direct rendering data. NULL
|
||||||
|
** if direct rendering is not supported on this screen. Never
|
||||||
|
** dereferenced in libGL.
|
||||||
|
*/
|
||||||
|
void *private;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Context dependent methods. This structure is initialized during the
|
||||||
|
** (*createContext)() call.
|
||||||
|
*/
|
||||||
|
struct __DRIcontextRec {
|
||||||
|
/*
|
||||||
|
** Method to destroy the private DRI context data.
|
||||||
|
*/
|
||||||
|
void (*destroyContext)(Display *dpy, int scrn, void *contextPrivate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Method to bind a DRI drawable to a DRI graphics context.
|
||||||
|
** XXX in the future, also pass a 'read' GLXDrawable for
|
||||||
|
** glXMakeCurrentReadSGI() and GLX 1.3's glXMakeContextCurrent().
|
||||||
|
*/
|
||||||
|
Bool (*bindContext)(Display *dpy, int scrn, GLXDrawable draw,
|
||||||
|
GLXContext gc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Method to unbind a DRI drawable to a DRI graphics context.
|
||||||
|
*/
|
||||||
|
Bool (*unbindContext)(Display *dpy, int scrn, GLXDrawable draw,
|
||||||
|
GLXContext gc, int will_rebind);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Opaque pointer to private per context direct rendering data.
|
||||||
|
** NULL if direct rendering is not supported on the display or
|
||||||
|
** screen used to create this context. Never dereferenced in libGL.
|
||||||
|
*/
|
||||||
|
void *private;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Drawable dependent methods. This structure is initialized during the
|
||||||
|
** (*createDrawable)() call. createDrawable() is not called by libGL at
|
||||||
|
** this time. It's currently used via the dri_util.c utility code instead.
|
||||||
|
*/
|
||||||
|
struct __DRIdrawableRec {
|
||||||
|
/*
|
||||||
|
** Method to destroy the private DRI drawable data.
|
||||||
|
*/
|
||||||
|
void (*destroyDrawable)(Display *dpy, void *drawablePrivate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Method to swap the front and back buffers.
|
||||||
|
*/
|
||||||
|
void (*swapBuffers)(Display *dpy, void *drawablePrivate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Opaque pointer to private per drawable direct rendering data.
|
||||||
|
** NULL if direct rendering is not supported on the display or
|
||||||
|
** screen used to create this drawable. Never dereferenced in libGL.
|
||||||
|
*/
|
||||||
|
void *private;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef void *(*CreateScreenFunc)(Display *dpy, int scrn, __DRIscreen *psc,
|
||||||
|
int numConfigs, __GLXvisualConfig *config);
|
||||||
|
|
||||||
|
typedef void *(*RegisterExtensionsFunc)(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** We keep a linked list of these structures, one per DRI device driver.
|
||||||
|
*/
|
||||||
|
struct __DRIdriverRec {
|
||||||
|
const char *name;
|
||||||
|
void *handle;
|
||||||
|
CreateScreenFunc createScreenFunc;
|
||||||
|
RegisterExtensionsFunc registerExtensionsFunc;
|
||||||
|
struct __DRIdriverRec *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Function to create and DRI display data and initialize the display
|
||||||
|
** dependent methods.
|
||||||
|
*/
|
||||||
|
extern void *driCreateDisplay(Display *dpy, __DRIdisplay *pdisp);
|
||||||
|
|
||||||
|
extern __DRIdriver *driGetDriver(Display *dpy, int scrNum);
|
||||||
|
|
||||||
|
extern void DRI_glXUseXFont( Font font, int first, int count, int listbase );
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
#define __GL_CLIENT_ATTRIB_STACK_DEPTH 16
|
||||||
|
|
||||||
|
typedef struct __GLXpixelStoreModeRec {
|
||||||
|
GLboolean swapEndian;
|
||||||
|
GLboolean lsbFirst;
|
||||||
|
GLuint rowLength;
|
||||||
|
GLuint imageHeight;
|
||||||
|
GLuint imageDepth;
|
||||||
|
GLuint skipRows;
|
||||||
|
GLuint skipPixels;
|
||||||
|
GLuint skipImages;
|
||||||
|
GLuint alignment;
|
||||||
|
} __GLXpixelStoreMode;
|
||||||
|
|
||||||
|
typedef struct __GLXvertexArrayPointerStateRec {
|
||||||
|
GLboolean enable;
|
||||||
|
void (*proc)(const void *);
|
||||||
|
const GLubyte *ptr;
|
||||||
|
GLsizei skip;
|
||||||
|
GLint size;
|
||||||
|
GLenum type;
|
||||||
|
GLsizei stride;
|
||||||
|
} __GLXvertexArrayPointerState;
|
||||||
|
|
||||||
|
typedef struct __GLXvertArrayStateRec {
|
||||||
|
__GLXvertexArrayPointerState vertex;
|
||||||
|
__GLXvertexArrayPointerState normal;
|
||||||
|
__GLXvertexArrayPointerState color;
|
||||||
|
__GLXvertexArrayPointerState index;
|
||||||
|
__GLXvertexArrayPointerState texCoord[__GLX_MAX_TEXTURE_UNITS];
|
||||||
|
__GLXvertexArrayPointerState edgeFlag;
|
||||||
|
GLint maxElementsVertices;
|
||||||
|
GLint maxElementsIndices;
|
||||||
|
GLint activeTexture;
|
||||||
|
} __GLXvertArrayState;
|
||||||
|
|
||||||
|
typedef struct __GLXattributeRec {
|
||||||
|
GLuint mask;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Pixel storage state. Most of the pixel store mode state is kept
|
||||||
|
** here and used by the client code to manage the packing and
|
||||||
|
** unpacking of data sent to/received from the server.
|
||||||
|
*/
|
||||||
|
__GLXpixelStoreMode storePack, storeUnpack;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Vertex Array storage state. The vertex array component
|
||||||
|
** state is stored here and is used to manage the packing of
|
||||||
|
** DrawArrays data sent to the server.
|
||||||
|
*/
|
||||||
|
__GLXvertArrayState vertArray;
|
||||||
|
} __GLXattribute;
|
||||||
|
|
||||||
|
typedef struct __GLXattributeMachineRec {
|
||||||
|
__GLXattribute *stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
|
||||||
|
__GLXattribute **stackPointer;
|
||||||
|
} __GLXattributeMachine;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** GLX state that needs to be kept on the client. One of these records
|
||||||
|
** exist for each context that has been made current by this client.
|
||||||
|
*/
|
||||||
|
struct __GLXcontextRec {
|
||||||
|
/*
|
||||||
|
** Drawing command buffer. Drawing commands are packed into this
|
||||||
|
** buffer before being sent as a single GLX protocol request. The
|
||||||
|
** buffer is sent when it overflows or is flushed by
|
||||||
|
** __glXFlushRenderBuffer. "pc" is the next location in the buffer
|
||||||
|
** to be filled. "limit" is described above in the buffer slop
|
||||||
|
** discussion.
|
||||||
|
**
|
||||||
|
** Commands that require large amounts of data to be transfered will
|
||||||
|
** also use this buffer to hold a header that describes the large
|
||||||
|
** command.
|
||||||
|
**
|
||||||
|
** These must be the first 6 fields since they are static initialized
|
||||||
|
** in the dummy context in glxext.c
|
||||||
|
*/
|
||||||
|
GLubyte *buf;
|
||||||
|
GLubyte *pc;
|
||||||
|
GLubyte *limit;
|
||||||
|
GLubyte *bufEnd;
|
||||||
|
GLint bufSize;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The XID of this rendering context. When the context is created a
|
||||||
|
** new XID is allocated. This is set to None when the context is
|
||||||
|
** destroyed but is still current to some thread. In this case the
|
||||||
|
** context will be freed on next MakeCurrent.
|
||||||
|
*/
|
||||||
|
XID xid;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The XID of the shareList context.
|
||||||
|
*/
|
||||||
|
XID share_xid;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Visual id.
|
||||||
|
*/
|
||||||
|
VisualID vid;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** screen number.
|
||||||
|
*/
|
||||||
|
GLint screen;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** GL_TRUE if the context was created with ImportContext, which
|
||||||
|
** means the server-side context was created by another X client.
|
||||||
|
*/
|
||||||
|
GLboolean imported;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The context tag returned by MakeCurrent when this context is made
|
||||||
|
** current. This tag is used to identify the context that a thread has
|
||||||
|
** current so that proper server context management can be done. It is
|
||||||
|
** used for all context specific commands (i.e., Render, RenderLarge,
|
||||||
|
** WaitX, WaitGL, UseXFont, and MakeCurrent (for the old context)).
|
||||||
|
*/
|
||||||
|
GLXContextTag currentContextTag;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The rendering mode is kept on the client as well as the server.
|
||||||
|
** When glRenderMode() is called, the buffer associated with the
|
||||||
|
** previous rendering mode (feedback or select) is filled.
|
||||||
|
*/
|
||||||
|
GLenum renderMode;
|
||||||
|
GLfloat *feedbackBuf;
|
||||||
|
GLuint *selectBuf;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This is GL_TRUE if the pixel unpack modes are such that an image
|
||||||
|
** can be unpacked from the clients memory by just copying. It may
|
||||||
|
** still be true that the server will have to do some work. This
|
||||||
|
** just promises that a straight copy will fetch the correct bytes.
|
||||||
|
*/
|
||||||
|
GLboolean fastImageUnpack;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Fill newImage with the unpacked form of oldImage getting it
|
||||||
|
** ready for transport to the server.
|
||||||
|
*/
|
||||||
|
void (*fillImage)(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
|
||||||
|
GLenum, const GLvoid*, GLubyte*, GLubyte*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Client side attribs.
|
||||||
|
*/
|
||||||
|
__GLXattribute state;
|
||||||
|
__GLXattributeMachine attributes;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Client side error code. This is set when client side gl API
|
||||||
|
** routines need to set an error because of a bad enumerant or
|
||||||
|
** running out of memory, etc.
|
||||||
|
*/
|
||||||
|
GLenum error;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Whether this context does direct rendering.
|
||||||
|
*/
|
||||||
|
Bool isDirect;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** dpy of current display for this context. Will be NULL if not
|
||||||
|
** current to any display, or if this is the "dummy context".
|
||||||
|
*/
|
||||||
|
Display *currentDpy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The current drawable for this context. Will be None if this
|
||||||
|
** context is not current to any drawable.
|
||||||
|
*/
|
||||||
|
GLXDrawable currentDrawable;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Constant strings that describe the server implementation
|
||||||
|
** These pertain to GL attributes, not to be confused with
|
||||||
|
** GLX versioning attributes.
|
||||||
|
*/
|
||||||
|
GLubyte *vendor;
|
||||||
|
GLubyte *renderer;
|
||||||
|
GLubyte *version;
|
||||||
|
GLubyte *extensions;
|
||||||
|
|
||||||
|
/* Record the dpy this context was created on for later freeing */
|
||||||
|
Display *createDpy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Maximum small render command size. This is the smaller of 64k and
|
||||||
|
** the size of the above buffer.
|
||||||
|
*/
|
||||||
|
GLint maxSmallRenderCommandSize;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Major opcode for the extension. Copied here so a lookup isn't
|
||||||
|
** needed.
|
||||||
|
*/
|
||||||
|
GLint majorOpcode;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Per context direct rendering interface functions and data.
|
||||||
|
*/
|
||||||
|
__DRIcontext driContext;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define __glXSetError(gc,code) \
|
||||||
|
if (!(gc)->error) { \
|
||||||
|
(gc)->error = code; \
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void __glFreeAttributeState(__GLXcontext *);
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The size of the largest drawing command known to the implementation
|
||||||
|
** that will use the GLXRender glx command. In this case it is
|
||||||
|
** glPolygonStipple.
|
||||||
|
*/
|
||||||
|
#define __GLX_MAX_SMALL_RENDER_CMD_SIZE 156
|
||||||
|
|
||||||
|
/*
|
||||||
|
** To keep the implementation fast, the code uses a "limit" pointer
|
||||||
|
** to determine when the drawing command buffer is too full to hold
|
||||||
|
** another fixed size command. This constant defines the amount of
|
||||||
|
** space that must always be available in the drawing command buffer
|
||||||
|
** at all times for the implementation to work. It is important that
|
||||||
|
** the number be just large enough, but not so large as to reduce the
|
||||||
|
** efficacy of the buffer. The "+32" is just to keep the code working
|
||||||
|
** in case somebody counts wrong.
|
||||||
|
*/
|
||||||
|
#define __GLX_BUFFER_LIMIT_SIZE (__GLX_MAX_SMALL_RENDER_CMD_SIZE + 32)
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This implementation uses a smaller threshold for switching
|
||||||
|
** to the RenderLarge protocol than the protcol requires so that
|
||||||
|
** large copies don't occur.
|
||||||
|
*/
|
||||||
|
#define __GLX_RENDER_CMD_SIZE_LIMIT 4096
|
||||||
|
|
||||||
|
/*
|
||||||
|
** One of these records exists per screen of the display. It contains
|
||||||
|
** a pointer to the config data for that screen (if the screen supports GL).
|
||||||
|
*/
|
||||||
|
typedef struct __GLXscreenConfigsRec {
|
||||||
|
__GLXvisualConfig *configs;
|
||||||
|
int numConfigs;
|
||||||
|
const char *serverGLXexts;
|
||||||
|
char *effectiveGLXexts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Per screen direct rendering interface functions and data.
|
||||||
|
*/
|
||||||
|
__DRIscreen driScreen;
|
||||||
|
} __GLXscreenConfigs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Per display private data. One of these records exists for each display
|
||||||
|
** that is using the OpenGL (GLX) extension.
|
||||||
|
*/
|
||||||
|
struct __GLXdisplayPrivateRec {
|
||||||
|
/*
|
||||||
|
** Back pointer to the display
|
||||||
|
*/
|
||||||
|
Display *dpy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The majorOpcode is common to all connections to the same server.
|
||||||
|
** It is also copied into the context structure.
|
||||||
|
*/
|
||||||
|
int majorOpcode;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Major and minor version returned by the server during initialization.
|
||||||
|
*/
|
||||||
|
int majorVersion, minorVersion;
|
||||||
|
|
||||||
|
/* Storage for the servers GLX vendor and versions strings. These
|
||||||
|
** are the same for all screens on this display. These fields will
|
||||||
|
** be filled in on demand.
|
||||||
|
*/
|
||||||
|
char *serverGLXvendor;
|
||||||
|
char *serverGLXversion;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Configurations of visuals for all screens on this display.
|
||||||
|
** Also, per screen data which now includes the server GLX_EXTENSION
|
||||||
|
** string.
|
||||||
|
*/
|
||||||
|
__GLXscreenConfigs *screenConfigs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Per display direct rendering interface functions and data.
|
||||||
|
*/
|
||||||
|
__DRIdisplay driDisplay;
|
||||||
|
};
|
||||||
|
|
||||||
|
void __glXFreeContext(__GLXcontext*);
|
||||||
|
|
||||||
|
extern GLubyte *__glXFlushRenderBuffer(__GLXcontext*, GLubyte*);
|
||||||
|
|
||||||
|
extern void __glXSendLargeCommand(__GLXcontext *, const GLvoid *, GLint,
|
||||||
|
const GLvoid *, GLint);
|
||||||
|
|
||||||
|
/* Initialize the GLX extension for dpy */
|
||||||
|
extern __GLXdisplayPrivate *__glXInitialize(Display*);
|
||||||
|
|
||||||
|
/* Query drivers for dynamically registered extensions */
|
||||||
|
extern void __glXRegisterExtensions(void);
|
||||||
|
|
||||||
|
/* Functions for extending the GLX API: */
|
||||||
|
extern void *__glXRegisterGLXFunction(const char *funcName, void *funcAddr);
|
||||||
|
extern void __glXRegisterGLXExtensionString(const char *extName);
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
extern int __glXDebug;
|
||||||
|
|
||||||
|
/* This is per-thread storage in an MT environment */
|
||||||
|
#if defined(XTHREADS)
|
||||||
|
extern __GLXcontext *__glXGetCurrentContext(void);
|
||||||
|
extern void __glXSetCurrentContext(__GLXcontext *c);
|
||||||
|
#else
|
||||||
|
extern __GLXcontext *__glXcurrentContext;
|
||||||
|
#define __glXGetCurrentContext() __glXcurrentContext
|
||||||
|
#define __glXSetCurrentContext(gc) __glXcurrentContext = gc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Global lock for all threads in this address space using the GLX
|
||||||
|
** extension
|
||||||
|
*/
|
||||||
|
#if defined(XTHREADS)
|
||||||
|
extern xmutex_rec __glXmutex;
|
||||||
|
#define __glXLock() xmutex_lock(&__glXmutex)
|
||||||
|
#define __glXUnlock() xmutex_unlock(&__glXmutex)
|
||||||
|
#else
|
||||||
|
#define __glXLock()
|
||||||
|
#define __glXUnlock()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Setup for a command. Initialize the extension for dpy if necessary.
|
||||||
|
*/
|
||||||
|
extern CARD8 __glXSetupForCommand(Display *dpy);
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Data conversion and packing support.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Return the size, in bytes, of some pixel data */
|
||||||
|
extern GLint __glImageSize(GLint, GLint, GLint, GLenum, GLenum);
|
||||||
|
|
||||||
|
/* Return the k value for a given map target */
|
||||||
|
extern GLint __glEvalComputeK(GLenum);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Fill the transport buffer with the data from the users buffer,
|
||||||
|
** applying some of the pixel store modes (unpack modes) to the data
|
||||||
|
** first. As a side effect of this call, the "modes" field is
|
||||||
|
** updated to contain the modes needed by the server to decode the
|
||||||
|
** sent data.
|
||||||
|
*/
|
||||||
|
extern void __glFillImage(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
|
||||||
|
GLenum, const GLvoid*, GLubyte*, GLubyte*);
|
||||||
|
|
||||||
|
/* Copy map data with a stride into a packed buffer */
|
||||||
|
extern void __glFillMap1f(GLint, GLint, GLint, const GLfloat *, GLubyte *);
|
||||||
|
extern void __glFillMap1d(GLint, GLint, GLint, const GLdouble *, GLubyte *);
|
||||||
|
extern void __glFillMap2f(GLint, GLint, GLint, GLint, GLint,
|
||||||
|
const GLfloat *, GLfloat *);
|
||||||
|
extern void __glFillMap2d(GLint, GLint, GLint, GLint, GLint,
|
||||||
|
const GLdouble *, GLdouble *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Empty an image out of the reply buffer into the clients memory applying
|
||||||
|
** the pack modes to pack back into the clients requested format.
|
||||||
|
*/
|
||||||
|
extern void __glEmptyImage(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
|
||||||
|
GLenum, const GLubyte *, GLvoid *);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Allocate and Initialize Vertex Array client state
|
||||||
|
*/
|
||||||
|
extern void __glXInitVertexArrayState(__GLXcontext*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Inform the Server of the major and minor numbers and of the client
|
||||||
|
** libraries extension string.
|
||||||
|
*/
|
||||||
|
extern void __glXClientInfo ( Display *dpy, int opcode );
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Declarations that should be in Xlib
|
||||||
|
*/
|
||||||
|
#ifdef __GL_USE_OUR_PROTOTYPES
|
||||||
|
extern void _XFlush(Display*);
|
||||||
|
extern Status _XReply(Display*, xReply*, int, Bool);
|
||||||
|
extern void _XRead(Display*, void*, long);
|
||||||
|
extern void _XSend(Display*, const void*, long);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** GLX_BUILT_IN_XMESA controls whether libGL has a built-in verions of
|
||||||
|
** Mesa that can render to non-GLX displays.
|
||||||
|
*/
|
||||||
|
#ifdef GLX_BUILT_IN_XMESA
|
||||||
|
#define GLX_PREFIX(function) _real_##function
|
||||||
|
#else
|
||||||
|
#define GLX_PREFIX(function) function
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
extern char *__glXstrdup(const char *str);
|
||||||
|
|
||||||
|
extern int __glXGetInternalVersion(void);
|
||||||
|
|
||||||
|
extern Bool __glXWindowExists(Display *dpy, GLXDrawable draw);
|
||||||
|
|
||||||
|
#endif /* !__GLX_client_h__ */
|
||||||
80
src/dri-es/sarea.h
Normal file
80
src/dri-es/sarea.h
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/* $XFree86: xc/programs/Xserver/GL/dri/sarea.h,v 1.10 2001/10/04 18:28:20 alanh Exp $ */
|
||||||
|
/**************************************************************************
|
||||||
|
|
||||||
|
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
Copyright 2000 VA Linux Systems, Inc.
|
||||||
|
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, 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 PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <kevin@precisioninsight.com>
|
||||||
|
* Jens Owen <jens@tungstengraphics.com>
|
||||||
|
* Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SAREA_H_
|
||||||
|
#define _SAREA_H_
|
||||||
|
|
||||||
|
#include "xf86drm.h"
|
||||||
|
|
||||||
|
/* SAREA area needs to be at least a page */
|
||||||
|
#if defined(__alpha__)
|
||||||
|
#define SAREA_MAX 0x2000
|
||||||
|
#elif defined(__ia64__)
|
||||||
|
#define SAREA_MAX 0x10000 /* 64kB */
|
||||||
|
#else
|
||||||
|
/* Intel 830M driver needs at least 8k SAREA */
|
||||||
|
#define SAREA_MAX 0x2000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SAREA_MAX_DRAWABLES 256
|
||||||
|
|
||||||
|
#define SAREA_DRAWABLE_CLAIMED_ENTRY 0x80000000
|
||||||
|
|
||||||
|
typedef struct _XF86DRISAREADrawable {
|
||||||
|
unsigned int stamp;
|
||||||
|
unsigned int flags;
|
||||||
|
} XF86DRISAREADrawableRec, *XF86DRISAREADrawablePtr;
|
||||||
|
|
||||||
|
typedef struct _XF86DRISAREAFrame {
|
||||||
|
unsigned int x;
|
||||||
|
unsigned int y;
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
unsigned int fullscreen;
|
||||||
|
} XF86DRISAREAFrameRec, *XF86DRISAREAFramePtr;
|
||||||
|
|
||||||
|
typedef struct _XF86DRISAREA {
|
||||||
|
/* first thing is always the drm locking structure */
|
||||||
|
drmLock lock;
|
||||||
|
/* NOT_DONE: Use readers/writer lock for drawable_lock */
|
||||||
|
drmLock drawable_lock;
|
||||||
|
XF86DRISAREADrawableRec drawableTable[SAREA_MAX_DRAWABLES];
|
||||||
|
XF86DRISAREAFrameRec frame;
|
||||||
|
drmContext dummy_context;
|
||||||
|
} XF86DRISAREARec, *XF86DRISAREAPtr;
|
||||||
|
|
||||||
|
#endif
|
||||||
227
src/dri-es/xf86dri.h
Normal file
227
src/dri-es/xf86dri.h
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
/* $XFree86: xc/lib/GL/dri/xf86dri.h,v 1.7 2000/12/07 20:26:02 dawes Exp $ */
|
||||||
|
/**************************************************************************
|
||||||
|
|
||||||
|
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
Copyright 2000 VA Linux Systems, Inc.
|
||||||
|
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, 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 PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <martin@valinux.com>
|
||||||
|
* Jens Owen <jens@tungstengraphics.com>
|
||||||
|
* Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _XF86DRI_H_
|
||||||
|
#define _XF86DRI_H_
|
||||||
|
|
||||||
|
#include <X11/Xfuncproto.h>
|
||||||
|
#include <xf86drm.h>
|
||||||
|
|
||||||
|
#define X_XF86DRIQueryVersion 0
|
||||||
|
#define X_XF86DRIQueryDirectRenderingCapable 1
|
||||||
|
#define X_XF86DRIOpenConnection 2
|
||||||
|
#define X_XF86DRICloseConnection 3
|
||||||
|
#define X_XF86DRIGetClientDriverName 4
|
||||||
|
#define X_XF86DRICreateContext 5
|
||||||
|
#define X_XF86DRIDestroyContext 6
|
||||||
|
#define X_XF86DRICreateDrawable 7
|
||||||
|
#define X_XF86DRIDestroyDrawable 8
|
||||||
|
#define X_XF86DRIGetDrawableInfo 9
|
||||||
|
#define X_XF86DRIGetDeviceInfo 10
|
||||||
|
#define X_XF86DRIAuthConnection 11
|
||||||
|
#define X_XF86DRIOpenFullScreen 12
|
||||||
|
#define X_XF86DRICloseFullScreen 13
|
||||||
|
|
||||||
|
#define XF86DRINumberEvents 0
|
||||||
|
|
||||||
|
#define XF86DRIClientNotLocal 0
|
||||||
|
#define XF86DRIOperationNotSupported 1
|
||||||
|
#define XF86DRINumberErrors (XF86DRIOperationNotSupported + 1)
|
||||||
|
|
||||||
|
/* Warning : Do not change XF86DRIClipRect without changing the kernel
|
||||||
|
* structure! */
|
||||||
|
typedef struct _XF86DRIClipRect {
|
||||||
|
unsigned short x1; /* Upper left: inclusive */
|
||||||
|
unsigned short y1;
|
||||||
|
unsigned short x2; /* Lower right: exclusive */
|
||||||
|
unsigned short y2;
|
||||||
|
} XF86DRIClipRectRec, *XF86DRIClipRectPtr;
|
||||||
|
|
||||||
|
#ifndef _XF86DRI_SERVER_
|
||||||
|
|
||||||
|
_XFUNCPROTOBEGIN
|
||||||
|
|
||||||
|
Bool XF86DRIQueryExtension(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int* /* event_base */,
|
||||||
|
int* /* error_base */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIQueryVersion(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int* /* majorVersion */,
|
||||||
|
int* /* minorVersion */,
|
||||||
|
int* /* patchVersion */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIQueryDirectRenderingCapable(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
Bool* /* isCapable */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIOpenConnection(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
drmHandlePtr /* hSAREA */,
|
||||||
|
char** /* busIDString */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIAuthConnection(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
drmMagic /* magic */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRICloseConnection(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIGetClientDriverName(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
int* /* ddxDriverMajorVersion */,
|
||||||
|
int* /* ddxDriverMinorVersion */,
|
||||||
|
int* /* ddxDriverPatchVersion */,
|
||||||
|
char** /* clientDriverName */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRICreateContext(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
Visual* /* visual */,
|
||||||
|
XID* /* ptr to returned context id */,
|
||||||
|
drmContextPtr /* hHWContext */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIDestroyContext(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
XID /* context id */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRICreateDrawable(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
Drawable /* drawable */,
|
||||||
|
drmDrawablePtr /* hHWDrawable */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIDestroyDrawable(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
Drawable /* drawable */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIGetDrawableInfo(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
Drawable /* drawable */,
|
||||||
|
unsigned int* /* index */,
|
||||||
|
unsigned int* /* stamp */,
|
||||||
|
int* /* X */,
|
||||||
|
int* /* Y */,
|
||||||
|
int* /* W */,
|
||||||
|
int* /* H */,
|
||||||
|
int* /* numClipRects */,
|
||||||
|
XF86DRIClipRectPtr*,/* pClipRects */
|
||||||
|
int* /* backX */,
|
||||||
|
int* /* backY */,
|
||||||
|
int* /* numBackClipRects */,
|
||||||
|
XF86DRIClipRectPtr* /* pBackClipRects */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIGetDeviceInfo(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
drmHandlePtr /* hFrameBuffer */,
|
||||||
|
int* /* fbOrigin */,
|
||||||
|
int* /* fbSize */,
|
||||||
|
int* /* fbStride */,
|
||||||
|
int* /* devPrivateSize */,
|
||||||
|
void** /* pDevPrivate */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRIOpenFullScreen(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
Drawable /* drawable */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
Bool XF86DRICloseFullScreen(
|
||||||
|
#if NeedFunctionPrototypes
|
||||||
|
Display* /* dpy */,
|
||||||
|
int /* screen */,
|
||||||
|
Drawable /* drawable */
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
_XFUNCPROTOEND
|
||||||
|
|
||||||
|
#endif /* _XF86DRI_SERVER_ */
|
||||||
|
|
||||||
|
#endif /* _XF86DRI_H_ */
|
||||||
|
|
||||||
343
src/dri-es/xf86dristr.h
Normal file
343
src/dri-es/xf86dristr.h
Normal file
@@ -0,0 +1,343 @@
|
|||||||
|
/* $XFree86: xc/lib/GL/dri/xf86dristr.h,v 1.9 2001/03/21 16:01:08 dawes Exp $ */
|
||||||
|
/**************************************************************************
|
||||||
|
|
||||||
|
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
Copyright 2000 VA Linux Systems, Inc.
|
||||||
|
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, 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 PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Kevin E. Martin <martin@valinux.com>
|
||||||
|
* Jens Owen <jens@tungstengraphics.com>
|
||||||
|
* Rickard E. (Rik) Fiath <faith@valinux.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _XF86DRISTR_H_
|
||||||
|
#define _XF86DRISTR_H_
|
||||||
|
|
||||||
|
#include "xf86dri.h"
|
||||||
|
|
||||||
|
#define XF86DRINAME "XFree86-DRI"
|
||||||
|
|
||||||
|
/* The DRI version number. This was originally set to be the same of the
|
||||||
|
* XFree86 version number. However, this version is really indepedent of
|
||||||
|
* the XFree86 version.
|
||||||
|
*
|
||||||
|
* Version History:
|
||||||
|
* 4.0.0: Original
|
||||||
|
* 4.0.1: Patch to bump clipstamp when windows are destroyed, 28 May 02
|
||||||
|
* 4.1.0: Add transition from single to multi in DRMInfo rec, 24 Jun 02
|
||||||
|
*/
|
||||||
|
#define XF86DRI_MAJOR_VERSION 4
|
||||||
|
#define XF86DRI_MINOR_VERSION 1
|
||||||
|
#define XF86DRI_PATCH_VERSION 0
|
||||||
|
|
||||||
|
typedef struct _XF86DRIQueryVersion {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIQueryVersion */
|
||||||
|
CARD16 length B16;
|
||||||
|
} xXF86DRIQueryVersionReq;
|
||||||
|
#define sz_xXF86DRIQueryVersionReq 4
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD16 majorVersion B16; /* major version of DRI protocol */
|
||||||
|
CARD16 minorVersion B16; /* minor version of DRI protocol */
|
||||||
|
CARD32 patchVersion B32; /* patch version of DRI protocol */
|
||||||
|
CARD32 pad3 B32;
|
||||||
|
CARD32 pad4 B32;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
} xXF86DRIQueryVersionReply;
|
||||||
|
#define sz_xXF86DRIQueryVersionReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRIQueryDirectRenderingCapable {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* X_DRIQueryDirectRenderingCapable */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
} xXF86DRIQueryDirectRenderingCapableReq;
|
||||||
|
#define sz_xXF86DRIQueryDirectRenderingCapableReq 8
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
BOOL isCapable;
|
||||||
|
BOOL pad2;
|
||||||
|
BOOL pad3;
|
||||||
|
BOOL pad4;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
CARD32 pad7 B32;
|
||||||
|
CARD32 pad8 B32;
|
||||||
|
CARD32 pad9 B32;
|
||||||
|
} xXF86DRIQueryDirectRenderingCapableReply;
|
||||||
|
#define sz_xXF86DRIQueryDirectRenderingCapableReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRIOpenConnection {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIOpenConnection */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
} xXF86DRIOpenConnectionReq;
|
||||||
|
#define sz_xXF86DRIOpenConnectionReq 8
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 hSAREALow B32;
|
||||||
|
CARD32 hSAREAHigh B32;
|
||||||
|
CARD32 busIdStringLength B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
CARD32 pad7 B32;
|
||||||
|
CARD32 pad8 B32;
|
||||||
|
} xXF86DRIOpenConnectionReply;
|
||||||
|
#define sz_xXF86DRIOpenConnectionReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRIAuthConnection {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRICloseConnection */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 magic B32;
|
||||||
|
} xXF86DRIAuthConnectionReq;
|
||||||
|
#define sz_xXF86DRIAuthConnectionReq 12
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type;
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 authenticated B32;
|
||||||
|
CARD32 pad2 B32;
|
||||||
|
CARD32 pad3 B32;
|
||||||
|
CARD32 pad4 B32;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
} xXF86DRIAuthConnectionReply;
|
||||||
|
#define zx_xXF86DRIAuthConnectionReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRICloseConnection {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRICloseConnection */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
} xXF86DRICloseConnectionReq;
|
||||||
|
#define sz_xXF86DRICloseConnectionReq 8
|
||||||
|
|
||||||
|
typedef struct _XF86DRIGetClientDriverName {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIGetClientDriverName */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
} xXF86DRIGetClientDriverNameReq;
|
||||||
|
#define sz_xXF86DRIGetClientDriverNameReq 8
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 ddxDriverMajorVersion B32;
|
||||||
|
CARD32 ddxDriverMinorVersion B32;
|
||||||
|
CARD32 ddxDriverPatchVersion B32;
|
||||||
|
CARD32 clientDriverNameLength B32;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
} xXF86DRIGetClientDriverNameReply;
|
||||||
|
#define sz_xXF86DRIGetClientDriverNameReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRICreateContext {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRICreateContext */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 visual B32;
|
||||||
|
CARD32 context B32;
|
||||||
|
} xXF86DRICreateContextReq;
|
||||||
|
#define sz_xXF86DRICreateContextReq 16
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 hHWContext B32;
|
||||||
|
CARD32 pad2 B32;
|
||||||
|
CARD32 pad3 B32;
|
||||||
|
CARD32 pad4 B32;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
} xXF86DRICreateContextReply;
|
||||||
|
#define sz_xXF86DRICreateContextReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRIDestroyContext {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIDestroyContext */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 context B32;
|
||||||
|
} xXF86DRIDestroyContextReq;
|
||||||
|
#define sz_xXF86DRIDestroyContextReq 12
|
||||||
|
|
||||||
|
typedef struct _XF86DRICreateDrawable {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRICreateDrawable */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 drawable B32;
|
||||||
|
} xXF86DRICreateDrawableReq;
|
||||||
|
#define sz_xXF86DRICreateDrawableReq 12
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 hHWDrawable B32;
|
||||||
|
CARD32 pad2 B32;
|
||||||
|
CARD32 pad3 B32;
|
||||||
|
CARD32 pad4 B32;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
} xXF86DRICreateDrawableReply;
|
||||||
|
#define sz_xXF86DRICreateDrawableReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRIDestroyDrawable {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIDestroyDrawable */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 drawable B32;
|
||||||
|
} xXF86DRIDestroyDrawableReq;
|
||||||
|
#define sz_xXF86DRIDestroyDrawableReq 12
|
||||||
|
|
||||||
|
typedef struct _XF86DRIGetDrawableInfo {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIGetDrawableInfo */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 drawable B32;
|
||||||
|
} xXF86DRIGetDrawableInfoReq;
|
||||||
|
#define sz_xXF86DRIGetDrawableInfoReq 12
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 drawableTableIndex B32;
|
||||||
|
CARD32 drawableTableStamp B32;
|
||||||
|
INT16 drawableX B16;
|
||||||
|
INT16 drawableY B16;
|
||||||
|
INT16 drawableWidth B16;
|
||||||
|
INT16 drawableHeight B16;
|
||||||
|
CARD32 numClipRects B32;
|
||||||
|
INT16 backX B16;
|
||||||
|
INT16 backY B16;
|
||||||
|
CARD32 numBackClipRects B32;
|
||||||
|
} xXF86DRIGetDrawableInfoReply;
|
||||||
|
|
||||||
|
#define sz_xXF86DRIGetDrawableInfoReply 36
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _XF86DRIGetDeviceInfo {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIGetDeviceInfo */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
} xXF86DRIGetDeviceInfoReq;
|
||||||
|
#define sz_xXF86DRIGetDeviceInfoReq 8
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type; /* X_Reply */
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 hFrameBufferLow B32;
|
||||||
|
CARD32 hFrameBufferHigh B32;
|
||||||
|
CARD32 framebufferOrigin B32;
|
||||||
|
CARD32 framebufferSize B32;
|
||||||
|
CARD32 framebufferStride B32;
|
||||||
|
CARD32 devPrivateSize B32;
|
||||||
|
} xXF86DRIGetDeviceInfoReply;
|
||||||
|
#define sz_xXF86DRIGetDeviceInfoReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRIOpenFullScreen {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRIOpenFullScreen */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 drawable B32;
|
||||||
|
} xXF86DRIOpenFullScreenReq;
|
||||||
|
#define sz_xXF86DRIOpenFullScreenReq 12
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type;
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 isFullScreen B32;
|
||||||
|
CARD32 pad2 B32;
|
||||||
|
CARD32 pad3 B32;
|
||||||
|
CARD32 pad4 B32;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
} xXF86DRIOpenFullScreenReply;
|
||||||
|
#define sz_xXF86DRIOpenFullScreenReply 32
|
||||||
|
|
||||||
|
typedef struct _XF86DRICloseFullScreen {
|
||||||
|
CARD8 reqType; /* always DRIReqCode */
|
||||||
|
CARD8 driReqType; /* always X_DRICloseFullScreen */
|
||||||
|
CARD16 length B16;
|
||||||
|
CARD32 screen B32;
|
||||||
|
CARD32 drawable B32;
|
||||||
|
} xXF86DRICloseFullScreenReq;
|
||||||
|
#define sz_xXF86DRICloseFullScreenReq 12
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
BYTE type;
|
||||||
|
BOOL pad1;
|
||||||
|
CARD16 sequenceNumber B16;
|
||||||
|
CARD32 length B32;
|
||||||
|
CARD32 pad2 B32;
|
||||||
|
CARD32 pad3 B32;
|
||||||
|
CARD32 pad4 B32;
|
||||||
|
CARD32 pad5 B32;
|
||||||
|
CARD32 pad6 B32;
|
||||||
|
CARD32 pad7 B32;
|
||||||
|
} xXF86DRICloseFullScreenReply;
|
||||||
|
#define sz_xXF86DRICloseFullScreenReply 32
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _XF86DRISTR_H_ */
|
||||||
1500
src/dri-es/xf86drm.c
Normal file
1500
src/dri-es/xf86drm.c
Normal file
File diff suppressed because it is too large
Load Diff
607
src/dri-es/xf86drm.h
Normal file
607
src/dri-es/xf86drm.h
Normal file
@@ -0,0 +1,607 @@
|
|||||||
|
/* xf86drm.h -- OS-independent header for DRM user-level library interface
|
||||||
|
* Created: Tue Jan 5 08:17:23 1999 by faith@precisioninsight.com
|
||||||
|
*
|
||||||
|
* Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
||||||
|
* 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
*
|
||||||
|
* Author: Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
|
*
|
||||||
|
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h,v 1.17 2002/10/16 01:26:48 dawes Exp $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _XF86DRM_H_
|
||||||
|
#define _XF86DRM_H_
|
||||||
|
|
||||||
|
/* Defaults, if nothing set in xf86config */
|
||||||
|
#define DRM_DEV_UID 0
|
||||||
|
#define DRM_DEV_GID 0
|
||||||
|
/* Default /dev/dri directory permissions 0755 */
|
||||||
|
#define DRM_DEV_DIRMODE \
|
||||||
|
(S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
|
||||||
|
#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
|
||||||
|
|
||||||
|
#define DRM_DIR_NAME "/dev/dri"
|
||||||
|
#define DRM_DEV_NAME "%s/card%d"
|
||||||
|
#define DRM_PROC_NAME "/proc/dri/" /* For backware Linux compatibility */
|
||||||
|
|
||||||
|
#define DRM_ERR_NO_DEVICE (-1001)
|
||||||
|
#define DRM_ERR_NO_ACCESS (-1002)
|
||||||
|
#define DRM_ERR_NOT_ROOT (-1003)
|
||||||
|
#define DRM_ERR_INVALID (-1004)
|
||||||
|
#define DRM_ERR_NO_FD (-1005)
|
||||||
|
|
||||||
|
typedef unsigned long drmHandle, *drmHandlePtr; /* To mapped regions */
|
||||||
|
typedef unsigned int drmSize, *drmSizePtr; /* For mapped regions */
|
||||||
|
typedef void *drmAddress, **drmAddressPtr; /* For mapped regions */
|
||||||
|
typedef unsigned int drmContext, *drmContextPtr; /* GLXContext handle */
|
||||||
|
typedef unsigned int drmDrawable, *drmDrawablePtr; /* Unused */
|
||||||
|
typedef unsigned int drmMagic, *drmMagicPtr; /* Magic for auth */
|
||||||
|
|
||||||
|
typedef struct _drmVersion {
|
||||||
|
int version_major; /* Major version */
|
||||||
|
int version_minor; /* Minor version */
|
||||||
|
int version_patchlevel; /* Patch level */
|
||||||
|
int name_len; /* Length of name buffer */
|
||||||
|
char *name; /* Name of driver */
|
||||||
|
int date_len; /* Length of date buffer */
|
||||||
|
char *date; /* User-space buffer to hold date */
|
||||||
|
int desc_len; /* Length of desc buffer */
|
||||||
|
char *desc; /* User-space buffer to hold desc */
|
||||||
|
} drmVersion, *drmVersionPtr;
|
||||||
|
|
||||||
|
typedef struct _drmStats {
|
||||||
|
unsigned long count; /* Number of data */
|
||||||
|
struct {
|
||||||
|
unsigned long value; /* Value from kernel */
|
||||||
|
const char *long_format; /* Suggested format for long_name */
|
||||||
|
const char *long_name; /* Long name for value */
|
||||||
|
const char *rate_format; /* Suggested format for rate_name */
|
||||||
|
const char *rate_name; /* Short name for value per second */
|
||||||
|
int isvalue; /* True if value (vs. counter) */
|
||||||
|
const char *mult_names; /* Multiplier names (e.g., "KGM") */
|
||||||
|
int mult; /* Multiplier value (e.g., 1024) */
|
||||||
|
int verbose; /* Suggest only in verbose output */
|
||||||
|
} data[15];
|
||||||
|
} drmStatsT;
|
||||||
|
|
||||||
|
|
||||||
|
/* All of these enums *MUST* match with the
|
||||||
|
kernel implementation -- so do *NOT*
|
||||||
|
change them! (The drmlib implementation
|
||||||
|
will just copy the flags instead of
|
||||||
|
translating them.) */
|
||||||
|
typedef enum {
|
||||||
|
DRM_FRAME_BUFFER = 0, /* WC, no caching, no core dump */
|
||||||
|
DRM_REGISTERS = 1, /* no caching, no core dump */
|
||||||
|
DRM_SHM = 2, /* shared, cached */
|
||||||
|
DRM_AGP = 3, /* AGP/GART */
|
||||||
|
DRM_SCATTER_GATHER = 4 /* PCI scatter/gather */
|
||||||
|
} drmMapType;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DRM_RESTRICTED = 0x0001, /* Cannot be mapped to client-virtual */
|
||||||
|
DRM_READ_ONLY = 0x0002, /* Read-only in client-virtual */
|
||||||
|
DRM_LOCKED = 0x0004, /* Physical pages locked */
|
||||||
|
DRM_KERNEL = 0x0008, /* Kernel requires access */
|
||||||
|
DRM_WRITE_COMBINING = 0x0010, /* Use write-combining, if available */
|
||||||
|
DRM_CONTAINS_LOCK = 0x0020, /* SHM page that contains lock */
|
||||||
|
DRM_REMOVABLE = 0x0040 /* Removable mapping */
|
||||||
|
} drmMapFlags;
|
||||||
|
|
||||||
|
typedef enum { /* These values *MUST* match drm.h */
|
||||||
|
/* Flags for DMA buffer dispatch */
|
||||||
|
DRM_DMA_BLOCK = 0x01, /* Block until buffer dispatched. Note,
|
||||||
|
the buffer may not yet have been
|
||||||
|
processed by the hardware -- getting a
|
||||||
|
hardware lock with the hardware
|
||||||
|
quiescent will ensure that the buffer
|
||||||
|
has been processed. */
|
||||||
|
DRM_DMA_WHILE_LOCKED = 0x02, /* Dispatch while lock held */
|
||||||
|
DRM_DMA_PRIORITY = 0x04, /* High priority dispatch */
|
||||||
|
|
||||||
|
/* Flags for DMA buffer request */
|
||||||
|
DRM_DMA_WAIT = 0x10, /* Wait for free buffers */
|
||||||
|
DRM_DMA_SMALLER_OK = 0x20, /* Smaller-than-requested buffers ok */
|
||||||
|
DRM_DMA_LARGER_OK = 0x40 /* Larger-than-requested buffers ok */
|
||||||
|
} drmDMAFlags;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DRM_PAGE_ALIGN = 0x01,
|
||||||
|
DRM_AGP_BUFFER = 0x02,
|
||||||
|
DRM_SG_BUFFER = 0x04
|
||||||
|
} drmBufDescFlags;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DRM_LOCK_READY = 0x01, /* Wait until hardware is ready for DMA */
|
||||||
|
DRM_LOCK_QUIESCENT = 0x02, /* Wait until hardware quiescent */
|
||||||
|
DRM_LOCK_FLUSH = 0x04, /* Flush this context's DMA queue first */
|
||||||
|
DRM_LOCK_FLUSH_ALL = 0x08, /* Flush all DMA queues first */
|
||||||
|
/* These *HALT* flags aren't supported yet
|
||||||
|
-- they will be used to support the
|
||||||
|
full-screen DGA-like mode. */
|
||||||
|
DRM_HALT_ALL_QUEUES = 0x10, /* Halt all current and future queues */
|
||||||
|
DRM_HALT_CUR_QUEUES = 0x20 /* Halt all current queues */
|
||||||
|
} drmLockFlags;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DRM_CONTEXT_PRESERVED = 0x01, /* This context is preserved and
|
||||||
|
never swapped. */
|
||||||
|
DRM_CONTEXT_2DONLY = 0x02 /* This context is for 2D rendering only. */
|
||||||
|
} drmContextFlags, *drmContextFlagsPtr;
|
||||||
|
|
||||||
|
typedef struct _drmBufDesc {
|
||||||
|
int count; /* Number of buffers of this size */
|
||||||
|
int size; /* Size in bytes */
|
||||||
|
int low_mark; /* Low water mark */
|
||||||
|
int high_mark; /* High water mark */
|
||||||
|
} drmBufDesc, *drmBufDescPtr;
|
||||||
|
|
||||||
|
typedef struct _drmBufInfo {
|
||||||
|
int count; /* Number of buffers described in list */
|
||||||
|
drmBufDescPtr list; /* List of buffer descriptions */
|
||||||
|
} drmBufInfo, *drmBufInfoPtr;
|
||||||
|
|
||||||
|
typedef struct _drmBuf {
|
||||||
|
int idx; /* Index into master buflist */
|
||||||
|
int total; /* Buffer size */
|
||||||
|
int used; /* Amount of buffer in use (for DMA) */
|
||||||
|
drmAddress address; /* Address */
|
||||||
|
} drmBuf, *drmBufPtr;
|
||||||
|
|
||||||
|
typedef struct _drmBufMap {
|
||||||
|
int count; /* Number of buffers mapped */
|
||||||
|
drmBufPtr list; /* Buffers */
|
||||||
|
} drmBufMap, *drmBufMapPtr;
|
||||||
|
|
||||||
|
typedef struct _drmLock {
|
||||||
|
volatile unsigned int lock;
|
||||||
|
char padding[60];
|
||||||
|
/* This is big enough for most current (and future?) architectures:
|
||||||
|
DEC Alpha: 32 bytes
|
||||||
|
Intel Merced: ?
|
||||||
|
Intel P5/PPro/PII/PIII: 32 bytes
|
||||||
|
Intel StrongARM: 32 bytes
|
||||||
|
Intel i386/i486: 16 bytes
|
||||||
|
MIPS: 32 bytes (?)
|
||||||
|
Motorola 68k: 16 bytes
|
||||||
|
Motorola PowerPC: 32 bytes
|
||||||
|
Sun SPARC: 32 bytes
|
||||||
|
*/
|
||||||
|
} drmLock, *drmLockPtr;
|
||||||
|
|
||||||
|
typedef struct _drmDMAReq {
|
||||||
|
/* Indices here refer to the offset into
|
||||||
|
list in drmBufInfo */
|
||||||
|
drmContext context; /* Context handle */
|
||||||
|
int send_count; /* Number of buffers to send */
|
||||||
|
int *send_list; /* List of handles to buffers */
|
||||||
|
int *send_sizes; /* Lengths of data to send, in bytes */
|
||||||
|
drmDMAFlags flags; /* Flags */
|
||||||
|
int request_count; /* Number of buffers requested */
|
||||||
|
int request_size; /* Desired size of buffers requested */
|
||||||
|
int *request_list; /* Buffer information */
|
||||||
|
int *request_sizes; /* Minimum acceptable sizes */
|
||||||
|
int granted_count; /* Number of buffers granted at this size */
|
||||||
|
} drmDMAReq, *drmDMAReqPtr;
|
||||||
|
|
||||||
|
typedef struct _drmRegion {
|
||||||
|
drmHandle handle;
|
||||||
|
unsigned int offset;
|
||||||
|
drmSize size;
|
||||||
|
drmAddress map;
|
||||||
|
} drmRegion, *drmRegionPtr;
|
||||||
|
|
||||||
|
typedef struct _drmTextureRegion {
|
||||||
|
unsigned char next;
|
||||||
|
unsigned char prev;
|
||||||
|
unsigned char in_use;
|
||||||
|
unsigned char padding; /* Explicitly pad this out */
|
||||||
|
unsigned int age;
|
||||||
|
} drmTextureRegion, *drmTextureRegionPtr;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _drmClipRect {
|
||||||
|
unsigned short x1; /* Upper left: inclusive */
|
||||||
|
unsigned short y1;
|
||||||
|
unsigned short x2; /* Lower right: exclusive */
|
||||||
|
unsigned short y2;
|
||||||
|
} drmClipRect, *drmClipRectPtr;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DRM_VBLANK_ABSOLUTE = 0x0, /* Wait for specific vblank sequence number */
|
||||||
|
DRM_VBLANK_RELATIVE = 0x1, /* Wait for given number of vblanks */
|
||||||
|
DRM_VBLANK_SIGNAL = 0x40000000 /* Send signal instead of blocking */
|
||||||
|
} drmVBlankSeqType;
|
||||||
|
|
||||||
|
typedef struct _drmVBlankReq {
|
||||||
|
drmVBlankSeqType type;
|
||||||
|
unsigned int sequence;
|
||||||
|
unsigned long signal;
|
||||||
|
} drmVBlankReq, *drmVBlankReqPtr;
|
||||||
|
|
||||||
|
typedef struct _drmVBlankReply {
|
||||||
|
drmVBlankSeqType type;
|
||||||
|
unsigned int sequence;
|
||||||
|
long tval_sec;
|
||||||
|
long tval_usec;
|
||||||
|
} drmVBlankReply, *drmVBlankReplyPtr;
|
||||||
|
|
||||||
|
typedef union _drmVBlank {
|
||||||
|
drmVBlankReq request;
|
||||||
|
drmVBlankReply reply;
|
||||||
|
} drmVBlank, *drmVBlankPtr;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock)
|
||||||
|
|
||||||
|
#define DRM_LOCK_HELD 0x80000000 /* Hardware lock is held */
|
||||||
|
#define DRM_LOCK_CONT 0x40000000 /* Hardware lock is contended */
|
||||||
|
|
||||||
|
#if __GNUC__ >= 2
|
||||||
|
# if defined(__i386) || defined(__x86_64__)
|
||||||
|
/* Reflect changes here to drmP.h */
|
||||||
|
#define DRM_CAS(lock,old,new,__ret) \
|
||||||
|
do { \
|
||||||
|
int __dummy; /* Can't mark eax as clobbered */ \
|
||||||
|
__asm__ __volatile__( \
|
||||||
|
"lock ; cmpxchg %4,%1\n\t" \
|
||||||
|
"setnz %0" \
|
||||||
|
: "=d" (__ret), \
|
||||||
|
"=m" (__drm_dummy_lock(lock)), \
|
||||||
|
"=a" (__dummy) \
|
||||||
|
: "2" (old), \
|
||||||
|
"r" (new)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#elif defined(__alpha__)
|
||||||
|
|
||||||
|
#define DRM_CAS(lock, old, new, ret) \
|
||||||
|
do { \
|
||||||
|
int old32; \
|
||||||
|
int cur32; \
|
||||||
|
__asm__ __volatile__( \
|
||||||
|
" mb\n" \
|
||||||
|
" zap %4, 0xF0, %0\n" \
|
||||||
|
" ldl_l %1, %2\n" \
|
||||||
|
" zap %1, 0xF0, %1\n" \
|
||||||
|
" cmpeq %0, %1, %1\n" \
|
||||||
|
" beq %1, 1f\n" \
|
||||||
|
" bis %5, %5, %1\n" \
|
||||||
|
" stl_c %1, %2\n" \
|
||||||
|
"1: xor %1, 1, %1\n" \
|
||||||
|
" stl %1, %3" \
|
||||||
|
: "+r" (old32), \
|
||||||
|
"+&r" (cur32), \
|
||||||
|
"=m" (__drm_dummy_lock(lock)),\
|
||||||
|
"=m" (ret) \
|
||||||
|
: "r" (old), \
|
||||||
|
"r" (new)); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#elif defined(__sparc__)
|
||||||
|
|
||||||
|
#define DRM_CAS(lock,old,new,__ret) \
|
||||||
|
do { register unsigned int __old __asm("o0"); \
|
||||||
|
register unsigned int __new __asm("o1"); \
|
||||||
|
register volatile unsigned int *__lock __asm("o2"); \
|
||||||
|
__old = old; \
|
||||||
|
__new = new; \
|
||||||
|
__lock = (volatile unsigned int *)lock; \
|
||||||
|
__asm__ __volatile__( \
|
||||||
|
/*"cas [%2], %3, %0"*/ \
|
||||||
|
".word 0xd3e29008\n\t" \
|
||||||
|
/*"membar #StoreStore | #StoreLoad"*/ \
|
||||||
|
".word 0x8143e00a" \
|
||||||
|
: "=&r" (__new) \
|
||||||
|
: "0" (__new), \
|
||||||
|
"r" (__lock), \
|
||||||
|
"r" (__old) \
|
||||||
|
: "memory"); \
|
||||||
|
__ret = (__new != __old); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#elif defined(__ia64__)
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* this currently generates bad code (missing stop bits)... */
|
||||||
|
#include <ia64intrin.h>
|
||||||
|
|
||||||
|
#define DRM_CAS(lock,old,new,__ret) \
|
||||||
|
do { \
|
||||||
|
__ret = (__sync_val_compare_and_swap(&__drm_dummy_lock(lock), \
|
||||||
|
(old), (new)) \
|
||||||
|
!= (old)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define DRM_CAS(lock,old,new,__ret) \
|
||||||
|
do { \
|
||||||
|
unsigned int __result, __old = (old); \
|
||||||
|
__asm__ __volatile__( \
|
||||||
|
"mf\n" \
|
||||||
|
"mov ar.ccv=%2\n" \
|
||||||
|
";;\n" \
|
||||||
|
"cmpxchg4.acq %0=%1,%3,ar.ccv" \
|
||||||
|
: "=r" (__result), "=m" (__drm_dummy_lock(lock)) \
|
||||||
|
: "r" (__old), "r" (new) \
|
||||||
|
: "memory"); \
|
||||||
|
__ret = (__result) != (__old); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(__powerpc__)
|
||||||
|
|
||||||
|
#define DRM_CAS(lock,old,new,__ret) \
|
||||||
|
do { \
|
||||||
|
__asm__ __volatile__( \
|
||||||
|
"sync;" \
|
||||||
|
"0: lwarx %0,0,%1;" \
|
||||||
|
" xor. %0,%3,%0;" \
|
||||||
|
" bne 1f;" \
|
||||||
|
" stwcx. %2,0,%1;" \
|
||||||
|
" bne- 0b;" \
|
||||||
|
"1: " \
|
||||||
|
"sync;" \
|
||||||
|
: "=&r"(__ret) \
|
||||||
|
: "r"(lock), "r"(new), "r"(old) \
|
||||||
|
: "cr0", "memory"); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* architecture */
|
||||||
|
#endif /* __GNUC__ >= 2 */
|
||||||
|
|
||||||
|
#ifndef DRM_CAS
|
||||||
|
#define DRM_CAS(lock,old,new,ret) do { ret=1; } while (0) /* FAST LOCK FAILS */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__alpha__) || defined(__powerpc__)
|
||||||
|
#define DRM_CAS_RESULT(_result) int _result
|
||||||
|
#else
|
||||||
|
#define DRM_CAS_RESULT(_result) char _result
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DRM_LIGHT_LOCK(fd,lock,context) \
|
||||||
|
do { \
|
||||||
|
DRM_CAS_RESULT(__ret); \
|
||||||
|
DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \
|
||||||
|
if (__ret) drmGetLock(fd,context,0); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* This one counts fast locks -- for
|
||||||
|
benchmarking only. */
|
||||||
|
#define DRM_LIGHT_LOCK_COUNT(fd,lock,context,count) \
|
||||||
|
do { \
|
||||||
|
DRM_CAS_RESULT(__ret); \
|
||||||
|
DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \
|
||||||
|
if (__ret) drmGetLock(fd,context,0); \
|
||||||
|
else ++count; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define DRM_LOCK(fd,lock,context,flags) \
|
||||||
|
do { \
|
||||||
|
if (flags) drmGetLock(fd,context,flags); \
|
||||||
|
else DRM_LIGHT_LOCK(fd,lock,context); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define DRM_UNLOCK(fd,lock,context) \
|
||||||
|
do { \
|
||||||
|
DRM_CAS_RESULT(__ret); \
|
||||||
|
DRM_CAS(lock,DRM_LOCK_HELD|context,context,__ret); \
|
||||||
|
if (__ret) drmUnlock(fd,context); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* Simple spin locks */
|
||||||
|
#define DRM_SPINLOCK(spin,val) \
|
||||||
|
do { \
|
||||||
|
DRM_CAS_RESULT(__ret); \
|
||||||
|
do { \
|
||||||
|
DRM_CAS(spin,0,val,__ret); \
|
||||||
|
if (__ret) while ((spin)->lock); \
|
||||||
|
} while (__ret); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define DRM_SPINLOCK_TAKE(spin,val) \
|
||||||
|
do { \
|
||||||
|
DRM_CAS_RESULT(__ret); \
|
||||||
|
int cur; \
|
||||||
|
do { \
|
||||||
|
cur = (*spin).lock; \
|
||||||
|
DRM_CAS(spin,cur,val,__ret); \
|
||||||
|
} while (__ret); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define DRM_SPINLOCK_COUNT(spin,val,count,__ret) \
|
||||||
|
do { \
|
||||||
|
int __i; \
|
||||||
|
__ret = 1; \
|
||||||
|
for (__i = 0; __ret && __i < count; __i++) { \
|
||||||
|
DRM_CAS(spin,0,val,__ret); \
|
||||||
|
if (__ret) for (;__i < count && (spin)->lock; __i++); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define DRM_SPINUNLOCK(spin,val) \
|
||||||
|
do { \
|
||||||
|
DRM_CAS_RESULT(__ret); \
|
||||||
|
if ((*spin).lock == val) { /* else server stole lock */ \
|
||||||
|
do { \
|
||||||
|
DRM_CAS(spin,val,0,__ret); \
|
||||||
|
} while (__ret); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* General user-level programmer's API: unprivileged */
|
||||||
|
extern int drmAvailable(void);
|
||||||
|
extern int drmOpen(const char *name, const char *busid);
|
||||||
|
extern int drmClose(int fd);
|
||||||
|
extern drmVersionPtr drmGetVersion(int fd);
|
||||||
|
extern drmVersionPtr drmGetLibVersion(int fd);
|
||||||
|
extern void drmFreeVersion(drmVersionPtr);
|
||||||
|
extern int drmGetMagic(int fd, drmMagicPtr magic);
|
||||||
|
extern char *drmGetBusid(int fd);
|
||||||
|
extern int drmGetInterruptFromBusID(int fd, int busnum, int devnum,
|
||||||
|
int funcnum);
|
||||||
|
extern int drmGetMap(int fd, int idx, drmHandle *offset,
|
||||||
|
drmSize *size, drmMapType *type,
|
||||||
|
drmMapFlags *flags, drmHandle *handle,
|
||||||
|
int *mtrr);
|
||||||
|
extern int drmGetClient(int fd, int idx, int *auth, int *pid,
|
||||||
|
int *uid, unsigned long *magic,
|
||||||
|
unsigned long *iocs);
|
||||||
|
extern int drmGetStats(int fd, drmStatsT *stats);
|
||||||
|
extern int drmCommandNone(int fd, unsigned long drmCommandIndex);
|
||||||
|
extern int drmCommandRead(int fd, unsigned long drmCommandIndex,
|
||||||
|
void *data, unsigned long size);
|
||||||
|
extern int drmCommandWrite(int fd, unsigned long drmCommandIndex,
|
||||||
|
void *data, unsigned long size);
|
||||||
|
extern int drmCommandWriteRead(int fd, unsigned long drmCommandIndex,
|
||||||
|
void *data, unsigned long size);
|
||||||
|
|
||||||
|
/* General user-level programmer's API: X server (root) only */
|
||||||
|
extern void drmFreeBusid(const char *busid);
|
||||||
|
extern int drmSetBusid(int fd, const char *busid);
|
||||||
|
extern int drmAuthMagic(int fd, drmMagic magic);
|
||||||
|
extern int drmAddMap(int fd,
|
||||||
|
drmHandle offset,
|
||||||
|
drmSize size,
|
||||||
|
drmMapType type,
|
||||||
|
drmMapFlags flags,
|
||||||
|
drmHandlePtr handle);
|
||||||
|
extern int drmRmMap(int fd, drmHandle handle);
|
||||||
|
extern int drmAddContextPrivateMapping(int fd, drmContext ctx_id,
|
||||||
|
drmHandle handle);
|
||||||
|
|
||||||
|
extern int drmAddBufs(int fd, int count, int size,
|
||||||
|
drmBufDescFlags flags,
|
||||||
|
int agp_offset);
|
||||||
|
extern int drmMarkBufs(int fd, double low, double high);
|
||||||
|
extern int drmCreateContext(int fd, drmContextPtr handle);
|
||||||
|
extern int drmSetContextFlags(int fd, drmContext context,
|
||||||
|
drmContextFlags flags);
|
||||||
|
extern int drmGetContextFlags(int fd, drmContext context,
|
||||||
|
drmContextFlagsPtr flags);
|
||||||
|
extern int drmAddContextTag(int fd, drmContext context, void *tag);
|
||||||
|
extern int drmDelContextTag(int fd, drmContext context);
|
||||||
|
extern void *drmGetContextTag(int fd, drmContext context);
|
||||||
|
extern drmContextPtr drmGetReservedContextList(int fd, int *count);
|
||||||
|
extern void drmFreeReservedContextList(drmContextPtr);
|
||||||
|
extern int drmSwitchToContext(int fd, drmContext context);
|
||||||
|
extern int drmDestroyContext(int fd, drmContext handle);
|
||||||
|
extern int drmCreateDrawable(int fd, drmDrawablePtr handle);
|
||||||
|
extern int drmDestroyDrawable(int fd, drmDrawable handle);
|
||||||
|
extern int drmCtlInstHandler(int fd, int irq);
|
||||||
|
extern int drmCtlUninstHandler(int fd);
|
||||||
|
extern int drmInstallSIGIOHandler(int fd,
|
||||||
|
void (*f)(int fd,
|
||||||
|
void *oldctx,
|
||||||
|
void *newctx));
|
||||||
|
extern int drmRemoveSIGIOHandler(int fd);
|
||||||
|
|
||||||
|
/* General user-level programmer's API: authenticated client and/or X */
|
||||||
|
extern int drmMap(int fd,
|
||||||
|
drmHandle handle,
|
||||||
|
drmSize size,
|
||||||
|
drmAddressPtr address);
|
||||||
|
extern int drmUnmap(drmAddress address, drmSize size);
|
||||||
|
extern drmBufInfoPtr drmGetBufInfo(int fd);
|
||||||
|
extern drmBufMapPtr drmMapBufs(int fd);
|
||||||
|
extern int drmUnmapBufs(drmBufMapPtr bufs);
|
||||||
|
extern int drmDMA(int fd, drmDMAReqPtr request);
|
||||||
|
extern int drmFreeBufs(int fd, int count, int *list);
|
||||||
|
extern int drmGetLock(int fd,
|
||||||
|
drmContext context,
|
||||||
|
drmLockFlags flags);
|
||||||
|
extern int drmUnlock(int fd, drmContext context);
|
||||||
|
extern int drmFinish(int fd, int context, drmLockFlags flags);
|
||||||
|
extern int drmGetContextPrivateMapping(int fd, drmContext ctx_id,
|
||||||
|
drmHandlePtr handle);
|
||||||
|
|
||||||
|
/* AGP/GART support: X server (root) only */
|
||||||
|
extern int drmAgpAcquire(int fd);
|
||||||
|
extern int drmAgpRelease(int fd);
|
||||||
|
extern int drmAgpEnable(int fd, unsigned long mode);
|
||||||
|
extern int drmAgpAlloc(int fd, unsigned long size,
|
||||||
|
unsigned long type, unsigned long *address,
|
||||||
|
unsigned long *handle);
|
||||||
|
extern int drmAgpFree(int fd, unsigned long handle);
|
||||||
|
extern int drmAgpBind(int fd, unsigned long handle,
|
||||||
|
unsigned long offset);
|
||||||
|
extern int drmAgpUnbind(int fd, unsigned long handle);
|
||||||
|
|
||||||
|
/* AGP/GART info: authenticated client and/or X */
|
||||||
|
extern int drmAgpVersionMajor(int fd);
|
||||||
|
extern int drmAgpVersionMinor(int fd);
|
||||||
|
extern unsigned long drmAgpGetMode(int fd);
|
||||||
|
extern unsigned long drmAgpBase(int fd); /* Physical location */
|
||||||
|
extern unsigned long drmAgpSize(int fd); /* Bytes */
|
||||||
|
extern unsigned long drmAgpMemoryUsed(int fd);
|
||||||
|
extern unsigned long drmAgpMemoryAvail(int fd);
|
||||||
|
extern unsigned int drmAgpVendorId(int fd);
|
||||||
|
extern unsigned int drmAgpDeviceId(int fd);
|
||||||
|
|
||||||
|
/* PCI scatter/gather support: X server (root) only */
|
||||||
|
extern int drmScatterGatherAlloc(int fd, unsigned long size,
|
||||||
|
unsigned long *handle);
|
||||||
|
extern int drmScatterGatherFree(int fd, unsigned long handle);
|
||||||
|
|
||||||
|
extern int drmWaitVBlank(int fd, drmVBlankPtr vbl);
|
||||||
|
|
||||||
|
/* Support routines */
|
||||||
|
extern int drmError(int err, const char *label);
|
||||||
|
extern void *drmMalloc(int size);
|
||||||
|
extern void drmFree(void *pt);
|
||||||
|
|
||||||
|
/* Hash table routines */
|
||||||
|
extern void *drmHashCreate(void);
|
||||||
|
extern int drmHashDestroy(void *t);
|
||||||
|
extern int drmHashLookup(void *t, unsigned long key, void **value);
|
||||||
|
extern int drmHashInsert(void *t, unsigned long key, void *value);
|
||||||
|
extern int drmHashDelete(void *t, unsigned long key);
|
||||||
|
extern int drmHashFirst(void *t, unsigned long *key, void **value);
|
||||||
|
extern int drmHashNext(void *t, unsigned long *key, void **value);
|
||||||
|
|
||||||
|
/* PRNG routines */
|
||||||
|
extern void *drmRandomCreate(unsigned long seed);
|
||||||
|
extern int drmRandomDestroy(void *state);
|
||||||
|
extern unsigned long drmRandom(void *state);
|
||||||
|
extern double drmRandomDouble(void *state);
|
||||||
|
|
||||||
|
/* Skip list routines */
|
||||||
|
|
||||||
|
extern void *drmSLCreate(void);
|
||||||
|
extern int drmSLDestroy(void *l);
|
||||||
|
extern int drmSLLookup(void *l, unsigned long key, void **value);
|
||||||
|
extern int drmSLInsert(void *l, unsigned long key, void *value);
|
||||||
|
extern int drmSLDelete(void *l, unsigned long key);
|
||||||
|
extern int drmSLNext(void *l, unsigned long *key, void **value);
|
||||||
|
extern int drmSLFirst(void *l, unsigned long *key, void **value);
|
||||||
|
extern void drmSLDump(void *l);
|
||||||
|
extern int drmSLLookupNeighbors(void *l, unsigned long key,
|
||||||
|
unsigned long *prev_key, void **prev_value,
|
||||||
|
unsigned long *next_key, void **next_value);
|
||||||
|
|
||||||
|
#endif
|
||||||
435
src/dri-es/xf86drmHash.c
Normal file
435
src/dri-es/xf86drmHash.c
Normal file
@@ -0,0 +1,435 @@
|
|||||||
|
/* xf86drmHash.c -- Small hash table support for integer -> integer mapping
|
||||||
|
* Created: Sun Apr 18 09:35:45 1999 by faith@precisioninsight.com
|
||||||
|
*
|
||||||
|
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
* 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
*
|
||||||
|
* Authors: Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
|
*
|
||||||
|
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmHash.c,v 1.4 2001/03/21 18:08:54 dawes Exp $
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* This file contains a straightforward implementation of a fixed-sized
|
||||||
|
* hash table using self-organizing linked lists [Knuth73, pp. 398-399] for
|
||||||
|
* collision resolution. There are two potentially interesting things
|
||||||
|
* about this implementation:
|
||||||
|
*
|
||||||
|
* 1) The table is power-of-two sized. Prime sized tables are more
|
||||||
|
* traditional, but do not have a significant advantage over power-of-two
|
||||||
|
* sized table, especially when double hashing is not used for collision
|
||||||
|
* resolution.
|
||||||
|
*
|
||||||
|
* 2) The hash computation uses a table of random integers [Hanson97,
|
||||||
|
* pp. 39-41].
|
||||||
|
*
|
||||||
|
* FUTURE ENHANCEMENTS
|
||||||
|
*
|
||||||
|
* With a table size of 512, the current implementation is sufficient for a
|
||||||
|
* few hundred keys. Since this is well above the expected size of the
|
||||||
|
* tables for which this implementation was designed, the implementation of
|
||||||
|
* dynamic hash tables was postponed until the need arises. A common (and
|
||||||
|
* naive) approach to dynamic hash table implementation simply creates a
|
||||||
|
* new hash table when necessary, rehashes all the data into the new table,
|
||||||
|
* and destroys the old table. The approach in [Larson88] is superior in
|
||||||
|
* two ways: 1) only a portion of the table is expanded when needed,
|
||||||
|
* distributing the expansion cost over several insertions, and 2) portions
|
||||||
|
* of the table can be locked, enabling a scalable thread-safe
|
||||||
|
* implementation.
|
||||||
|
*
|
||||||
|
* REFERENCES
|
||||||
|
*
|
||||||
|
* [Hanson97] David R. Hanson. C Interfaces and Implementations:
|
||||||
|
* Techniques for Creating Reusable Software. Reading, Massachusetts:
|
||||||
|
* Addison-Wesley, 1997.
|
||||||
|
*
|
||||||
|
* [Knuth73] Donald E. Knuth. The Art of Computer Programming. Volume 3:
|
||||||
|
* Sorting and Searching. Reading, Massachusetts: Addison-Wesley, 1973.
|
||||||
|
*
|
||||||
|
* [Larson88] Per-Ake Larson. "Dynamic Hash Tables". CACM 31(4), April
|
||||||
|
* 1988, pp. 446-457.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HASH_MAIN 0
|
||||||
|
|
||||||
|
#if HASH_MAIN
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
# include "xf86drm.h"
|
||||||
|
# ifdef XFree86LOADER
|
||||||
|
# include "xf86.h"
|
||||||
|
# include "xf86_ansic.h"
|
||||||
|
# else
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define N(x) drm##x
|
||||||
|
|
||||||
|
#define HASH_MAGIC 0xdeadbeef
|
||||||
|
#define HASH_DEBUG 0
|
||||||
|
#define HASH_SIZE 512 /* Good for about 100 entries */
|
||||||
|
/* If you change this value, you probably
|
||||||
|
have to change the HashHash hashing
|
||||||
|
function! */
|
||||||
|
|
||||||
|
#if HASH_MAIN
|
||||||
|
#define HASH_ALLOC malloc
|
||||||
|
#define HASH_FREE free
|
||||||
|
#define HASH_RANDOM_DECL
|
||||||
|
#define HASH_RANDOM_INIT(seed) srandom(seed)
|
||||||
|
#define HASH_RANDOM random()
|
||||||
|
#else
|
||||||
|
#define HASH_ALLOC drmMalloc
|
||||||
|
#define HASH_FREE drmFree
|
||||||
|
#define HASH_RANDOM_DECL void *state
|
||||||
|
#define HASH_RANDOM_INIT(seed) state = drmRandomCreate(seed)
|
||||||
|
#define HASH_RANDOM drmRandom(state)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct HashBucket {
|
||||||
|
unsigned long key;
|
||||||
|
void *value;
|
||||||
|
struct HashBucket *next;
|
||||||
|
} HashBucket, *HashBucketPtr;
|
||||||
|
|
||||||
|
typedef struct HashTable {
|
||||||
|
unsigned long magic;
|
||||||
|
unsigned long entries;
|
||||||
|
unsigned long hits; /* At top of linked list */
|
||||||
|
unsigned long partials; /* Not at top of linked list */
|
||||||
|
unsigned long misses; /* Not in table */
|
||||||
|
HashBucketPtr buckets[HASH_SIZE];
|
||||||
|
int p0;
|
||||||
|
HashBucketPtr p1;
|
||||||
|
} HashTable, *HashTablePtr;
|
||||||
|
|
||||||
|
#if HASH_MAIN
|
||||||
|
extern void *N(HashCreate)(void);
|
||||||
|
extern int N(HashDestroy)(void *t);
|
||||||
|
extern int N(HashLookup)(void *t, unsigned long key, unsigned long *value);
|
||||||
|
extern int N(HashInsert)(void *t, unsigned long key, unsigned long value);
|
||||||
|
extern int N(HashDelete)(void *t, unsigned long key);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static unsigned long HashHash(unsigned long key)
|
||||||
|
{
|
||||||
|
unsigned long hash = 0;
|
||||||
|
unsigned long tmp = key;
|
||||||
|
static int init = 0;
|
||||||
|
static unsigned long scatter[256];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!init) {
|
||||||
|
HASH_RANDOM_DECL;
|
||||||
|
HASH_RANDOM_INIT(37);
|
||||||
|
for (i = 0; i < 256; i++) scatter[i] = HASH_RANDOM;
|
||||||
|
++init;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (tmp) {
|
||||||
|
hash = (hash << 1) + scatter[tmp & 0xff];
|
||||||
|
tmp >>= 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash %= HASH_SIZE;
|
||||||
|
#if HASH_DEBUG
|
||||||
|
printf( "Hash(%d) = %d\n", key, hash);
|
||||||
|
#endif
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *N(HashCreate)(void)
|
||||||
|
{
|
||||||
|
HashTablePtr table;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
table = HASH_ALLOC(sizeof(*table));
|
||||||
|
if (!table) return NULL;
|
||||||
|
table->magic = HASH_MAGIC;
|
||||||
|
table->entries = 0;
|
||||||
|
table->hits = 0;
|
||||||
|
table->partials = 0;
|
||||||
|
table->misses = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < HASH_SIZE; i++) table->buckets[i] = NULL;
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(HashDestroy)(void *t)
|
||||||
|
{
|
||||||
|
HashTablePtr table = (HashTablePtr)t;
|
||||||
|
HashBucketPtr bucket;
|
||||||
|
HashBucketPtr next;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
for (i = 0; i < HASH_SIZE; i++) {
|
||||||
|
for (bucket = table->buckets[i]; bucket;) {
|
||||||
|
next = bucket->next;
|
||||||
|
HASH_FREE(bucket);
|
||||||
|
bucket = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HASH_FREE(table);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the bucket and organize the list so that this bucket is at the
|
||||||
|
top. */
|
||||||
|
|
||||||
|
static HashBucketPtr HashFind(HashTablePtr table,
|
||||||
|
unsigned long key, unsigned long *h)
|
||||||
|
{
|
||||||
|
unsigned long hash = HashHash(key);
|
||||||
|
HashBucketPtr prev = NULL;
|
||||||
|
HashBucketPtr bucket;
|
||||||
|
|
||||||
|
if (h) *h = hash;
|
||||||
|
|
||||||
|
for (bucket = table->buckets[hash]; bucket; bucket = bucket->next) {
|
||||||
|
if (bucket->key == key) {
|
||||||
|
if (prev) {
|
||||||
|
/* Organize */
|
||||||
|
prev->next = bucket->next;
|
||||||
|
bucket->next = table->buckets[hash];
|
||||||
|
table->buckets[hash] = bucket;
|
||||||
|
++table->partials;
|
||||||
|
} else {
|
||||||
|
++table->hits;
|
||||||
|
}
|
||||||
|
return bucket;
|
||||||
|
}
|
||||||
|
prev = bucket;
|
||||||
|
}
|
||||||
|
++table->misses;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(HashLookup)(void *t, unsigned long key, void **value)
|
||||||
|
{
|
||||||
|
HashTablePtr table = (HashTablePtr)t;
|
||||||
|
HashBucketPtr bucket;
|
||||||
|
|
||||||
|
if (!table || table->magic != HASH_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
bucket = HashFind(table, key, NULL);
|
||||||
|
if (!bucket) return 1; /* Not found */
|
||||||
|
*value = bucket->value;
|
||||||
|
return 0; /* Found */
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(HashInsert)(void *t, unsigned long key, void *value)
|
||||||
|
{
|
||||||
|
HashTablePtr table = (HashTablePtr)t;
|
||||||
|
HashBucketPtr bucket;
|
||||||
|
unsigned long hash;
|
||||||
|
|
||||||
|
if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
if (HashFind(table, key, &hash)) return 1; /* Already in table */
|
||||||
|
|
||||||
|
bucket = HASH_ALLOC(sizeof(*bucket));
|
||||||
|
if (!bucket) return -1; /* Error */
|
||||||
|
bucket->key = key;
|
||||||
|
bucket->value = value;
|
||||||
|
bucket->next = table->buckets[hash];
|
||||||
|
table->buckets[hash] = bucket;
|
||||||
|
#if HASH_DEBUG
|
||||||
|
printf("Inserted %d at %d/%p\n", key, hash, bucket);
|
||||||
|
#endif
|
||||||
|
return 0; /* Added to table */
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(HashDelete)(void *t, unsigned long key)
|
||||||
|
{
|
||||||
|
HashTablePtr table = (HashTablePtr)t;
|
||||||
|
unsigned long hash;
|
||||||
|
HashBucketPtr bucket;
|
||||||
|
|
||||||
|
if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
bucket = HashFind(table, key, &hash);
|
||||||
|
|
||||||
|
if (!bucket) return 1; /* Not found */
|
||||||
|
|
||||||
|
table->buckets[hash] = bucket->next;
|
||||||
|
HASH_FREE(bucket);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(HashNext)(void *t, unsigned long *key, void **value)
|
||||||
|
{
|
||||||
|
HashTablePtr table = (HashTablePtr)t;
|
||||||
|
|
||||||
|
for (; table->p0 < HASH_SIZE;
|
||||||
|
++table->p0, table->p1 = table->buckets[table->p0]) {
|
||||||
|
if (table->p1) {
|
||||||
|
*key = table->p1->key;
|
||||||
|
*value = table->p1->value;
|
||||||
|
table->p1 = table->p1->next;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(HashFirst)(void *t, unsigned long *key, void **value)
|
||||||
|
{
|
||||||
|
HashTablePtr table = (HashTablePtr)t;
|
||||||
|
|
||||||
|
if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
table->p0 = 0;
|
||||||
|
table->p1 = table->buckets[0];
|
||||||
|
return N(HashNext)(table, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HASH_MAIN
|
||||||
|
#define DIST_LIMIT 10
|
||||||
|
static int dist[DIST_LIMIT];
|
||||||
|
|
||||||
|
static void clear_dist(void) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < DIST_LIMIT; i++) dist[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int count_entries(HashBucketPtr bucket)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (; bucket; bucket = bucket->next) ++count;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update_dist(int count)
|
||||||
|
{
|
||||||
|
if (count >= DIST_LIMIT) ++dist[DIST_LIMIT-1];
|
||||||
|
else ++dist[count];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void compute_dist(HashTablePtr table)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
HashBucketPtr bucket;
|
||||||
|
|
||||||
|
printf("Entries = %ld, hits = %ld, partials = %ld, misses = %ld\n",
|
||||||
|
table->entries, table->hits, table->partials, table->misses);
|
||||||
|
clear_dist();
|
||||||
|
for (i = 0; i < HASH_SIZE; i++) {
|
||||||
|
bucket = table->buckets[i];
|
||||||
|
update_dist(count_entries(bucket));
|
||||||
|
}
|
||||||
|
for (i = 0; i < DIST_LIMIT; i++) {
|
||||||
|
if (i != DIST_LIMIT-1) printf("%5d %10d\n", i, dist[i]);
|
||||||
|
else printf("other %10d\n", dist[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void check_table(HashTablePtr table,
|
||||||
|
unsigned long key, unsigned long value)
|
||||||
|
{
|
||||||
|
unsigned long retval = 0;
|
||||||
|
int retcode = N(HashLookup)(table, key, &retval);
|
||||||
|
|
||||||
|
switch (retcode) {
|
||||||
|
case -1:
|
||||||
|
printf("Bad magic = 0x%08lx:"
|
||||||
|
" key = %lu, expected = %lu, returned = %lu\n",
|
||||||
|
table->magic, key, value, retval);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
printf("Not found: key = %lu, expected = %lu returned = %lu\n",
|
||||||
|
key, value, retval);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
if (value != retval)
|
||||||
|
printf("Bad value: key = %lu, expected = %lu, returned = %lu\n",
|
||||||
|
key, value, retval);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Bad retcode = %d: key = %lu, expected = %lu, returned = %lu\n",
|
||||||
|
retcode, key, value, retval);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
HashTablePtr table;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf("\n***** 256 consecutive integers ****\n");
|
||||||
|
table = N(HashCreate)();
|
||||||
|
for (i = 0; i < 256; i++) N(HashInsert)(table, i, i);
|
||||||
|
for (i = 0; i < 256; i++) check_table(table, i, i);
|
||||||
|
for (i = 256; i >= 0; i--) check_table(table, i, i);
|
||||||
|
compute_dist(table);
|
||||||
|
N(HashDestroy)(table);
|
||||||
|
|
||||||
|
printf("\n***** 1024 consecutive integers ****\n");
|
||||||
|
table = N(HashCreate)();
|
||||||
|
for (i = 0; i < 1024; i++) N(HashInsert)(table, i, i);
|
||||||
|
for (i = 0; i < 1024; i++) check_table(table, i, i);
|
||||||
|
for (i = 1024; i >= 0; i--) check_table(table, i, i);
|
||||||
|
compute_dist(table);
|
||||||
|
N(HashDestroy)(table);
|
||||||
|
|
||||||
|
printf("\n***** 1024 consecutive page addresses (4k pages) ****\n");
|
||||||
|
table = N(HashCreate)();
|
||||||
|
for (i = 0; i < 1024; i++) N(HashInsert)(table, i*4096, i);
|
||||||
|
for (i = 0; i < 1024; i++) check_table(table, i*4096, i);
|
||||||
|
for (i = 1024; i >= 0; i--) check_table(table, i*4096, i);
|
||||||
|
compute_dist(table);
|
||||||
|
N(HashDestroy)(table);
|
||||||
|
|
||||||
|
printf("\n***** 1024 random integers ****\n");
|
||||||
|
table = N(HashCreate)();
|
||||||
|
srandom(0xbeefbeef);
|
||||||
|
for (i = 0; i < 1024; i++) N(HashInsert)(table, random(), i);
|
||||||
|
srandom(0xbeefbeef);
|
||||||
|
for (i = 0; i < 1024; i++) check_table(table, random(), i);
|
||||||
|
srandom(0xbeefbeef);
|
||||||
|
for (i = 0; i < 1024; i++) check_table(table, random(), i);
|
||||||
|
compute_dist(table);
|
||||||
|
N(HashDestroy)(table);
|
||||||
|
|
||||||
|
printf("\n***** 5000 random integers ****\n");
|
||||||
|
table = N(HashCreate)();
|
||||||
|
srandom(0xbeefbeef);
|
||||||
|
for (i = 0; i < 5000; i++) N(HashInsert)(table, random(), i);
|
||||||
|
srandom(0xbeefbeef);
|
||||||
|
for (i = 0; i < 5000; i++) check_table(table, random(), i);
|
||||||
|
srandom(0xbeefbeef);
|
||||||
|
for (i = 0; i < 5000; i++) check_table(table, random(), i);
|
||||||
|
compute_dist(table);
|
||||||
|
N(HashDestroy)(table);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
219
src/dri-es/xf86drmRandom.c
Normal file
219
src/dri-es/xf86drmRandom.c
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
/* xf86drmRandom.c -- "Minimal Standard" PRNG Implementation
|
||||||
|
* Created: Mon Apr 19 08:28:13 1999 by faith@precisioninsight.com
|
||||||
|
*
|
||||||
|
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
* 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
*
|
||||||
|
* Authors: Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
|
*
|
||||||
|
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRandom.c,v 1.4 2000/06/17 00:03:34 martin Exp $
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* This file contains a simple, straightforward implementation of the Park
|
||||||
|
* & Miller "Minimal Standard" PRNG [PM88, PMS93], which is a Lehmer
|
||||||
|
* multiplicative linear congruential generator (MLCG) with a period of
|
||||||
|
* 2^31-1.
|
||||||
|
*
|
||||||
|
* This implementation is intended to provide a reliable, portable PRNG
|
||||||
|
* that is suitable for testing a hash table implementation and for
|
||||||
|
* implementing skip lists.
|
||||||
|
*
|
||||||
|
* FUTURE ENHANCEMENTS
|
||||||
|
*
|
||||||
|
* If initial seeds are not selected randomly, two instances of the PRNG
|
||||||
|
* can be correlated. [Knuth81, pp. 32-33] describes a shuffling technique
|
||||||
|
* that can eliminate this problem.
|
||||||
|
*
|
||||||
|
* If PRNGs are used for simulation, the period of the current
|
||||||
|
* implementation may be too short. [LE88] discusses methods of combining
|
||||||
|
* MLCGs to produce much longer periods, and suggests some alternative
|
||||||
|
* values for A and M. [LE90 and Sch92] also provide information on
|
||||||
|
* long-period PRNGs.
|
||||||
|
*
|
||||||
|
* REFERENCES
|
||||||
|
*
|
||||||
|
* [Knuth81] Donald E. Knuth. The Art of Computer Programming. Volume 2:
|
||||||
|
* Seminumerical Algorithms. Reading, Massachusetts: Addison-Wesley, 1981.
|
||||||
|
*
|
||||||
|
* [LE88] Pierre L'Ecuyer. "Efficient and Portable Combined Random Number
|
||||||
|
* Generators". CACM 31(6), June 1988, pp. 742-774.
|
||||||
|
*
|
||||||
|
* [LE90] Pierre L'Ecuyer. "Random Numbers for Simulation". CACM 33(10,
|
||||||
|
* October 1990, pp. 85-97.
|
||||||
|
*
|
||||||
|
* [PM88] Stephen K. Park and Keith W. Miller. "Random Number Generators:
|
||||||
|
* Good Ones are Hard to Find". CACM 31(10), October 1988, pp. 1192-1201.
|
||||||
|
*
|
||||||
|
* [Sch92] Bruce Schneier. "Pseudo-Ransom Sequence Generator for 32-Bit
|
||||||
|
* CPUs". Dr. Dobb's Journal 17(2), February 1992, pp. 34, 37-38, 40.
|
||||||
|
*
|
||||||
|
* [PMS93] Stephen K. Park, Keith W. Miller, and Paul K. Stockmeyer. In
|
||||||
|
* "Technical Correspondence: Remarks on Choosing and Implementing Random
|
||||||
|
* Number Generators". CACM 36(7), July 1993, pp. 105-110.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define RANDOM_MAIN 0
|
||||||
|
|
||||||
|
#if RANDOM_MAIN
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
# include "xf86drm.h"
|
||||||
|
# ifdef XFree86LOADER
|
||||||
|
# include "xf86.h"
|
||||||
|
# include "xf86_ansic.h"
|
||||||
|
# else
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define N(x) drm##x
|
||||||
|
|
||||||
|
#define RANDOM_MAGIC 0xfeedbeef
|
||||||
|
#define RANDOM_DEBUG 0
|
||||||
|
|
||||||
|
#if RANDOM_MAIN
|
||||||
|
#define RANDOM_ALLOC malloc
|
||||||
|
#define RANDOM_FREE free
|
||||||
|
#else
|
||||||
|
#define RANDOM_ALLOC drmMalloc
|
||||||
|
#define RANDOM_FREE drmFree
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct RandomState {
|
||||||
|
unsigned long magic;
|
||||||
|
unsigned long a;
|
||||||
|
unsigned long m;
|
||||||
|
unsigned long q; /* m div a */
|
||||||
|
unsigned long r; /* m mod a */
|
||||||
|
unsigned long check;
|
||||||
|
long seed;
|
||||||
|
} RandomState;
|
||||||
|
|
||||||
|
#if RANDOM_MAIN
|
||||||
|
extern void *N(RandomCreate)(unsigned long seed);
|
||||||
|
extern int N(RandomDestroy)(void *state);
|
||||||
|
extern unsigned long N(Random)(void *state);
|
||||||
|
extern double N(RandomDouble)(void *state);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void *N(RandomCreate)(unsigned long seed)
|
||||||
|
{
|
||||||
|
RandomState *state;
|
||||||
|
|
||||||
|
state = RANDOM_ALLOC(sizeof(*state));
|
||||||
|
if (!state) return NULL;
|
||||||
|
state->magic = RANDOM_MAGIC;
|
||||||
|
#if 0
|
||||||
|
/* Park & Miller, October 1988 */
|
||||||
|
state->a = 16807;
|
||||||
|
state->m = 2147483647;
|
||||||
|
state->check = 1043618065; /* After 10000 iterations */
|
||||||
|
#else
|
||||||
|
/* Park, Miller, and Stockmeyer, July 1993 */
|
||||||
|
state->a = 48271;
|
||||||
|
state->m = 2147483647;
|
||||||
|
state->check = 399268537; /* After 10000 iterations */
|
||||||
|
#endif
|
||||||
|
state->q = state->m / state->a;
|
||||||
|
state->r = state->m % state->a;
|
||||||
|
|
||||||
|
state->seed = seed;
|
||||||
|
/* Check for illegal boundary conditions,
|
||||||
|
and choose closest legal value. */
|
||||||
|
if (state->seed <= 0) state->seed = 1;
|
||||||
|
if (state->seed >= state->m) state->seed = state->m - 1;
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(RandomDestroy)(void *state)
|
||||||
|
{
|
||||||
|
RANDOM_FREE(state);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long N(Random)(void *state)
|
||||||
|
{
|
||||||
|
RandomState *s = (RandomState *)state;
|
||||||
|
long hi;
|
||||||
|
long lo;
|
||||||
|
|
||||||
|
hi = s->seed / s->q;
|
||||||
|
lo = s->seed % s->q;
|
||||||
|
s->seed = s->a * lo - s->r * hi;
|
||||||
|
if (s->seed <= 0) s->seed += s->m;
|
||||||
|
|
||||||
|
return s->seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
double N(RandomDouble)(void *state)
|
||||||
|
{
|
||||||
|
RandomState *s = (RandomState *)state;
|
||||||
|
|
||||||
|
return (double)N(Random)(state)/(double)s->m;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if RANDOM_MAIN
|
||||||
|
static void check_period(long seed)
|
||||||
|
{
|
||||||
|
unsigned long count = 0;
|
||||||
|
unsigned long initial;
|
||||||
|
void *state;
|
||||||
|
|
||||||
|
state = N(RandomCreate)(seed);
|
||||||
|
initial = N(Random)(state);
|
||||||
|
++count;
|
||||||
|
while (initial != N(Random)(state)) {
|
||||||
|
if (!++count) break;
|
||||||
|
}
|
||||||
|
printf("With seed of %10ld, period = %10lu (0x%08lx)\n",
|
||||||
|
seed, count, count);
|
||||||
|
N(RandomDestroy)(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
RandomState *state;
|
||||||
|
int i;
|
||||||
|
unsigned long rand;
|
||||||
|
|
||||||
|
state = N(RandomCreate)(1);
|
||||||
|
for (i = 0; i < 10000; i++) {
|
||||||
|
rand = N(Random)(state);
|
||||||
|
}
|
||||||
|
printf("After 10000 iterations: %lu (%lu expected): %s\n",
|
||||||
|
rand, state->check,
|
||||||
|
rand - state->check ? "*INCORRECT*" : "CORRECT");
|
||||||
|
N(RandomDestroy)(state);
|
||||||
|
|
||||||
|
printf("Checking periods...\n");
|
||||||
|
check_period(1);
|
||||||
|
check_period(2);
|
||||||
|
check_period(31415926);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
490
src/dri-es/xf86drmSL.c
Normal file
490
src/dri-es/xf86drmSL.c
Normal file
@@ -0,0 +1,490 @@
|
|||||||
|
/* xf86drmSL.c -- Skip list support
|
||||||
|
* Created: Mon May 10 09:28:13 1999 by faith@precisioninsight.com
|
||||||
|
*
|
||||||
|
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
|
* 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* PRECISION INSIGHT AND/OR ITS 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.
|
||||||
|
*
|
||||||
|
* Authors: Rickard E. (Rik) Faith <faith@valinux.com>
|
||||||
|
*
|
||||||
|
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSL.c,v 1.3 2000/06/17 00:03:34 martin Exp $
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* This file contains a straightforward skip list implementation.n
|
||||||
|
*
|
||||||
|
* FUTURE ENHANCEMENTS
|
||||||
|
*
|
||||||
|
* REFERENCES
|
||||||
|
*
|
||||||
|
* [Pugh90] William Pugh. Skip Lists: A Probabilistic Alternative to
|
||||||
|
* Balanced Trees. CACM 33(6), June 1990, pp. 668-676.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SL_MAIN 0
|
||||||
|
|
||||||
|
#if SL_MAIN
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <sys/time.h>
|
||||||
|
#else
|
||||||
|
# include "xf86drm.h"
|
||||||
|
# ifdef XFree86LOADER
|
||||||
|
# include "xf86.h"
|
||||||
|
# include "xf86_ansic.h"
|
||||||
|
# else
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define N(x) drm##x
|
||||||
|
|
||||||
|
#define SL_LIST_MAGIC 0xfacade00LU
|
||||||
|
#define SL_ENTRY_MAGIC 0x00fab1edLU
|
||||||
|
#define SL_FREED_MAGIC 0xdecea5edLU
|
||||||
|
#define SL_MAX_LEVEL 16
|
||||||
|
#define SL_DEBUG 0
|
||||||
|
#define SL_RANDOM_SEED 0xc01055a1LU
|
||||||
|
|
||||||
|
#if SL_MAIN
|
||||||
|
#define SL_ALLOC malloc
|
||||||
|
#define SL_FREE free
|
||||||
|
#define SL_RANDOM_DECL static int state = 0;
|
||||||
|
#define SL_RANDOM_INIT(seed) if (!state) { srandom(seed); ++state; }
|
||||||
|
#define SL_RANDOM random()
|
||||||
|
#else
|
||||||
|
#define SL_ALLOC drmMalloc
|
||||||
|
#define SL_FREE drmFree
|
||||||
|
#define SL_RANDOM_DECL static void *state = NULL
|
||||||
|
#define SL_RANDOM_INIT(seed) if (!state) state = drmRandomCreate(seed)
|
||||||
|
#define SL_RANDOM drmRandom(state)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct SLEntry {
|
||||||
|
unsigned long magic; /* SL_ENTRY_MAGIC */
|
||||||
|
unsigned long key;
|
||||||
|
void *value;
|
||||||
|
int levels;
|
||||||
|
struct SLEntry *forward[1]; /* variable sized array */
|
||||||
|
} SLEntry, *SLEntryPtr;
|
||||||
|
|
||||||
|
typedef struct SkipList {
|
||||||
|
unsigned long magic; /* SL_LIST_MAGIC */
|
||||||
|
int level;
|
||||||
|
int count;
|
||||||
|
SLEntryPtr head;
|
||||||
|
SLEntryPtr p0; /* Position for iteration */
|
||||||
|
} SkipList, *SkipListPtr;
|
||||||
|
|
||||||
|
#if SL_MAIN
|
||||||
|
extern void *N(SLCreate)(void);
|
||||||
|
extern int N(SLDestroy)(void *l);
|
||||||
|
extern int N(SLLookup)(void *l, unsigned long key, void **value);
|
||||||
|
extern int N(SLInsert)(void *l, unsigned long key, void *value);
|
||||||
|
extern int N(SLDelete)(void *l, unsigned long key);
|
||||||
|
extern int N(SLNext)(void *l, unsigned long *key, void **value);
|
||||||
|
extern int N(SLFirst)(void *l, unsigned long *key, void **value);
|
||||||
|
extern void N(SLDump)(void *l);
|
||||||
|
extern int N(SLLookupNeighbors)(void *l, unsigned long key,
|
||||||
|
unsigned long *prev_key, void **prev_value,
|
||||||
|
unsigned long *next_key, void **next_value);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static SLEntryPtr SLCreateEntry(int max_level, unsigned long key, void *value)
|
||||||
|
{
|
||||||
|
SLEntryPtr entry;
|
||||||
|
|
||||||
|
if (max_level < 0 || max_level > SL_MAX_LEVEL) max_level = SL_MAX_LEVEL;
|
||||||
|
|
||||||
|
entry = SL_ALLOC(sizeof(*entry)
|
||||||
|
+ (max_level + 1) * sizeof(entry->forward[0]));
|
||||||
|
if (!entry) return NULL;
|
||||||
|
entry->magic = SL_ENTRY_MAGIC;
|
||||||
|
entry->key = key;
|
||||||
|
entry->value = value;
|
||||||
|
entry->levels = max_level + 1;
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int SLRandomLevel(void)
|
||||||
|
{
|
||||||
|
int level = 1;
|
||||||
|
SL_RANDOM_DECL;
|
||||||
|
|
||||||
|
SL_RANDOM_INIT(SL_RANDOM_SEED);
|
||||||
|
|
||||||
|
while ((SL_RANDOM & 0x01) && level < SL_MAX_LEVEL) ++level;
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *N(SLCreate)(void)
|
||||||
|
{
|
||||||
|
SkipListPtr list;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
list = SL_ALLOC(sizeof(*list));
|
||||||
|
if (!list) return NULL;
|
||||||
|
list->magic = SL_LIST_MAGIC;
|
||||||
|
list->level = 0;
|
||||||
|
list->head = SLCreateEntry(SL_MAX_LEVEL, 0, NULL);
|
||||||
|
list->count = 0;
|
||||||
|
|
||||||
|
for (i = 0; i <= SL_MAX_LEVEL; i++) list->head->forward[i] = NULL;
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(SLDestroy)(void *l)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr entry;
|
||||||
|
SLEntryPtr next;
|
||||||
|
|
||||||
|
if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
for (entry = list->head; entry; entry = next) {
|
||||||
|
if (entry->magic != SL_ENTRY_MAGIC) return -1; /* Bad magic */
|
||||||
|
next = entry->forward[0];
|
||||||
|
entry->magic = SL_FREED_MAGIC;
|
||||||
|
SL_FREE(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
list->magic = SL_FREED_MAGIC;
|
||||||
|
SL_FREE(list);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SLEntryPtr SLLocate(void *l, unsigned long key, SLEntryPtr *update)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr entry;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (list->magic != SL_LIST_MAGIC) return NULL;
|
||||||
|
|
||||||
|
for (i = list->level, entry = list->head; i >= 0; i--) {
|
||||||
|
while (entry->forward[i] && entry->forward[i]->key < key)
|
||||||
|
entry = entry->forward[i];
|
||||||
|
update[i] = entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry->forward[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(SLInsert)(void *l, unsigned long key, void *value)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr entry;
|
||||||
|
SLEntryPtr update[SL_MAX_LEVEL + 1];
|
||||||
|
int level;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
entry = SLLocate(list, key, update);
|
||||||
|
|
||||||
|
if (entry && entry->key == key) return 1; /* Already in list */
|
||||||
|
|
||||||
|
|
||||||
|
level = SLRandomLevel();
|
||||||
|
if (level > list->level) {
|
||||||
|
level = ++list->level;
|
||||||
|
update[level] = list->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = SLCreateEntry(level, key, value);
|
||||||
|
|
||||||
|
/* Fix up forward pointers */
|
||||||
|
for (i = 0; i <= level; i++) {
|
||||||
|
entry->forward[i] = update[i]->forward[i];
|
||||||
|
update[i]->forward[i] = entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
++list->count;
|
||||||
|
return 0; /* Added to table */
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(SLDelete)(void *l, unsigned long key)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr update[SL_MAX_LEVEL + 1];
|
||||||
|
SLEntryPtr entry;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
entry = SLLocate(list, key, update);
|
||||||
|
|
||||||
|
if (!entry || entry->key != key) return 1; /* Not found */
|
||||||
|
|
||||||
|
/* Fix up forward pointers */
|
||||||
|
for (i = 0; i <= list->level; i++) {
|
||||||
|
if (update[i]->forward[i] == entry)
|
||||||
|
update[i]->forward[i] = entry->forward[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
entry->magic = SL_FREED_MAGIC;
|
||||||
|
SL_FREE(entry);
|
||||||
|
|
||||||
|
while (list->level && !list->head->forward[list->level]) --list->level;
|
||||||
|
--list->count;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(SLLookup)(void *l, unsigned long key, void **value)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr update[SL_MAX_LEVEL + 1];
|
||||||
|
SLEntryPtr entry;
|
||||||
|
|
||||||
|
entry = SLLocate(list, key, update);
|
||||||
|
|
||||||
|
if (entry && entry->key == key) {
|
||||||
|
*value = entry;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*value = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(SLLookupNeighbors)(void *l, unsigned long key,
|
||||||
|
unsigned long *prev_key, void **prev_value,
|
||||||
|
unsigned long *next_key, void **next_value)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr update[SL_MAX_LEVEL + 1];
|
||||||
|
SLEntryPtr entry;
|
||||||
|
int retcode = 0;
|
||||||
|
|
||||||
|
entry = SLLocate(list, key, update);
|
||||||
|
|
||||||
|
*prev_key = *next_key = key;
|
||||||
|
*prev_value = *next_value = NULL;
|
||||||
|
|
||||||
|
if (update[0]) {
|
||||||
|
*prev_key = update[0]->key;
|
||||||
|
*prev_value = update[0]->value;
|
||||||
|
++retcode;
|
||||||
|
if (update[0]->forward[0]) {
|
||||||
|
*next_key = update[0]->forward[0]->key;
|
||||||
|
*next_value = update[0]->forward[0]->value;
|
||||||
|
++retcode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(SLNext)(void *l, unsigned long *key, void **value)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr entry;
|
||||||
|
|
||||||
|
if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
entry = list->p0;
|
||||||
|
|
||||||
|
if (entry) {
|
||||||
|
list->p0 = entry->forward[0];
|
||||||
|
*key = entry->key;
|
||||||
|
*value = entry->value;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
list->p0 = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int N(SLFirst)(void *l, unsigned long *key, void **value)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
|
||||||
|
if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
|
||||||
|
|
||||||
|
list->p0 = list->head->forward[0];
|
||||||
|
return N(SLNext)(list, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dump internal data structures for debugging. */
|
||||||
|
void N(SLDump)(void *l)
|
||||||
|
{
|
||||||
|
SkipListPtr list = (SkipListPtr)l;
|
||||||
|
SLEntryPtr entry;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (list->magic != SL_LIST_MAGIC) {
|
||||||
|
printf("Bad magic: 0x%08lx (expected 0x%08lx)\n",
|
||||||
|
list->magic, SL_LIST_MAGIC);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Level = %d, count = %d\n", list->level, list->count);
|
||||||
|
for (entry = list->head; entry; entry = entry->forward[0]) {
|
||||||
|
if (entry->magic != SL_ENTRY_MAGIC) {
|
||||||
|
printf("Bad magic: 0x%08lx (expected 0x%08lx)\n",
|
||||||
|
list->magic, SL_ENTRY_MAGIC);
|
||||||
|
}
|
||||||
|
printf("\nEntry %p <0x%08lx, %p> has %2d levels\n",
|
||||||
|
entry, entry->key, entry->value, entry->levels);
|
||||||
|
for (i = 0; i < entry->levels; i++) {
|
||||||
|
if (entry->forward[i]) {
|
||||||
|
printf(" %2d: %p <0x%08lx, %p>\n",
|
||||||
|
i,
|
||||||
|
entry->forward[i],
|
||||||
|
entry->forward[i]->key,
|
||||||
|
entry->forward[i]->value);
|
||||||
|
} else {
|
||||||
|
printf(" %2d: %p\n", i, entry->forward[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if SL_MAIN
|
||||||
|
static void print(SkipListPtr list)
|
||||||
|
{
|
||||||
|
unsigned long key;
|
||||||
|
void *value;
|
||||||
|
|
||||||
|
if (N(SLFirst)(list, &key, &value)) {
|
||||||
|
do {
|
||||||
|
printf("key = %5lu, value = %p\n", key, value);
|
||||||
|
} while (N(SLNext)(list, &key, &value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static double do_time(int size, int iter)
|
||||||
|
{
|
||||||
|
SkipListPtr list;
|
||||||
|
int i, j;
|
||||||
|
unsigned long keys[1000000];
|
||||||
|
unsigned long previous;
|
||||||
|
unsigned long key;
|
||||||
|
void *value;
|
||||||
|
struct timeval start, stop;
|
||||||
|
double usec;
|
||||||
|
SL_RANDOM_DECL;
|
||||||
|
|
||||||
|
SL_RANDOM_INIT(12345);
|
||||||
|
|
||||||
|
list = N(SLCreate)();
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
keys[i] = SL_RANDOM;
|
||||||
|
N(SLInsert)(list, keys[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
previous = 0;
|
||||||
|
if (N(SLFirst)(list, &key, &value)) {
|
||||||
|
do {
|
||||||
|
if (key <= previous) {
|
||||||
|
printf( "%lu !< %lu\n", previous, key);
|
||||||
|
}
|
||||||
|
previous = key;
|
||||||
|
} while (N(SLNext)(list, &key, &value));
|
||||||
|
}
|
||||||
|
|
||||||
|
gettimeofday(&start, NULL);
|
||||||
|
for (j = 0; j < iter; j++) {
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
if (N(SLLookup)(list, keys[i], &value))
|
||||||
|
printf("Error %lu %d\n", keys[i], i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gettimeofday(&stop, NULL);
|
||||||
|
|
||||||
|
usec = (double)(stop.tv_sec * 1000000 + stop.tv_usec
|
||||||
|
- start.tv_sec * 1000000 - start.tv_usec) / (size * iter);
|
||||||
|
|
||||||
|
printf("%0.2f microseconds for list length %d\n", usec, size);
|
||||||
|
|
||||||
|
N(SLDestroy)(list);
|
||||||
|
|
||||||
|
return usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_neighbors(void *list, unsigned long key)
|
||||||
|
{
|
||||||
|
unsigned long prev_key = 0;
|
||||||
|
unsigned long next_key = 0;
|
||||||
|
void *prev_value;
|
||||||
|
void *next_value;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
retval = drmSLLookupNeighbors(list, key,
|
||||||
|
&prev_key, &prev_value,
|
||||||
|
&next_key, &next_value);
|
||||||
|
printf("Neighbors of %5lu: %d %5lu %5lu\n",
|
||||||
|
key, retval, prev_key, next_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
SkipListPtr list;
|
||||||
|
double usec, usec2, usec3, usec4;
|
||||||
|
|
||||||
|
list = N(SLCreate)();
|
||||||
|
printf( "list at %p\n", list);
|
||||||
|
|
||||||
|
print(list);
|
||||||
|
printf("\n==============================\n\n");
|
||||||
|
|
||||||
|
N(SLInsert)(list, 123, NULL);
|
||||||
|
N(SLInsert)(list, 213, NULL);
|
||||||
|
N(SLInsert)(list, 50, NULL);
|
||||||
|
print(list);
|
||||||
|
printf("\n==============================\n\n");
|
||||||
|
|
||||||
|
print_neighbors(list, 0);
|
||||||
|
print_neighbors(list, 50);
|
||||||
|
print_neighbors(list, 51);
|
||||||
|
print_neighbors(list, 123);
|
||||||
|
print_neighbors(list, 200);
|
||||||
|
print_neighbors(list, 213);
|
||||||
|
print_neighbors(list, 256);
|
||||||
|
printf("\n==============================\n\n");
|
||||||
|
|
||||||
|
N(SLDelete)(list, 50);
|
||||||
|
print(list);
|
||||||
|
printf("\n==============================\n\n");
|
||||||
|
|
||||||
|
N(SLDump)(list);
|
||||||
|
N(SLDestroy)(list);
|
||||||
|
printf("\n==============================\n\n");
|
||||||
|
|
||||||
|
usec = do_time(100, 10000);
|
||||||
|
usec2 = do_time(1000, 500);
|
||||||
|
printf("Table size increased by %0.2f, search time increased by %0.2f\n",
|
||||||
|
1000.0/100.0, usec2 / usec);
|
||||||
|
|
||||||
|
usec3 = do_time(10000, 50);
|
||||||
|
printf("Table size increased by %0.2f, search time increased by %0.2f\n",
|
||||||
|
10000.0/100.0, usec3 / usec);
|
||||||
|
|
||||||
|
usec4 = do_time(100000, 4);
|
||||||
|
printf("Table size increased by %0.2f, search time increased by %0.2f\n",
|
||||||
|
100000.0/100.0, usec4 / usec);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
7
src/glu/mini/.cvsignore
Normal file
7
src/glu/mini/.cvsignore
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.deps
|
||||||
|
.libs
|
||||||
|
Makefile.in
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.la
|
||||||
|
depend
|
||||||
46
src/glu/mini/Makefile
Normal file
46
src/glu/mini/Makefile
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
|
||||||
|
MESA = ../..
|
||||||
|
default: libGLU.so.1.1 install
|
||||||
|
include $(MESA)/Makefile.include
|
||||||
|
|
||||||
|
LIBDIR = $(MESA)/lib
|
||||||
|
|
||||||
|
INCLUDES = -I$(MESA)/include
|
||||||
|
CFLAGS = -c -g $(INCLUDES) -MD
|
||||||
|
|
||||||
|
SOURCES = glu.c \
|
||||||
|
mipmap.c \
|
||||||
|
nurbs.c \
|
||||||
|
polytest.c \
|
||||||
|
project.c \
|
||||||
|
quadric.c \
|
||||||
|
tess.c \
|
||||||
|
tesselat.c
|
||||||
|
|
||||||
|
|
||||||
|
OBJS = $(addsuffix .o,$(basename $(SOURCES)))
|
||||||
|
|
||||||
|
LIBS=-L$(MESA)/lib -lGL -lm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
libGLU.so.1.1: $(OBJS) Makefile
|
||||||
|
gcc -shared -Wl,-soname,libGLU.so -Wl,-Bsymbolic $(OBJS) $(LIBS) -o $@
|
||||||
|
|
||||||
|
install:
|
||||||
|
rm -f $(MESA)/lib/libGLU.so*
|
||||||
|
install -D libGLU.so.1.1 $(MESA)/lib/libGLU.so.1.1
|
||||||
|
ln -s libGLU.so.1.1 $(MESA)/lib/libGLU.so.1
|
||||||
|
ln -s libGLU.so.1 $(MESA)/lib/libGLU.so
|
||||||
|
|
||||||
|
|
||||||
|
clean: clean_here
|
||||||
|
|
||||||
|
clean_here:
|
||||||
|
rm -f ../lib/libGLU.so*
|
||||||
|
|
||||||
|
|
||||||
|
-include $(SOURCES:.c=.d)
|
||||||
55
src/glu/mini/all.h
Normal file
55
src/glu/mini/all.h
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/* $Id: all.h,v 1.1.2.1 2003/03/21 13:02:08 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file includes all .h files needed for the GLU source code for
|
||||||
|
* the purpose of precompiled headers.
|
||||||
|
*
|
||||||
|
* If the preprocessor symbol PCH is defined at compile time then each
|
||||||
|
* of the .c files will #include "all.h" only, instead of a bunch of
|
||||||
|
* individual .h files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GLU_ALL_H
|
||||||
|
#define GLU_ALL_H
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef PC_HEADER
|
||||||
|
This is an error. all.h should be included only if PCH is defined.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "GL/gl.h"
|
||||||
|
#include "GL/glu.h"
|
||||||
|
#include "gluP.h"
|
||||||
|
#include "nurbs.h"
|
||||||
|
#include "tess.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*GLU_ALL_H */
|
||||||
417
src/glu/mini/glu.c
Normal file
417
src/glu/mini/glu.c
Normal file
@@ -0,0 +1,417 @@
|
|||||||
|
/* $Id: glu.c,v 1.1.2.1 2003/03/21 13:02:08 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.5
|
||||||
|
* Copyright (C) 1995-2001 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "gluP.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Miscellaneous utility functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.1415926536
|
||||||
|
#endif
|
||||||
|
#define EPS 0.00001
|
||||||
|
|
||||||
|
#ifndef GLU_INCOMPATIBLE_GL_VERSION
|
||||||
|
#define GLU_INCOMPATIBLE_GL_VERSION 100903
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,
|
||||||
|
GLdouble centerx, GLdouble centery, GLdouble centerz,
|
||||||
|
GLdouble upx, GLdouble upy, GLdouble upz)
|
||||||
|
{
|
||||||
|
GLfloat m[16];
|
||||||
|
GLfloat x[3], y[3], z[3];
|
||||||
|
GLfloat mag;
|
||||||
|
|
||||||
|
/* Make rotation matrix */
|
||||||
|
|
||||||
|
/* Z vector */
|
||||||
|
z[0] = eyex - centerx;
|
||||||
|
z[1] = eyey - centery;
|
||||||
|
z[2] = eyez - centerz;
|
||||||
|
mag = sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
|
||||||
|
if (mag) { /* mpichler, 19950515 */
|
||||||
|
z[0] /= mag;
|
||||||
|
z[1] /= mag;
|
||||||
|
z[2] /= mag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Y vector */
|
||||||
|
y[0] = upx;
|
||||||
|
y[1] = upy;
|
||||||
|
y[2] = upz;
|
||||||
|
|
||||||
|
/* X vector = Y cross Z */
|
||||||
|
x[0] = y[1] * z[2] - y[2] * z[1];
|
||||||
|
x[1] = -y[0] * z[2] + y[2] * z[0];
|
||||||
|
x[2] = y[0] * z[1] - y[1] * z[0];
|
||||||
|
|
||||||
|
/* Recompute Y = Z cross X */
|
||||||
|
y[0] = z[1] * x[2] - z[2] * x[1];
|
||||||
|
y[1] = -z[0] * x[2] + z[2] * x[0];
|
||||||
|
y[2] = z[0] * x[1] - z[1] * x[0];
|
||||||
|
|
||||||
|
/* mpichler, 19950515 */
|
||||||
|
/* cross product gives area of parallelogram, which is < 1.0 for
|
||||||
|
* non-perpendicular unit-length vectors; so normalize x, y here
|
||||||
|
*/
|
||||||
|
|
||||||
|
mag = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
|
||||||
|
if (mag) {
|
||||||
|
x[0] /= mag;
|
||||||
|
x[1] /= mag;
|
||||||
|
x[2] /= mag;
|
||||||
|
}
|
||||||
|
|
||||||
|
mag = sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
|
||||||
|
if (mag) {
|
||||||
|
y[0] /= mag;
|
||||||
|
y[1] /= mag;
|
||||||
|
y[2] /= mag;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define M(row,col) m[col*4+row]
|
||||||
|
M(0, 0) = x[0];
|
||||||
|
M(0, 1) = x[1];
|
||||||
|
M(0, 2) = x[2];
|
||||||
|
M(0, 3) = 0.0;
|
||||||
|
M(1, 0) = y[0];
|
||||||
|
M(1, 1) = y[1];
|
||||||
|
M(1, 2) = y[2];
|
||||||
|
M(1, 3) = 0.0;
|
||||||
|
M(2, 0) = z[0];
|
||||||
|
M(2, 1) = z[1];
|
||||||
|
M(2, 2) = z[2];
|
||||||
|
M(2, 3) = 0.0;
|
||||||
|
M(3, 0) = 0.0;
|
||||||
|
M(3, 1) = 0.0;
|
||||||
|
M(3, 2) = 0.0;
|
||||||
|
M(3, 3) = 1.0;
|
||||||
|
#undef M
|
||||||
|
glMultMatrixf(m);
|
||||||
|
|
||||||
|
/* Translate Eye to Origin */
|
||||||
|
glTranslatef(-eyex, -eyey, -eyez);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)
|
||||||
|
{
|
||||||
|
glOrtho(left, right, bottom, top, -1.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
frustum(GLfloat left, GLfloat right,
|
||||||
|
GLfloat bottom, GLfloat top,
|
||||||
|
GLfloat nearval, GLfloat farval)
|
||||||
|
{
|
||||||
|
GLfloat x, y, a, b, c, d;
|
||||||
|
GLfloat m[16];
|
||||||
|
|
||||||
|
x = (2.0 * nearval) / (right - left);
|
||||||
|
y = (2.0 * nearval) / (top - bottom);
|
||||||
|
a = (right + left) / (right - left);
|
||||||
|
b = (top + bottom) / (top - bottom);
|
||||||
|
c = -(farval + nearval) / ( farval - nearval);
|
||||||
|
d = -(2.0 * farval * nearval) / (farval - nearval);
|
||||||
|
|
||||||
|
#define M(row,col) m[col*4+row]
|
||||||
|
M(0,0) = x; M(0,1) = 0.0F; M(0,2) = a; M(0,3) = 0.0F;
|
||||||
|
M(1,0) = 0.0F; M(1,1) = y; M(1,2) = b; M(1,3) = 0.0F;
|
||||||
|
M(2,0) = 0.0F; M(2,1) = 0.0F; M(2,2) = c; M(2,3) = d;
|
||||||
|
M(3,0) = 0.0F; M(3,1) = 0.0F; M(3,2) = -1.0F; M(3,3) = 0.0F;
|
||||||
|
#undef M
|
||||||
|
|
||||||
|
glMultMatrixf(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
|
||||||
|
{
|
||||||
|
GLfloat xmin, xmax, ymin, ymax;
|
||||||
|
|
||||||
|
ymax = zNear * tan(fovy * M_PI / 360.0);
|
||||||
|
ymin = -ymax;
|
||||||
|
xmin = ymin * aspect;
|
||||||
|
xmax = ymax * aspect;
|
||||||
|
|
||||||
|
/* don't call glFrustum() because of error semantics (covglu) */
|
||||||
|
frustum(xmin, xmax, ymin, ymax, zNear, zFar);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluPickMatrix(GLdouble x, GLdouble y,
|
||||||
|
GLdouble width, GLdouble height, GLint viewport[4])
|
||||||
|
{
|
||||||
|
GLfloat m[16];
|
||||||
|
GLfloat sx, sy;
|
||||||
|
GLfloat tx, ty;
|
||||||
|
|
||||||
|
sx = viewport[2] / width;
|
||||||
|
sy = viewport[3] / height;
|
||||||
|
tx = (viewport[2] + 2.0 * (viewport[0] - x)) / width;
|
||||||
|
ty = (viewport[3] + 2.0 * (viewport[1] - y)) / height;
|
||||||
|
|
||||||
|
#define M(row,col) m[col*4+row]
|
||||||
|
M(0, 0) = sx;
|
||||||
|
M(0, 1) = 0.0;
|
||||||
|
M(0, 2) = 0.0;
|
||||||
|
M(0, 3) = tx;
|
||||||
|
M(1, 0) = 0.0;
|
||||||
|
M(1, 1) = sy;
|
||||||
|
M(1, 2) = 0.0;
|
||||||
|
M(1, 3) = ty;
|
||||||
|
M(2, 0) = 0.0;
|
||||||
|
M(2, 1) = 0.0;
|
||||||
|
M(2, 2) = 1.0;
|
||||||
|
M(2, 3) = 0.0;
|
||||||
|
M(3, 0) = 0.0;
|
||||||
|
M(3, 1) = 0.0;
|
||||||
|
M(3, 2) = 0.0;
|
||||||
|
M(3, 3) = 1.0;
|
||||||
|
#undef M
|
||||||
|
|
||||||
|
glMultMatrixf(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const GLubyte *GLAPIENTRY
|
||||||
|
gluErrorString(GLenum errorCode)
|
||||||
|
{
|
||||||
|
static char *tess_error[] = {
|
||||||
|
"missing gluBeginPolygon",
|
||||||
|
"missing gluBeginContour",
|
||||||
|
"missing gluEndPolygon",
|
||||||
|
"missing gluEndContour",
|
||||||
|
"misoriented or self-intersecting loops",
|
||||||
|
"coincident vertices",
|
||||||
|
"colinear vertices",
|
||||||
|
"FIST recovery process fatal error"
|
||||||
|
};
|
||||||
|
static char *nurbs_error[] = {
|
||||||
|
"spline order un-supported",
|
||||||
|
"too few knots",
|
||||||
|
"valid knot range is empty",
|
||||||
|
"decreasing knot sequence knot",
|
||||||
|
"knot multiplicity greater than order of spline",
|
||||||
|
"endcurve() must follow bgncurve()",
|
||||||
|
"bgncurve() must precede endcurve()",
|
||||||
|
"missing or extra geometric data",
|
||||||
|
"can't draw pwlcurves",
|
||||||
|
"missing bgncurve()",
|
||||||
|
"missing bgnsurface()",
|
||||||
|
"endtrim() must precede endsurface()",
|
||||||
|
"bgnsurface() must precede endsurface()",
|
||||||
|
"curve of improper type passed as trim curve",
|
||||||
|
"bgnsurface() must precede bgntrim()",
|
||||||
|
"endtrim() must follow bgntrim()",
|
||||||
|
"bgntrim() must precede endtrim()",
|
||||||
|
"invalid or missing trim curve",
|
||||||
|
"bgntrim() must precede pwlcurve()",
|
||||||
|
"pwlcurve referenced twice",
|
||||||
|
"pwlcurve and nurbscurve mixed",
|
||||||
|
"improper usage of trim data type",
|
||||||
|
"nurbscurve referenced twice",
|
||||||
|
"nurbscurve and pwlcurve mixed",
|
||||||
|
"nurbssurface referenced twice",
|
||||||
|
"invalid property",
|
||||||
|
"endsurface() must follow bgnsurface()",
|
||||||
|
"misoriented trim curves",
|
||||||
|
"intersecting trim curves",
|
||||||
|
"UNUSED",
|
||||||
|
"unconnected trim curves",
|
||||||
|
"unknown knot error",
|
||||||
|
"negative vertex count encountered",
|
||||||
|
"negative byte-stride encountered",
|
||||||
|
"unknown type descriptor",
|
||||||
|
"null control array or knot vector",
|
||||||
|
"duplicate point on pwlcurve"
|
||||||
|
};
|
||||||
|
|
||||||
|
/* GL Errors */
|
||||||
|
if (errorCode == GL_NO_ERROR) {
|
||||||
|
return (GLubyte *) "no error";
|
||||||
|
}
|
||||||
|
else if (errorCode == GL_INVALID_VALUE) {
|
||||||
|
return (GLubyte *) "invalid value";
|
||||||
|
}
|
||||||
|
else if (errorCode == GL_INVALID_ENUM) {
|
||||||
|
return (GLubyte *) "invalid enum";
|
||||||
|
}
|
||||||
|
else if (errorCode == GL_INVALID_OPERATION) {
|
||||||
|
return (GLubyte *) "invalid operation";
|
||||||
|
}
|
||||||
|
else if (errorCode == GL_STACK_OVERFLOW) {
|
||||||
|
return (GLubyte *) "stack overflow";
|
||||||
|
}
|
||||||
|
else if (errorCode == GL_STACK_UNDERFLOW) {
|
||||||
|
return (GLubyte *) "stack underflow";
|
||||||
|
}
|
||||||
|
else if (errorCode == GL_OUT_OF_MEMORY) {
|
||||||
|
return (GLubyte *) "out of memory";
|
||||||
|
}
|
||||||
|
/* GLU Errors */
|
||||||
|
else if (errorCode == GLU_NO_ERROR) {
|
||||||
|
return (GLubyte *) "no error";
|
||||||
|
}
|
||||||
|
else if (errorCode == GLU_INVALID_ENUM) {
|
||||||
|
return (GLubyte *) "invalid enum";
|
||||||
|
}
|
||||||
|
else if (errorCode == GLU_INVALID_VALUE) {
|
||||||
|
return (GLubyte *) "invalid value";
|
||||||
|
}
|
||||||
|
else if (errorCode == GLU_OUT_OF_MEMORY) {
|
||||||
|
return (GLubyte *) "out of memory";
|
||||||
|
}
|
||||||
|
else if (errorCode == GLU_INCOMPATIBLE_GL_VERSION) {
|
||||||
|
return (GLubyte *) "incompatible GL version";
|
||||||
|
}
|
||||||
|
else if (errorCode >= GLU_TESS_ERROR1 && errorCode <= GLU_TESS_ERROR8) {
|
||||||
|
return (GLubyte *) tess_error[errorCode - GLU_TESS_ERROR1];
|
||||||
|
}
|
||||||
|
else if (errorCode >= GLU_NURBS_ERROR1 && errorCode <= GLU_NURBS_ERROR37) {
|
||||||
|
return (GLubyte *) nurbs_error[errorCode - GLU_NURBS_ERROR1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* New in GLU 1.1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const GLubyte *GLAPIENTRY
|
||||||
|
gluGetString(GLenum name)
|
||||||
|
{
|
||||||
|
static char *extensions = "GL_EXT_abgr";
|
||||||
|
static char *version = "1.1 Mesa 3.5";
|
||||||
|
|
||||||
|
switch (name) {
|
||||||
|
case GLU_EXTENSIONS:
|
||||||
|
return (GLubyte *) extensions;
|
||||||
|
case GLU_VERSION:
|
||||||
|
return (GLubyte *) version;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0 /* gluGetProcAddressEXT not finalized yet! */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
/* for BeOS R4.5 */
|
||||||
|
void GLAPIENTRY(*gluGetProcAddressEXT(const GLubyte * procName)) (...)
|
||||||
|
#else
|
||||||
|
void (GLAPIENTRY * gluGetProcAddressEXT(const GLubyte * procName)) ()
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
struct proc
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
void *address;
|
||||||
|
};
|
||||||
|
static struct proc procTable[] = {
|
||||||
|
{"gluGetProcAddressEXT", (void *) gluGetProcAddressEXT}, /* me! */
|
||||||
|
|
||||||
|
/* new 1.1 functions */
|
||||||
|
{"gluGetString", (void *) gluGetString},
|
||||||
|
|
||||||
|
/* new 1.2 functions */
|
||||||
|
{"gluTessBeginPolygon", (void *) gluTessBeginPolygon},
|
||||||
|
{"gluTessBeginContour", (void *) gluTessBeginContour},
|
||||||
|
{"gluTessEndContour", (void *) gluTessEndContour},
|
||||||
|
{"gluTessEndPolygon", (void *) gluTessEndPolygon},
|
||||||
|
{"gluGetTessProperty", (void *) gluGetTessProperty},
|
||||||
|
|
||||||
|
/* new 1.3 functions */
|
||||||
|
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
GLuint i;
|
||||||
|
|
||||||
|
for (i = 0; procTable[i].address; i++) {
|
||||||
|
if (strcmp((const char *) procName, procTable[i].name) == 0)
|
||||||
|
return (void (GLAPIENTRY *) ()) procTable[i].address;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* New in GLU 1.3
|
||||||
|
*/
|
||||||
|
#ifdef GLU_VERSION_1_3
|
||||||
|
GLboolean GLAPIENTRY
|
||||||
|
gluCheckExtension(const GLubyte *extName, const GLubyte * extString)
|
||||||
|
{
|
||||||
|
assert(extName);
|
||||||
|
assert(extString);
|
||||||
|
{
|
||||||
|
const int len = strlen((const char *) extName);
|
||||||
|
const char *start = (const char *) extString;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
const char *c = strstr(start, (const char *) extName);
|
||||||
|
if (!c)
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
if ((c == start || c[-1] == ' ') && (c[len] == ' ' || c[len] == 0))
|
||||||
|
return GL_TRUE;
|
||||||
|
|
||||||
|
start = c + len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
142
src/glu/mini/gluP.h
Normal file
142
src/glu/mini/gluP.h
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/* $Id: gluP.h,v 1.1.2.1 2003/03/21 13:02:10 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file allows the GLU code to be compiled either with the Mesa
|
||||||
|
* headers or with the real OpenGL headers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GLUP_H
|
||||||
|
#define GLUP_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_WIN32) && !defined(__WIN32__)
|
||||||
|
# define __WIN32__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(OPENSTEP) && (defined(__WIN32__) || defined(__CYGWIN__))
|
||||||
|
# pragma warning( disable : 4068 ) /* unknown pragma */
|
||||||
|
# pragma warning( disable : 4710 ) /* function 'foo' not inlined */
|
||||||
|
# pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */
|
||||||
|
# pragma warning( disable : 4127 ) /* conditional expression is constant */
|
||||||
|
# if defined(MESA_MINWARN)
|
||||||
|
# pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */
|
||||||
|
# pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */
|
||||||
|
# pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */
|
||||||
|
# pragma warning( disable : 4550 ) /* 'function' undefined; assuming extern returning int */
|
||||||
|
# pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */
|
||||||
|
# endif
|
||||||
|
# if defined(_MSC_VER) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */
|
||||||
|
# define GLAPI __declspec(dllexport)
|
||||||
|
# define WGLAPI __declspec(dllexport)
|
||||||
|
# elif defined(_MSC_VER) && defined(_DLL) /* tag specifying we're building for DLL runtime support */
|
||||||
|
# define GLAPI __declspec(dllimport)
|
||||||
|
# define WGLAPI __declspec(dllimport)
|
||||||
|
# else /* for use with static link lib build of Win32 edition only */
|
||||||
|
# define GLAPI extern
|
||||||
|
# define WGLAPI __declspec(dllimport)
|
||||||
|
# endif /* _STATIC_MESA support */
|
||||||
|
# define GLAPIENTRY __stdcall
|
||||||
|
# define GLAPIENTRYP __stdcall *
|
||||||
|
# define GLCALLBACK __stdcall
|
||||||
|
# define GLCALLBACKP __stdcall *
|
||||||
|
# if defined(__CYGWIN__)
|
||||||
|
# define GLCALLBACKPCAST *
|
||||||
|
# else
|
||||||
|
# define GLCALLBACKPCAST __stdcall *
|
||||||
|
# endif
|
||||||
|
# define GLWINAPI __stdcall
|
||||||
|
# define GLWINAPIV __cdecl
|
||||||
|
#else
|
||||||
|
/* non-Windows compilation */
|
||||||
|
# define GLAPI extern
|
||||||
|
# define GLAPIENTRY
|
||||||
|
# define GLAPIENTRYP *
|
||||||
|
# define GLCALLBACK
|
||||||
|
# define GLCALLBACKP *
|
||||||
|
# define GLCALLBACKPCAST *
|
||||||
|
# define GLWINAPI
|
||||||
|
# define GLWINAPIV
|
||||||
|
#endif /* WIN32 / CYGWIN bracket */
|
||||||
|
|
||||||
|
/* compatability guard so we don't need to change client code */
|
||||||
|
|
||||||
|
#if defined(_WIN32) && !defined(_WINDEF_) && !defined(_GNU_H_WINDOWS32_BASE) && !defined(OPENSTEP)
|
||||||
|
# define CALLBACK GLCALLBACK
|
||||||
|
typedef int (GLAPIENTRY *PROC)();
|
||||||
|
typedef void *HGLRC;
|
||||||
|
typedef void *HDC;
|
||||||
|
typedef unsigned long COLORREF;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP)
|
||||||
|
# define WGL_FONT_LINES 0
|
||||||
|
# define WGL_FONT_POLYGONS 1
|
||||||
|
#ifndef _GNU_H_WINDOWS32_FUNCTIONS
|
||||||
|
# ifdef UNICODE
|
||||||
|
# define wglUseFontBitmaps wglUseFontBitmapsW
|
||||||
|
# define wglUseFontOutlines wglUseFontOutlinesW
|
||||||
|
# else
|
||||||
|
# define wglUseFontBitmaps wglUseFontBitmapsA
|
||||||
|
# define wglUseFontOutlines wglUseFontOutlinesA
|
||||||
|
# endif /* !UNICODE */
|
||||||
|
#endif /* _GNU_H_WINDOWS32_FUNCTIONS */
|
||||||
|
typedef struct tagLAYERPLANEDESCRIPTOR LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR;
|
||||||
|
typedef struct _GLYPHMETRICSFLOAT GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, *LPGLYPHMETRICSFLOAT;
|
||||||
|
typedef struct tagPIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR;
|
||||||
|
#include <gl/mesa_wgl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GLU_TESS_ERROR9
|
||||||
|
/* If we're using the real OpenGL header files... */
|
||||||
|
# define GLU_TESS_ERROR9 100159
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define GLU_NO_ERROR GL_NO_ERROR
|
||||||
|
|
||||||
|
|
||||||
|
/* for Sun: */
|
||||||
|
#ifdef SUNOS4
|
||||||
|
#define MEMCPY( DST, SRC, BYTES) \
|
||||||
|
memcpy( (char *) (DST), (char *) (SRC), (int) (BYTES) )
|
||||||
|
#else
|
||||||
|
#define MEMCPY( DST, SRC, BYTES) \
|
||||||
|
memcpy( (void *) (DST), (void *) (SRC), (size_t) (BYTES) )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
# define NULL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
764
src/glu/mini/mipmap.c
Normal file
764
src/glu/mini/mipmap.c
Normal file
@@ -0,0 +1,764 @@
|
|||||||
|
/* $Id: mipmap.c,v 1.1.2.1 2003/03/21 13:02:12 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.4
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "gluP.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute ceiling of integer quotient of A divided by B:
|
||||||
|
*/
|
||||||
|
#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EPSILON
|
||||||
|
#undef EPSILON
|
||||||
|
#endif
|
||||||
|
#define EPSILON 0.001
|
||||||
|
|
||||||
|
|
||||||
|
/* To work around optimizer bug in MSVC4.1 */
|
||||||
|
#if defined(__WIN32__) && !defined(OPENSTEP)
|
||||||
|
void
|
||||||
|
dummy(GLuint j, GLuint k)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define dummy(J, K)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
GLint GLAPIENTRY
|
||||||
|
gluScaleImage(GLenum format,
|
||||||
|
GLsizei widthin, GLsizei heightin,
|
||||||
|
GLenum typein, const void *datain,
|
||||||
|
GLsizei widthout, GLsizei heightout,
|
||||||
|
GLenum typeout, void *dataout)
|
||||||
|
{
|
||||||
|
GLint components, i, j, k;
|
||||||
|
GLfloat *tempin, *tempout, f;
|
||||||
|
GLfloat sx, sy;
|
||||||
|
GLint unpackrowlength, unpackalignment, unpackskiprows, unpackskippixels;
|
||||||
|
GLint packrowlength, packalignment, packskiprows, packskippixels;
|
||||||
|
GLint sizein, sizeout;
|
||||||
|
GLint rowstride, rowlen;
|
||||||
|
|
||||||
|
|
||||||
|
/* Determine number of components per pixel */
|
||||||
|
switch (format) {
|
||||||
|
case GL_COLOR_INDEX:
|
||||||
|
case GL_STENCIL_INDEX:
|
||||||
|
case GL_DEPTH_COMPONENT:
|
||||||
|
case GL_RED:
|
||||||
|
case GL_GREEN:
|
||||||
|
case GL_BLUE:
|
||||||
|
case GL_ALPHA:
|
||||||
|
case GL_LUMINANCE:
|
||||||
|
components = 1;
|
||||||
|
break;
|
||||||
|
case GL_LUMINANCE_ALPHA:
|
||||||
|
components = 2;
|
||||||
|
break;
|
||||||
|
case GL_RGB:
|
||||||
|
case GL_BGR:
|
||||||
|
components = 3;
|
||||||
|
break;
|
||||||
|
case GL_RGBA:
|
||||||
|
case GL_BGRA:
|
||||||
|
#ifdef GL_EXT_abgr
|
||||||
|
case GL_ABGR_EXT:
|
||||||
|
#endif
|
||||||
|
components = 4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return GLU_INVALID_ENUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine bytes per input datum */
|
||||||
|
switch (typein) {
|
||||||
|
case GL_UNSIGNED_BYTE:
|
||||||
|
sizein = sizeof(GLubyte);
|
||||||
|
break;
|
||||||
|
case GL_BYTE:
|
||||||
|
sizein = sizeof(GLbyte);
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_SHORT:
|
||||||
|
sizein = sizeof(GLushort);
|
||||||
|
break;
|
||||||
|
case GL_SHORT:
|
||||||
|
sizein = sizeof(GLshort);
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_INT:
|
||||||
|
sizein = sizeof(GLuint);
|
||||||
|
break;
|
||||||
|
case GL_INT:
|
||||||
|
sizein = sizeof(GLint);
|
||||||
|
break;
|
||||||
|
case GL_FLOAT:
|
||||||
|
sizein = sizeof(GLfloat);
|
||||||
|
break;
|
||||||
|
case GL_BITMAP:
|
||||||
|
/* not implemented yet */
|
||||||
|
default:
|
||||||
|
return GL_INVALID_ENUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine bytes per output datum */
|
||||||
|
switch (typeout) {
|
||||||
|
case GL_UNSIGNED_BYTE:
|
||||||
|
sizeout = sizeof(GLubyte);
|
||||||
|
break;
|
||||||
|
case GL_BYTE:
|
||||||
|
sizeout = sizeof(GLbyte);
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_SHORT:
|
||||||
|
sizeout = sizeof(GLushort);
|
||||||
|
break;
|
||||||
|
case GL_SHORT:
|
||||||
|
sizeout = sizeof(GLshort);
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_INT:
|
||||||
|
sizeout = sizeof(GLuint);
|
||||||
|
break;
|
||||||
|
case GL_INT:
|
||||||
|
sizeout = sizeof(GLint);
|
||||||
|
break;
|
||||||
|
case GL_FLOAT:
|
||||||
|
sizeout = sizeof(GLfloat);
|
||||||
|
break;
|
||||||
|
case GL_BITMAP:
|
||||||
|
/* not implemented yet */
|
||||||
|
default:
|
||||||
|
return GL_INVALID_ENUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get glPixelStore state */
|
||||||
|
glGetFloatv(GL_UNPACK_ROW_LENGTH, &f); unpackrowlength = (int)f;
|
||||||
|
glGetFloatv(GL_UNPACK_ALIGNMENT, &f); unpackalignment = (int)f;
|
||||||
|
glGetFloatv(GL_UNPACK_SKIP_ROWS, &f); unpackskiprows = (int)f;
|
||||||
|
glGetFloatv(GL_UNPACK_SKIP_PIXELS, &f); unpackskippixels = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_ROW_LENGTH, &f); packrowlength = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_ALIGNMENT, &f); packalignment = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_SKIP_ROWS, &f); packskiprows = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_SKIP_PIXELS, &f); packskippixels = (int)f;
|
||||||
|
|
||||||
|
/* Allocate storage for intermediate images */
|
||||||
|
tempin = (GLfloat *) malloc(widthin * heightin
|
||||||
|
* components * sizeof(GLfloat));
|
||||||
|
if (!tempin) {
|
||||||
|
return GLU_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tempout = (GLfloat *) malloc(widthout * heightout
|
||||||
|
* components * sizeof(GLfloat));
|
||||||
|
if (!tempout) {
|
||||||
|
free(tempin);
|
||||||
|
return GLU_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unpack the pixel data and convert to floating point
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (unpackrowlength > 0) {
|
||||||
|
rowlen = unpackrowlength;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rowlen = widthin;
|
||||||
|
}
|
||||||
|
if (sizein >= unpackalignment) {
|
||||||
|
rowstride = components * rowlen;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rowstride = unpackalignment / sizein
|
||||||
|
* CEILING(components * rowlen * sizein, unpackalignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (typein) {
|
||||||
|
case GL_UNSIGNED_BYTE:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightin; i++) {
|
||||||
|
GLubyte *ubptr = (GLubyte *) datain
|
||||||
|
+ i * rowstride
|
||||||
|
+ unpackskiprows * rowstride + unpackskippixels * components;
|
||||||
|
for (j = 0; j < widthin * components; j++) {
|
||||||
|
dummy(j, k);
|
||||||
|
tempin[k++] = (GLfloat) * ubptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_BYTE:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightin; i++) {
|
||||||
|
GLbyte *bptr = (GLbyte *) datain
|
||||||
|
+ i * rowstride
|
||||||
|
+ unpackskiprows * rowstride + unpackskippixels * components;
|
||||||
|
for (j = 0; j < widthin * components; j++) {
|
||||||
|
dummy(j, k);
|
||||||
|
tempin[k++] = (GLfloat) * bptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_SHORT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightin; i++) {
|
||||||
|
GLushort *usptr = (GLushort *) datain
|
||||||
|
+ i * rowstride
|
||||||
|
+ unpackskiprows * rowstride + unpackskippixels * components;
|
||||||
|
for (j = 0; j < widthin * components; j++) {
|
||||||
|
dummy(j, k);
|
||||||
|
tempin[k++] = (GLfloat) * usptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_SHORT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightin; i++) {
|
||||||
|
GLshort *sptr = (GLshort *) datain
|
||||||
|
+ i * rowstride
|
||||||
|
+ unpackskiprows * rowstride + unpackskippixels * components;
|
||||||
|
for (j = 0; j < widthin * components; j++) {
|
||||||
|
dummy(j, k);
|
||||||
|
tempin[k++] = (GLfloat) * sptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_INT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightin; i++) {
|
||||||
|
GLuint *uiptr = (GLuint *) datain
|
||||||
|
+ i * rowstride
|
||||||
|
+ unpackskiprows * rowstride + unpackskippixels * components;
|
||||||
|
for (j = 0; j < widthin * components; j++) {
|
||||||
|
dummy(j, k);
|
||||||
|
tempin[k++] = (GLfloat) * uiptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_INT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightin; i++) {
|
||||||
|
GLint *iptr = (GLint *) datain
|
||||||
|
+ i * rowstride
|
||||||
|
+ unpackskiprows * rowstride + unpackskippixels * components;
|
||||||
|
for (j = 0; j < widthin * components; j++) {
|
||||||
|
dummy(j, k);
|
||||||
|
tempin[k++] = (GLfloat) * iptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_FLOAT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightin; i++) {
|
||||||
|
GLfloat *fptr = (GLfloat *) datain
|
||||||
|
+ i * rowstride
|
||||||
|
+ unpackskiprows * rowstride + unpackskippixels * components;
|
||||||
|
for (j = 0; j < widthin * components; j++) {
|
||||||
|
dummy(j, k);
|
||||||
|
tempin[k++] = *fptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return GLU_INVALID_ENUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scale the image!
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (widthout > 1)
|
||||||
|
sx = (GLfloat) (widthin - 1) / (GLfloat) (widthout - 1);
|
||||||
|
else
|
||||||
|
sx = (GLfloat) (widthin - 1);
|
||||||
|
if (heightout > 1)
|
||||||
|
sy = (GLfloat) (heightin - 1) / (GLfloat) (heightout - 1);
|
||||||
|
else
|
||||||
|
sy = (GLfloat) (heightin - 1);
|
||||||
|
|
||||||
|
/*#define POINT_SAMPLE*/
|
||||||
|
#ifdef POINT_SAMPLE
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLint ii = i * sy;
|
||||||
|
for (j = 0; j < widthout; j++) {
|
||||||
|
GLint jj = j * sx;
|
||||||
|
|
||||||
|
GLfloat *src = tempin + (ii * widthin + jj) * components;
|
||||||
|
GLfloat *dst = tempout + (i * widthout + j) * components;
|
||||||
|
|
||||||
|
for (k = 0; k < components; k++) {
|
||||||
|
*dst++ = *src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (sx < 1.0 && sy < 1.0) {
|
||||||
|
/* magnify both width and height: use weighted sample of 4 pixels */
|
||||||
|
GLint i0, i1, j0, j1;
|
||||||
|
GLfloat alpha, beta;
|
||||||
|
GLfloat *src00, *src01, *src10, *src11;
|
||||||
|
GLfloat s1, s2;
|
||||||
|
GLfloat *dst;
|
||||||
|
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
i0 = i * sy;
|
||||||
|
i1 = i0 + 1;
|
||||||
|
if (i1 >= heightin)
|
||||||
|
i1 = heightin - 1;
|
||||||
|
/* i1 = (i+1) * sy - EPSILON;*/
|
||||||
|
alpha = i * sy - i0;
|
||||||
|
for (j = 0; j < widthout; j++) {
|
||||||
|
j0 = j * sx;
|
||||||
|
j1 = j0 + 1;
|
||||||
|
if (j1 >= widthin)
|
||||||
|
j1 = widthin - 1;
|
||||||
|
/* j1 = (j+1) * sx - EPSILON; */
|
||||||
|
beta = j * sx - j0;
|
||||||
|
|
||||||
|
/* compute weighted average of pixels in rect (i0,j0)-(i1,j1) */
|
||||||
|
src00 = tempin + (i0 * widthin + j0) * components;
|
||||||
|
src01 = tempin + (i0 * widthin + j1) * components;
|
||||||
|
src10 = tempin + (i1 * widthin + j0) * components;
|
||||||
|
src11 = tempin + (i1 * widthin + j1) * components;
|
||||||
|
|
||||||
|
dst = tempout + (i * widthout + j) * components;
|
||||||
|
|
||||||
|
for (k = 0; k < components; k++) {
|
||||||
|
s1 = *src00++ * (1.0 - beta) + *src01++ * beta;
|
||||||
|
s2 = *src10++ * (1.0 - beta) + *src11++ * beta;
|
||||||
|
*dst++ = s1 * (1.0 - alpha) + s2 * alpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* shrink width and/or height: use an unweighted box filter */
|
||||||
|
GLint i0, i1;
|
||||||
|
GLint j0, j1;
|
||||||
|
GLint ii, jj;
|
||||||
|
GLfloat sum, *dst;
|
||||||
|
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
i0 = i * sy;
|
||||||
|
i1 = i0 + 1;
|
||||||
|
if (i1 >= heightin)
|
||||||
|
i1 = heightin - 1;
|
||||||
|
/* i1 = (i+1) * sy - EPSILON; */
|
||||||
|
for (j = 0; j < widthout; j++) {
|
||||||
|
j0 = j * sx;
|
||||||
|
j1 = j0 + 1;
|
||||||
|
if (j1 >= widthin)
|
||||||
|
j1 = widthin - 1;
|
||||||
|
/* j1 = (j+1) * sx - EPSILON; */
|
||||||
|
|
||||||
|
dst = tempout + (i * widthout + j) * components;
|
||||||
|
|
||||||
|
/* compute average of pixels in the rectangle (i0,j0)-(i1,j1) */
|
||||||
|
for (k = 0; k < components; k++) {
|
||||||
|
sum = 0.0;
|
||||||
|
for (ii = i0; ii <= i1; ii++) {
|
||||||
|
for (jj = j0; jj <= j1; jj++) {
|
||||||
|
sum += *(tempin + (ii * widthin + jj) * components + k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum /= (j1 - j0 + 1) * (i1 - i0 + 1);
|
||||||
|
*dst++ = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return output image
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (packrowlength > 0) {
|
||||||
|
rowlen = packrowlength;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rowlen = widthout;
|
||||||
|
}
|
||||||
|
if (sizeout >= packalignment) {
|
||||||
|
rowstride = components * rowlen;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rowstride = packalignment / sizeout
|
||||||
|
* CEILING(components * rowlen * sizeout, packalignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (typeout) {
|
||||||
|
case GL_UNSIGNED_BYTE:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLubyte *ubptr = (GLubyte *) dataout
|
||||||
|
+ i * rowstride
|
||||||
|
+ packskiprows * rowstride + packskippixels * components;
|
||||||
|
for (j = 0; j < widthout * components; j++) {
|
||||||
|
dummy(j, k + i);
|
||||||
|
*ubptr++ = (GLubyte) tempout[k++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_BYTE:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLbyte *bptr = (GLbyte *) dataout
|
||||||
|
+ i * rowstride
|
||||||
|
+ packskiprows * rowstride + packskippixels * components;
|
||||||
|
for (j = 0; j < widthout * components; j++) {
|
||||||
|
dummy(j, k + i);
|
||||||
|
*bptr++ = (GLbyte) tempout[k++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_SHORT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLushort *usptr = (GLushort *) dataout
|
||||||
|
+ i * rowstride
|
||||||
|
+ packskiprows * rowstride + packskippixels * components;
|
||||||
|
for (j = 0; j < widthout * components; j++) {
|
||||||
|
dummy(j, k + i);
|
||||||
|
*usptr++ = (GLushort) tempout[k++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_SHORT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLshort *sptr = (GLshort *) dataout
|
||||||
|
+ i * rowstride
|
||||||
|
+ packskiprows * rowstride + packskippixels * components;
|
||||||
|
for (j = 0; j < widthout * components; j++) {
|
||||||
|
dummy(j, k + i);
|
||||||
|
*sptr++ = (GLshort) tempout[k++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_INT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLuint *uiptr = (GLuint *) dataout
|
||||||
|
+ i * rowstride
|
||||||
|
+ packskiprows * rowstride + packskippixels * components;
|
||||||
|
for (j = 0; j < widthout * components; j++) {
|
||||||
|
dummy(j, k + i);
|
||||||
|
*uiptr++ = (GLuint) tempout[k++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_INT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLint *iptr = (GLint *) dataout
|
||||||
|
+ i * rowstride
|
||||||
|
+ packskiprows * rowstride + packskippixels * components;
|
||||||
|
for (j = 0; j < widthout * components; j++) {
|
||||||
|
dummy(j, k + i);
|
||||||
|
*iptr++ = (GLint) tempout[k++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GL_FLOAT:
|
||||||
|
k = 0;
|
||||||
|
for (i = 0; i < heightout; i++) {
|
||||||
|
GLfloat *fptr = (GLfloat *) dataout
|
||||||
|
+ i * rowstride
|
||||||
|
+ packskiprows * rowstride + packskippixels * components;
|
||||||
|
for (j = 0; j < widthout * components; j++) {
|
||||||
|
dummy(j, k + i);
|
||||||
|
*fptr++ = tempout[k++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return GLU_INVALID_ENUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* free temporary image storage */
|
||||||
|
free(tempin);
|
||||||
|
free(tempout);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the largest k such that 2^k <= n.
|
||||||
|
*/
|
||||||
|
static GLint
|
||||||
|
ilog2(GLint n)
|
||||||
|
{
|
||||||
|
GLint k;
|
||||||
|
|
||||||
|
if (n <= 0)
|
||||||
|
return 0;
|
||||||
|
for (k = 0; n >>= 1; k++);
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the value nearest to n which is also a power of two.
|
||||||
|
*/
|
||||||
|
static GLint
|
||||||
|
round2(GLint n)
|
||||||
|
{
|
||||||
|
GLint m;
|
||||||
|
|
||||||
|
for (m = 1; m < n; m *= 2);
|
||||||
|
|
||||||
|
/* m>=n */
|
||||||
|
if (m - n <= n - m / 2) {
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return m / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Given an pixel format and datatype, return the number of bytes to
|
||||||
|
* store one pixel.
|
||||||
|
*/
|
||||||
|
static GLint
|
||||||
|
bytes_per_pixel(GLenum format, GLenum type)
|
||||||
|
{
|
||||||
|
GLint n, m;
|
||||||
|
|
||||||
|
switch (format) {
|
||||||
|
case GL_COLOR_INDEX:
|
||||||
|
case GL_STENCIL_INDEX:
|
||||||
|
case GL_DEPTH_COMPONENT:
|
||||||
|
case GL_RED:
|
||||||
|
case GL_GREEN:
|
||||||
|
case GL_BLUE:
|
||||||
|
case GL_ALPHA:
|
||||||
|
case GL_LUMINANCE:
|
||||||
|
n = 1;
|
||||||
|
break;
|
||||||
|
case GL_LUMINANCE_ALPHA:
|
||||||
|
n = 2;
|
||||||
|
break;
|
||||||
|
case GL_RGB:
|
||||||
|
case GL_BGR:
|
||||||
|
n = 3;
|
||||||
|
break;
|
||||||
|
case GL_RGBA:
|
||||||
|
case GL_BGRA:
|
||||||
|
#ifdef GL_EXT_abgr
|
||||||
|
case GL_ABGR_EXT:
|
||||||
|
#endif
|
||||||
|
n = 4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case GL_UNSIGNED_BYTE:
|
||||||
|
m = sizeof(GLubyte);
|
||||||
|
break;
|
||||||
|
case GL_BYTE:
|
||||||
|
m = sizeof(GLbyte);
|
||||||
|
break;
|
||||||
|
case GL_BITMAP:
|
||||||
|
m = 1;
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_SHORT:
|
||||||
|
m = sizeof(GLushort);
|
||||||
|
break;
|
||||||
|
case GL_SHORT:
|
||||||
|
m = sizeof(GLshort);
|
||||||
|
break;
|
||||||
|
case GL_UNSIGNED_INT:
|
||||||
|
m = sizeof(GLuint);
|
||||||
|
break;
|
||||||
|
case GL_INT:
|
||||||
|
m = sizeof(GLint);
|
||||||
|
break;
|
||||||
|
case GL_FLOAT:
|
||||||
|
m = sizeof(GLfloat);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
m = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return n * m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING: This function isn't finished and has never been tested!!!!
|
||||||
|
*/
|
||||||
|
GLint GLAPIENTRY
|
||||||
|
gluBuild1DMipmaps(GLenum target, GLint components,
|
||||||
|
GLsizei width, GLenum format, GLenum type, const void *data)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GLint GLAPIENTRY
|
||||||
|
gluBuild2DMipmaps(GLenum target, GLint components,
|
||||||
|
GLsizei width, GLsizei height, GLenum format,
|
||||||
|
GLenum type, const void *data)
|
||||||
|
{
|
||||||
|
GLint w, h;
|
||||||
|
GLint maxsize;
|
||||||
|
void *image, *newimage;
|
||||||
|
GLint neww, newh, level, bpp;
|
||||||
|
int error;
|
||||||
|
GLboolean done;
|
||||||
|
GLint retval = 0;
|
||||||
|
GLint unpackrowlength, unpackalignment, unpackskiprows, unpackskippixels;
|
||||||
|
GLint packrowlength, packalignment, packskiprows, packskippixels;
|
||||||
|
GLfloat f;
|
||||||
|
|
||||||
|
if (width < 1 || height < 1)
|
||||||
|
return GLU_INVALID_VALUE;
|
||||||
|
|
||||||
|
glGetFloatv(GL_MAX_TEXTURE_SIZE, &f); maxsize = (int)f;
|
||||||
|
|
||||||
|
w = round2(width);
|
||||||
|
if (w > maxsize) {
|
||||||
|
w = maxsize;
|
||||||
|
}
|
||||||
|
h = round2(height);
|
||||||
|
if (h > maxsize) {
|
||||||
|
h = maxsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
bpp = bytes_per_pixel(format, type);
|
||||||
|
if (bpp == 0) {
|
||||||
|
/* probably a bad format or type enum */
|
||||||
|
return GLU_INVALID_ENUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get current glPixelStore values */
|
||||||
|
glGetFloatv(GL_UNPACK_ROW_LENGTH, &f); unpackrowlength = (int)f;
|
||||||
|
glGetFloatv(GL_UNPACK_ALIGNMENT, &f); unpackalignment = (int)f;
|
||||||
|
glGetFloatv(GL_UNPACK_SKIP_ROWS, &f); unpackskiprows = (int)f;
|
||||||
|
glGetFloatv(GL_UNPACK_SKIP_PIXELS, &f); unpackskippixels = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_ROW_LENGTH, &f); packrowlength = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_ALIGNMENT, &f); packalignment = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_SKIP_ROWS, &f); packskiprows = (int)f;
|
||||||
|
glGetFloatv(GL_PACK_SKIP_PIXELS, &f); packskippixels = (int)f;
|
||||||
|
|
||||||
|
/* set pixel packing */
|
||||||
|
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
|
||||||
|
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||||
|
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
|
||||||
|
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
|
||||||
|
|
||||||
|
done = GL_FALSE;
|
||||||
|
|
||||||
|
if (w != width || h != height) {
|
||||||
|
/* must rescale image to get "top" mipmap texture image */
|
||||||
|
image = malloc((w + 4) * h * bpp);
|
||||||
|
if (!image) {
|
||||||
|
return GLU_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
error = gluScaleImage(format, width, height, type, data,
|
||||||
|
w, h, type, image);
|
||||||
|
if (error) {
|
||||||
|
retval = error;
|
||||||
|
done = GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
image = (void *) data;
|
||||||
|
}
|
||||||
|
|
||||||
|
level = 0;
|
||||||
|
while (!done) {
|
||||||
|
if (image != data) {
|
||||||
|
/* set pixel unpacking */
|
||||||
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||||
|
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
glTexImage2D(target, level, components, w, h, 0, format, type, image);
|
||||||
|
|
||||||
|
if (w == 1 && h == 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
neww = (w < 2) ? 1 : w / 2;
|
||||||
|
newh = (h < 2) ? 1 : h / 2;
|
||||||
|
newimage = malloc((neww + 4) * newh * bpp);
|
||||||
|
if (!newimage) {
|
||||||
|
return GLU_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = gluScaleImage(format, w, h, type, image,
|
||||||
|
neww, newh, type, newimage);
|
||||||
|
if (error) {
|
||||||
|
retval = error;
|
||||||
|
done = GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image != data) {
|
||||||
|
free(image);
|
||||||
|
}
|
||||||
|
image = newimage;
|
||||||
|
|
||||||
|
w = neww;
|
||||||
|
h = newh;
|
||||||
|
level++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image != data) {
|
||||||
|
free(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore original glPixelStore state */
|
||||||
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, unpackrowlength);
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, unpackalignment);
|
||||||
|
glPixelStorei(GL_UNPACK_SKIP_ROWS, unpackskiprows);
|
||||||
|
glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpackskippixels);
|
||||||
|
glPixelStorei(GL_PACK_ROW_LENGTH, packrowlength);
|
||||||
|
glPixelStorei(GL_PACK_ALIGNMENT, packalignment);
|
||||||
|
glPixelStorei(GL_PACK_SKIP_ROWS, packskiprows);
|
||||||
|
glPixelStorei(GL_PACK_SKIP_PIXELS, packskippixels);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
158
src/glu/mini/nurbs.c
Normal file
158
src/glu/mini/nurbs.c
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
/* $Id: nurbs.c,v 1.1.2.1 2003/03/21 13:02:13 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
|
||||||
|
* See README2 for more info.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "gluP.h"
|
||||||
|
#include "nurbs.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
call_user_error(GLUnurbsObj * nobj, GLenum error)
|
||||||
|
{
|
||||||
|
nobj->error = error;
|
||||||
|
if (nobj->error_callback != NULL) {
|
||||||
|
(*(nobj->error_callback)) (error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("NURBS error %d %s\n", error, (char *) gluErrorString(error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GLUnurbsObj *GLAPIENTRY
|
||||||
|
gluNewNurbsRenderer(void)
|
||||||
|
{
|
||||||
|
GLUnurbsObj *n;
|
||||||
|
GLfloat tmp_viewport[4];
|
||||||
|
GLint i, j;
|
||||||
|
|
||||||
|
n = (GLUnurbsObj *) malloc(sizeof(GLUnurbsObj));
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluDeleteNurbsRenderer(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
if (nobj) {
|
||||||
|
free(nobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluLoadSamplingMatrices(GLUnurbsObj * nobj,
|
||||||
|
const GLfloat modelMatrix[16],
|
||||||
|
const GLfloat projMatrix[16], const GLint viewport[4])
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluNurbsProperty(GLUnurbsObj * nobj, GLenum property, GLfloat value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluGetNurbsProperty(GLUnurbsObj * nobj, GLenum property, GLfloat * value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluBeginCurve(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluEndCurve(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluNurbsCurve(GLUnurbsObj * nobj, GLint nknots, GLfloat * knot,
|
||||||
|
GLint stride, GLfloat * ctlarray, GLint order, GLenum type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluBeginSurface(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluEndSurface(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluNurbsSurface(GLUnurbsObj * nobj,
|
||||||
|
GLint sknot_count, GLfloat * sknot,
|
||||||
|
GLint tknot_count, GLfloat * tknot,
|
||||||
|
GLint s_stride, GLint t_stride,
|
||||||
|
GLfloat * ctrlarray, GLint sorder, GLint torder, GLenum type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluNurbsCallback(GLUnurbsObj * nobj, GLenum which, void (GLCALLBACK * fn) ())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluBeginTrim(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluPwlCurve(GLUnurbsObj * nobj, GLint count, GLfloat * array, GLint stride,
|
||||||
|
GLenum type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluEndTrim(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
}
|
||||||
253
src/glu/mini/nurbs.h
Normal file
253
src/glu/mini/nurbs.h
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
/* $Id: nurbs.h,v 1.1.2.1 2003/03/21 13:02:14 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
|
||||||
|
* See README2 for more info.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NURBS_H
|
||||||
|
#define NURBS_H
|
||||||
|
|
||||||
|
|
||||||
|
#define EPSILON 1e-06 /* epsilon for double precision compares */
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GLU_NURBS_CURVE, GLU_NURBS_SURFACE, GLU_NURBS_TRIM, GLU_NURBS_NO_TRIM,
|
||||||
|
GLU_NURBS_TRIM_DONE, GLU_NURBS_NONE
|
||||||
|
}
|
||||||
|
GLU_nurbs_enum;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GLU_TRIM_NURBS, GLU_TRIM_PWL
|
||||||
|
}
|
||||||
|
GLU_trim_enum;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GLint sknot_count;
|
||||||
|
GLfloat *sknot;
|
||||||
|
GLint tknot_count;
|
||||||
|
GLfloat *tknot;
|
||||||
|
GLint s_stride;
|
||||||
|
GLint t_stride;
|
||||||
|
GLfloat *ctrlarray;
|
||||||
|
GLint sorder;
|
||||||
|
GLint torder;
|
||||||
|
GLint dim;
|
||||||
|
GLenum type;
|
||||||
|
}
|
||||||
|
surface_attribs;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
surface_attribs geom;
|
||||||
|
surface_attribs color;
|
||||||
|
surface_attribs texture;
|
||||||
|
surface_attribs normal;
|
||||||
|
}
|
||||||
|
nurbs_surface;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GLint knot_count;
|
||||||
|
GLfloat *knot;
|
||||||
|
GLint stride;
|
||||||
|
GLfloat *ctrlarray;
|
||||||
|
GLint order;
|
||||||
|
GLint dim;
|
||||||
|
GLenum type;
|
||||||
|
}
|
||||||
|
curve_attribs;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GLint pt_count;
|
||||||
|
GLfloat *ctrlarray;
|
||||||
|
GLint stride;
|
||||||
|
GLint dim;
|
||||||
|
GLenum type;
|
||||||
|
}
|
||||||
|
pwl_curve_attribs;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
curve_attribs geom;
|
||||||
|
curve_attribs color;
|
||||||
|
curve_attribs texture;
|
||||||
|
curve_attribs normal;
|
||||||
|
}
|
||||||
|
nurbs_curve;
|
||||||
|
|
||||||
|
typedef struct trim_list_str
|
||||||
|
{
|
||||||
|
GLU_trim_enum trim_type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
pwl_curve_attribs pwl_curve;
|
||||||
|
curve_attribs nurbs_curve;
|
||||||
|
}
|
||||||
|
curve;
|
||||||
|
struct trim_list_str *next;
|
||||||
|
}
|
||||||
|
trim_list;
|
||||||
|
|
||||||
|
typedef struct seg_trim_str
|
||||||
|
{
|
||||||
|
GLfloat *points;
|
||||||
|
GLint pt_cnt, seg_array_len;
|
||||||
|
struct seg_trim_str *next;
|
||||||
|
}
|
||||||
|
trim_segments;
|
||||||
|
|
||||||
|
typedef struct nurbs_trim_str
|
||||||
|
{
|
||||||
|
trim_list *trim_loop;
|
||||||
|
trim_segments *segments;
|
||||||
|
struct nurbs_trim_str *next;
|
||||||
|
}
|
||||||
|
nurbs_trim;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GLfloat model[16], proj[16], viewport[4];
|
||||||
|
}
|
||||||
|
culling_and_sampling_str;
|
||||||
|
|
||||||
|
struct GLUnurbs
|
||||||
|
{
|
||||||
|
GLboolean culling;
|
||||||
|
GLenum error;
|
||||||
|
void (GLCALLBACK * error_callback) (GLenum err);
|
||||||
|
GLenum display_mode;
|
||||||
|
GLU_nurbs_enum nurbs_type;
|
||||||
|
GLboolean auto_load_matrix;
|
||||||
|
culling_and_sampling_str sampling_matrices;
|
||||||
|
GLenum sampling_method;
|
||||||
|
GLfloat sampling_tolerance;
|
||||||
|
GLfloat parametric_tolerance;
|
||||||
|
GLint u_step, v_step;
|
||||||
|
nurbs_surface surface;
|
||||||
|
nurbs_curve curve;
|
||||||
|
nurbs_trim *trim;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GLfloat *knot;
|
||||||
|
GLint nknots;
|
||||||
|
GLfloat *unified_knot;
|
||||||
|
GLint unified_nknots;
|
||||||
|
GLint order;
|
||||||
|
GLint t_min, t_max;
|
||||||
|
GLint delta_nknots;
|
||||||
|
GLboolean open_at_begin, open_at_end;
|
||||||
|
GLfloat *new_knot;
|
||||||
|
GLfloat *alpha;
|
||||||
|
}
|
||||||
|
knot_str_type;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GLfloat *geom_ctrl;
|
||||||
|
GLint geom_s_stride, geom_t_stride;
|
||||||
|
GLfloat **geom_offsets;
|
||||||
|
GLint geom_s_pt_cnt, geom_t_pt_cnt;
|
||||||
|
GLfloat *color_ctrl;
|
||||||
|
GLint color_s_stride, color_t_stride;
|
||||||
|
GLfloat **color_offsets;
|
||||||
|
GLint color_s_pt_cnt, color_t_pt_cnt;
|
||||||
|
GLfloat *normal_ctrl;
|
||||||
|
GLint normal_s_stride, normal_t_stride;
|
||||||
|
GLfloat **normal_offsets;
|
||||||
|
GLint normal_s_pt_cnt, normal_t_pt_cnt;
|
||||||
|
GLfloat *texture_ctrl;
|
||||||
|
GLint texture_s_stride, texture_t_stride;
|
||||||
|
GLfloat **texture_offsets;
|
||||||
|
GLint texture_s_pt_cnt, texture_t_pt_cnt;
|
||||||
|
GLint s_bezier_cnt, t_bezier_cnt;
|
||||||
|
}
|
||||||
|
new_ctrl_type;
|
||||||
|
|
||||||
|
extern void call_user_error(GLUnurbsObj * nobj, GLenum error);
|
||||||
|
|
||||||
|
extern GLenum test_knot(GLint nknots, GLfloat * knot, GLint order);
|
||||||
|
|
||||||
|
extern GLenum explode_knot(knot_str_type * the_knot);
|
||||||
|
|
||||||
|
extern GLenum calc_alphas(knot_str_type * the_knot);
|
||||||
|
|
||||||
|
extern GLenum calc_new_ctrl_pts(GLfloat * ctrl, GLint stride,
|
||||||
|
knot_str_type * the_knot, GLint dim,
|
||||||
|
GLfloat ** new_ctrl, GLint * ncontrol);
|
||||||
|
|
||||||
|
extern GLenum glu_do_sampling_crv(GLUnurbsObj * nobj, GLfloat * new_ctrl,
|
||||||
|
GLint n_ctrl, GLint order, GLint dim,
|
||||||
|
GLint ** factors);
|
||||||
|
|
||||||
|
extern GLenum glu_do_sampling_3D(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
|
||||||
|
int **sfactors, GLint ** tfactors);
|
||||||
|
|
||||||
|
extern GLenum glu_do_sampling_uv(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
|
||||||
|
int **sfactors, GLint ** tfactors);
|
||||||
|
|
||||||
|
extern GLenum glu_do_sampling_param_3D(GLUnurbsObj * nobj,
|
||||||
|
new_ctrl_type * new_ctrl,
|
||||||
|
int **sfactors, GLint ** tfactors);
|
||||||
|
|
||||||
|
extern GLboolean fine_culling_test_2D(GLUnurbsObj * nobj, GLfloat * ctrl,
|
||||||
|
GLint n_ctrl, GLint stride, GLint dim);
|
||||||
|
|
||||||
|
extern GLboolean fine_culling_test_3D(GLUnurbsObj * nobj, GLfloat * ctrl,
|
||||||
|
GLint s_n_ctrl, GLint t_n_ctrl,
|
||||||
|
GLint s_stride, GLint t_stride,
|
||||||
|
GLint dim);
|
||||||
|
|
||||||
|
extern void do_nurbs_curve(GLUnurbsObj * nobj);
|
||||||
|
|
||||||
|
extern void do_nurbs_surface(GLUnurbsObj * nobj);
|
||||||
|
|
||||||
|
extern GLenum patch_trimming(GLUnurbsObj * nobj, new_ctrl_type * new_ctrl,
|
||||||
|
GLint * sfactors, GLint * tfactors);
|
||||||
|
|
||||||
|
extern void collect_unified_knot(knot_str_type * dest, knot_str_type * src,
|
||||||
|
GLfloat maximal_min_knot,
|
||||||
|
GLfloat minimal_max_knot);
|
||||||
|
|
||||||
|
extern GLenum select_knot_working_range(GLUnurbsObj * nobj,
|
||||||
|
knot_str_type * geom_knot,
|
||||||
|
knot_str_type * color_knot,
|
||||||
|
knot_str_type * normal_knot,
|
||||||
|
knot_str_type * texture_knot);
|
||||||
|
|
||||||
|
extern void free_unified_knots(knot_str_type * geom_knot,
|
||||||
|
knot_str_type * color_knot,
|
||||||
|
knot_str_type * normal_knot,
|
||||||
|
knot_str_type * texture_knot);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
133
src/glu/mini/nurbscrv.c
Normal file
133
src/glu/mini/nurbscrv.c
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/* $Id: nurbscrv.c,v 1.1.2.1 2003/03/21 13:02:16 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NURBS implementation written by Bogdan Sikorski (bogdan@cira.it)
|
||||||
|
* See README2 for more info.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "gluP.h"
|
||||||
|
#include "nurbs.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* main NURBS curve procedure */
|
||||||
|
void
|
||||||
|
do_nurbs_curve(GLUnurbsObj * nobj)
|
||||||
|
{
|
||||||
|
GLint geom_order, color_order = 0, normal_order = 0, texture_order = 0;
|
||||||
|
GLenum geom_type;
|
||||||
|
GLint n_ctrl;
|
||||||
|
GLfloat *new_geom_ctrl, *new_color_ctrl, *new_normal_ctrl,
|
||||||
|
*new_texture_ctrl;
|
||||||
|
GLfloat *geom_ctrl = 0, *color_ctrl = 0, *normal_ctrl = 0, *texture_ctrl = 0;
|
||||||
|
GLint *factors;
|
||||||
|
GLint i, j;
|
||||||
|
GLint geom_dim, color_dim = 0, normal_dim = 0, texture_dim = 0;
|
||||||
|
|
||||||
|
/* test the user supplied data */
|
||||||
|
if (test_nurbs_curves(nobj) != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (convert_curves(nobj, &new_geom_ctrl, &n_ctrl, &new_color_ctrl,
|
||||||
|
&new_normal_ctrl, &new_texture_ctrl) != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
geom_order = nobj->curve.geom.order;
|
||||||
|
geom_type = nobj->curve.geom.type;
|
||||||
|
geom_dim = nobj->curve.geom.dim;
|
||||||
|
|
||||||
|
if (glu_do_sampling_crv(nobj, new_geom_ctrl, n_ctrl, geom_order, geom_dim,
|
||||||
|
&factors) != GLU_NO_ERROR) {
|
||||||
|
free(new_geom_ctrl);
|
||||||
|
if (new_color_ctrl)
|
||||||
|
free(new_color_ctrl);
|
||||||
|
if (new_normal_ctrl)
|
||||||
|
free(new_normal_ctrl);
|
||||||
|
if (new_texture_ctrl)
|
||||||
|
free(new_texture_ctrl);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
glEnable(geom_type);
|
||||||
|
if (new_color_ctrl) {
|
||||||
|
glEnable(nobj->curve.color.type);
|
||||||
|
color_dim = nobj->curve.color.dim;
|
||||||
|
color_ctrl = new_color_ctrl;
|
||||||
|
color_order = nobj->curve.color.order;
|
||||||
|
}
|
||||||
|
if (new_normal_ctrl) {
|
||||||
|
glEnable(nobj->curve.normal.type);
|
||||||
|
normal_dim = nobj->curve.normal.dim;
|
||||||
|
normal_ctrl = new_normal_ctrl;
|
||||||
|
normal_order = nobj->curve.normal.order;
|
||||||
|
}
|
||||||
|
if (new_texture_ctrl) {
|
||||||
|
glEnable(nobj->curve.texture.type);
|
||||||
|
texture_dim = nobj->curve.texture.dim;
|
||||||
|
texture_ctrl = new_texture_ctrl;
|
||||||
|
texture_order = nobj->curve.texture.order;
|
||||||
|
}
|
||||||
|
for (i = 0, j = 0, geom_ctrl = new_geom_ctrl;
|
||||||
|
i < n_ctrl; i += geom_order, j++, geom_ctrl += geom_order * geom_dim) {
|
||||||
|
if (fine_culling_test_2D
|
||||||
|
(nobj, geom_ctrl, geom_order, geom_dim, geom_dim)) {
|
||||||
|
color_ctrl += color_order * color_dim;
|
||||||
|
normal_ctrl += normal_order * normal_dim;
|
||||||
|
texture_ctrl += texture_order * texture_dim;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
glMap1f(geom_type, 0.0, 1.0, geom_dim, geom_order, geom_ctrl);
|
||||||
|
if (new_color_ctrl) {
|
||||||
|
glMap1f(nobj->curve.color.type, 0.0, 1.0, color_dim,
|
||||||
|
color_order, color_ctrl);
|
||||||
|
color_ctrl += color_order * color_dim;
|
||||||
|
}
|
||||||
|
if (new_normal_ctrl) {
|
||||||
|
glMap1f(nobj->curve.normal.type, 0.0, 1.0, normal_dim,
|
||||||
|
normal_order, normal_ctrl);
|
||||||
|
normal_ctrl += normal_order * normal_dim;
|
||||||
|
}
|
||||||
|
if (new_texture_ctrl) {
|
||||||
|
glMap1f(nobj->curve.texture.type, 0.0, 1.0, texture_dim,
|
||||||
|
texture_order, texture_ctrl);
|
||||||
|
texture_ctrl += texture_order * texture_dim;
|
||||||
|
}
|
||||||
|
glMapGrid1f(factors[j], 0.0, 1.0);
|
||||||
|
glEvalMesh1(GL_LINE, 0, factors[j]);
|
||||||
|
}
|
||||||
|
free(new_geom_ctrl);
|
||||||
|
free(factors);
|
||||||
|
if (new_color_ctrl)
|
||||||
|
free(new_color_ctrl);
|
||||||
|
if (new_normal_ctrl)
|
||||||
|
free(new_normal_ctrl);
|
||||||
|
if (new_texture_ctrl)
|
||||||
|
free(new_texture_ctrl);
|
||||||
|
}
|
||||||
938
src/glu/mini/polytest.c
Normal file
938
src/glu/mini/polytest.c
Normal file
@@ -0,0 +1,938 @@
|
|||||||
|
/* $Id: polytest.c,v 1.1.2.1 2003/03/21 13:02:17 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the polygon tesselation code contributed by
|
||||||
|
* Bogdan Sikorski
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "gluP.h"
|
||||||
|
#include "tess.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static GLenum store_polygon_as_contour(GLUtriangulatorObj *);
|
||||||
|
static void free_current_polygon(tess_polygon *);
|
||||||
|
static void prepare_projection_info(GLUtriangulatorObj *);
|
||||||
|
static GLdouble twice_the_polygon_area(tess_vertex *, tess_vertex *);
|
||||||
|
static GLenum verify_edge_vertex_intersections(GLUtriangulatorObj *);
|
||||||
|
void tess_find_contour_hierarchies(GLUtriangulatorObj *);
|
||||||
|
static GLenum test_for_overlapping_contours(GLUtriangulatorObj *);
|
||||||
|
static GLenum contours_overlap(tess_contour *, tess_polygon *);
|
||||||
|
static GLenum is_contour_contained_in(tess_contour *, tess_contour *);
|
||||||
|
static void add_new_exterior(GLUtriangulatorObj *, tess_contour *);
|
||||||
|
static void add_new_interior(GLUtriangulatorObj *, tess_contour *,
|
||||||
|
tess_contour *);
|
||||||
|
static void add_interior_with_hierarchy_check(GLUtriangulatorObj *,
|
||||||
|
tess_contour *, tess_contour *);
|
||||||
|
static void reverse_hierarchy_and_add_exterior(GLUtriangulatorObj *,
|
||||||
|
tess_contour *,
|
||||||
|
tess_contour *);
|
||||||
|
static GLboolean point_in_polygon(tess_contour *, GLdouble, GLdouble);
|
||||||
|
static void shift_interior_to_exterior(GLUtriangulatorObj *, tess_contour *);
|
||||||
|
static void add_exterior_with_check(GLUtriangulatorObj *, tess_contour *,
|
||||||
|
tess_contour *);
|
||||||
|
static GLenum cut_out_hole(GLUtriangulatorObj *, tess_contour *,
|
||||||
|
tess_contour *);
|
||||||
|
static GLenum merge_hole_with_contour(GLUtriangulatorObj *,
|
||||||
|
tess_contour *, tess_contour *,
|
||||||
|
tess_vertex *, tess_vertex *);
|
||||||
|
|
||||||
|
static GLenum
|
||||||
|
find_normal(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_polygon *polygon = tobj->current_polygon;
|
||||||
|
tess_vertex *va, *vb, *vc;
|
||||||
|
GLdouble A, B, C;
|
||||||
|
GLdouble A0, A1, A2, B0, B1, B2;
|
||||||
|
|
||||||
|
va = polygon->vertices;
|
||||||
|
vb = va->next;
|
||||||
|
A0 = vb->location[0] - va->location[0];
|
||||||
|
A1 = vb->location[1] - va->location[1];
|
||||||
|
A2 = vb->location[2] - va->location[2];
|
||||||
|
for (vc = vb->next; vc != va; vc = vc->next) {
|
||||||
|
B0 = vc->location[0] - va->location[0];
|
||||||
|
B1 = vc->location[1] - va->location[1];
|
||||||
|
B2 = vc->location[2] - va->location[2];
|
||||||
|
A = A1 * B2 - A2 * B1;
|
||||||
|
B = A2 * B0 - A0 * B2;
|
||||||
|
C = A0 * B1 - A1 * B0;
|
||||||
|
if (fabs(A) > EPSILON || fabs(B) > EPSILON || fabs(C) > EPSILON) {
|
||||||
|
polygon->A = A;
|
||||||
|
polygon->B = B;
|
||||||
|
polygon->C = C;
|
||||||
|
polygon->D =
|
||||||
|
-A * va->location[0] - B * va->location[1] - C * va->location[2];
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR7);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tess_test_polygon(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_polygon *polygon = tobj->current_polygon;
|
||||||
|
|
||||||
|
/* any vertices defined? */
|
||||||
|
if (polygon->vertex_cnt < 3) {
|
||||||
|
free_current_polygon(polygon);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* wrap pointers */
|
||||||
|
polygon->last_vertex->next = polygon->vertices;
|
||||||
|
polygon->vertices->previous = polygon->last_vertex;
|
||||||
|
/* determine the normal */
|
||||||
|
if (find_normal(tobj) == GLU_ERROR)
|
||||||
|
return;
|
||||||
|
/* compare the normals of previously defined contours and this one */
|
||||||
|
/* first contour define ? */
|
||||||
|
if (tobj->contours == NULL) {
|
||||||
|
tobj->A = polygon->A;
|
||||||
|
tobj->B = polygon->B;
|
||||||
|
tobj->C = polygon->C;
|
||||||
|
tobj->D = polygon->D;
|
||||||
|
/* determine the best projection to use */
|
||||||
|
if (fabs(polygon->A) > fabs(polygon->B))
|
||||||
|
if (fabs(polygon->A) > fabs(polygon->C))
|
||||||
|
tobj->projection = OYZ;
|
||||||
|
else
|
||||||
|
tobj->projection = OXY;
|
||||||
|
else if (fabs(polygon->B) > fabs(polygon->C))
|
||||||
|
tobj->projection = OXZ;
|
||||||
|
else
|
||||||
|
tobj->projection = OXY;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GLdouble a[3], b[3];
|
||||||
|
tess_vertex *vertex = polygon->vertices;
|
||||||
|
|
||||||
|
a[0] = tobj->A;
|
||||||
|
a[1] = tobj->B;
|
||||||
|
a[2] = tobj->C;
|
||||||
|
b[0] = polygon->A;
|
||||||
|
b[1] = polygon->B;
|
||||||
|
b[2] = polygon->C;
|
||||||
|
|
||||||
|
/* compare the normals */
|
||||||
|
if (fabs(a[1] * b[2] - a[2] * b[1]) > EPSILON ||
|
||||||
|
fabs(a[2] * b[0] - a[0] * b[2]) > EPSILON ||
|
||||||
|
fabs(a[0] * b[1] - a[1] * b[0]) > EPSILON) {
|
||||||
|
/* not coplanar */
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR9);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* the normals are parallel - test for plane equation */
|
||||||
|
if (fabs(a[0] * vertex->location[0] + a[1] * vertex->location[1] +
|
||||||
|
a[2] * vertex->location[2] + tobj->D) > EPSILON) {
|
||||||
|
/* not the same plane */
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR9);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prepare_projection_info(tobj);
|
||||||
|
if (verify_edge_vertex_intersections(tobj) == GLU_ERROR)
|
||||||
|
return;
|
||||||
|
if (test_for_overlapping_contours(tobj) == GLU_ERROR)
|
||||||
|
return;
|
||||||
|
if (store_polygon_as_contour(tobj) == GLU_ERROR)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLenum
|
||||||
|
test_for_overlapping_contours(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_contour *contour;
|
||||||
|
tess_polygon *polygon;
|
||||||
|
|
||||||
|
polygon = tobj->current_polygon;
|
||||||
|
for (contour = tobj->contours; contour != NULL; contour = contour->next)
|
||||||
|
if (contours_overlap(contour, polygon) != GLU_NO_ERROR) {
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR5);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLenum
|
||||||
|
store_polygon_as_contour(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_polygon *polygon = tobj->current_polygon;
|
||||||
|
tess_contour *contour = tobj->contours;
|
||||||
|
|
||||||
|
/* the first contour defined */
|
||||||
|
if (contour == NULL) {
|
||||||
|
if ((contour = (tess_contour *) malloc(sizeof(tess_contour))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
free_current_polygon(polygon);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
tobj->contours = tobj->last_contour = contour;
|
||||||
|
contour->next = contour->previous = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((contour = (tess_contour *) malloc(sizeof(tess_contour))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
free_current_polygon(polygon);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
contour->previous = tobj->last_contour;
|
||||||
|
tobj->last_contour->next = contour;
|
||||||
|
tobj->last_contour = contour;
|
||||||
|
contour->next = NULL;
|
||||||
|
}
|
||||||
|
/* mark all vertices in new contour as not special */
|
||||||
|
/* and all are boundary edges */
|
||||||
|
{
|
||||||
|
tess_vertex *vertex;
|
||||||
|
GLuint vertex_cnt, i;
|
||||||
|
|
||||||
|
for (vertex = polygon->vertices, i = 0, vertex_cnt =
|
||||||
|
polygon->vertex_cnt; i < vertex_cnt; vertex = vertex->next, i++) {
|
||||||
|
vertex->shadow_vertex = NULL;
|
||||||
|
vertex->edge_flag = GL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contour->vertex_cnt = polygon->vertex_cnt;
|
||||||
|
contour->area = polygon->area;
|
||||||
|
contour->orientation = polygon->orientation;
|
||||||
|
contour->type = GLU_UNKNOWN;
|
||||||
|
contour->vertices = polygon->vertices;
|
||||||
|
contour->last_vertex = polygon->last_vertex;
|
||||||
|
polygon->vertices = polygon->last_vertex = NULL;
|
||||||
|
polygon->vertex_cnt = 0;
|
||||||
|
++(tobj->contour_cnt);
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_current_polygon(tess_polygon * polygon)
|
||||||
|
{
|
||||||
|
tess_vertex *vertex, *vertex_tmp;
|
||||||
|
GLuint i;
|
||||||
|
|
||||||
|
/* free current_polygon structures */
|
||||||
|
for (vertex = polygon->vertices, i = 0; i < polygon->vertex_cnt; i++) {
|
||||||
|
vertex_tmp = vertex->next;
|
||||||
|
free(vertex);
|
||||||
|
vertex = vertex_tmp;
|
||||||
|
}
|
||||||
|
polygon->vertices = polygon->last_vertex = NULL;
|
||||||
|
polygon->vertex_cnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
prepare_projection_info(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_polygon *polygon = tobj->current_polygon;
|
||||||
|
tess_vertex *vertex, *last_vertex_ptr;
|
||||||
|
GLdouble area;
|
||||||
|
|
||||||
|
last_vertex_ptr = polygon->last_vertex;
|
||||||
|
switch (tobj->projection) {
|
||||||
|
case OXY:
|
||||||
|
for (vertex = polygon->vertices; vertex != last_vertex_ptr;
|
||||||
|
vertex = vertex->next) {
|
||||||
|
vertex->x = vertex->location[0];
|
||||||
|
vertex->y = vertex->location[1];
|
||||||
|
}
|
||||||
|
last_vertex_ptr->x = last_vertex_ptr->location[0];
|
||||||
|
last_vertex_ptr->y = last_vertex_ptr->location[1];
|
||||||
|
break;
|
||||||
|
case OXZ:
|
||||||
|
for (vertex = polygon->vertices; vertex != last_vertex_ptr;
|
||||||
|
vertex = vertex->next) {
|
||||||
|
vertex->x = vertex->location[0];
|
||||||
|
vertex->y = vertex->location[2];
|
||||||
|
}
|
||||||
|
last_vertex_ptr->x = last_vertex_ptr->location[0];
|
||||||
|
last_vertex_ptr->y = last_vertex_ptr->location[2];
|
||||||
|
break;
|
||||||
|
case OYZ:
|
||||||
|
for (vertex = polygon->vertices; vertex != last_vertex_ptr;
|
||||||
|
vertex = vertex->next) {
|
||||||
|
vertex->x = vertex->location[1];
|
||||||
|
vertex->y = vertex->location[2];
|
||||||
|
}
|
||||||
|
last_vertex_ptr->x = last_vertex_ptr->location[1];
|
||||||
|
last_vertex_ptr->y = last_vertex_ptr->location[2];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
area = twice_the_polygon_area(polygon->vertices, polygon->last_vertex);
|
||||||
|
if (area >= 0.0) {
|
||||||
|
polygon->orientation = GLU_CCW;
|
||||||
|
polygon->area = area;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
polygon->orientation = GLU_CW;
|
||||||
|
polygon->area = -area;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLdouble
|
||||||
|
twice_the_polygon_area(tess_vertex * vertex, tess_vertex * last_vertex)
|
||||||
|
{
|
||||||
|
tess_vertex *next;
|
||||||
|
GLdouble area, x, y;
|
||||||
|
|
||||||
|
area = 0.0;
|
||||||
|
x = vertex->x;
|
||||||
|
y = vertex->y;
|
||||||
|
vertex = vertex->next;
|
||||||
|
for (; vertex != last_vertex; vertex = vertex->next) {
|
||||||
|
next = vertex->next;
|
||||||
|
area +=
|
||||||
|
(vertex->x - x) * (next->y - y) - (vertex->y - y) * (next->x - x);
|
||||||
|
}
|
||||||
|
return area;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* test if edges ab and cd intersect */
|
||||||
|
/* if not return GLU_NO_ERROR, else if cross return GLU_TESS_ERROR8, */
|
||||||
|
/* else if adjacent return GLU_TESS_ERROR4 */
|
||||||
|
static GLenum
|
||||||
|
edge_edge_intersect(tess_vertex * a,
|
||||||
|
tess_vertex * b, tess_vertex * c, tess_vertex * d)
|
||||||
|
{
|
||||||
|
GLdouble denom, r, s;
|
||||||
|
GLdouble xba, ydc, yba, xdc, yac, xac;
|
||||||
|
|
||||||
|
xba = b->x - a->x;
|
||||||
|
yba = b->y - a->y;
|
||||||
|
xdc = d->x - c->x;
|
||||||
|
ydc = d->y - c->y;
|
||||||
|
xac = a->x - c->x;
|
||||||
|
yac = a->y - c->y;
|
||||||
|
denom = xba * ydc - yba * xdc;
|
||||||
|
r = yac * xdc - xac * ydc;
|
||||||
|
/* parallel? */
|
||||||
|
if (fabs(denom) < EPSILON) {
|
||||||
|
if (fabs(r) < EPSILON) {
|
||||||
|
/* colinear */
|
||||||
|
if (fabs(xba) < EPSILON) {
|
||||||
|
/* compare the Y coordinate */
|
||||||
|
if (yba > 0.0) {
|
||||||
|
if (
|
||||||
|
(fabs(a->y - c->y) < EPSILON
|
||||||
|
&& fabs(c->y - b->y) < EPSILON)
|
||||||
|
|| (fabs(a->y - d->y) < EPSILON
|
||||||
|
&& fabs(d->y - b->y) <
|
||||||
|
EPSILON)) return GLU_TESS_ERROR4;
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (
|
||||||
|
(fabs(b->y - c->y) < EPSILON
|
||||||
|
&& fabs(c->y - a->y) < EPSILON)
|
||||||
|
|| (fabs(b->y - d->y) < EPSILON
|
||||||
|
&& fabs(d->y - a->y) <
|
||||||
|
EPSILON)) return GLU_TESS_ERROR4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* compare the X coordinate */
|
||||||
|
if (xba > 0.0) {
|
||||||
|
if (
|
||||||
|
(fabs(a->x - c->x) < EPSILON
|
||||||
|
&& fabs(c->x - b->x) < EPSILON)
|
||||||
|
|| (fabs(a->x - d->x) < EPSILON
|
||||||
|
&& fabs(d->x - b->x) <
|
||||||
|
EPSILON)) return GLU_TESS_ERROR4;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (
|
||||||
|
(fabs(b->x - c->x) < EPSILON
|
||||||
|
&& fabs(c->x - a->x) < EPSILON)
|
||||||
|
|| (fabs(b->x - d->x) < EPSILON
|
||||||
|
&& fabs(d->x - a->x) <
|
||||||
|
EPSILON)) return GLU_TESS_ERROR4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
r /= denom;
|
||||||
|
s = (yac * xba - xac * yba) / denom;
|
||||||
|
/* test if one vertex lies on other edge */
|
||||||
|
if (((fabs(r) < EPSILON || (r < 1.0 + EPSILON && r > 1.0 - EPSILON)) &&
|
||||||
|
s > -EPSILON && s < 1.0 + EPSILON) ||
|
||||||
|
((fabs(s) < EPSILON || (s < 1.0 + EPSILON && s > 1.0 - EPSILON)) &&
|
||||||
|
r > -EPSILON && r < 1.0 + EPSILON)) {
|
||||||
|
return GLU_TESS_ERROR4;
|
||||||
|
}
|
||||||
|
/* test for crossing */
|
||||||
|
if (r > -EPSILON && r < 1.0 + EPSILON && s > -EPSILON && s < 1.0 + EPSILON) {
|
||||||
|
return GLU_TESS_ERROR8;
|
||||||
|
}
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLenum
|
||||||
|
verify_edge_vertex_intersections(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_polygon *polygon = tobj->current_polygon;
|
||||||
|
tess_vertex *vertex1, *last_vertex, *vertex2;
|
||||||
|
GLenum test;
|
||||||
|
|
||||||
|
last_vertex = polygon->last_vertex;
|
||||||
|
vertex1 = last_vertex;
|
||||||
|
for (vertex2 = vertex1->next->next;
|
||||||
|
vertex2->next != last_vertex; vertex2 = vertex2->next) {
|
||||||
|
test = edge_edge_intersect(vertex1, vertex1->next, vertex2,
|
||||||
|
vertex2->next);
|
||||||
|
if (test != GLU_NO_ERROR) {
|
||||||
|
tess_call_user_error(tobj, test);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (vertex1 = polygon->vertices;
|
||||||
|
vertex1->next->next != last_vertex; vertex1 = vertex1->next) {
|
||||||
|
for (vertex2 = vertex1->next->next;
|
||||||
|
vertex2 != last_vertex; vertex2 = vertex2->next) {
|
||||||
|
test = edge_edge_intersect(vertex1, vertex1->next, vertex2,
|
||||||
|
vertex2->next);
|
||||||
|
if (test != GLU_NO_ERROR) {
|
||||||
|
tess_call_user_error(tobj, test);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
#ifdef WIN32
|
||||||
|
__cdecl
|
||||||
|
#endif
|
||||||
|
area_compare(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
GLdouble area1, area2;
|
||||||
|
|
||||||
|
area1 = (*((tess_contour **) a))->area;
|
||||||
|
area2 = (*((tess_contour **) b))->area;
|
||||||
|
if (area1 < area2)
|
||||||
|
return 1;
|
||||||
|
if (area1 > area2)
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tess_find_contour_hierarchies(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_contour **contours; /* dinamic array of pointers */
|
||||||
|
tess_contour *tmp_contour_ptr = tobj->contours;
|
||||||
|
GLuint cnt, i;
|
||||||
|
GLenum result;
|
||||||
|
GLboolean hierarchy_changed;
|
||||||
|
|
||||||
|
/* any contours? */
|
||||||
|
if (tobj->contour_cnt < 2) {
|
||||||
|
tobj->contours->type = GLU_EXTERIOR;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((contours = (tess_contour **)
|
||||||
|
malloc(sizeof(tess_contour *) * (tobj->contour_cnt))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (tmp_contour_ptr = tobj->contours, cnt = 0;
|
||||||
|
tmp_contour_ptr != NULL; tmp_contour_ptr = tmp_contour_ptr->next)
|
||||||
|
contours[cnt++] = tmp_contour_ptr;
|
||||||
|
/* now sort the contours in decreasing area size order */
|
||||||
|
qsort((void *) contours, (size_t) cnt, (size_t) sizeof(tess_contour *),
|
||||||
|
area_compare);
|
||||||
|
/* we leave just the first contour - remove others from list */
|
||||||
|
tobj->contours = contours[0];
|
||||||
|
tobj->contours->next = tobj->contours->previous = NULL;
|
||||||
|
tobj->last_contour = tobj->contours;
|
||||||
|
tobj->contour_cnt = 1;
|
||||||
|
/* first contour is the one with greatest area */
|
||||||
|
/* must be EXTERIOR */
|
||||||
|
tobj->contours->type = GLU_EXTERIOR;
|
||||||
|
tmp_contour_ptr = tobj->contours;
|
||||||
|
/* now we play! */
|
||||||
|
for (i = 1; i < cnt; i++) {
|
||||||
|
hierarchy_changed = GL_FALSE;
|
||||||
|
for (tmp_contour_ptr = tobj->contours;
|
||||||
|
tmp_contour_ptr != NULL; tmp_contour_ptr = tmp_contour_ptr->next) {
|
||||||
|
if (tmp_contour_ptr->type == GLU_EXTERIOR) {
|
||||||
|
/* check if contour completely contained in EXTERIOR */
|
||||||
|
result = is_contour_contained_in(tmp_contour_ptr, contours[i]);
|
||||||
|
switch (result) {
|
||||||
|
case GLU_INTERIOR:
|
||||||
|
/* now we have to check if contour is inside interiors */
|
||||||
|
/* or not */
|
||||||
|
/* any interiors? */
|
||||||
|
if (tmp_contour_ptr->next != NULL &&
|
||||||
|
tmp_contour_ptr->next->type == GLU_INTERIOR) {
|
||||||
|
/* for all interior, check if inside any of them */
|
||||||
|
/* if not inside any of interiors, its another */
|
||||||
|
/* interior */
|
||||||
|
/* or it may contain some interiors, then change */
|
||||||
|
/* the contained interiors to exterior ones */
|
||||||
|
add_interior_with_hierarchy_check(tobj,
|
||||||
|
tmp_contour_ptr,
|
||||||
|
contours[i]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* not in interior, add as new interior contour */
|
||||||
|
add_new_interior(tobj, tmp_contour_ptr, contours[i]);
|
||||||
|
}
|
||||||
|
hierarchy_changed = GL_TRUE;
|
||||||
|
break;
|
||||||
|
case GLU_EXTERIOR:
|
||||||
|
/* ooops, the marked as EXTERIOR (contours[i]) is */
|
||||||
|
/* actually an interior of tmp_contour_ptr */
|
||||||
|
/* reverse the local hierarchy */
|
||||||
|
reverse_hierarchy_and_add_exterior(tobj, tmp_contour_ptr,
|
||||||
|
contours[i]);
|
||||||
|
hierarchy_changed = GL_TRUE;
|
||||||
|
break;
|
||||||
|
case GLU_NO_ERROR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hierarchy_changed)
|
||||||
|
break; /* break from for loop */
|
||||||
|
}
|
||||||
|
if (hierarchy_changed == GL_FALSE) {
|
||||||
|
/* disjoint with all contours, add to contour list */
|
||||||
|
add_new_exterior(tobj, contours[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(contours);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns GLU_INTERIOR if inner is completey enclosed within outer */
|
||||||
|
/* returns GLU_EXTERIOR if outer is completely enclosed within inner */
|
||||||
|
/* returns GLU_NO_ERROR if contours are disjoint */
|
||||||
|
static GLenum
|
||||||
|
is_contour_contained_in(tess_contour * outer, tess_contour * inner)
|
||||||
|
{
|
||||||
|
GLenum relation_flag;
|
||||||
|
|
||||||
|
/* set relation_flag to relation of containment of first inner vertex */
|
||||||
|
/* regarding outer contour */
|
||||||
|
if (point_in_polygon(outer, inner->vertices->x, inner->vertices->y))
|
||||||
|
relation_flag = GLU_INTERIOR;
|
||||||
|
else
|
||||||
|
relation_flag = GLU_EXTERIOR;
|
||||||
|
if (relation_flag == GLU_INTERIOR)
|
||||||
|
return GLU_INTERIOR;
|
||||||
|
if (point_in_polygon(inner, outer->vertices->x, outer->vertices->y))
|
||||||
|
return GLU_EXTERIOR;
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLboolean
|
||||||
|
point_in_polygon(tess_contour * contour, GLdouble x, GLdouble y)
|
||||||
|
{
|
||||||
|
tess_vertex *v1, *v2;
|
||||||
|
GLuint i, vertex_cnt;
|
||||||
|
GLdouble xp1, yp1, xp2, yp2;
|
||||||
|
GLboolean tst;
|
||||||
|
|
||||||
|
tst = GL_FALSE;
|
||||||
|
v1 = contour->vertices;
|
||||||
|
v2 = contour->vertices->previous;
|
||||||
|
for (i = 0, vertex_cnt = contour->vertex_cnt; i < vertex_cnt; i++) {
|
||||||
|
xp1 = v1->x;
|
||||||
|
yp1 = v1->y;
|
||||||
|
xp2 = v2->x;
|
||||||
|
yp2 = v2->y;
|
||||||
|
if ((((yp1 <= y) && (y < yp2)) || ((yp2 <= y) && (y < yp1))) &&
|
||||||
|
(x < (xp2 - xp1) * (y - yp1) / (yp2 - yp1) + xp1))
|
||||||
|
tst = (tst == GL_FALSE ? GL_TRUE : GL_FALSE);
|
||||||
|
v2 = v1;
|
||||||
|
v1 = v1->next;
|
||||||
|
}
|
||||||
|
return tst;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLenum
|
||||||
|
contours_overlap(tess_contour * contour, tess_polygon * polygon)
|
||||||
|
{
|
||||||
|
tess_vertex *vertex1, *vertex2;
|
||||||
|
GLuint vertex1_cnt, vertex2_cnt, i, j;
|
||||||
|
GLenum test;
|
||||||
|
|
||||||
|
vertex1 = contour->vertices;
|
||||||
|
vertex2 = polygon->vertices;
|
||||||
|
vertex1_cnt = contour->vertex_cnt;
|
||||||
|
vertex2_cnt = polygon->vertex_cnt;
|
||||||
|
for (i = 0; i < vertex1_cnt; vertex1 = vertex1->next, i++) {
|
||||||
|
for (j = 0; j < vertex2_cnt; vertex2 = vertex2->next, j++)
|
||||||
|
if ((test = edge_edge_intersect(vertex1, vertex1->next, vertex2,
|
||||||
|
vertex2->next)) != GLU_NO_ERROR)
|
||||||
|
return test;
|
||||||
|
}
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_new_exterior(GLUtriangulatorObj * tobj, tess_contour * contour)
|
||||||
|
{
|
||||||
|
contour->type = GLU_EXTERIOR;
|
||||||
|
contour->next = NULL;
|
||||||
|
contour->previous = tobj->last_contour;
|
||||||
|
tobj->last_contour->next = contour;
|
||||||
|
tobj->last_contour = contour;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_new_interior(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * outer, tess_contour * contour)
|
||||||
|
{
|
||||||
|
contour->type = GLU_INTERIOR;
|
||||||
|
contour->next = outer->next;
|
||||||
|
contour->previous = outer;
|
||||||
|
if (outer->next != NULL)
|
||||||
|
outer->next->previous = contour;
|
||||||
|
outer->next = contour;
|
||||||
|
if (tobj->last_contour == outer)
|
||||||
|
tobj->last_contour = contour;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_interior_with_hierarchy_check(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * outer,
|
||||||
|
tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_contour *ptr;
|
||||||
|
|
||||||
|
/* for all interiors of outer check if they are interior of contour */
|
||||||
|
/* if so, change that interior to exterior and move it of of the */
|
||||||
|
/* interior sequence */
|
||||||
|
if (outer->next != NULL && outer->next->type == GLU_INTERIOR) {
|
||||||
|
GLenum test;
|
||||||
|
|
||||||
|
for (ptr = outer->next; ptr != NULL && ptr->type == GLU_INTERIOR;
|
||||||
|
ptr = ptr->next) {
|
||||||
|
test = is_contour_contained_in(ptr, contour);
|
||||||
|
switch (test) {
|
||||||
|
case GLU_INTERIOR:
|
||||||
|
/* contour is contained in one of the interiors */
|
||||||
|
/* check if possibly contained in other exteriors */
|
||||||
|
/* move ptr to first EXTERIOR */
|
||||||
|
for (; ptr != NULL && ptr->type == GLU_INTERIOR; ptr = ptr->next);
|
||||||
|
if (ptr == NULL)
|
||||||
|
/* another exterior */
|
||||||
|
add_new_exterior(tobj, contour);
|
||||||
|
else
|
||||||
|
add_exterior_with_check(tobj, ptr, contour);
|
||||||
|
return;
|
||||||
|
case GLU_EXTERIOR:
|
||||||
|
/* one of the interiors is contained in the contour */
|
||||||
|
/* change it to EXTERIOR, and shift it away from the */
|
||||||
|
/* interior sequence */
|
||||||
|
shift_interior_to_exterior(tobj, ptr);
|
||||||
|
break;
|
||||||
|
case GLU_NO_ERROR:
|
||||||
|
/* disjoint */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* add contour to the interior sequence */
|
||||||
|
add_new_interior(tobj, outer, contour);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
reverse_hierarchy_and_add_exterior(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * outer,
|
||||||
|
tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_contour *ptr;
|
||||||
|
|
||||||
|
/* reverse INTERIORS to EXTERIORS */
|
||||||
|
/* any INTERIORS? */
|
||||||
|
if (outer->next != NULL && outer->next->type == GLU_INTERIOR)
|
||||||
|
for (ptr = outer->next; ptr != NULL && ptr->type == GLU_INTERIOR;
|
||||||
|
ptr = ptr->next) ptr->type = GLU_EXTERIOR;
|
||||||
|
/* the outer now becomes inner */
|
||||||
|
outer->type = GLU_INTERIOR;
|
||||||
|
/* contour is the EXTERIOR */
|
||||||
|
contour->next = outer;
|
||||||
|
if (tobj->contours == outer) {
|
||||||
|
/* first contour beeing reversed */
|
||||||
|
contour->previous = NULL;
|
||||||
|
tobj->contours = contour;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outer->previous->next = contour;
|
||||||
|
contour->previous = outer->previous;
|
||||||
|
}
|
||||||
|
outer->previous = contour;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shift_interior_to_exterior(GLUtriangulatorObj * tobj, tess_contour * contour)
|
||||||
|
{
|
||||||
|
contour->previous->next = contour->next;
|
||||||
|
if (contour->next != NULL)
|
||||||
|
contour->next->previous = contour->previous;
|
||||||
|
else
|
||||||
|
tobj->last_contour = contour->previous;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_exterior_with_check(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * outer, tess_contour * contour)
|
||||||
|
{
|
||||||
|
GLenum test;
|
||||||
|
|
||||||
|
/* this contour might be interior to further exteriors - check */
|
||||||
|
/* if not, just add as a new exterior */
|
||||||
|
for (; outer != NULL && outer->type == GLU_EXTERIOR; outer = outer->next) {
|
||||||
|
test = is_contour_contained_in(outer, contour);
|
||||||
|
switch (test) {
|
||||||
|
case GLU_INTERIOR:
|
||||||
|
/* now we have to check if contour is inside interiors */
|
||||||
|
/* or not */
|
||||||
|
/* any interiors? */
|
||||||
|
if (outer->next != NULL && outer->next->type == GLU_INTERIOR) {
|
||||||
|
/* for all interior, check if inside any of them */
|
||||||
|
/* if not inside any of interiors, its another */
|
||||||
|
/* interior */
|
||||||
|
/* or it may contain some interiors, then change */
|
||||||
|
/* the contained interiors to exterior ones */
|
||||||
|
add_interior_with_hierarchy_check(tobj, outer, contour);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* not in interior, add as new interior contour */
|
||||||
|
add_new_interior(tobj, outer, contour);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
case GLU_NO_ERROR:
|
||||||
|
/* disjoint */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* add contour to the exterior sequence */
|
||||||
|
add_new_exterior(tobj, contour);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tess_handle_holes(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_contour *contour, *hole;
|
||||||
|
GLenum exterior_orientation;
|
||||||
|
|
||||||
|
/* verify hole orientation */
|
||||||
|
for (contour = tobj->contours; contour != NULL;) {
|
||||||
|
exterior_orientation = contour->orientation;
|
||||||
|
for (contour = contour->next;
|
||||||
|
contour != NULL && contour->type == GLU_INTERIOR;
|
||||||
|
contour = contour->next) {
|
||||||
|
if (contour->orientation == exterior_orientation) {
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR5);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* now cut-out holes */
|
||||||
|
for (contour = tobj->contours; contour != NULL;) {
|
||||||
|
hole = contour->next;
|
||||||
|
while (hole != NULL && hole->type == GLU_INTERIOR) {
|
||||||
|
if (cut_out_hole(tobj, contour, hole) == GLU_ERROR)
|
||||||
|
return;
|
||||||
|
hole = contour->next;
|
||||||
|
}
|
||||||
|
contour = contour->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLenum
|
||||||
|
cut_out_hole(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * contour, tess_contour * hole)
|
||||||
|
{
|
||||||
|
tess_contour *tmp_hole;
|
||||||
|
tess_vertex *v1, *v2, *tmp_vertex;
|
||||||
|
GLuint vertex1_cnt, vertex2_cnt, tmp_vertex_cnt;
|
||||||
|
GLuint i, j, k;
|
||||||
|
GLenum test = 0;
|
||||||
|
|
||||||
|
/* find an edge connecting contour and hole not intersecting any other */
|
||||||
|
/* edge belonging to either the contour or any of the other holes */
|
||||||
|
for (v1 = contour->vertices, vertex1_cnt = contour->vertex_cnt, i = 0;
|
||||||
|
i < vertex1_cnt; i++, v1 = v1->next) {
|
||||||
|
for (v2 = hole->vertices, vertex2_cnt = hole->vertex_cnt, j = 0;
|
||||||
|
j < vertex2_cnt; j++, v2 = v2->next) {
|
||||||
|
/* does edge (v1,v2) intersect any edge of contour */
|
||||||
|
for (tmp_vertex = contour->vertices, tmp_vertex_cnt =
|
||||||
|
contour->vertex_cnt, k = 0; k < tmp_vertex_cnt;
|
||||||
|
tmp_vertex = tmp_vertex->next, k++) {
|
||||||
|
/* skip edge tests for edges directly connected */
|
||||||
|
if (v1 == tmp_vertex || v1 == tmp_vertex->next)
|
||||||
|
continue;
|
||||||
|
test = edge_edge_intersect(v1, v2, tmp_vertex, tmp_vertex->next);
|
||||||
|
if (test != GLU_NO_ERROR)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (test == GLU_NO_ERROR) {
|
||||||
|
/* does edge (v1,v2) intersect any edge of hole */
|
||||||
|
for (tmp_vertex = hole->vertices,
|
||||||
|
tmp_vertex_cnt = hole->vertex_cnt, k = 0;
|
||||||
|
k < tmp_vertex_cnt; tmp_vertex = tmp_vertex->next, k++) {
|
||||||
|
/* skip edge tests for edges directly connected */
|
||||||
|
if (v2 == tmp_vertex || v2 == tmp_vertex->next)
|
||||||
|
continue;
|
||||||
|
test =
|
||||||
|
edge_edge_intersect(v1, v2, tmp_vertex, tmp_vertex->next);
|
||||||
|
if (test != GLU_NO_ERROR)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (test == GLU_NO_ERROR) {
|
||||||
|
/* does edge (v1,v2) intersect any other hole? */
|
||||||
|
for (tmp_hole = hole->next;
|
||||||
|
tmp_hole != NULL && tmp_hole->type == GLU_INTERIOR;
|
||||||
|
tmp_hole = tmp_hole->next) {
|
||||||
|
/* does edge (v1,v2) intersect any edge of hole */
|
||||||
|
for (tmp_vertex = tmp_hole->vertices,
|
||||||
|
tmp_vertex_cnt = tmp_hole->vertex_cnt, k = 0;
|
||||||
|
k < tmp_vertex_cnt; tmp_vertex = tmp_vertex->next, k++) {
|
||||||
|
test = edge_edge_intersect(v1, v2, tmp_vertex,
|
||||||
|
tmp_vertex->next);
|
||||||
|
if (test != GLU_NO_ERROR)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (test != GLU_NO_ERROR)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (test == GLU_NO_ERROR) {
|
||||||
|
/* edge (v1,v2) is good for eliminating the hole */
|
||||||
|
if (merge_hole_with_contour(tobj, contour, hole, v1, v2)
|
||||||
|
== GLU_NO_ERROR)
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
else
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* other holes are blocking all possible connections of hole */
|
||||||
|
/* with contour, we shift this hole as the last hole and retry */
|
||||||
|
for (tmp_hole = hole;
|
||||||
|
tmp_hole != NULL && tmp_hole->type == GLU_INTERIOR;
|
||||||
|
tmp_hole = tmp_hole->next);
|
||||||
|
contour->next = hole->next;
|
||||||
|
hole->next->previous = contour;
|
||||||
|
if (tmp_hole == NULL) {
|
||||||
|
/* last EXTERIOR contour, shift hole as last contour */
|
||||||
|
hole->next = NULL;
|
||||||
|
hole->previous = tobj->last_contour;
|
||||||
|
tobj->last_contour->next = hole;
|
||||||
|
tobj->last_contour = hole;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tmp_hole->previous->next = hole;
|
||||||
|
hole->previous = tmp_hole->previous;
|
||||||
|
tmp_hole->previous = hole;
|
||||||
|
hole->next = tmp_hole;
|
||||||
|
}
|
||||||
|
hole = contour->next;
|
||||||
|
/* try once again - recurse */
|
||||||
|
return cut_out_hole(tobj, contour, hole);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLenum
|
||||||
|
merge_hole_with_contour(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * contour,
|
||||||
|
tess_contour * hole,
|
||||||
|
tess_vertex * v1, tess_vertex * v2)
|
||||||
|
{
|
||||||
|
tess_vertex *v1_new, *v2_new;
|
||||||
|
|
||||||
|
/* make copies of v1 and v2, place them respectively after their originals */
|
||||||
|
if ((v1_new = (tess_vertex *) malloc(sizeof(tess_vertex))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
if ((v2_new = (tess_vertex *) malloc(sizeof(tess_vertex))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
return GLU_ERROR;
|
||||||
|
}
|
||||||
|
v1_new->edge_flag = GL_TRUE;
|
||||||
|
v1_new->data = v1->data;
|
||||||
|
v1_new->location[0] = v1->location[0];
|
||||||
|
v1_new->location[1] = v1->location[1];
|
||||||
|
v1_new->location[2] = v1->location[2];
|
||||||
|
v1_new->x = v1->x;
|
||||||
|
v1_new->y = v1->y;
|
||||||
|
v1_new->shadow_vertex = v1;
|
||||||
|
v1->shadow_vertex = v1_new;
|
||||||
|
v1_new->next = v1->next;
|
||||||
|
v1_new->previous = v1;
|
||||||
|
v1->next->previous = v1_new;
|
||||||
|
v1->next = v1_new;
|
||||||
|
v2_new->edge_flag = GL_TRUE;
|
||||||
|
v2_new->data = v2->data;
|
||||||
|
v2_new->location[0] = v2->location[0];
|
||||||
|
v2_new->location[1] = v2->location[1];
|
||||||
|
v2_new->location[2] = v2->location[2];
|
||||||
|
v2_new->x = v2->x;
|
||||||
|
v2_new->y = v2->y;
|
||||||
|
v2_new->shadow_vertex = v2;
|
||||||
|
v2->shadow_vertex = v2_new;
|
||||||
|
v2_new->next = v2->next;
|
||||||
|
v2_new->previous = v2;
|
||||||
|
v2->next->previous = v2_new;
|
||||||
|
v2->next = v2_new;
|
||||||
|
/* link together the two lists */
|
||||||
|
v1->next = v2_new;
|
||||||
|
v2_new->previous = v1;
|
||||||
|
v2->next = v1_new;
|
||||||
|
v1_new->previous = v2;
|
||||||
|
/* update the vertex count of the contour */
|
||||||
|
contour->vertex_cnt += hole->vertex_cnt + 2;
|
||||||
|
/* remove the INTERIOR contour */
|
||||||
|
contour->next = hole->next;
|
||||||
|
if (hole->next != NULL)
|
||||||
|
hole->next->previous = contour;
|
||||||
|
free(hole);
|
||||||
|
/* update tobj structure */
|
||||||
|
--(tobj->contour_cnt);
|
||||||
|
if (contour->last_vertex == v1)
|
||||||
|
contour->last_vertex = v1_new;
|
||||||
|
/* mark two vertices with edge_flag */
|
||||||
|
v2->edge_flag = GL_FALSE;
|
||||||
|
v1->edge_flag = GL_FALSE;
|
||||||
|
return GLU_NO_ERROR;
|
||||||
|
}
|
||||||
402
src/glu/mini/project.c
Normal file
402
src/glu/mini/project.c
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
/* $Id: project.c,v 1.1.2.1 2003/03/21 13:02:18 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "gluP.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code was contributed by Marc Buffat (buffat@mecaflu.ec-lyon.fr).
|
||||||
|
* Thanks Marc!!!
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* implementation de gluProject et gluUnproject */
|
||||||
|
/* M. Buffat 17/2/95 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transform a point (column vector) by a 4x4 matrix. I.e. out = m * in
|
||||||
|
* Input: m - the 4x4 matrix
|
||||||
|
* in - the 4x1 vector
|
||||||
|
* Output: out - the resulting 4x1 vector.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
transform_point(GLdouble out[4], const GLdouble m[16], const GLdouble in[4])
|
||||||
|
{
|
||||||
|
#define M(row,col) m[col*4+row]
|
||||||
|
out[0] =
|
||||||
|
M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3];
|
||||||
|
out[1] =
|
||||||
|
M(1, 0) * in[0] + M(1, 1) * in[1] + M(1, 2) * in[2] + M(1, 3) * in[3];
|
||||||
|
out[2] =
|
||||||
|
M(2, 0) * in[0] + M(2, 1) * in[1] + M(2, 2) * in[2] + M(2, 3) * in[3];
|
||||||
|
out[3] =
|
||||||
|
M(3, 0) * in[0] + M(3, 1) * in[1] + M(3, 2) * in[2] + M(3, 3) * in[3];
|
||||||
|
#undef M
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform a 4x4 matrix multiplication (product = a x b).
|
||||||
|
* Input: a, b - matrices to multiply
|
||||||
|
* Output: product - product of a and b
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
matmul(GLdouble * product, const GLdouble * a, const GLdouble * b)
|
||||||
|
{
|
||||||
|
/* This matmul was contributed by Thomas Malik */
|
||||||
|
GLdouble temp[16];
|
||||||
|
GLint i;
|
||||||
|
|
||||||
|
#define A(row,col) a[(col<<2)+row]
|
||||||
|
#define B(row,col) b[(col<<2)+row]
|
||||||
|
#define T(row,col) temp[(col<<2)+row]
|
||||||
|
|
||||||
|
/* i-te Zeile */
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
T(i, 0) =
|
||||||
|
A(i, 0) * B(0, 0) + A(i, 1) * B(1, 0) + A(i, 2) * B(2, 0) + A(i,
|
||||||
|
3) *
|
||||||
|
B(3, 0);
|
||||||
|
T(i, 1) =
|
||||||
|
A(i, 0) * B(0, 1) + A(i, 1) * B(1, 1) + A(i, 2) * B(2, 1) + A(i,
|
||||||
|
3) *
|
||||||
|
B(3, 1);
|
||||||
|
T(i, 2) =
|
||||||
|
A(i, 0) * B(0, 2) + A(i, 1) * B(1, 2) + A(i, 2) * B(2, 2) + A(i,
|
||||||
|
3) *
|
||||||
|
B(3, 2);
|
||||||
|
T(i, 3) =
|
||||||
|
A(i, 0) * B(0, 3) + A(i, 1) * B(1, 3) + A(i, 2) * B(2, 3) + A(i,
|
||||||
|
3) *
|
||||||
|
B(3, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef A
|
||||||
|
#undef B
|
||||||
|
#undef T
|
||||||
|
MEMCPY(product, temp, 16 * sizeof(GLdouble));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute inverse of 4x4 transformation matrix.
|
||||||
|
* Code contributed by Jacques Leroy jle@star.be
|
||||||
|
* Return GL_TRUE for success, GL_FALSE for failure (singular matrix)
|
||||||
|
*/
|
||||||
|
static GLboolean
|
||||||
|
invert_matrix(const GLdouble * m, GLdouble * out)
|
||||||
|
{
|
||||||
|
/* NB. OpenGL Matrices are COLUMN major. */
|
||||||
|
#define SWAP_ROWS(a, b) { GLdouble *_tmp = a; (a)=(b); (b)=_tmp; }
|
||||||
|
#define MAT(m,r,c) (m)[(c)*4+(r)]
|
||||||
|
|
||||||
|
GLdouble wtmp[4][8];
|
||||||
|
GLdouble m0, m1, m2, m3, s;
|
||||||
|
GLdouble *r0, *r1, *r2, *r3;
|
||||||
|
|
||||||
|
r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2], r3 = wtmp[3];
|
||||||
|
|
||||||
|
r0[0] = MAT(m, 0, 0), r0[1] = MAT(m, 0, 1),
|
||||||
|
r0[2] = MAT(m, 0, 2), r0[3] = MAT(m, 0, 3),
|
||||||
|
r0[4] = 1.0, r0[5] = r0[6] = r0[7] = 0.0,
|
||||||
|
r1[0] = MAT(m, 1, 0), r1[1] = MAT(m, 1, 1),
|
||||||
|
r1[2] = MAT(m, 1, 2), r1[3] = MAT(m, 1, 3),
|
||||||
|
r1[5] = 1.0, r1[4] = r1[6] = r1[7] = 0.0,
|
||||||
|
r2[0] = MAT(m, 2, 0), r2[1] = MAT(m, 2, 1),
|
||||||
|
r2[2] = MAT(m, 2, 2), r2[3] = MAT(m, 2, 3),
|
||||||
|
r2[6] = 1.0, r2[4] = r2[5] = r2[7] = 0.0,
|
||||||
|
r3[0] = MAT(m, 3, 0), r3[1] = MAT(m, 3, 1),
|
||||||
|
r3[2] = MAT(m, 3, 2), r3[3] = MAT(m, 3, 3),
|
||||||
|
r3[7] = 1.0, r3[4] = r3[5] = r3[6] = 0.0;
|
||||||
|
|
||||||
|
/* choose pivot - or die */
|
||||||
|
if (fabs(r3[0]) > fabs(r2[0]))
|
||||||
|
SWAP_ROWS(r3, r2);
|
||||||
|
if (fabs(r2[0]) > fabs(r1[0]))
|
||||||
|
SWAP_ROWS(r2, r1);
|
||||||
|
if (fabs(r1[0]) > fabs(r0[0]))
|
||||||
|
SWAP_ROWS(r1, r0);
|
||||||
|
if (0.0 == r0[0])
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
/* eliminate first variable */
|
||||||
|
m1 = r1[0] / r0[0];
|
||||||
|
m2 = r2[0] / r0[0];
|
||||||
|
m3 = r3[0] / r0[0];
|
||||||
|
s = r0[1];
|
||||||
|
r1[1] -= m1 * s;
|
||||||
|
r2[1] -= m2 * s;
|
||||||
|
r3[1] -= m3 * s;
|
||||||
|
s = r0[2];
|
||||||
|
r1[2] -= m1 * s;
|
||||||
|
r2[2] -= m2 * s;
|
||||||
|
r3[2] -= m3 * s;
|
||||||
|
s = r0[3];
|
||||||
|
r1[3] -= m1 * s;
|
||||||
|
r2[3] -= m2 * s;
|
||||||
|
r3[3] -= m3 * s;
|
||||||
|
s = r0[4];
|
||||||
|
if (s != 0.0) {
|
||||||
|
r1[4] -= m1 * s;
|
||||||
|
r2[4] -= m2 * s;
|
||||||
|
r3[4] -= m3 * s;
|
||||||
|
}
|
||||||
|
s = r0[5];
|
||||||
|
if (s != 0.0) {
|
||||||
|
r1[5] -= m1 * s;
|
||||||
|
r2[5] -= m2 * s;
|
||||||
|
r3[5] -= m3 * s;
|
||||||
|
}
|
||||||
|
s = r0[6];
|
||||||
|
if (s != 0.0) {
|
||||||
|
r1[6] -= m1 * s;
|
||||||
|
r2[6] -= m2 * s;
|
||||||
|
r3[6] -= m3 * s;
|
||||||
|
}
|
||||||
|
s = r0[7];
|
||||||
|
if (s != 0.0) {
|
||||||
|
r1[7] -= m1 * s;
|
||||||
|
r2[7] -= m2 * s;
|
||||||
|
r3[7] -= m3 * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* choose pivot - or die */
|
||||||
|
if (fabs(r3[1]) > fabs(r2[1]))
|
||||||
|
SWAP_ROWS(r3, r2);
|
||||||
|
if (fabs(r2[1]) > fabs(r1[1]))
|
||||||
|
SWAP_ROWS(r2, r1);
|
||||||
|
if (0.0 == r1[1])
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
/* eliminate second variable */
|
||||||
|
m2 = r2[1] / r1[1];
|
||||||
|
m3 = r3[1] / r1[1];
|
||||||
|
r2[2] -= m2 * r1[2];
|
||||||
|
r3[2] -= m3 * r1[2];
|
||||||
|
r2[3] -= m2 * r1[3];
|
||||||
|
r3[3] -= m3 * r1[3];
|
||||||
|
s = r1[4];
|
||||||
|
if (0.0 != s) {
|
||||||
|
r2[4] -= m2 * s;
|
||||||
|
r3[4] -= m3 * s;
|
||||||
|
}
|
||||||
|
s = r1[5];
|
||||||
|
if (0.0 != s) {
|
||||||
|
r2[5] -= m2 * s;
|
||||||
|
r3[5] -= m3 * s;
|
||||||
|
}
|
||||||
|
s = r1[6];
|
||||||
|
if (0.0 != s) {
|
||||||
|
r2[6] -= m2 * s;
|
||||||
|
r3[6] -= m3 * s;
|
||||||
|
}
|
||||||
|
s = r1[7];
|
||||||
|
if (0.0 != s) {
|
||||||
|
r2[7] -= m2 * s;
|
||||||
|
r3[7] -= m3 * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* choose pivot - or die */
|
||||||
|
if (fabs(r3[2]) > fabs(r2[2]))
|
||||||
|
SWAP_ROWS(r3, r2);
|
||||||
|
if (0.0 == r2[2])
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
/* eliminate third variable */
|
||||||
|
m3 = r3[2] / r2[2];
|
||||||
|
r3[3] -= m3 * r2[3], r3[4] -= m3 * r2[4],
|
||||||
|
r3[5] -= m3 * r2[5], r3[6] -= m3 * r2[6], r3[7] -= m3 * r2[7];
|
||||||
|
|
||||||
|
/* last check */
|
||||||
|
if (0.0 == r3[3])
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
s = 1.0 / r3[3]; /* now back substitute row 3 */
|
||||||
|
r3[4] *= s;
|
||||||
|
r3[5] *= s;
|
||||||
|
r3[6] *= s;
|
||||||
|
r3[7] *= s;
|
||||||
|
|
||||||
|
m2 = r2[3]; /* now back substitute row 2 */
|
||||||
|
s = 1.0 / r2[2];
|
||||||
|
r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2),
|
||||||
|
r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2);
|
||||||
|
m1 = r1[3];
|
||||||
|
r1[4] -= r3[4] * m1, r1[5] -= r3[5] * m1,
|
||||||
|
r1[6] -= r3[6] * m1, r1[7] -= r3[7] * m1;
|
||||||
|
m0 = r0[3];
|
||||||
|
r0[4] -= r3[4] * m0, r0[5] -= r3[5] * m0,
|
||||||
|
r0[6] -= r3[6] * m0, r0[7] -= r3[7] * m0;
|
||||||
|
|
||||||
|
m1 = r1[2]; /* now back substitute row 1 */
|
||||||
|
s = 1.0 / r1[1];
|
||||||
|
r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1),
|
||||||
|
r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1);
|
||||||
|
m0 = r0[2];
|
||||||
|
r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0,
|
||||||
|
r0[6] -= r2[6] * m0, r0[7] -= r2[7] * m0;
|
||||||
|
|
||||||
|
m0 = r0[1]; /* now back substitute row 0 */
|
||||||
|
s = 1.0 / r0[0];
|
||||||
|
r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0),
|
||||||
|
r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0);
|
||||||
|
|
||||||
|
MAT(out, 0, 0) = r0[4];
|
||||||
|
MAT(out, 0, 1) = r0[5], MAT(out, 0, 2) = r0[6];
|
||||||
|
MAT(out, 0, 3) = r0[7], MAT(out, 1, 0) = r1[4];
|
||||||
|
MAT(out, 1, 1) = r1[5], MAT(out, 1, 2) = r1[6];
|
||||||
|
MAT(out, 1, 3) = r1[7], MAT(out, 2, 0) = r2[4];
|
||||||
|
MAT(out, 2, 1) = r2[5], MAT(out, 2, 2) = r2[6];
|
||||||
|
MAT(out, 2, 3) = r2[7], MAT(out, 3, 0) = r3[4];
|
||||||
|
MAT(out, 3, 1) = r3[5], MAT(out, 3, 2) = r3[6];
|
||||||
|
MAT(out, 3, 3) = r3[7];
|
||||||
|
|
||||||
|
return GL_TRUE;
|
||||||
|
|
||||||
|
#undef MAT
|
||||||
|
#undef SWAP_ROWS
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* projection du point (objx,objy,obz) sur l'ecran (winx,winy,winz) */
|
||||||
|
GLint GLAPIENTRY
|
||||||
|
gluProject(GLdouble objx, GLdouble objy, GLdouble objz,
|
||||||
|
const GLdouble model[16], const GLdouble proj[16],
|
||||||
|
const GLint viewport[4],
|
||||||
|
GLdouble * winx, GLdouble * winy, GLdouble * winz)
|
||||||
|
{
|
||||||
|
/* matrice de transformation */
|
||||||
|
GLdouble in[4], out[4];
|
||||||
|
|
||||||
|
/* initilise la matrice et le vecteur a transformer */
|
||||||
|
in[0] = objx;
|
||||||
|
in[1] = objy;
|
||||||
|
in[2] = objz;
|
||||||
|
in[3] = 1.0;
|
||||||
|
transform_point(out, model, in);
|
||||||
|
transform_point(in, proj, out);
|
||||||
|
|
||||||
|
/* d'ou le resultat normalise entre -1 et 1 */
|
||||||
|
if (in[3] == 0.0)
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
in[0] /= in[3];
|
||||||
|
in[1] /= in[3];
|
||||||
|
in[2] /= in[3];
|
||||||
|
|
||||||
|
/* en coordonnees ecran */
|
||||||
|
*winx = viewport[0] + (1 + in[0]) * viewport[2] / 2;
|
||||||
|
*winy = viewport[1] + (1 + in[1]) * viewport[3] / 2;
|
||||||
|
/* entre 0 et 1 suivant z */
|
||||||
|
*winz = (1 + in[2]) / 2;
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* transformation du point ecran (winx,winy,winz) en point objet */
|
||||||
|
GLint GLAPIENTRY
|
||||||
|
gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz,
|
||||||
|
const GLdouble model[16], const GLdouble proj[16],
|
||||||
|
const GLint viewport[4],
|
||||||
|
GLdouble * objx, GLdouble * objy, GLdouble * objz)
|
||||||
|
{
|
||||||
|
/* matrice de transformation */
|
||||||
|
GLdouble m[16], A[16];
|
||||||
|
GLdouble in[4], out[4];
|
||||||
|
|
||||||
|
/* transformation coordonnees normalisees entre -1 et 1 */
|
||||||
|
in[0] = (winx - viewport[0]) * 2 / viewport[2] - 1.0;
|
||||||
|
in[1] = (winy - viewport[1]) * 2 / viewport[3] - 1.0;
|
||||||
|
in[2] = 2 * winz - 1.0;
|
||||||
|
in[3] = 1.0;
|
||||||
|
|
||||||
|
/* calcul transformation inverse */
|
||||||
|
matmul(A, proj, model);
|
||||||
|
invert_matrix(A, m);
|
||||||
|
|
||||||
|
/* d'ou les coordonnees objets */
|
||||||
|
transform_point(out, m, in);
|
||||||
|
if (out[3] == 0.0)
|
||||||
|
return GL_FALSE;
|
||||||
|
*objx = out[0] / out[3];
|
||||||
|
*objy = out[1] / out[3];
|
||||||
|
*objz = out[2] / out[3];
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* New in GLU 1.3
|
||||||
|
* This is like gluUnProject but also takes near and far DepthRange values.
|
||||||
|
*/
|
||||||
|
#ifdef GLU_VERSION_1_3
|
||||||
|
GLint GLAPIENTRY
|
||||||
|
gluUnProject4(GLdouble winx, GLdouble winy, GLdouble winz, GLdouble clipw,
|
||||||
|
const GLdouble modelMatrix[16],
|
||||||
|
const GLdouble projMatrix[16],
|
||||||
|
const GLint viewport[4],
|
||||||
|
GLclampd nearZ, GLclampd farZ,
|
||||||
|
GLdouble * objx, GLdouble * objy, GLdouble * objz,
|
||||||
|
GLdouble * objw)
|
||||||
|
{
|
||||||
|
/* matrice de transformation */
|
||||||
|
GLdouble m[16], A[16];
|
||||||
|
GLdouble in[4], out[4];
|
||||||
|
GLdouble z = nearZ + winz * (farZ - nearZ);
|
||||||
|
|
||||||
|
/* transformation coordonnees normalisees entre -1 et 1 */
|
||||||
|
in[0] = (winx - viewport[0]) * 2 / viewport[2] - 1.0;
|
||||||
|
in[1] = (winy - viewport[1]) * 2 / viewport[3] - 1.0;
|
||||||
|
in[2] = 2.0 * z - 1.0;
|
||||||
|
in[3] = clipw;
|
||||||
|
|
||||||
|
/* calcul transformation inverse */
|
||||||
|
matmul(A, projMatrix, modelMatrix);
|
||||||
|
invert_matrix(A, m);
|
||||||
|
|
||||||
|
/* d'ou les coordonnees objets */
|
||||||
|
transform_point(out, m, in);
|
||||||
|
if (out[3] == 0.0)
|
||||||
|
return GL_FALSE;
|
||||||
|
*objx = out[0] / out[3];
|
||||||
|
*objy = out[1] / out[3];
|
||||||
|
*objz = out[2] / out[3];
|
||||||
|
*objw = out[3];
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
774
src/glu/mini/quadric.c
Normal file
774
src/glu/mini/quadric.c
Normal file
@@ -0,0 +1,774 @@
|
|||||||
|
/* $Id: quadric.c,v 1.1.2.1 2003/03/21 13:02:22 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1999-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
* texture coordinate support
|
||||||
|
* flip normals according to orientation
|
||||||
|
* there's still some inside/outside orientation bugs in possibly all
|
||||||
|
* but the sphere function
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "gluP.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
# define M_PI (3.1415926)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert degrees to radians:
|
||||||
|
*/
|
||||||
|
#define DEG_TO_RAD(A) ((A)*(M_PI/180.0))
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sin and Cos for degree angles:
|
||||||
|
*/
|
||||||
|
#define SIND( A ) sin( (A)*(M_PI/180.0) )
|
||||||
|
#define COSD( A) cos( (A)*(M_PI/180.0) )
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Texture coordinates if texture flag is set
|
||||||
|
*/
|
||||||
|
#define TXTR_COORD(x,y) if (qobj->TextureFlag) glTexCoord2f(x,y);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct GLUquadric
|
||||||
|
{
|
||||||
|
GLenum DrawStyle; /* GLU_FILL, LINE, SILHOUETTE, or POINT */
|
||||||
|
GLenum Orientation; /* GLU_INSIDE or GLU_OUTSIDE */
|
||||||
|
GLboolean TextureFlag; /* Generate texture coords? */
|
||||||
|
GLenum Normals; /* GLU_NONE, GLU_FLAT, or GLU_SMOOTH */
|
||||||
|
void (GLCALLBACK * ErrorFunc) (GLenum err); /* Error handler callback function */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process a GLU error.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
quadric_error(GLUquadricObj * qobj, GLenum error, const char *msg)
|
||||||
|
{
|
||||||
|
/* Call the error call back function if any */
|
||||||
|
if (qobj->ErrorFunc) {
|
||||||
|
(*qobj->ErrorFunc) (error);
|
||||||
|
}
|
||||||
|
/* Print a message to stdout if MESA_DEBUG variable is defined */
|
||||||
|
if (getenv("MESA_DEBUG")) {
|
||||||
|
fprintf(stderr, "GLUError: %s: %s\n", (char *) gluErrorString(error),
|
||||||
|
msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
GLUquadricObj *GLAPIENTRY
|
||||||
|
gluNewQuadric(void)
|
||||||
|
{
|
||||||
|
GLUquadricObj *q;
|
||||||
|
|
||||||
|
q = (GLUquadricObj *) malloc(sizeof(struct GLUquadric));
|
||||||
|
if (q) {
|
||||||
|
q->DrawStyle = GLU_FILL;
|
||||||
|
q->Orientation = GLU_OUTSIDE;
|
||||||
|
q->TextureFlag = GL_FALSE;
|
||||||
|
q->Normals = GLU_SMOOTH;
|
||||||
|
q->ErrorFunc = NULL;
|
||||||
|
}
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluDeleteQuadric(GLUquadricObj * state)
|
||||||
|
{
|
||||||
|
if (state) {
|
||||||
|
free((void *) state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the drawing style to be GLU_FILL, GLU_LINE, GLU_SILHOUETTE,
|
||||||
|
* or GLU_POINT.
|
||||||
|
*/
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluQuadricDrawStyle(GLUquadricObj * quadObject, GLenum drawStyle)
|
||||||
|
{
|
||||||
|
if (quadObject && (drawStyle == GLU_FILL || drawStyle == GLU_LINE
|
||||||
|
|| drawStyle == GLU_SILHOUETTE
|
||||||
|
|| drawStyle == GLU_POINT)) {
|
||||||
|
quadObject->DrawStyle = drawStyle;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
quadric_error(quadObject, GLU_INVALID_ENUM, "qluQuadricDrawStyle");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the orientation to GLU_INSIDE or GLU_OUTSIDE.
|
||||||
|
*/
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluQuadricOrientation(GLUquadricObj * quadObject, GLenum orientation)
|
||||||
|
{
|
||||||
|
if (quadObject
|
||||||
|
&& (orientation == GLU_INSIDE || orientation == GLU_OUTSIDE)) {
|
||||||
|
quadObject->Orientation = orientation;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
quadric_error(quadObject, GLU_INVALID_ENUM, "qluQuadricOrientation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the error handler callback function.
|
||||||
|
*/
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluQuadricCallback(GLUquadricObj * qobj,
|
||||||
|
GLenum which, void (GLCALLBACK * fn) ())
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* UGH, this is a mess! I thought ANSI was a standard.
|
||||||
|
*/
|
||||||
|
if (qobj && which == GLU_ERROR) {
|
||||||
|
#ifdef __CYGWIN32__
|
||||||
|
qobj->ErrorFunc = (void (GLCALLBACKPCAST) (GLenum)) fn;
|
||||||
|
#elif defined(OPENSTEP)
|
||||||
|
qobj->ErrorFunc = (void (*)(GLenum)) fn;
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
qobj->ErrorFunc = (void (GLCALLBACK *) (int)) fn;
|
||||||
|
#elif defined(__STORM__)
|
||||||
|
qobj->ErrorFunc = (void (GLCALLBACK *) (GLenum)) fn;
|
||||||
|
#elif defined(__BEOS__)
|
||||||
|
qobj->ErrorFunc = (void (*)(GLenum)) fn;
|
||||||
|
#else
|
||||||
|
qobj->ErrorFunc = (void (GLCALLBACK *) ()) fn;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluQuadricNormals(GLUquadricObj * quadObject, GLenum normals)
|
||||||
|
{
|
||||||
|
if (quadObject
|
||||||
|
&& (normals == GLU_NONE || normals == GLU_FLAT
|
||||||
|
|| normals == GLU_SMOOTH)) {
|
||||||
|
quadObject->Normals = normals;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluQuadricTexture(GLUquadricObj * quadObject, GLboolean textureCoords)
|
||||||
|
{
|
||||||
|
if (quadObject) {
|
||||||
|
quadObject->TextureFlag = textureCoords;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Call glNormal3f after scaling normal to unit length.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
normal3f(GLfloat x, GLfloat y, GLfloat z)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluCylinder(GLUquadricObj * qobj,
|
||||||
|
GLdouble baseRadius, GLdouble topRadius,
|
||||||
|
GLdouble height, GLint slices, GLint stacks)
|
||||||
|
{
|
||||||
|
GLdouble da, r, dr, dz;
|
||||||
|
GLfloat x, y, z, nz, nsign;
|
||||||
|
GLint i, j;
|
||||||
|
|
||||||
|
if (qobj->Orientation == GLU_INSIDE) {
|
||||||
|
nsign = -1.0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsign = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
da = 2.0 * M_PI / slices;
|
||||||
|
dr = (topRadius - baseRadius) / stacks;
|
||||||
|
dz = height / stacks;
|
||||||
|
nz = (baseRadius - topRadius) / height; /* Z component of normal vectors */
|
||||||
|
|
||||||
|
if (qobj->DrawStyle == GLU_POINT) {
|
||||||
|
glBegin(GL_POINTS);
|
||||||
|
for (i = 0; i < slices; i++) {
|
||||||
|
x = cos(i * da);
|
||||||
|
y = sin(i * da);
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
|
||||||
|
z = 0.0;
|
||||||
|
r = baseRadius;
|
||||||
|
for (j = 0; j <= stacks; j++) {
|
||||||
|
glVertex3f(x * r, y * r, z);
|
||||||
|
z += dz;
|
||||||
|
r += dr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
else if (qobj->DrawStyle == GLU_LINE || qobj->DrawStyle == GLU_SILHOUETTE) {
|
||||||
|
/* Draw rings */
|
||||||
|
if (qobj->DrawStyle == GLU_LINE) {
|
||||||
|
z = 0.0;
|
||||||
|
r = baseRadius;
|
||||||
|
for (j = 0; j <= stacks; j++) {
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
for (i = 0; i < slices; i++) {
|
||||||
|
x = cos(i * da);
|
||||||
|
y = sin(i * da);
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
glVertex3f(x * r, y * r, z);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
z += dz;
|
||||||
|
r += dr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* draw one ring at each end */
|
||||||
|
if (baseRadius != 0.0) {
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
for (i = 0; i < slices; i++) {
|
||||||
|
x = cos(i * da);
|
||||||
|
y = sin(i * da);
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
glVertex3f(x * baseRadius, y * baseRadius, 0.0);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
for (i = 0; i < slices; i++) {
|
||||||
|
x = cos(i * da);
|
||||||
|
y = sin(i * da);
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
glVertex3f(x * topRadius, y * topRadius, height);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* draw length lines */
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
for (i = 0; i < slices; i++) {
|
||||||
|
x = cos(i * da);
|
||||||
|
y = sin(i * da);
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
glVertex3f(x * baseRadius, y * baseRadius, 0.0);
|
||||||
|
glVertex3f(x * topRadius, y * topRadius, height);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
else if (qobj->DrawStyle == GLU_FILL) {
|
||||||
|
GLfloat ds = 1.0 / slices;
|
||||||
|
GLfloat dt = 1.0 / stacks;
|
||||||
|
GLfloat t = 0.0;
|
||||||
|
z = 0.0;
|
||||||
|
r = baseRadius;
|
||||||
|
for (j = 0; j < stacks; j++) {
|
||||||
|
GLfloat s = 0.0;
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (i = 0; i <= slices; i++) {
|
||||||
|
GLfloat x, y;
|
||||||
|
if (i == slices) {
|
||||||
|
x = sin(0.0);
|
||||||
|
y = cos(0.0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x = sin(i * da);
|
||||||
|
y = cos(i * da);
|
||||||
|
}
|
||||||
|
if (nsign == 1.0) {
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
TXTR_COORD(s, t);
|
||||||
|
glVertex3f(x * r, y * r, z);
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
TXTR_COORD(s, t + dt);
|
||||||
|
glVertex3f(x * (r + dr), y * (r + dr), z + dz);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
TXTR_COORD(s, t);
|
||||||
|
glVertex3f(x * r, y * r, z);
|
||||||
|
normal3f(x * nsign, y * nsign, nz * nsign);
|
||||||
|
TXTR_COORD(s, t + dt);
|
||||||
|
glVertex3f(x * (r + dr), y * (r + dr), z + dz);
|
||||||
|
}
|
||||||
|
s += ds;
|
||||||
|
} /* for slices */
|
||||||
|
glEnd();
|
||||||
|
r += dr;
|
||||||
|
t += dt;
|
||||||
|
z += dz;
|
||||||
|
} /* for stacks */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluSphere(GLUquadricObj * qobj, GLdouble radius, GLint slices, GLint stacks)
|
||||||
|
{
|
||||||
|
GLfloat rho, drho, theta, dtheta;
|
||||||
|
GLfloat x, y, z;
|
||||||
|
GLfloat s, t, ds, dt;
|
||||||
|
GLint i, j, imin, imax;
|
||||||
|
GLboolean normals;
|
||||||
|
GLfloat nsign;
|
||||||
|
|
||||||
|
if (qobj->Normals == GLU_NONE) {
|
||||||
|
normals = GL_FALSE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
normals = GL_TRUE;
|
||||||
|
}
|
||||||
|
if (qobj->Orientation == GLU_INSIDE) {
|
||||||
|
nsign = -1.0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsign = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
drho = M_PI / (GLfloat) stacks;
|
||||||
|
dtheta = 2.0 * M_PI / (GLfloat) slices;
|
||||||
|
|
||||||
|
/* texturing: s goes from 0.0/0.25/0.5/0.75/1.0 at +y/+x/-y/-x/+y axis */
|
||||||
|
/* t goes from -1.0/+1.0 at z = -radius/+radius (linear along longitudes) */
|
||||||
|
/* cannot use triangle fan on texturing (s coord. at top/bottom tip varies) */
|
||||||
|
|
||||||
|
if (qobj->DrawStyle == GLU_FILL) {
|
||||||
|
if (!qobj->TextureFlag) {
|
||||||
|
/* draw +Z end as a triangle fan */
|
||||||
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
|
/* glNormal3f(0.0, 0.0, 1.0); */
|
||||||
|
glVertex3f(0.0, 0.0, nsign * radius);
|
||||||
|
for (j = 0; j <= slices; j++) {
|
||||||
|
theta = (j == slices) ? 0.0 : j * dtheta;
|
||||||
|
x = -sin(theta) * sin(drho);
|
||||||
|
y = cos(theta) * sin(drho);
|
||||||
|
z = nsign * cos(drho);
|
||||||
|
glVertex3f(x * radius, y * radius, z * radius);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
ds = 1.0 / slices;
|
||||||
|
dt = 1.0 / stacks;
|
||||||
|
t = 1.0; /* because loop now runs from 0 */
|
||||||
|
if (qobj->TextureFlag) {
|
||||||
|
imin = 0;
|
||||||
|
imax = stacks;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
imin = 1;
|
||||||
|
imax = stacks - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* draw intermediate stacks as quad strips */
|
||||||
|
for (i = imin; i < imax; i++) {
|
||||||
|
rho = i * drho;
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
s = 0.0;
|
||||||
|
for (j = 0; j <= slices; j++) {
|
||||||
|
theta = (j == slices) ? 0.0 : j * dtheta;
|
||||||
|
x = -sin(theta) * sin(rho);
|
||||||
|
y = cos(theta) * sin(rho);
|
||||||
|
z = nsign * cos(rho);
|
||||||
|
TXTR_COORD(s, t);
|
||||||
|
glVertex3f(x * radius, y * radius, z * radius);
|
||||||
|
x = -sin(theta) * sin(rho + drho);
|
||||||
|
y = cos(theta) * sin(rho + drho);
|
||||||
|
z = nsign * cos(rho + drho);
|
||||||
|
TXTR_COORD(s, t - dt);
|
||||||
|
s += ds;
|
||||||
|
glVertex3f(x * radius, y * radius, z * radius);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
t -= dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qobj->TextureFlag) {
|
||||||
|
/* draw -Z end as a triangle fan */
|
||||||
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
|
glVertex3f(0.0, 0.0, -radius * nsign);
|
||||||
|
rho = M_PI - drho;
|
||||||
|
s = 1.0;
|
||||||
|
t = dt;
|
||||||
|
for (j = slices; j >= 0; j--) {
|
||||||
|
theta = (j == slices) ? 0.0 : j * dtheta;
|
||||||
|
x = -sin(theta) * sin(rho);
|
||||||
|
y = cos(theta) * sin(rho);
|
||||||
|
z = nsign * cos(rho);
|
||||||
|
s -= ds;
|
||||||
|
glVertex3f(x * radius, y * radius, z * radius);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (qobj->DrawStyle == GLU_LINE || qobj->DrawStyle == GLU_SILHOUETTE) {
|
||||||
|
/* draw stack lines */
|
||||||
|
for (i = 1; i < stacks; i++) { /* stack line at i==stacks-1 was missing here */
|
||||||
|
rho = i * drho;
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
for (j = 0; j < slices; j++) {
|
||||||
|
theta = j * dtheta;
|
||||||
|
x = cos(theta) * sin(rho);
|
||||||
|
y = sin(theta) * sin(rho);
|
||||||
|
z = cos(rho);
|
||||||
|
glVertex3f(x * radius, y * radius, z * radius);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
/* draw slice lines */
|
||||||
|
for (j = 0; j < slices; j++) {
|
||||||
|
theta = j * dtheta;
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
for (i = 0; i <= stacks; i++) {
|
||||||
|
rho = i * drho;
|
||||||
|
x = cos(theta) * sin(rho);
|
||||||
|
y = sin(theta) * sin(rho);
|
||||||
|
z = cos(rho);
|
||||||
|
glVertex3f(x * radius, y * radius, z * radius);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (qobj->DrawStyle == GLU_POINT) {
|
||||||
|
/* top and bottom-most points */
|
||||||
|
glBegin(GL_POINTS);
|
||||||
|
glVertex3f(0.0, 0.0, radius);
|
||||||
|
glVertex3f(0.0, 0.0, -radius);
|
||||||
|
|
||||||
|
/* loop over stacks */
|
||||||
|
for (i = 1; i < stacks - 1; i++) {
|
||||||
|
rho = i * drho;
|
||||||
|
for (j = 0; j < slices; j++) {
|
||||||
|
theta = j * dtheta;
|
||||||
|
x = cos(theta) * sin(rho);
|
||||||
|
y = sin(theta) * sin(rho);
|
||||||
|
z = cos(rho);
|
||||||
|
glVertex3f(x * radius, y * radius, z * radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluDisk(GLUquadricObj * qobj,
|
||||||
|
GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops)
|
||||||
|
{
|
||||||
|
GLfloat da, dr;
|
||||||
|
#if 0
|
||||||
|
GLdouble a, da;
|
||||||
|
GLfloat r, dr;
|
||||||
|
GLfloat x, y;
|
||||||
|
GLfloat r1, r2, dtc;
|
||||||
|
GLint s, l;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
da = 2.0 * M_PI / slices;
|
||||||
|
dr = (outerRadius - innerRadius) / (GLfloat) loops;
|
||||||
|
|
||||||
|
switch (qobj->DrawStyle) {
|
||||||
|
case GLU_FILL:
|
||||||
|
{
|
||||||
|
/* texture of a gluDisk is a cut out of the texture unit square
|
||||||
|
* x, y in [-outerRadius, +outerRadius]; s, t in [0, 1]
|
||||||
|
* (linear mapping)
|
||||||
|
*/
|
||||||
|
GLfloat dtc = 2.0f * outerRadius;
|
||||||
|
GLfloat sa, ca;
|
||||||
|
GLfloat r1 = innerRadius;
|
||||||
|
GLint l;
|
||||||
|
for (l = 0; l < loops; l++) {
|
||||||
|
GLfloat r2 = r1 + dr;
|
||||||
|
if (qobj->Orientation == GLU_OUTSIDE) {
|
||||||
|
GLint s;
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (s = 0; s <= slices; s++) {
|
||||||
|
GLfloat a;
|
||||||
|
if (s == slices)
|
||||||
|
a = 0.0;
|
||||||
|
else
|
||||||
|
a = s * da;
|
||||||
|
sa = sin(a);
|
||||||
|
ca = cos(a);
|
||||||
|
TXTR_COORD(0.5 + sa * r2 / dtc, 0.5 + ca * r2 / dtc);
|
||||||
|
glVertex2f(r2 * sa, r2 * ca);
|
||||||
|
TXTR_COORD(0.5 + sa * r1 / dtc, 0.5 + ca * r1 / dtc);
|
||||||
|
glVertex2f(r1 * sa, r1 * ca);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GLint s;
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
for (s = slices; s >= 0; s--) {
|
||||||
|
GLfloat a;
|
||||||
|
if (s == slices)
|
||||||
|
a = 0.0;
|
||||||
|
else
|
||||||
|
a = s * da;
|
||||||
|
sa = sin(a);
|
||||||
|
ca = cos(a);
|
||||||
|
TXTR_COORD(0.5 - sa * r2 / dtc, 0.5 + ca * r2 / dtc);
|
||||||
|
glVertex2f(r2 * sa, r2 * ca);
|
||||||
|
TXTR_COORD(0.5 - sa * r1 / dtc, 0.5 + ca * r1 / dtc);
|
||||||
|
glVertex2f(r1 * sa, r1 * ca);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
r1 = r2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GLU_LINE:
|
||||||
|
{
|
||||||
|
GLint l, s;
|
||||||
|
/* draw loops */
|
||||||
|
for (l = 0; l <= loops; l++) {
|
||||||
|
GLfloat r = innerRadius + l * dr;
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
for (s = 0; s < slices; s++) {
|
||||||
|
GLfloat a = s * da;
|
||||||
|
glVertex2f(r * sin(a), r * cos(a));
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
/* draw spokes */
|
||||||
|
for (s = 0; s < slices; s++) {
|
||||||
|
GLfloat a = s * da;
|
||||||
|
GLfloat x = sin(a);
|
||||||
|
GLfloat y = cos(a);
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
for (l = 0; l <= loops; l++) {
|
||||||
|
GLfloat r = innerRadius + l * dr;
|
||||||
|
glVertex2f(r * x, r * y);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GLU_POINT:
|
||||||
|
{
|
||||||
|
GLint s;
|
||||||
|
glBegin(GL_POINTS);
|
||||||
|
for (s = 0; s < slices; s++) {
|
||||||
|
GLfloat a = s * da;
|
||||||
|
GLfloat x = sin(a);
|
||||||
|
GLfloat y = cos(a);
|
||||||
|
GLint l;
|
||||||
|
for (l = 0; l <= loops; l++) {
|
||||||
|
GLfloat r = innerRadius * l * dr;
|
||||||
|
glVertex2f(r * x, r * y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GLU_SILHOUETTE:
|
||||||
|
{
|
||||||
|
if (innerRadius != 0.0) {
|
||||||
|
GLfloat a;
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
for (a = 0.0; a < 2.0 * M_PI; a += da) {
|
||||||
|
GLfloat x = innerRadius * sin(a);
|
||||||
|
GLfloat y = innerRadius * cos(a);
|
||||||
|
glVertex2f(x, y);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
GLfloat a;
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
for (a = 0; a < 2.0 * M_PI; a += da) {
|
||||||
|
GLfloat x = outerRadius * sin(a);
|
||||||
|
GLfloat y = outerRadius * cos(a);
|
||||||
|
glVertex2f(x, y);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluPartialDisk(GLUquadricObj * qobj, GLdouble innerRadius,
|
||||||
|
GLdouble outerRadius, GLint slices, GLint loops,
|
||||||
|
GLdouble startAngle, GLdouble sweepAngle)
|
||||||
|
{
|
||||||
|
if (qobj->DrawStyle == GLU_POINT) {
|
||||||
|
GLint loop, slice;
|
||||||
|
GLdouble radius, delta_radius;
|
||||||
|
GLdouble angle, delta_angle;
|
||||||
|
delta_radius = (outerRadius - innerRadius) / (loops - 1);
|
||||||
|
delta_angle = DEG_TO_RAD((sweepAngle) / (slices - 1));
|
||||||
|
glBegin(GL_POINTS);
|
||||||
|
radius = innerRadius;
|
||||||
|
for (loop = 0; loop < loops; loop++) {
|
||||||
|
angle = DEG_TO_RAD(startAngle);
|
||||||
|
for (slice = 0; slice < slices; slice++) {
|
||||||
|
glVertex2f(radius * sin(angle), radius * cos(angle));
|
||||||
|
angle += delta_angle;
|
||||||
|
}
|
||||||
|
radius += delta_radius;
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
else if (qobj->DrawStyle == GLU_LINE) {
|
||||||
|
GLint loop, slice;
|
||||||
|
GLdouble radius, delta_radius;
|
||||||
|
GLdouble angle, delta_angle;
|
||||||
|
delta_radius = (outerRadius - innerRadius) / loops;
|
||||||
|
delta_angle = DEG_TO_RAD(sweepAngle / slices);
|
||||||
|
/* draw rings */
|
||||||
|
radius = innerRadius;
|
||||||
|
for (loop = 0; loop < loops; loop++) {
|
||||||
|
angle = DEG_TO_RAD(startAngle);
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
for (slice = 0; slice <= slices; slice++) {
|
||||||
|
glVertex2f(radius * sin(angle), radius * cos(angle));
|
||||||
|
angle += delta_angle;
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
radius += delta_radius;
|
||||||
|
}
|
||||||
|
/* draw spokes */
|
||||||
|
angle = DEG_TO_RAD(startAngle);
|
||||||
|
for (slice = 0; slice <= slices; slice++) {
|
||||||
|
radius = innerRadius;
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
for (loop = 0; loop < loops; loop++) {
|
||||||
|
glVertex2f(radius * sin(angle), radius * cos(angle));
|
||||||
|
radius += delta_radius;
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
angle += delta_angle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (qobj->DrawStyle == GLU_SILHOUETTE) {
|
||||||
|
GLint slice;
|
||||||
|
GLdouble angle, delta_angle;
|
||||||
|
delta_angle = DEG_TO_RAD(sweepAngle / slices);
|
||||||
|
/* draw outer ring */
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
angle = DEG_TO_RAD(startAngle);
|
||||||
|
for (slice = 0; slice <= slices; slice++) {
|
||||||
|
glVertex2f(outerRadius * sin(angle), outerRadius * cos(angle));
|
||||||
|
angle += delta_angle;
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
/* draw inner ring */
|
||||||
|
if (innerRadius > 0.0) {
|
||||||
|
glBegin(GL_LINE_STRIP);
|
||||||
|
angle = DEG_TO_RAD(startAngle);
|
||||||
|
for (slice = 0; slice < slices; slice++) {
|
||||||
|
glVertex2f(innerRadius * sin(angle), innerRadius * cos(angle));
|
||||||
|
angle += delta_angle;
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
/* draw spokes */
|
||||||
|
if (sweepAngle < 360.0) {
|
||||||
|
GLdouble stopAngle = startAngle + sweepAngle;
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
glVertex2f(innerRadius * SIND(startAngle),
|
||||||
|
innerRadius * COSD(startAngle));
|
||||||
|
glVertex2f(outerRadius * SIND(startAngle),
|
||||||
|
outerRadius * COSD(startAngle));
|
||||||
|
glVertex2f(innerRadius * SIND(stopAngle),
|
||||||
|
innerRadius * COSD(stopAngle));
|
||||||
|
glVertex2f(outerRadius * SIND(stopAngle),
|
||||||
|
outerRadius * COSD(stopAngle));
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (qobj->DrawStyle == GLU_FILL) {
|
||||||
|
GLint loop, slice;
|
||||||
|
GLdouble radius, delta_radius;
|
||||||
|
GLdouble angle, delta_angle;
|
||||||
|
delta_radius = (outerRadius - innerRadius) / loops;
|
||||||
|
delta_angle = DEG_TO_RAD(sweepAngle / slices);
|
||||||
|
radius = innerRadius;
|
||||||
|
for (loop = 0; loop < loops; loop++) {
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
angle = DEG_TO_RAD(startAngle);
|
||||||
|
for (slice = 0; slice <= slices; slice++) {
|
||||||
|
if (qobj->Orientation == GLU_OUTSIDE) {
|
||||||
|
glVertex2f((radius + delta_radius) * sin(angle),
|
||||||
|
(radius + delta_radius) * cos(angle));
|
||||||
|
glVertex2f(radius * sin(angle), radius * cos(angle));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
glVertex2f(radius * sin(angle), radius * cos(angle));
|
||||||
|
glVertex2f((radius + delta_radius) * sin(angle),
|
||||||
|
(radius + delta_radius) * cos(angle));
|
||||||
|
}
|
||||||
|
angle += delta_angle;
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
radius += delta_radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
328
src/glu/mini/tess.c
Normal file
328
src/glu/mini/tess.c
Normal file
@@ -0,0 +1,328 @@
|
|||||||
|
/* $Id: tess.c,v 1.1.2.1 2003/03/21 13:02:23 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the polygon tesselation code contributed by
|
||||||
|
* Bogdan Sikorski
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "tess.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is ugly, but seems the easiest way to do things to make the
|
||||||
|
* code work under YellowBox for Windows
|
||||||
|
*/
|
||||||
|
#if defined(OPENSTEP) && defined(CALLBACK)
|
||||||
|
#undef CALLBACK
|
||||||
|
#define CALLBACK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void delete_contours(GLUtriangulatorObj *);
|
||||||
|
|
||||||
|
#ifdef __CYGWIN32__
|
||||||
|
#define _CALLBACK
|
||||||
|
#else
|
||||||
|
#define _CALLBACK GLCALLBACK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_callbacks(tess_callbacks * callbacks)
|
||||||
|
{
|
||||||
|
callbacks->begin = (void (_CALLBACK *) (GLenum)) 0;
|
||||||
|
callbacks->edgeFlag = (void (_CALLBACK *) (GLboolean)) 0;
|
||||||
|
callbacks->vertex = (void (_CALLBACK *) (void *)) 0;
|
||||||
|
callbacks->end = (void (_CALLBACK *) (void)) 0;
|
||||||
|
callbacks->error = (void (_CALLBACK *) (GLenum)) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tess_call_user_error(GLUtriangulatorObj * tobj, GLenum gluerr)
|
||||||
|
{
|
||||||
|
if (tobj->error == GLU_NO_ERROR)
|
||||||
|
tobj->error = gluerr;
|
||||||
|
if (tobj->callbacks.error != NULL)
|
||||||
|
(tobj->callbacks.error) (gluerr);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLUtriangulatorObj *GLAPIENTRY
|
||||||
|
gluNewTess(void)
|
||||||
|
{
|
||||||
|
GLUtriangulatorObj *tobj;
|
||||||
|
|
||||||
|
if ((tobj = (GLUtriangulatorObj *)
|
||||||
|
malloc(sizeof(struct GLUtesselator))) == NULL)
|
||||||
|
return NULL;
|
||||||
|
tobj->contours = tobj->last_contour = NULL;
|
||||||
|
init_callbacks(&tobj->callbacks);
|
||||||
|
tobj->error = GLU_NO_ERROR;
|
||||||
|
tobj->current_polygon = NULL;
|
||||||
|
tobj->contour_cnt = 0;
|
||||||
|
return tobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluTessCallback(GLUtriangulatorObj * tobj, GLenum which,
|
||||||
|
void (GLCALLBACK * fn) ())
|
||||||
|
{
|
||||||
|
switch (which) {
|
||||||
|
case GLU_BEGIN:
|
||||||
|
tobj->callbacks.begin = (void (_CALLBACK *) (GLenum)) fn;
|
||||||
|
break;
|
||||||
|
case GLU_EDGE_FLAG:
|
||||||
|
tobj->callbacks.edgeFlag = (void (_CALLBACK *) (GLboolean)) fn;
|
||||||
|
break;
|
||||||
|
case GLU_VERTEX:
|
||||||
|
tobj->callbacks.vertex = (void (_CALLBACK *) (void *)) fn;
|
||||||
|
break;
|
||||||
|
case GLU_END:
|
||||||
|
tobj->callbacks.end = (void (_CALLBACK *) (void)) fn;
|
||||||
|
break;
|
||||||
|
case GLU_ERROR:
|
||||||
|
tobj->callbacks.error = (void (_CALLBACK *) (GLenum)) fn;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
tobj->error = GLU_INVALID_ENUM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluDeleteTess(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
if (tobj->error == GLU_NO_ERROR && tobj->contour_cnt)
|
||||||
|
/* was gluEndPolygon called? */
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR1);
|
||||||
|
/* delete all internal structures */
|
||||||
|
delete_contours(tobj);
|
||||||
|
free(tobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluBeginPolygon(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if(tobj->error!=GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
*/
|
||||||
|
tobj->error = GLU_NO_ERROR;
|
||||||
|
if (tobj->current_polygon != NULL) {
|
||||||
|
/* gluEndPolygon was not called */
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR1);
|
||||||
|
/* delete all internal structures */
|
||||||
|
delete_contours(tobj);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((tobj->current_polygon =
|
||||||
|
(tess_polygon *) malloc(sizeof(tess_polygon))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tobj->current_polygon->vertex_cnt = 0;
|
||||||
|
tobj->current_polygon->vertices =
|
||||||
|
tobj->current_polygon->last_vertex = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluEndPolygon(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
/*tess_contour *contour_ptr; */
|
||||||
|
|
||||||
|
/* there was an error */
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
/* check if gluBeginPolygon was called */
|
||||||
|
if (tobj->current_polygon == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tess_test_polygon(tobj);
|
||||||
|
/* there was an error */
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
/* any real contours? */
|
||||||
|
if (tobj->contour_cnt == 0) {
|
||||||
|
/* delete all internal structures */
|
||||||
|
delete_contours(tobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tess_find_contour_hierarchies(tobj);
|
||||||
|
/* there was an error */
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
tess_handle_holes(tobj);
|
||||||
|
/* there was an error */
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
/* if no callbacks, nothing to do */
|
||||||
|
if (tobj->callbacks.begin != NULL && tobj->callbacks.vertex != NULL &&
|
||||||
|
tobj->callbacks.end != NULL) {
|
||||||
|
if (tobj->callbacks.edgeFlag == NULL)
|
||||||
|
tess_tesselate(tobj);
|
||||||
|
else
|
||||||
|
tess_tesselate_with_edge_flag(tobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
/* delete all internal structures */
|
||||||
|
delete_contours(tobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluNextContour(GLUtriangulatorObj * tobj, GLenum type)
|
||||||
|
{
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
if (tobj->current_polygon == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* first contour? */
|
||||||
|
if (tobj->current_polygon->vertex_cnt)
|
||||||
|
tess_test_polygon(tobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluTessVertex(GLUtriangulatorObj * tobj, GLdouble v[3], void *data)
|
||||||
|
{
|
||||||
|
tess_polygon *polygon = tobj->current_polygon;
|
||||||
|
tess_vertex *last_vertex_ptr;
|
||||||
|
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
if (polygon == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
last_vertex_ptr = polygon->last_vertex;
|
||||||
|
if (last_vertex_ptr == NULL) {
|
||||||
|
if ((last_vertex_ptr = (tess_vertex *)
|
||||||
|
malloc(sizeof(tess_vertex))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
polygon->vertices = last_vertex_ptr;
|
||||||
|
polygon->last_vertex = last_vertex_ptr;
|
||||||
|
last_vertex_ptr->data = data;
|
||||||
|
last_vertex_ptr->location[0] = v[0];
|
||||||
|
last_vertex_ptr->location[1] = v[1];
|
||||||
|
last_vertex_ptr->location[2] = v[2];
|
||||||
|
last_vertex_ptr->next = NULL;
|
||||||
|
last_vertex_ptr->previous = NULL;
|
||||||
|
++(polygon->vertex_cnt);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tess_vertex *vertex_ptr;
|
||||||
|
|
||||||
|
/* same point twice? */
|
||||||
|
if (fabs(last_vertex_ptr->location[0] - v[0]) < EPSILON &&
|
||||||
|
fabs(last_vertex_ptr->location[1] - v[1]) < EPSILON &&
|
||||||
|
fabs(last_vertex_ptr->location[2] - v[2]) < EPSILON) {
|
||||||
|
tess_call_user_error(tobj, GLU_TESS_ERROR6);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((vertex_ptr = (tess_vertex *)
|
||||||
|
malloc(sizeof(tess_vertex))) == NULL) {
|
||||||
|
tess_call_user_error(tobj, GLU_OUT_OF_MEMORY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
vertex_ptr->data = data;
|
||||||
|
vertex_ptr->location[0] = v[0];
|
||||||
|
vertex_ptr->location[1] = v[1];
|
||||||
|
vertex_ptr->location[2] = v[2];
|
||||||
|
vertex_ptr->next = NULL;
|
||||||
|
vertex_ptr->previous = last_vertex_ptr;
|
||||||
|
++(polygon->vertex_cnt);
|
||||||
|
last_vertex_ptr->next = vertex_ptr;
|
||||||
|
polygon->last_vertex = vertex_ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
delete_contours(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_polygon *polygon = tobj->current_polygon;
|
||||||
|
tess_contour *contour, *contour_tmp;
|
||||||
|
tess_vertex *vertex, *vertex_tmp;
|
||||||
|
|
||||||
|
/* remove current_polygon list - if exists due to detected error */
|
||||||
|
if (polygon != NULL) {
|
||||||
|
if (polygon->vertices) {
|
||||||
|
for (vertex = polygon->vertices; vertex != polygon->last_vertex;) {
|
||||||
|
vertex_tmp = vertex->next;
|
||||||
|
free(vertex);
|
||||||
|
vertex = vertex_tmp;
|
||||||
|
}
|
||||||
|
free(vertex);
|
||||||
|
}
|
||||||
|
free(polygon);
|
||||||
|
tobj->current_polygon = NULL;
|
||||||
|
}
|
||||||
|
/* remove all contour data */
|
||||||
|
for (contour = tobj->contours; contour != NULL;) {
|
||||||
|
for (vertex = contour->vertices; vertex != contour->last_vertex;) {
|
||||||
|
vertex_tmp = vertex->next;
|
||||||
|
free(vertex);
|
||||||
|
vertex = vertex_tmp;
|
||||||
|
}
|
||||||
|
free(vertex);
|
||||||
|
contour_tmp = contour->next;
|
||||||
|
free(contour);
|
||||||
|
contour = contour_tmp;
|
||||||
|
}
|
||||||
|
tobj->contours = tobj->last_contour = NULL;
|
||||||
|
tobj->contour_cnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
gluTessNormal(GLUtesselator *tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ)
|
||||||
|
{
|
||||||
|
/* dummy function */
|
||||||
|
(void) tess;
|
||||||
|
(void) valueX;
|
||||||
|
(void) valueY;
|
||||||
|
(void) valueZ;
|
||||||
|
}
|
||||||
108
src/glu/mini/tess.h
Normal file
108
src/glu/mini/tess.h
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/* $Id: tess.h,v 1.1.2.1 2003/03/21 13:02:23 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the polygon tesselation code contributed by
|
||||||
|
* Bogdan Sikorski
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef TESS_H
|
||||||
|
#define TESS_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "gluP.h"
|
||||||
|
|
||||||
|
#define EPSILON 1e-06 /* epsilon for double precision compares */
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
OXY,
|
||||||
|
OYZ,
|
||||||
|
OXZ
|
||||||
|
}
|
||||||
|
projection_type;
|
||||||
|
|
||||||
|
typedef struct callbacks_str
|
||||||
|
{
|
||||||
|
void (GLCALLBACK * begin) (GLenum mode);
|
||||||
|
void (GLCALLBACK * edgeFlag) (GLboolean flag);
|
||||||
|
void (GLCALLBACK * vertex) (GLvoid * v);
|
||||||
|
void (GLCALLBACK * end) (void);
|
||||||
|
void (GLCALLBACK * error) (GLenum err);
|
||||||
|
}
|
||||||
|
tess_callbacks;
|
||||||
|
|
||||||
|
typedef struct vertex_str
|
||||||
|
{
|
||||||
|
void *data;
|
||||||
|
GLdouble location[3];
|
||||||
|
GLdouble x, y;
|
||||||
|
GLboolean edge_flag;
|
||||||
|
struct vertex_str *shadow_vertex;
|
||||||
|
struct vertex_str *next, *previous;
|
||||||
|
}
|
||||||
|
tess_vertex;
|
||||||
|
|
||||||
|
typedef struct contour_str
|
||||||
|
{
|
||||||
|
GLenum type;
|
||||||
|
GLuint vertex_cnt;
|
||||||
|
GLdouble area;
|
||||||
|
GLenum orientation;
|
||||||
|
struct vertex_str *vertices, *last_vertex;
|
||||||
|
struct contour_str *next, *previous;
|
||||||
|
}
|
||||||
|
tess_contour;
|
||||||
|
|
||||||
|
typedef struct polygon_str
|
||||||
|
{
|
||||||
|
GLuint vertex_cnt;
|
||||||
|
GLdouble A, B, C, D;
|
||||||
|
GLdouble area;
|
||||||
|
GLenum orientation;
|
||||||
|
struct vertex_str *vertices, *last_vertex;
|
||||||
|
}
|
||||||
|
tess_polygon;
|
||||||
|
|
||||||
|
struct GLUtesselator
|
||||||
|
{
|
||||||
|
tess_contour *contours, *last_contour;
|
||||||
|
GLuint contour_cnt;
|
||||||
|
tess_callbacks callbacks;
|
||||||
|
tess_polygon *current_polygon;
|
||||||
|
GLenum error;
|
||||||
|
GLdouble A, B, C, D;
|
||||||
|
projection_type projection;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern void tess_call_user_error(GLUtriangulatorObj *, GLenum);
|
||||||
|
extern void tess_test_polygon(GLUtriangulatorObj *);
|
||||||
|
extern void tess_find_contour_hierarchies(GLUtriangulatorObj *);
|
||||||
|
extern void tess_handle_holes(GLUtriangulatorObj *);
|
||||||
|
extern void tess_tesselate(GLUtriangulatorObj *);
|
||||||
|
extern void tess_tesselate_with_edge_flag(GLUtriangulatorObj *);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
407
src/glu/mini/tesselat.c
Normal file
407
src/glu/mini/tesselat.c
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
/* $Id: tesselat.c,v 1.1.2.1 2003/03/21 13:02:23 keithw Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.3
|
||||||
|
* Copyright (C) 1995-2000 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the polygon tesselation code contributed by
|
||||||
|
* Bogdan Sikorski
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PC_HEADER
|
||||||
|
#include "all.h"
|
||||||
|
#else
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "tess.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static GLboolean edge_flag;
|
||||||
|
|
||||||
|
static void emit_triangle(GLUtriangulatorObj *, tess_vertex *,
|
||||||
|
tess_vertex *, tess_vertex *);
|
||||||
|
|
||||||
|
static void emit_triangle_with_edge_flag(GLUtriangulatorObj *,
|
||||||
|
tess_vertex *, GLboolean,
|
||||||
|
tess_vertex *, GLboolean,
|
||||||
|
tess_vertex *, GLboolean);
|
||||||
|
|
||||||
|
static GLdouble
|
||||||
|
twice_the_triangle_area(tess_vertex * va, tess_vertex * vb, tess_vertex * vc)
|
||||||
|
{
|
||||||
|
return (vb->x - va->x) * (vc->y - va->y) - (vb->y - va->y) * (vc->x -
|
||||||
|
va->x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLboolean
|
||||||
|
left(GLdouble A, GLdouble B, GLdouble C, GLdouble x, GLdouble y)
|
||||||
|
{
|
||||||
|
if (A * x + B * y + C > -EPSILON)
|
||||||
|
return GL_TRUE;
|
||||||
|
else
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLboolean
|
||||||
|
right(GLdouble A, GLdouble B, GLdouble C, GLdouble x, GLdouble y)
|
||||||
|
{
|
||||||
|
if (A * x + B * y + C < EPSILON)
|
||||||
|
return GL_TRUE;
|
||||||
|
else
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLint
|
||||||
|
convex_ccw(tess_vertex * va,
|
||||||
|
tess_vertex * vb, tess_vertex * vc, GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
GLdouble d;
|
||||||
|
|
||||||
|
d = twice_the_triangle_area(va, vb, vc);
|
||||||
|
|
||||||
|
if (d > EPSILON) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (d < -EPSILON) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLint
|
||||||
|
convex_cw(tess_vertex * va,
|
||||||
|
tess_vertex * vb, tess_vertex * vc, GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
GLdouble d;
|
||||||
|
|
||||||
|
d = twice_the_triangle_area(va, vb, vc);
|
||||||
|
|
||||||
|
if (d < -EPSILON) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (d > EPSILON) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLboolean
|
||||||
|
diagonal_ccw(tess_vertex * va,
|
||||||
|
tess_vertex * vb,
|
||||||
|
GLUtriangulatorObj * tobj, tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_vertex *vc = va->next, *vertex, *shadow_vertex;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
GLdouble A, B, C;
|
||||||
|
}
|
||||||
|
ac, cb, ba;
|
||||||
|
GLdouble x, y;
|
||||||
|
|
||||||
|
GLint res = convex_ccw(va, vc, vb, tobj);
|
||||||
|
if (res == 0)
|
||||||
|
return GL_FALSE;
|
||||||
|
if (res == -1)
|
||||||
|
return GL_TRUE;
|
||||||
|
|
||||||
|
ba.A = vb->y - va->y;
|
||||||
|
ba.B = va->x - vb->x;
|
||||||
|
ba.C = -ba.A * va->x - ba.B * va->y;
|
||||||
|
ac.A = va->y - vc->y;
|
||||||
|
ac.B = vc->x - va->x;
|
||||||
|
ac.C = -ac.A * vc->x - ac.B * vc->y;
|
||||||
|
cb.A = vc->y - vb->y;
|
||||||
|
cb.B = vb->x - vc->x;
|
||||||
|
cb.C = -cb.A * vb->x - cb.B * vb->y;
|
||||||
|
for (vertex = vb->next; vertex != va; vertex = vertex->next) {
|
||||||
|
shadow_vertex = vertex->shadow_vertex;
|
||||||
|
if (shadow_vertex != NULL &&
|
||||||
|
(shadow_vertex == va || shadow_vertex == vb || shadow_vertex == vc))
|
||||||
|
continue;
|
||||||
|
x = vertex->x;
|
||||||
|
y = vertex->y;
|
||||||
|
if (left(ba.A, ba.B, ba.C, x, y) &&
|
||||||
|
left(ac.A, ac.B, ac.C, x, y) && left(cb.A, cb.B, cb.C, x, y))
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLboolean
|
||||||
|
diagonal_cw(tess_vertex * va,
|
||||||
|
tess_vertex * vb,
|
||||||
|
GLUtriangulatorObj * tobj, tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_vertex *vc = va->next, *vertex, *shadow_vertex;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
GLdouble A, B, C;
|
||||||
|
}
|
||||||
|
ac, cb, ba;
|
||||||
|
GLdouble x, y;
|
||||||
|
|
||||||
|
GLint res = convex_cw(va, vc, vb, tobj);
|
||||||
|
if (res == 0)
|
||||||
|
return GL_FALSE;
|
||||||
|
if (res == -1)
|
||||||
|
return GL_TRUE;
|
||||||
|
|
||||||
|
ba.A = vb->y - va->y;
|
||||||
|
ba.B = va->x - vb->x;
|
||||||
|
ba.C = -ba.A * va->x - ba.B * va->y;
|
||||||
|
ac.A = va->y - vc->y;
|
||||||
|
ac.B = vc->x - va->x;
|
||||||
|
ac.C = -ac.A * vc->x - ac.B * vc->y;
|
||||||
|
cb.A = vc->y - vb->y;
|
||||||
|
cb.B = vb->x - vc->x;
|
||||||
|
cb.C = -cb.A * vb->x - cb.B * vb->y;
|
||||||
|
for (vertex = vb->next; vertex != va; vertex = vertex->next) {
|
||||||
|
shadow_vertex = vertex->shadow_vertex;
|
||||||
|
if (shadow_vertex != NULL &&
|
||||||
|
(shadow_vertex == va || shadow_vertex == vb || shadow_vertex == vc))
|
||||||
|
continue;
|
||||||
|
x = vertex->x;
|
||||||
|
y = vertex->y;
|
||||||
|
if (right(ba.A, ba.B, ba.C, x, y) &&
|
||||||
|
right(ac.A, ac.B, ac.C, x, y) && right(cb.A, cb.B, cb.C, x, y))
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clip_ear(GLUtriangulatorObj * tobj, tess_vertex * v, tess_contour * contour)
|
||||||
|
{
|
||||||
|
emit_triangle(tobj, v->previous, v, v->next);
|
||||||
|
/* the first in the list */
|
||||||
|
if (contour->vertices == v) {
|
||||||
|
contour->vertices = v->next;
|
||||||
|
contour->last_vertex->next = v->next;
|
||||||
|
v->next->previous = contour->last_vertex;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* the last ? */
|
||||||
|
if (contour->last_vertex == v) {
|
||||||
|
contour->vertices->previous = v->previous;
|
||||||
|
v->previous->next = v->next;
|
||||||
|
contour->last_vertex = v->previous;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v->next->previous = v->previous;
|
||||||
|
v->previous->next = v->next;
|
||||||
|
}
|
||||||
|
free(v);
|
||||||
|
--(contour->vertex_cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clip_ear_with_edge_flag(GLUtriangulatorObj * tobj,
|
||||||
|
tess_vertex * v, tess_contour * contour)
|
||||||
|
{
|
||||||
|
emit_triangle_with_edge_flag(tobj, v->previous, v->previous->edge_flag,
|
||||||
|
v, v->edge_flag, v->next, GL_FALSE);
|
||||||
|
v->previous->edge_flag = GL_FALSE;
|
||||||
|
/* the first in the list */
|
||||||
|
if (contour->vertices == v) {
|
||||||
|
contour->vertices = v->next;
|
||||||
|
contour->last_vertex->next = v->next;
|
||||||
|
v->next->previous = contour->last_vertex;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* the last ? */
|
||||||
|
if (contour->last_vertex == v) {
|
||||||
|
contour->vertices->previous = v->previous;
|
||||||
|
v->previous->next = v->next;
|
||||||
|
contour->last_vertex = v->previous;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v->next->previous = v->previous;
|
||||||
|
v->previous->next = v->next;
|
||||||
|
}
|
||||||
|
free(v);
|
||||||
|
--(contour->vertex_cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
triangulate_ccw(GLUtriangulatorObj * tobj, tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_vertex *vertex;
|
||||||
|
GLuint vertex_cnt = contour->vertex_cnt;
|
||||||
|
|
||||||
|
while (vertex_cnt > 3) {
|
||||||
|
vertex = contour->vertices;
|
||||||
|
while (diagonal_ccw(vertex, vertex->next->next, tobj, contour) ==
|
||||||
|
GL_FALSE && tobj->error == GLU_NO_ERROR)
|
||||||
|
vertex = vertex->next;
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
clip_ear(tobj, vertex->next, contour);
|
||||||
|
--vertex_cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
triangulate_cw(GLUtriangulatorObj * tobj, tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_vertex *vertex;
|
||||||
|
GLuint vertex_cnt = contour->vertex_cnt;
|
||||||
|
|
||||||
|
while (vertex_cnt > 3) {
|
||||||
|
vertex = contour->vertices;
|
||||||
|
while (diagonal_cw(vertex, vertex->next->next, tobj, contour) ==
|
||||||
|
GL_FALSE && tobj->error == GLU_NO_ERROR)
|
||||||
|
vertex = vertex->next;
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
clip_ear(tobj, vertex->next, contour);
|
||||||
|
--vertex_cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
triangulate_ccw_with_edge_flag(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_vertex *vertex;
|
||||||
|
GLuint vertex_cnt = contour->vertex_cnt;
|
||||||
|
|
||||||
|
while (vertex_cnt > 3) {
|
||||||
|
vertex = contour->vertices;
|
||||||
|
while (diagonal_ccw(vertex, vertex->next->next, tobj, contour) ==
|
||||||
|
GL_FALSE && tobj->error == GLU_NO_ERROR)
|
||||||
|
vertex = vertex->next;
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
clip_ear_with_edge_flag(tobj, vertex->next, contour);
|
||||||
|
--vertex_cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
triangulate_cw_with_edge_flag(GLUtriangulatorObj * tobj,
|
||||||
|
tess_contour * contour)
|
||||||
|
{
|
||||||
|
tess_vertex *vertex;
|
||||||
|
GLuint vertex_cnt = contour->vertex_cnt;
|
||||||
|
|
||||||
|
while (vertex_cnt > 3) {
|
||||||
|
vertex = contour->vertices;
|
||||||
|
while (diagonal_cw(vertex, vertex->next->next, tobj, contour) ==
|
||||||
|
GL_FALSE && tobj->error == GLU_NO_ERROR)
|
||||||
|
vertex = vertex->next;
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
clip_ear_with_edge_flag(tobj, vertex->next, contour);
|
||||||
|
--vertex_cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tess_tesselate(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_contour *contour;
|
||||||
|
|
||||||
|
for (contour = tobj->contours; contour != NULL; contour = contour->next) {
|
||||||
|
if (contour->orientation == GLU_CCW) {
|
||||||
|
triangulate_ccw(tobj, contour);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
triangulate_cw(tobj, contour);
|
||||||
|
}
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* emit the last triangle */
|
||||||
|
emit_triangle(tobj, contour->vertices, contour->vertices->next,
|
||||||
|
contour->vertices->next->next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tess_tesselate_with_edge_flag(GLUtriangulatorObj * tobj)
|
||||||
|
{
|
||||||
|
tess_contour *contour;
|
||||||
|
|
||||||
|
edge_flag = GL_TRUE;
|
||||||
|
/* first callback with edgeFlag set to GL_TRUE */
|
||||||
|
(tobj->callbacks.edgeFlag) (GL_TRUE);
|
||||||
|
|
||||||
|
for (contour = tobj->contours; contour != NULL; contour = contour->next) {
|
||||||
|
if (contour->orientation == GLU_CCW)
|
||||||
|
triangulate_ccw_with_edge_flag(tobj, contour);
|
||||||
|
else
|
||||||
|
triangulate_cw_with_edge_flag(tobj, contour);
|
||||||
|
if (tobj->error != GLU_NO_ERROR)
|
||||||
|
return;
|
||||||
|
/* emit the last triangle */
|
||||||
|
emit_triangle_with_edge_flag(tobj, contour->vertices,
|
||||||
|
contour->vertices->edge_flag,
|
||||||
|
contour->vertices->next,
|
||||||
|
contour->vertices->next->edge_flag,
|
||||||
|
contour->vertices->next->next,
|
||||||
|
contour->vertices->next->next->edge_flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit_triangle(GLUtriangulatorObj * tobj,
|
||||||
|
tess_vertex * v1, tess_vertex * v2, tess_vertex * v3)
|
||||||
|
{
|
||||||
|
(tobj->callbacks.begin) (GL_TRIANGLES);
|
||||||
|
(tobj->callbacks.vertex) (v1->data);
|
||||||
|
(tobj->callbacks.vertex) (v2->data);
|
||||||
|
(tobj->callbacks.vertex) (v3->data);
|
||||||
|
(tobj->callbacks.end) ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit_triangle_with_edge_flag(GLUtriangulatorObj * tobj,
|
||||||
|
tess_vertex * v1,
|
||||||
|
GLboolean edge_flag1,
|
||||||
|
tess_vertex * v2,
|
||||||
|
GLboolean edge_flag2,
|
||||||
|
tess_vertex * v3, GLboolean edge_flag3)
|
||||||
|
{
|
||||||
|
(tobj->callbacks.begin) (GL_TRIANGLES);
|
||||||
|
if (edge_flag1 != edge_flag) {
|
||||||
|
edge_flag = (edge_flag == GL_TRUE ? GL_FALSE : GL_TRUE);
|
||||||
|
(tobj->callbacks.edgeFlag) (edge_flag);
|
||||||
|
}
|
||||||
|
(tobj->callbacks.vertex) (v1->data);
|
||||||
|
if (edge_flag2 != edge_flag) {
|
||||||
|
edge_flag = (edge_flag == GL_TRUE ? GL_FALSE : GL_TRUE);
|
||||||
|
(tobj->callbacks.edgeFlag) (edge_flag);
|
||||||
|
}
|
||||||
|
(tobj->callbacks.vertex) (v2->data);
|
||||||
|
if (edge_flag3 != edge_flag) {
|
||||||
|
edge_flag = (edge_flag == GL_TRUE ? GL_FALSE : GL_TRUE);
|
||||||
|
(tobj->callbacks.edgeFlag) (edge_flag);
|
||||||
|
}
|
||||||
|
(tobj->callbacks.vertex) (v3->data);
|
||||||
|
(tobj->callbacks.end) ();
|
||||||
|
}
|
||||||
2
src/glut/mini/.cvsignore
Normal file
2
src/glut/mini/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.d
|
||||||
|
libglut.so*
|
||||||
50
src/glut/mini/Makefile
Normal file
50
src/glut/mini/Makefile
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
MESA = ../..
|
||||||
|
|
||||||
|
MARK = $(MESA)/src-glut
|
||||||
|
default: libglut.so.3.7 install
|
||||||
|
include $(MESA)/Makefile.include
|
||||||
|
|
||||||
|
INCLUDES = -I$(MESA)/include -I$(MARK)
|
||||||
|
|
||||||
|
CORE_SOURCES = \
|
||||||
|
bitmap.c \
|
||||||
|
callback.c \
|
||||||
|
color.c \
|
||||||
|
globals.c \
|
||||||
|
init.c \
|
||||||
|
menu.c \
|
||||||
|
models.c \
|
||||||
|
overlay.c \
|
||||||
|
state.c \
|
||||||
|
teapot.c \
|
||||||
|
window.c
|
||||||
|
|
||||||
|
|
||||||
|
MARK_SOURCES = \
|
||||||
|
$(MARK)/glut_8x13.c \
|
||||||
|
$(MARK)/glut_9x15.c \
|
||||||
|
$(MARK)/glut_hel10.c \
|
||||||
|
$(MARK)/glut_hel12.c \
|
||||||
|
$(MARK)/glut_hel18.c \
|
||||||
|
$(MARK)/glut_tr10.c \
|
||||||
|
$(MARK)/glut_tr24.c
|
||||||
|
|
||||||
|
SOURCES = $(CORE_SOURCES) $(MARK_SOURCES)
|
||||||
|
|
||||||
|
OBJS = $(SOURCES:.c=.o)
|
||||||
|
|
||||||
|
LIBS = -L$(MESA)/lib -lGL -lGLU -lm
|
||||||
|
|
||||||
|
libglut.so.3.7: $(OBJS) Makefile
|
||||||
|
gcc -shared -Wl,-soname,libglut.so -Wl,-Bsymbolic $(OBJS) $(LIBS) -o $@
|
||||||
|
|
||||||
|
install:
|
||||||
|
rm -f $(MESA)/lib/libglut.so*
|
||||||
|
install -D libglut.so.3.7 $(MESA)/lib/libglut.so.3.7
|
||||||
|
ln -s libglut.so.3.7 $(MESA)/lib/libglut.so.3
|
||||||
|
ln -s libglut.so.3 $(MESA)/lib/libglut.so
|
||||||
|
|
||||||
|
|
||||||
|
-include $(SOURCES:.c=.d)
|
||||||
|
|
||||||
56
src/glut/mini/bitmap.c
Normal file
56
src/glut/mini/bitmap.c
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||||
|
|
||||||
|
/* This program is freely distributable without licensing fees
|
||||||
|
and is provided without guarantee or warrantee expressed or
|
||||||
|
implied. This program is -not- in the public domain. */
|
||||||
|
|
||||||
|
#include "glutbitmap.h"
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutBitmapCharacter(GLUTbitmapFont font, int c)
|
||||||
|
{
|
||||||
|
const BitmapCharRec *ch;
|
||||||
|
BitmapFontPtr fontinfo;
|
||||||
|
GLfloat swapbytes, lsbfirst, rowlength;
|
||||||
|
GLfloat skiprows, skippixels, alignment;
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
fontinfo = (BitmapFontPtr) __glutFont(font);
|
||||||
|
#else
|
||||||
|
fontinfo = (BitmapFontPtr) font;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (c < fontinfo->first ||
|
||||||
|
c >= fontinfo->first + fontinfo->num_chars)
|
||||||
|
return;
|
||||||
|
ch = fontinfo->ch[c - fontinfo->first];
|
||||||
|
if (ch) {
|
||||||
|
/* Save current modes. */
|
||||||
|
/* glGetFloatv(GL_UNPACK_SWAP_BYTES, &swapbytes); */
|
||||||
|
/* glGetFloatv(GL_UNPACK_LSB_FIRST, &lsbfirst); */
|
||||||
|
/* glGetFloatv(GL_UNPACK_ROW_LENGTH, &rowlength); */
|
||||||
|
/* glGetFloatv(GL_UNPACK_SKIP_ROWS, &skiprows); */
|
||||||
|
/* glGetFloatv(GL_UNPACK_SKIP_PIXELS, &skippixels); */
|
||||||
|
glGetFloatv(GL_UNPACK_ALIGNMENT, &alignment);
|
||||||
|
/* Little endian machines (DEC Alpha for example) could
|
||||||
|
benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
|
||||||
|
instead of GL_FALSE, but this would require changing the
|
||||||
|
generated bitmaps too. */
|
||||||
|
/* 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(ch->width, ch->height, ch->xorig, ch->yorig,
|
||||||
|
ch->advance, 0, ch->bitmap);
|
||||||
|
/* Restore saved modes. */
|
||||||
|
/* glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes); */
|
||||||
|
/* glPixelStorei(GL_UNPACK_LSB_FIRST, (int)lsbfirst); */
|
||||||
|
/* glPixelStorei(GL_UNPACK_ROW_LENGTH, (int)rowlength); */
|
||||||
|
/* glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows); */
|
||||||
|
/* glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels); */
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, (int)alignment);
|
||||||
|
}
|
||||||
|
}
|
||||||
152
src/glut/mini/callback.c
Normal file
152
src/glut/mini/callback.c
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.4
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutDisplayFunc (void (GLUTCALLBACK *func) (void))
|
||||||
|
{
|
||||||
|
display_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutReshapeFunc (void (GLUTCALLBACK *func) (int width, int height))
|
||||||
|
{
|
||||||
|
reshape_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutKeyboardFunc (void (GLUTCALLBACK *func) (unsigned char key, int x, int y))
|
||||||
|
{
|
||||||
|
keyboard_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutMouseFunc (void (GLUTCALLBACK *func) (int button, int state, int x, int y))
|
||||||
|
{
|
||||||
|
mouse_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutMotionFunc (void (GLUTCALLBACK *func) (int x, int y))
|
||||||
|
{
|
||||||
|
motion_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutPassiveMotionFunc (void (GLUTCALLBACK *func) (int x, int y))
|
||||||
|
{
|
||||||
|
passive_motion_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutEntryFunc (void (GLUTCALLBACK *func) (int state))
|
||||||
|
{
|
||||||
|
entry_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutVisibilityFunc (void (GLUTCALLBACK *func) (int state))
|
||||||
|
{
|
||||||
|
visibility_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutIdleFunc (void (GLUTCALLBACK *func) (void))
|
||||||
|
{
|
||||||
|
idle_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutTimerFunc (unsigned int millis, void (GLUTCALLBACK *func) (int value), int value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutMenuStateFunc (void (GLUTCALLBACK *func) (int state))
|
||||||
|
{
|
||||||
|
menu_state_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSpecialFunc (void (GLUTCALLBACK *func) (int key, int x, int y))
|
||||||
|
{
|
||||||
|
special_func = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSpaceballMotionFunc (void (GLUTCALLBACK *func) (int x, int y, int z))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSpaceballRotateFunc (void (GLUTCALLBACK *func) (int x, int y, int z))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSpaceballButtonFunc (void (GLUTCALLBACK *func) (int button, int state))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutButtonBoxFunc (void (GLUTCALLBACK *func) (int button, int state))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutDialsFunc (void (GLUTCALLBACK *func) (int dial, int value))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutTabletMotionFunc (void (GLUTCALLBACK *func) (int x, int y))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutTabletButtonFunc (void (GLUTCALLBACK *func) (int button, int state, int x, int y))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutMenuStatusFunc (void (GLUTCALLBACK *func) (int status, int x, int y))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutOverlayDisplayFunc (void (GLUTCALLBACK *func) (void))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutWindowStatusFunc (void (GLUTCALLBACK *func) (int state))
|
||||||
|
{
|
||||||
|
}
|
||||||
46
src/glut/mini/color.c
Normal file
46
src/glut/mini/color.c
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.4
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLfloat APIENTRY glutGetColor (int ndx, int component)
|
||||||
|
{
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutCopyColormap (int win)
|
||||||
|
{
|
||||||
|
}
|
||||||
61
src/glut/mini/globals.c
Normal file
61
src/glut/mini/globals.c
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.4
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
GLenum g_display_mode = 0;
|
||||||
|
GLuint g_width = DEFAULT_WIDTH;
|
||||||
|
GLuint g_height = DEFAULT_HEIGHT;
|
||||||
|
GLint g_mouse = GL_FALSE;
|
||||||
|
GLboolean g_redisplay = GL_FALSE;
|
||||||
|
GLint g_xpos = 0;
|
||||||
|
GLint g_ypos = 0;
|
||||||
|
|
||||||
|
void (GLUTCALLBACK *display_func) (void) = 0;
|
||||||
|
void (GLUTCALLBACK *reshape_func) (int width, int height) = 0;
|
||||||
|
void (GLUTCALLBACK *keyboard_func) (unsigned char key, int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *mouse_func) (int button, int state, int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *motion_func) (int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *passive_motion_func) (int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *entry_func) (int state) = 0;
|
||||||
|
void (GLUTCALLBACK *visibility_func) (int state) = 0;
|
||||||
|
void (GLUTCALLBACK *idle_func) (void) = 0;
|
||||||
|
void (GLUTCALLBACK *menu_state_func) (int state) = 0;
|
||||||
|
void (GLUTCALLBACK *special_func) (int key, int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *spaceball_motion_func) (int x, int y, int z) = 0;
|
||||||
|
void (GLUTCALLBACK *spaceball_rotate_func) (int x, int y, int z) = 0;
|
||||||
|
void (GLUTCALLBACK *spaceball_button_func) (int button, int state) = 0;
|
||||||
|
void (GLUTCALLBACK *button_box_func) (int button, int state) = 0;
|
||||||
|
void (GLUTCALLBACK *dials_func) (int dial, int value) = 0;
|
||||||
|
void (GLUTCALLBACK *tablet_motion_func) (int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *tabled_button_func) (int button, int state, int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *menu_status_func) (int status, int x, int y) = 0;
|
||||||
|
void (GLUTCALLBACK *overlay_display_func) (void) = 0;
|
||||||
|
void (GLUTCALLBACK *window_status_func) (int state) = 0;
|
||||||
59
src/glut/mini/init.c
Normal file
59
src/glut/mini/init.c
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 4.0
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutInit (int *argcp, char **argv)
|
||||||
|
{
|
||||||
|
glutGet(GLUT_ELAPSED_TIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutInitDisplayMode (unsigned int mode)
|
||||||
|
{
|
||||||
|
g_display_mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutInitWindowPosition (int x, int y)
|
||||||
|
{
|
||||||
|
g_xpos = x;
|
||||||
|
g_ypos = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutInitWindowSize (int width, int height)
|
||||||
|
{
|
||||||
|
g_width = width;
|
||||||
|
g_height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
78
src/glut/mini/internal.h
Normal file
78
src/glut/mini/internal.h
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 4.0
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef INTERNAL_H_included
|
||||||
|
#define INTERNAL_H_included
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
/* #include "pc_hw/pc_hw.h" */
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_WINDOWS 4
|
||||||
|
|
||||||
|
#define DEFAULT_WIDTH 640
|
||||||
|
#define DEFAULT_HEIGHT 480
|
||||||
|
#define DEFAULT_BPP 16
|
||||||
|
|
||||||
|
#define DEPTH_SIZE 16
|
||||||
|
#define STENCIL_SIZE 8
|
||||||
|
#define ACCUM_SIZE 16
|
||||||
|
|
||||||
|
extern GLenum g_display_mode;
|
||||||
|
extern GLuint g_width;
|
||||||
|
extern GLuint g_height;
|
||||||
|
extern GLint g_mouse;
|
||||||
|
extern GLboolean g_redisplay;
|
||||||
|
extern GLint g_xpos;
|
||||||
|
extern GLint g_ypos;
|
||||||
|
|
||||||
|
extern void (GLUTCALLBACK *display_func) (void);
|
||||||
|
extern void (GLUTCALLBACK *reshape_func) (int width, int height);
|
||||||
|
extern void (GLUTCALLBACK *keyboard_func) (unsigned char key, int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *mouse_func) (int button, int state, int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *motion_func) (int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *passive_motion_func) (int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *entry_func) (int state);
|
||||||
|
extern void (GLUTCALLBACK *visibility_func) (int state);
|
||||||
|
extern void (GLUTCALLBACK *idle_func) (void);
|
||||||
|
extern void (GLUTCALLBACK *menu_state_func) (int state);
|
||||||
|
extern void (GLUTCALLBACK *special_func) (int key, int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *spaceball_motion_func) (int x, int y, int z);
|
||||||
|
extern void (GLUTCALLBACK *spaceball_rotate_func) (int x, int y, int z);
|
||||||
|
extern void (GLUTCALLBACK *spaceball_button_func) (int button, int state);
|
||||||
|
extern void (GLUTCALLBACK *button_box_func) (int button, int state);
|
||||||
|
extern void (GLUTCALLBACK *dials_func) (int dial, int value);
|
||||||
|
extern void (GLUTCALLBACK *tablet_motion_func) (int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *tabled_button_func) (int button, int state, int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *menu_status_func) (int status, int x, int y);
|
||||||
|
extern void (GLUTCALLBACK *overlay_display_func) (void);
|
||||||
|
extern void (GLUTCALLBACK *window_status_func) (int state);
|
||||||
|
|
||||||
|
#endif
|
||||||
86
src/glut/mini/menu.c
Normal file
86
src/glut/mini/menu.c
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.4
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
|
||||||
|
|
||||||
|
int APIENTRY glutCreateMenu (void (GLUTCALLBACK *func) (int))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY glutDestroyMenu (int menu)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int APIENTRY glutGetMenu (void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSetMenu (int menu)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutAddMenuEntry (const char *label, int value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutAddSubMenu (const char *label, int submenu)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutChangeToMenuEntry (int item, const char *label, int value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutChangeToSubMenu (int item, const char *label, int submenu)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutRemoveMenuItem (int item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutAttachMenu (int button)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutDetachMenu (int button)
|
||||||
|
{
|
||||||
|
}
|
||||||
598
src/glut/mini/models.c
Normal file
598
src/glut/mini/models.c
Normal file
@@ -0,0 +1,598 @@
|
|||||||
|
|
||||||
|
/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
(c) Copyright 1993, Silicon Graphics, Inc.
|
||||||
|
|
||||||
|
ALL RIGHTS RESERVED
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software
|
||||||
|
for any purpose and without fee is hereby granted, provided
|
||||||
|
that the above copyright notice appear in all copies and that
|
||||||
|
both the copyright notice and this permission notice appear in
|
||||||
|
supporting documentation, and that the name of Silicon
|
||||||
|
Graphics, Inc. not be used in advertising or publicity
|
||||||
|
pertaining to distribution of the software without specific,
|
||||||
|
written prior permission.
|
||||||
|
|
||||||
|
THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
|
||||||
|
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
|
||||||
|
OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
|
||||||
|
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
|
||||||
|
EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
|
||||||
|
ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
|
||||||
|
CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
|
||||||
|
INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
|
||||||
|
SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
|
||||||
|
NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
|
||||||
|
PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
US Government Users Restricted Rights
|
||||||
|
|
||||||
|
Use, duplication, or disclosure by the Government is subject to
|
||||||
|
restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
|
||||||
|
(c)(1)(ii) of the Rights in Technical Data and Computer
|
||||||
|
Software clause at DFARS 252.227-7013 and/or in similar or
|
||||||
|
successor clauses in the FAR or the DOD or NASA FAR
|
||||||
|
Supplement. Unpublished-- rights reserved under the copyright
|
||||||
|
laws of the United States. Contractor/manufacturer is Silicon
|
||||||
|
Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
|
||||||
|
94039-7311.
|
||||||
|
|
||||||
|
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#include "GL/glut.h"
|
||||||
|
|
||||||
|
/* Some <math.h> files do not define M_PI... */
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.14159265358979323846
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static GLUquadricObj *quadObj;
|
||||||
|
|
||||||
|
#define QUAD_OBJ_INIT() { if(!quadObj) initQuadObj(); }
|
||||||
|
|
||||||
|
static void
|
||||||
|
initQuadObj(void)
|
||||||
|
{
|
||||||
|
quadObj = gluNewQuadric();
|
||||||
|
/* if (!quadObj)
|
||||||
|
__glutFatalError("out of memory."); */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
|
||||||
|
{
|
||||||
|
QUAD_OBJ_INIT();
|
||||||
|
gluQuadricDrawStyle(quadObj, GLU_LINE);
|
||||||
|
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||||
|
/* If we ever changed/used the texture or orientation state
|
||||||
|
of quadObj, we'd need to change it to the defaults here
|
||||||
|
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||||
|
gluSphere(quadObj, radius, slices, stacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
|
||||||
|
{
|
||||||
|
QUAD_OBJ_INIT();
|
||||||
|
gluQuadricDrawStyle(quadObj, GLU_FILL);
|
||||||
|
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||||
|
/* If we ever changed/used the texture or orientation state
|
||||||
|
of quadObj, we'd need to change it to the defaults here
|
||||||
|
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||||
|
gluSphere(quadObj, radius, slices, stacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutWireCone(GLdouble base, GLdouble height,
|
||||||
|
GLint slices, GLint stacks)
|
||||||
|
{
|
||||||
|
QUAD_OBJ_INIT();
|
||||||
|
gluQuadricDrawStyle(quadObj, GLU_LINE);
|
||||||
|
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||||
|
/* If we ever changed/used the texture or orientation state
|
||||||
|
of quadObj, we'd need to change it to the defaults here
|
||||||
|
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||||
|
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidCone(GLdouble base, GLdouble height,
|
||||||
|
GLint slices, GLint stacks)
|
||||||
|
{
|
||||||
|
QUAD_OBJ_INIT();
|
||||||
|
gluQuadricDrawStyle(quadObj, GLU_FILL);
|
||||||
|
gluQuadricNormals(quadObj, GLU_SMOOTH);
|
||||||
|
/* If we ever changed/used the texture or orientation state
|
||||||
|
of quadObj, we'd need to change it to the defaults here
|
||||||
|
with gluQuadricTexture and/or gluQuadricOrientation. */
|
||||||
|
gluCylinder(quadObj, base, 0.0, height, slices, stacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
|
|
||||||
|
static void
|
||||||
|
drawBox(GLfloat size, GLenum type)
|
||||||
|
{
|
||||||
|
static GLfloat n[6][3] =
|
||||||
|
{
|
||||||
|
{-1.0, 0.0, 0.0},
|
||||||
|
{0.0, 1.0, 0.0},
|
||||||
|
{1.0, 0.0, 0.0},
|
||||||
|
{0.0, -1.0, 0.0},
|
||||||
|
{0.0, 0.0, 1.0},
|
||||||
|
{0.0, 0.0, -1.0}
|
||||||
|
};
|
||||||
|
static GLint faces[6][4] =
|
||||||
|
{
|
||||||
|
{0, 1, 2, 3},
|
||||||
|
{3, 2, 6, 7},
|
||||||
|
{7, 6, 5, 4},
|
||||||
|
{4, 5, 1, 0},
|
||||||
|
{5, 6, 2, 1},
|
||||||
|
{7, 4, 0, 3}
|
||||||
|
};
|
||||||
|
GLfloat v[8][3];
|
||||||
|
GLint i;
|
||||||
|
|
||||||
|
v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
|
||||||
|
v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
|
||||||
|
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
|
||||||
|
v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
|
||||||
|
v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
|
||||||
|
v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
|
||||||
|
|
||||||
|
for (i = 5; i >= 0; i--) {
|
||||||
|
glBegin(type);
|
||||||
|
/* glNormal3fv(&n[i][0]); */
|
||||||
|
glVertex3fv(&v[faces[i][0]][0]);
|
||||||
|
glVertex3fv(&v[faces[i][1]][0]);
|
||||||
|
glVertex3fv(&v[faces[i][2]][0]);
|
||||||
|
glVertex3fv(&v[faces[i][3]][0]);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutWireCube(GLdouble size)
|
||||||
|
{
|
||||||
|
drawBox(size, GL_LINE_LOOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidCube(GLdouble size)
|
||||||
|
{
|
||||||
|
drawBox(size, GL_QUADS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
|
|
||||||
|
static void
|
||||||
|
doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
GLfloat theta, phi, theta1;
|
||||||
|
GLfloat cosTheta, sinTheta;
|
||||||
|
GLfloat cosTheta1, sinTheta1;
|
||||||
|
GLfloat ringDelta, sideDelta;
|
||||||
|
|
||||||
|
ringDelta = 2.0 * M_PI / rings;
|
||||||
|
sideDelta = 2.0 * M_PI / nsides;
|
||||||
|
|
||||||
|
theta = 0.0;
|
||||||
|
cosTheta = 1.0;
|
||||||
|
sinTheta = 0.0;
|
||||||
|
for (i = rings - 1; i >= 0; i--) {
|
||||||
|
theta1 = theta + ringDelta;
|
||||||
|
cosTheta1 = cos(theta1);
|
||||||
|
sinTheta1 = sin(theta1);
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
phi = 0.0;
|
||||||
|
for (j = nsides; j >= 0; j--) {
|
||||||
|
GLfloat cosPhi, sinPhi, dist;
|
||||||
|
|
||||||
|
phi += sideDelta;
|
||||||
|
cosPhi = cos(phi);
|
||||||
|
sinPhi = sin(phi);
|
||||||
|
dist = R + r * cosPhi;
|
||||||
|
|
||||||
|
/* glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); */
|
||||||
|
glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
|
||||||
|
/* glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); */
|
||||||
|
glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
theta = theta1;
|
||||||
|
cosTheta = cosTheta1;
|
||||||
|
sinTheta = sinTheta1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
|
||||||
|
GLint nsides, GLint rings)
|
||||||
|
{
|
||||||
|
/* glPushAttrib(GL_POLYGON_BIT); */
|
||||||
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
doughnut(innerRadius, outerRadius, nsides, rings);
|
||||||
|
/* glPopAttrib(); */
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
|
||||||
|
GLint nsides, GLint rings)
|
||||||
|
{
|
||||||
|
doughnut(innerRadius, outerRadius, nsides, rings);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
|
|
||||||
|
static GLfloat dodec[20][3];
|
||||||
|
|
||||||
|
static void
|
||||||
|
initDodecahedron(void)
|
||||||
|
{
|
||||||
|
GLfloat alpha, beta;
|
||||||
|
|
||||||
|
alpha = sqrt(2.0 / (3.0 + sqrt(5.0)));
|
||||||
|
beta = 1.0 + sqrt(6.0 / (3.0 + sqrt(5.0)) -
|
||||||
|
2.0 + 2.0 * sqrt(2.0 / (3.0 + sqrt(5.0))));
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta;
|
||||||
|
dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta;
|
||||||
|
dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1;
|
||||||
|
dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1;
|
||||||
|
dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1;
|
||||||
|
dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1;
|
||||||
|
dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1;
|
||||||
|
dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1;
|
||||||
|
dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1;
|
||||||
|
dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1;
|
||||||
|
dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0;
|
||||||
|
dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0;
|
||||||
|
dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0;
|
||||||
|
dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0;
|
||||||
|
dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta;
|
||||||
|
dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta;
|
||||||
|
dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha;
|
||||||
|
dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha;
|
||||||
|
dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha;
|
||||||
|
dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha;
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DIFF3(_a,_b,_c) { \
|
||||||
|
(_c)[0] = (_a)[0] - (_b)[0]; \
|
||||||
|
(_c)[1] = (_a)[1] - (_b)[1]; \
|
||||||
|
(_c)[2] = (_a)[2] - (_b)[2]; \
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
crossprod(GLfloat v1[3], GLfloat v2[3], GLfloat prod[3])
|
||||||
|
{
|
||||||
|
GLfloat p[3]; /* in case prod == v1 or v2 */
|
||||||
|
|
||||||
|
p[0] = v1[1] * v2[2] - v2[1] * v1[2];
|
||||||
|
p[1] = v1[2] * v2[0] - v2[2] * v1[0];
|
||||||
|
p[2] = v1[0] * v2[1] - v2[0] * v1[1];
|
||||||
|
prod[0] = p[0];
|
||||||
|
prod[1] = p[1];
|
||||||
|
prod[2] = p[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
normalize(GLfloat v[3])
|
||||||
|
{
|
||||||
|
GLfloat d;
|
||||||
|
|
||||||
|
d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
|
||||||
|
if (d == 0.0) {
|
||||||
|
// __glutWarning("normalize: zero length vector");
|
||||||
|
v[0] = d = 1.0;
|
||||||
|
}
|
||||||
|
d = 1 / d;
|
||||||
|
v[0] *= d;
|
||||||
|
v[1] *= d;
|
||||||
|
v[2] *= d;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pentagon(int a, int b, int c, int d, int e, GLenum shadeType)
|
||||||
|
{
|
||||||
|
GLfloat n0[3], d1[3], d2[3];
|
||||||
|
|
||||||
|
DIFF3(dodec[a], dodec[b], d1);
|
||||||
|
DIFF3(dodec[b], dodec[c], d2);
|
||||||
|
crossprod(d1, d2, n0);
|
||||||
|
normalize(n0);
|
||||||
|
|
||||||
|
glBegin(shadeType);
|
||||||
|
/* glNormal3fv(n0); */
|
||||||
|
glVertex3fv(&dodec[a][0]);
|
||||||
|
glVertex3fv(&dodec[b][0]);
|
||||||
|
glVertex3fv(&dodec[c][0]);
|
||||||
|
glVertex3fv(&dodec[d][0]);
|
||||||
|
glVertex3fv(&dodec[e][0]);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dodecahedron(GLenum type)
|
||||||
|
{
|
||||||
|
static int inited = 0;
|
||||||
|
|
||||||
|
if (inited == 0) {
|
||||||
|
inited = 1;
|
||||||
|
initDodecahedron();
|
||||||
|
}
|
||||||
|
pentagon(0, 1, 9, 16, 5, type);
|
||||||
|
pentagon(1, 0, 3, 18, 7, type);
|
||||||
|
pentagon(1, 7, 11, 10, 9, type);
|
||||||
|
pentagon(11, 7, 18, 19, 6, type);
|
||||||
|
pentagon(8, 17, 16, 9, 10, type);
|
||||||
|
pentagon(2, 14, 15, 6, 19, type);
|
||||||
|
pentagon(2, 13, 12, 4, 14, type);
|
||||||
|
pentagon(2, 19, 18, 3, 13, type);
|
||||||
|
pentagon(3, 0, 5, 12, 13, type);
|
||||||
|
pentagon(6, 15, 8, 10, 11, type);
|
||||||
|
pentagon(4, 17, 8, 15, 14, type);
|
||||||
|
pentagon(4, 12, 5, 16, 17, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutWireDodecahedron(void)
|
||||||
|
{
|
||||||
|
dodecahedron(GL_LINE_LOOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidDodecahedron(void)
|
||||||
|
{
|
||||||
|
dodecahedron(GL_TRIANGLE_FAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
|
|
||||||
|
static void
|
||||||
|
recorditem(GLfloat * n1, GLfloat * n2, GLfloat * n3,
|
||||||
|
GLenum shadeType)
|
||||||
|
{
|
||||||
|
GLfloat q0[3], q1[3];
|
||||||
|
|
||||||
|
DIFF3(n1, n2, q0);
|
||||||
|
DIFF3(n2, n3, q1);
|
||||||
|
crossprod(q0, q1, q1);
|
||||||
|
normalize(q1);
|
||||||
|
|
||||||
|
glBegin(shadeType);
|
||||||
|
/* glNormal3fv(q1); */
|
||||||
|
glVertex3fv(n1);
|
||||||
|
glVertex3fv(n2);
|
||||||
|
glVertex3fv(n3);
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2,
|
||||||
|
GLenum shadeType)
|
||||||
|
{
|
||||||
|
int depth;
|
||||||
|
GLfloat w0[3], w1[3], w2[3];
|
||||||
|
GLfloat l;
|
||||||
|
int i, j, k, n;
|
||||||
|
|
||||||
|
depth = 1;
|
||||||
|
for (i = 0; i < depth; i++) {
|
||||||
|
for (j = 0; i + j < depth; j++) {
|
||||||
|
k = depth - i - j;
|
||||||
|
for (n = 0; n < 3; n++) {
|
||||||
|
w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth;
|
||||||
|
w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n])
|
||||||
|
/ depth;
|
||||||
|
w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n])
|
||||||
|
/ depth;
|
||||||
|
}
|
||||||
|
l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]);
|
||||||
|
w0[0] /= l;
|
||||||
|
w0[1] /= l;
|
||||||
|
w0[2] /= l;
|
||||||
|
l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]);
|
||||||
|
w1[0] /= l;
|
||||||
|
w1[1] /= l;
|
||||||
|
w1[2] /= l;
|
||||||
|
l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]);
|
||||||
|
w2[0] /= l;
|
||||||
|
w2[1] /= l;
|
||||||
|
w2[2] /= l;
|
||||||
|
recorditem(w1, w0, w2, shadeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
drawtriangle(int i, GLfloat data[][3], int ndx[][3],
|
||||||
|
GLenum shadeType)
|
||||||
|
{
|
||||||
|
GLfloat *x0, *x1, *x2;
|
||||||
|
|
||||||
|
x0 = data[ndx[i][0]];
|
||||||
|
x1 = data[ndx[i][1]];
|
||||||
|
x2 = data[ndx[i][2]];
|
||||||
|
subdivide(x0, x1, x2, shadeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* octahedron data: The octahedron produced is centered at the
|
||||||
|
origin and has radius 1.0 */
|
||||||
|
static GLfloat odata[6][3] =
|
||||||
|
{
|
||||||
|
{1.0, 0.0, 0.0},
|
||||||
|
{-1.0, 0.0, 0.0},
|
||||||
|
{0.0, 1.0, 0.0},
|
||||||
|
{0.0, -1.0, 0.0},
|
||||||
|
{0.0, 0.0, 1.0},
|
||||||
|
{0.0, 0.0, -1.0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ondex[8][3] =
|
||||||
|
{
|
||||||
|
{0, 4, 2},
|
||||||
|
{1, 2, 4},
|
||||||
|
{0, 3, 4},
|
||||||
|
{1, 4, 3},
|
||||||
|
{0, 2, 5},
|
||||||
|
{1, 5, 2},
|
||||||
|
{0, 5, 3},
|
||||||
|
{1, 3, 5}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
octahedron(GLenum shadeType)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 7; i >= 0; i--) {
|
||||||
|
drawtriangle(i, odata, ondex, shadeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutWireOctahedron(void)
|
||||||
|
{
|
||||||
|
octahedron(GL_LINE_LOOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidOctahedron(void)
|
||||||
|
{
|
||||||
|
octahedron(GL_TRIANGLES);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
|
|
||||||
|
/* icosahedron data: These numbers are rigged to make an
|
||||||
|
icosahedron of radius 1.0 */
|
||||||
|
|
||||||
|
#define X .525731112119133606
|
||||||
|
#define Z .850650808352039932
|
||||||
|
|
||||||
|
static GLfloat idata[12][3] =
|
||||||
|
{
|
||||||
|
{-X, 0, Z},
|
||||||
|
{X, 0, Z},
|
||||||
|
{-X, 0, -Z},
|
||||||
|
{X, 0, -Z},
|
||||||
|
{0, Z, X},
|
||||||
|
{0, Z, -X},
|
||||||
|
{0, -Z, X},
|
||||||
|
{0, -Z, -X},
|
||||||
|
{Z, X, 0},
|
||||||
|
{-Z, X, 0},
|
||||||
|
{Z, -X, 0},
|
||||||
|
{-Z, -X, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int index[20][3] =
|
||||||
|
{
|
||||||
|
{0, 4, 1},
|
||||||
|
{0, 9, 4},
|
||||||
|
{9, 5, 4},
|
||||||
|
{4, 5, 8},
|
||||||
|
{4, 8, 1},
|
||||||
|
{8, 10, 1},
|
||||||
|
{8, 3, 10},
|
||||||
|
{5, 3, 8},
|
||||||
|
{5, 2, 3},
|
||||||
|
{2, 7, 3},
|
||||||
|
{7, 10, 3},
|
||||||
|
{7, 6, 10},
|
||||||
|
{7, 11, 6},
|
||||||
|
{11, 0, 6},
|
||||||
|
{0, 1, 6},
|
||||||
|
{6, 1, 10},
|
||||||
|
{9, 0, 11},
|
||||||
|
{9, 11, 2},
|
||||||
|
{9, 2, 5},
|
||||||
|
{7, 2, 11},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
icosahedron(GLenum shadeType)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 19; i >= 0; i--) {
|
||||||
|
drawtriangle(i, idata, index, shadeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutWireIcosahedron(void)
|
||||||
|
{
|
||||||
|
icosahedron(GL_LINE_LOOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidIcosahedron(void)
|
||||||
|
{
|
||||||
|
icosahedron(GL_TRIANGLES);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
|
|
||||||
|
/* tetrahedron data: */
|
||||||
|
|
||||||
|
#define T 1.73205080756887729
|
||||||
|
|
||||||
|
static GLfloat tdata[4][3] =
|
||||||
|
{
|
||||||
|
{T, T, T},
|
||||||
|
{T, -T, -T},
|
||||||
|
{-T, T, -T},
|
||||||
|
{-T, -T, T}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int tndex[4][3] =
|
||||||
|
{
|
||||||
|
{0, 1, 3},
|
||||||
|
{2, 1, 0},
|
||||||
|
{3, 2, 0},
|
||||||
|
{1, 2, 3}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
tetrahedron(GLenum shadeType)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 3; i >= 0; i--)
|
||||||
|
drawtriangle(i, tdata, tndex, shadeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutWireTetrahedron(void)
|
||||||
|
{
|
||||||
|
tetrahedron(GL_LINE_LOOP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidTetrahedron(void)
|
||||||
|
{
|
||||||
|
tetrahedron(GL_TRIANGLES);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
60
src/glut/mini/overlay.c
Normal file
60
src/glut/mini/overlay.c
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.4
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutEstablishOverlay (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutRemoveOverlay (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutUseLayer (GLenum layer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutPostOverlayRedisplay (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutShowOverlay (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutHideOverlay (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
70
src/glut/mini/state.c
Normal file
70
src/glut/mini/state.c
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 3.4
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.0 for Mesa 4.0
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "GL/glut.h"
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define TIMEDELTA(dest, src1, src2) { \
|
||||||
|
if(((dest).tv_usec = (src1).tv_usec - (src2).tv_usec) < 0) { \
|
||||||
|
(dest).tv_usec += 1000000; \
|
||||||
|
(dest).tv_sec = (src1).tv_sec - (src2).tv_sec - 1; \
|
||||||
|
} else { \
|
||||||
|
(dest).tv_sec = (src1).tv_sec - (src2).tv_sec; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
int APIENTRY glutGet (GLenum type)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case GLUT_WINDOW_RGBA:
|
||||||
|
return 1;
|
||||||
|
case GLUT_ELAPSED_TIME: {
|
||||||
|
static int inited = 0;
|
||||||
|
static struct timeval elapsed, beginning, now;
|
||||||
|
if (!inited) {
|
||||||
|
gettimeofday(&beginning, 0);
|
||||||
|
inited = 1;
|
||||||
|
}
|
||||||
|
gettimeofday(&now, 0);
|
||||||
|
TIMEDELTA(elapsed, now, beginning);
|
||||||
|
/* Return elapsed milliseconds. */
|
||||||
|
return (int) ((elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000));
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int APIENTRY glutDeviceGet (GLenum type)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
214
src/glut/mini/teapot.c
Normal file
214
src/glut/mini/teapot.c
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
|
||||||
|
/* Copyright (c) Mark J. Kilgard, 1994. */
|
||||||
|
|
||||||
|
/**
|
||||||
|
(c) Copyright 1993, Silicon Graphics, Inc.
|
||||||
|
|
||||||
|
ALL RIGHTS RESERVED
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software
|
||||||
|
for any purpose and without fee is hereby granted, provided
|
||||||
|
that the above copyright notice appear in all copies and that
|
||||||
|
both the copyright notice and this permission notice appear in
|
||||||
|
supporting documentation, and that the name of Silicon
|
||||||
|
Graphics, Inc. not be used in advertising or publicity
|
||||||
|
pertaining to distribution of the software without specific,
|
||||||
|
written prior permission.
|
||||||
|
|
||||||
|
THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
|
||||||
|
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
|
||||||
|
OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
|
||||||
|
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
|
||||||
|
EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
|
||||||
|
ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
|
||||||
|
CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
|
||||||
|
INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
|
||||||
|
SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
|
||||||
|
NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
|
||||||
|
PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
US Government Users Restricted Rights
|
||||||
|
|
||||||
|
Use, duplication, or disclosure by the Government is subject to
|
||||||
|
restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
|
||||||
|
(c)(1)(ii) of the Rights in Technical Data and Computer
|
||||||
|
Software clause at DFARS 252.227-7013 and/or in similar or
|
||||||
|
successor clauses in the FAR or the DOD or NASA FAR
|
||||||
|
Supplement. Unpublished-- rights reserved under the copyright
|
||||||
|
laws of the United States. Contractor/manufacturer is Silicon
|
||||||
|
Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
|
||||||
|
94039-7311.
|
||||||
|
|
||||||
|
OpenGL(TM) is a trademark of Silicon Graphics, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#include "GL/glut.h"
|
||||||
|
|
||||||
|
/* Rim, body, lid, and bottom data must be reflected in x and
|
||||||
|
y; handle and spout data across the y axis only. */
|
||||||
|
|
||||||
|
static int patchdata[][16] =
|
||||||
|
{
|
||||||
|
/* rim */
|
||||||
|
{102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
|
||||||
|
12, 13, 14, 15},
|
||||||
|
/* body */
|
||||||
|
{12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
||||||
|
24, 25, 26, 27},
|
||||||
|
{24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
|
||||||
|
37, 38, 39, 40},
|
||||||
|
/* lid */
|
||||||
|
{96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
|
||||||
|
101, 0, 1, 2, 3,},
|
||||||
|
{0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
|
||||||
|
113, 114, 115, 116, 117},
|
||||||
|
/* bottom */
|
||||||
|
{118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
|
||||||
|
125, 120, 40, 39, 38, 37},
|
||||||
|
/* handle */
|
||||||
|
{41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
|
||||||
|
53, 54, 55, 56},
|
||||||
|
{53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
|
||||||
|
28, 65, 66, 67},
|
||||||
|
/* spout */
|
||||||
|
{68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
|
||||||
|
80, 81, 82, 83},
|
||||||
|
{80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
|
||||||
|
92, 93, 94, 95}
|
||||||
|
};
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
|
||||||
|
static float cpdata[][3] =
|
||||||
|
{
|
||||||
|
{0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0,
|
||||||
|
-0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},
|
||||||
|
{0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375,
|
||||||
|
0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375,
|
||||||
|
2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84,
|
||||||
|
2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875},
|
||||||
|
{1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75,
|
||||||
|
1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35},
|
||||||
|
{0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2,
|
||||||
|
0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12,
|
||||||
|
0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225},
|
||||||
|
{1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225},
|
||||||
|
{1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0,
|
||||||
|
-1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5,
|
||||||
|
-0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3,
|
||||||
|
2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0,
|
||||||
|
2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0,
|
||||||
|
2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8},
|
||||||
|
{-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3,
|
||||||
|
-0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3,
|
||||||
|
1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2,
|
||||||
|
-0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0,
|
||||||
|
1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0,
|
||||||
|
0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66,
|
||||||
|
0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},
|
||||||
|
{2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7,
|
||||||
|
-0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0,
|
||||||
|
2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},
|
||||||
|
{3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},
|
||||||
|
{3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},
|
||||||
|
{2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0,
|
||||||
|
3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8,
|
||||||
|
3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4,
|
||||||
|
-0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0,
|
||||||
|
2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4,
|
||||||
|
2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3,
|
||||||
|
2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4},
|
||||||
|
{0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425,
|
||||||
|
-0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425,
|
||||||
|
0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075},
|
||||||
|
{0.84, -1.5, 0.075}
|
||||||
|
};
|
||||||
|
|
||||||
|
static float tex[2][2][2] =
|
||||||
|
{
|
||||||
|
{ {0, 0},
|
||||||
|
{1, 0}},
|
||||||
|
{ {0, 1},
|
||||||
|
{1, 1}}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
|
static void
|
||||||
|
teapot(GLint grid, GLdouble scale, GLenum type)
|
||||||
|
{
|
||||||
|
float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
|
||||||
|
long i, j, k, l;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
glPushAttrib(GL_ENABLE_BIT | GL_EVAL_BIT);
|
||||||
|
glEnable(GL_AUTO_NORMAL);
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
glEnable(GL_MAP2_VERTEX_3);
|
||||||
|
glEnable(GL_MAP2_TEXTURE_COORD_2);
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(270.0, 1.0, 0.0, 0.0);
|
||||||
|
glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
|
||||||
|
glTranslatef(0.0, 0.0, -1.5);
|
||||||
|
for (i = 0; i < 10; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
for (k = 0; k < 4; k++) {
|
||||||
|
for (l = 0; l < 3; l++) {
|
||||||
|
p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
|
||||||
|
q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
|
||||||
|
if (l == 1)
|
||||||
|
q[j][k][l] *= -1.0;
|
||||||
|
if (i < 6) {
|
||||||
|
r[j][k][l] =
|
||||||
|
cpdata[patchdata[i][j * 4 + (3 - k)]][l];
|
||||||
|
if (l == 0)
|
||||||
|
r[j][k][l] *= -1.0;
|
||||||
|
s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
|
||||||
|
if (l == 0)
|
||||||
|
s[j][k][l] *= -1.0;
|
||||||
|
if (l == 1)
|
||||||
|
s[j][k][l] *= -1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2,
|
||||||
|
&tex[0][0][0]);
|
||||||
|
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||||
|
&p[0][0][0]);
|
||||||
|
glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
|
||||||
|
glEvalMesh2(type, 0, grid, 0, grid);
|
||||||
|
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||||
|
&q[0][0][0]);
|
||||||
|
glEvalMesh2(type, 0, grid, 0, grid);
|
||||||
|
if (i < 6) {
|
||||||
|
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||||
|
&r[0][0][0]);
|
||||||
|
glEvalMesh2(type, 0, grid, 0, grid);
|
||||||
|
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
|
||||||
|
&s[0][0][0]);
|
||||||
|
glEvalMesh2(type, 0, grid, 0, grid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glPopMatrix();
|
||||||
|
glPopAttrib();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CENTRY */
|
||||||
|
void APIENTRY
|
||||||
|
glutSolidTeapot(GLdouble scale)
|
||||||
|
{
|
||||||
|
teapot(7, scale, GL_FILL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY
|
||||||
|
glutWireTeapot(GLdouble scale)
|
||||||
|
{
|
||||||
|
teapot(10, scale, GL_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ENDCENTRY */
|
||||||
267
src/glut/mini/window.c
Normal file
267
src/glut/mini/window.c
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
/*
|
||||||
|
* Mesa 3-D graphics library
|
||||||
|
* Version: 4.1
|
||||||
|
* Copyright (C) 1995-1998 Brian Paul
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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.2 for Mesa 4.1
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002 - Borca Daniel
|
||||||
|
* Email : dborca@yahoo.com
|
||||||
|
* Web : http://www.geocities.com/dborca
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include "GL/glut.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
#define USE_MINI_GLX 1
|
||||||
|
#if USE_MINI_GLX
|
||||||
|
#include "GL/miniglx.h"
|
||||||
|
#else
|
||||||
|
#include <GL/glx.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static GLXContext context = 0;
|
||||||
|
static Window win;
|
||||||
|
static XVisualInfo *visinfo = 0;
|
||||||
|
static Display *dpy = 0;
|
||||||
|
|
||||||
|
|
||||||
|
int APIENTRY glutCreateWindow (const char *title)
|
||||||
|
{
|
||||||
|
XSetWindowAttributes attr;
|
||||||
|
unsigned long mask;
|
||||||
|
GLXContext ctx;
|
||||||
|
int scrnum = 0;
|
||||||
|
Window root = RootWindow( dpy, scrnum );
|
||||||
|
|
||||||
|
if (win)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!dpy) {
|
||||||
|
dpy = XOpenDisplay(NULL);
|
||||||
|
if (!dpy) {
|
||||||
|
printf("Error: XOpenDisplay failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!visinfo) {
|
||||||
|
int attrib[] = {GLX_RGBA,
|
||||||
|
GLX_RED_SIZE, 1,
|
||||||
|
GLX_GREEN_SIZE, 1,
|
||||||
|
GLX_BLUE_SIZE, 1,
|
||||||
|
GLX_DEPTH_SIZE, 1,
|
||||||
|
GLX_DOUBLEBUFFER,
|
||||||
|
None };
|
||||||
|
|
||||||
|
|
||||||
|
visinfo = glXChooseVisual( dpy, scrnum, attrib );
|
||||||
|
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;
|
||||||
|
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
|
||||||
|
|
||||||
|
win = XCreateWindow( dpy, root, 0, 0, g_width, g_height,
|
||||||
|
0, visinfo->depth, InputOutput,
|
||||||
|
visinfo->visual, mask, &attr );
|
||||||
|
if (!win) {
|
||||||
|
printf("Error: XCreateWindow failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = glXCreateContext( dpy, visinfo, NULL, True );
|
||||||
|
if (!ctx) {
|
||||||
|
printf("Error: glXCreateContext failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glXMakeCurrent( dpy, win, ctx )) {
|
||||||
|
printf("Error: glXMakeCurrent failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(g_display_mode & GLUT_DOUBLE))
|
||||||
|
glDrawBuffer( GL_FRONT );
|
||||||
|
|
||||||
|
|
||||||
|
XMapWindow( dpy, win );
|
||||||
|
|
||||||
|
#if !USE_MINI_GLX
|
||||||
|
{
|
||||||
|
XEvent e;
|
||||||
|
while (1) {
|
||||||
|
XNextEvent( dpy, &e );
|
||||||
|
if (e.type == MapNotify && e.xmap.window == win) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutDestroyWindow (int idx)
|
||||||
|
{
|
||||||
|
if (dpy && win)
|
||||||
|
XDestroyWindow( dpy, win );
|
||||||
|
|
||||||
|
if (dpy)
|
||||||
|
XCloseDisplay( dpy );
|
||||||
|
|
||||||
|
win = 0;
|
||||||
|
dpy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutPostRedisplay (void)
|
||||||
|
{
|
||||||
|
g_redisplay = GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSwapBuffers (void)
|
||||||
|
{
|
||||||
|
/* if (g_mouse) pc_scare_mouse(); */
|
||||||
|
if (dpy && win) glXSwapBuffers( dpy, win );
|
||||||
|
/* if (g_mouse) pc_unscare_mouse(); */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int APIENTRY glutGetWindow (void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSetWindow (int win)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSetWindowTitle (const char *title)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutSetIconTitle (const char *title)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutPositionWindow (int x, int y)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutReshapeWindow (int width, int height)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutPopWindow (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutPushWindow (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutIconifyWindow (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutShowWindow (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void APIENTRY glutHideWindow (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIENTRY glutMainLoop (void)
|
||||||
|
{
|
||||||
|
GLboolean idle;
|
||||||
|
GLboolean have_event;
|
||||||
|
XEvent evt;
|
||||||
|
|
||||||
|
glutPostRedisplay();
|
||||||
|
if (reshape_func) reshape_func(g_width, g_height);
|
||||||
|
|
||||||
|
while (GL_TRUE) {
|
||||||
|
idle = GL_TRUE;
|
||||||
|
|
||||||
|
|
||||||
|
if (idle_func)
|
||||||
|
have_event = XCheckWindowEvent( dpy, win, ~0, &evt );
|
||||||
|
else
|
||||||
|
have_event = XNextEvent( dpy, &evt );
|
||||||
|
|
||||||
|
if (have_event) {
|
||||||
|
fprintf(stderr, "got event type %d\n", evt.type);
|
||||||
|
idle = GL_FALSE;
|
||||||
|
switch(evt.type) {
|
||||||
|
case MapNotify:
|
||||||
|
if (visibility_func) visibility_func(GLUT_VISIBLE);
|
||||||
|
break;
|
||||||
|
case UnmapNotify:
|
||||||
|
if (visibility_func) visibility_func(GLUT_NOT_VISIBLE);
|
||||||
|
break;
|
||||||
|
case Expose:
|
||||||
|
g_redisplay = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_redisplay && display_func) {
|
||||||
|
idle = GL_FALSE;
|
||||||
|
g_redisplay = GL_FALSE;
|
||||||
|
|
||||||
|
display_func();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idle && idle_func) {
|
||||||
|
idle_func();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
src/kernel/fbdev/radeonfb/.cvsignore
Normal file
2
src/kernel/fbdev/radeonfb/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
linux
|
||||||
|
video
|
||||||
129
src/kernel/fbdev/radeonfb/GNUmakefile
Normal file
129
src/kernel/fbdev/radeonfb/GNUmakefile
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
#
|
||||||
|
# Makefile for building the radeonfb module standalone.
|
||||||
|
#
|
||||||
|
# Modelled closely on the drm kernel Makefile.linux in the XFree86 source
|
||||||
|
# tree.
|
||||||
|
#
|
||||||
|
# $TG: radeonfb/GNUmakefile,v 1.5 2002/12/18 14:54:08 dawes Exp $
|
||||||
|
#
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
|
MODS = radeonfb.o
|
||||||
|
|
||||||
|
PROGS =
|
||||||
|
|
||||||
|
FBHEADERS =
|
||||||
|
|
||||||
|
FBLINHEADERS =
|
||||||
|
|
||||||
|
FBOBJS =
|
||||||
|
|
||||||
|
WARNINGS = -Wall -Wwrite-strings -Wpointer-arith -Wcast-align \
|
||||||
|
-Wstrict-prototypes -Wnested-externs \
|
||||||
|
-Wpointer-arith
|
||||||
|
CFLAGS = -O2 $(WARNINGS)
|
||||||
|
|
||||||
|
MODCFLAGS = $(CFLAGS) -D__KERNEL__ -DMODULE -fomit-frame-pointer
|
||||||
|
|
||||||
|
# First, locate correct tree for this kernel version. If we find a
|
||||||
|
# matching tree, we assume that we can rely on that tree's autoconf.h.
|
||||||
|
# This may not be correct, but it is the best assumption we can make.
|
||||||
|
|
||||||
|
VERSION := $(shell uname -r)
|
||||||
|
# For Red Hat...
|
||||||
|
RHVERS := $(shell uname -r)custom
|
||||||
|
|
||||||
|
A := /lib/modules/$(VERSION)/build/include
|
||||||
|
B := /usr/src/linux-$(VERSION)/include
|
||||||
|
C := /usr/src/linux/include
|
||||||
|
D := /usr/include
|
||||||
|
|
||||||
|
all::; @echo $(RHVERS)
|
||||||
|
V := $(shell gcc -E -nostdinc -I$A picker.c 2>/dev/null \
|
||||||
|
| grep -s 'RELEASE = ' | cut -d' ' -f3)
|
||||||
|
ifeq ($(V),"$(VERSION)")
|
||||||
|
TREE := $A
|
||||||
|
else
|
||||||
|
ifeq ($(V),"$(RHVERS)")
|
||||||
|
TREE := $A
|
||||||
|
else
|
||||||
|
V := $(shell gcc -E -nostdinc -I$B picker.c 2>/dev/null \
|
||||||
|
| grep -s 'RELEASE = ' | cut -d' ' -f3)
|
||||||
|
ifeq ($(V),"$(VERSION)")
|
||||||
|
TREE := $B
|
||||||
|
else
|
||||||
|
ifeq ($(V),"$(RHVERS)")
|
||||||
|
TREE := $B
|
||||||
|
else
|
||||||
|
V := $(shell gcc -E -nostdinc -I$C picker.c 2>/dev/null \
|
||||||
|
| grep -s 'RELEASE = ' | cut -d' ' -f3)
|
||||||
|
ifeq ($(V),"$(VERSION)")
|
||||||
|
TREE := $C
|
||||||
|
else
|
||||||
|
V := $(shell gcc -E -nostdinc -I$D picker.c 2>/dev/null \
|
||||||
|
| grep -s 'RELEASE = ' | cut -d' ' -f3)
|
||||||
|
ifeq ($(V),"$(VERSION)")
|
||||||
|
TREE := $D
|
||||||
|
else
|
||||||
|
TREE := 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(TREE),0)
|
||||||
|
all::; @echo Error: Could not locate kernel tree in $A $B $C $D
|
||||||
|
else
|
||||||
|
SMP := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \
|
||||||
|
| grep -s 'SMP = ' | cut -d' ' -f3)
|
||||||
|
MODULES := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \
|
||||||
|
| grep -s 'MODULES = ' | cut -d' ' -f3)
|
||||||
|
MODVERSIONS := $(shell gcc -E -nostdinc -I$(TREE) picker.c 2>/dev/null \
|
||||||
|
| grep -s 'MODVERSIONS = ' | cut -d' ' -f3)
|
||||||
|
MACHINE := $(shell echo `uname -m`)
|
||||||
|
endif
|
||||||
|
|
||||||
|
all::;@echo === KERNEL HEADERS IN $(TREE)
|
||||||
|
all::;@echo === SMP=${SMP} MODULES=${MODULES} MODVERSIONS=${MODVERSIONS}
|
||||||
|
all::;@echo === Compiling for machine $(MACHINE)
|
||||||
|
|
||||||
|
ifeq ($(MODULES),0)
|
||||||
|
all::;@echo
|
||||||
|
all::;@echo "*** Kernel modules must be configured. Build aborted."
|
||||||
|
all::;@echo
|
||||||
|
else
|
||||||
|
all:: linux video $(MODS) $(PROGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(SMP),1)
|
||||||
|
MODCFLAGS += -D__SMP__
|
||||||
|
endif
|
||||||
|
ifeq ($(MODVERSIONS),1)
|
||||||
|
MODCFLAGS += -DMODVERSIONS -include $(TREE)/linux/modversions.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
# radeonfb.o: radeonfb_be.o radeonfb_fe.o
|
||||||
|
# $(LD) -r $^ -o $@
|
||||||
|
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) $(MODCFLAGS) -DEXPORT_SYMTAB -I. -I$(TREE) -c $< -o $@
|
||||||
|
|
||||||
|
$(AGPOBJS): $(AGPHEADERS)
|
||||||
|
|
||||||
|
linux:
|
||||||
|
rm -f linux
|
||||||
|
ln -s . linux
|
||||||
|
|
||||||
|
video:
|
||||||
|
rm -f video
|
||||||
|
ln -s . video
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
||||||
|
rm -f linux
|
||||||
|
rm -f $(PROGS)
|
||||||
|
|
||||||
1847
src/kernel/fbdev/radeonfb/pci_ids.h
Normal file
1847
src/kernel/fbdev/radeonfb/pci_ids.h
Normal file
File diff suppressed because it is too large
Load Diff
30
src/kernel/fbdev/radeonfb/picker.c
Normal file
30
src/kernel/fbdev/radeonfb/picker.c
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <linux/version.h>
|
||||||
|
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
#define CONFIG_SMP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_MODULES
|
||||||
|
#define CONFIG_MODULES 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_MODVERSIONS
|
||||||
|
#define CONFIG_MODVERSIONS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_AGP_MODULE
|
||||||
|
#define CONFIG_AGP_MODULE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_AGP
|
||||||
|
#define CONFIG_AGP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SMP = CONFIG_SMP
|
||||||
|
MODULES = CONFIG_MODULES
|
||||||
|
MODVERSIONS = CONFIG_MODVERSIONS
|
||||||
|
AGP = CONFIG_AGP
|
||||||
|
AGP_MODULE = CONFIG_AGP_MODULE
|
||||||
|
RELEASE = UTS_RELEASE
|
||||||
787
src/kernel/fbdev/radeonfb/radeon.h
Normal file
787
src/kernel/fbdev/radeonfb/radeon.h
Normal file
@@ -0,0 +1,787 @@
|
|||||||
|
#ifndef _RADEON_H
|
||||||
|
#define _RADEON_H
|
||||||
|
|
||||||
|
|
||||||
|
#define RADEON_REGSIZE 0x4000
|
||||||
|
|
||||||
|
|
||||||
|
#define MM_INDEX 0x0000
|
||||||
|
#define MM_DATA 0x0004
|
||||||
|
#define BUS_CNTL 0x0030
|
||||||
|
#define HI_STAT 0x004C
|
||||||
|
#define BUS_CNTL1 0x0034
|
||||||
|
#define I2C_CNTL_1 0x0094
|
||||||
|
#define CONFIG_CNTL 0x00E0
|
||||||
|
#define CONFIG_MEMSIZE 0x00F8
|
||||||
|
#define CONFIG_APER_0_BASE 0x0100
|
||||||
|
#define CONFIG_APER_1_BASE 0x0104
|
||||||
|
#define CONFIG_APER_SIZE 0x0108
|
||||||
|
#define CONFIG_REG_1_BASE 0x010C
|
||||||
|
#define CONFIG_REG_APER_SIZE 0x0110
|
||||||
|
#define PAD_AGPINPUT_DELAY 0x0164
|
||||||
|
#define PAD_CTLR_STRENGTH 0x0168
|
||||||
|
#define PAD_CTLR_UPDATE 0x016C
|
||||||
|
#define AGP_CNTL 0x0174
|
||||||
|
#define BM_STATUS 0x0160
|
||||||
|
#define CAP0_TRIG_CNTL 0x0950
|
||||||
|
#define VIPH_CONTROL 0x0C40
|
||||||
|
#define VENDOR_ID 0x0F00
|
||||||
|
#define DEVICE_ID 0x0F02
|
||||||
|
#define COMMAND 0x0F04
|
||||||
|
#define STATUS 0x0F06
|
||||||
|
#define REVISION_ID 0x0F08
|
||||||
|
#define REGPROG_INF 0x0F09
|
||||||
|
#define SUB_CLASS 0x0F0A
|
||||||
|
#define BASE_CODE 0x0F0B
|
||||||
|
#define CACHE_LINE 0x0F0C
|
||||||
|
#define LATENCY 0x0F0D
|
||||||
|
#define HEADER 0x0F0E
|
||||||
|
#define BIST 0x0F0F
|
||||||
|
#define REG_MEM_BASE 0x0F10
|
||||||
|
#define REG_IO_BASE 0x0F14
|
||||||
|
#define REG_REG_BASE 0x0F18
|
||||||
|
#define ADAPTER_ID 0x0F2C
|
||||||
|
#define BIOS_ROM 0x0F30
|
||||||
|
#define CAPABILITIES_PTR 0x0F34
|
||||||
|
#define INTERRUPT_LINE 0x0F3C
|
||||||
|
#define INTERRUPT_PIN 0x0F3D
|
||||||
|
#define MIN_GRANT 0x0F3E
|
||||||
|
#define MAX_LATENCY 0x0F3F
|
||||||
|
#define ADAPTER_ID_W 0x0F4C
|
||||||
|
#define PMI_CAP_ID 0x0F50
|
||||||
|
#define PMI_NXT_CAP_PTR 0x0F51
|
||||||
|
#define PMI_PMC_REG 0x0F52
|
||||||
|
#define PM_STATUS 0x0F54
|
||||||
|
#define PMI_DATA 0x0F57
|
||||||
|
#define AGP_CAP_ID 0x0F58
|
||||||
|
#define AGP_STATUS 0x0F5C
|
||||||
|
#define AGP_COMMAND 0x0F60
|
||||||
|
#define AIC_CTRL 0x01D0
|
||||||
|
#define AIC_STAT 0x01D4
|
||||||
|
#define AIC_PT_BASE 0x01D8
|
||||||
|
#define AIC_LO_ADDR 0x01DC
|
||||||
|
#define AIC_HI_ADDR 0x01E0
|
||||||
|
#define AIC_TLB_ADDR 0x01E4
|
||||||
|
#define AIC_TLB_DATA 0x01E8
|
||||||
|
#define DAC_CNTL 0x0058
|
||||||
|
#define CRTC_GEN_CNTL 0x0050
|
||||||
|
#define MEM_CNTL 0x0140
|
||||||
|
#define EXT_MEM_CNTL 0x0144
|
||||||
|
#define MC_AGP_LOCATION 0x014C
|
||||||
|
#define MEM_IO_CNTL_A0 0x0178
|
||||||
|
#define MEM_INIT_LATENCY_TIMER 0x0154
|
||||||
|
#define MEM_SDRAM_MODE_REG 0x0158
|
||||||
|
#define AGP_BASE 0x0170
|
||||||
|
#define MEM_IO_CNTL_A1 0x017C
|
||||||
|
#define MEM_IO_CNTL_B0 0x0180
|
||||||
|
#define MEM_IO_CNTL_B1 0x0184
|
||||||
|
#define MC_DEBUG 0x0188
|
||||||
|
#define MC_STATUS 0x0150
|
||||||
|
#define MEM_IO_OE_CNTL 0x018C
|
||||||
|
#define MC_FB_LOCATION 0x0148
|
||||||
|
#define HOST_PATH_CNTL 0x0130
|
||||||
|
#define MEM_VGA_WP_SEL 0x0038
|
||||||
|
#define MEM_VGA_RP_SEL 0x003C
|
||||||
|
#define HDP_DEBUG 0x0138
|
||||||
|
#define SW_SEMAPHORE 0x013C
|
||||||
|
#define CRTC2_GEN_CNTL 0x03f8
|
||||||
|
#define CRTC2_DISPLAY_BASE_ADDR 0x033c
|
||||||
|
#define SURFACE_CNTL 0x0B00
|
||||||
|
#define SURFACE0_LOWER_BOUND 0x0B04
|
||||||
|
#define SURFACE1_LOWER_BOUND 0x0B14
|
||||||
|
#define SURFACE2_LOWER_BOUND 0x0B24
|
||||||
|
#define SURFACE3_LOWER_BOUND 0x0B34
|
||||||
|
#define SURFACE4_LOWER_BOUND 0x0B44
|
||||||
|
#define SURFACE5_LOWER_BOUND 0x0B54
|
||||||
|
#define SURFACE6_LOWER_BOUND 0x0B64
|
||||||
|
#define SURFACE7_LOWER_BOUND 0x0B74
|
||||||
|
#define SURFACE0_UPPER_BOUND 0x0B08
|
||||||
|
#define SURFACE1_UPPER_BOUND 0x0B18
|
||||||
|
#define SURFACE2_UPPER_BOUND 0x0B28
|
||||||
|
#define SURFACE3_UPPER_BOUND 0x0B38
|
||||||
|
#define SURFACE4_UPPER_BOUND 0x0B48
|
||||||
|
#define SURFACE5_UPPER_BOUND 0x0B58
|
||||||
|
#define SURFACE6_UPPER_BOUND 0x0B68
|
||||||
|
#define SURFACE7_UPPER_BOUND 0x0B78
|
||||||
|
#define SURFACE0_INFO 0x0B0C
|
||||||
|
#define SURFACE1_INFO 0x0B1C
|
||||||
|
#define SURFACE2_INFO 0x0B2C
|
||||||
|
#define SURFACE3_INFO 0x0B3C
|
||||||
|
#define SURFACE4_INFO 0x0B4C
|
||||||
|
#define SURFACE5_INFO 0x0B5C
|
||||||
|
#define SURFACE6_INFO 0x0B6C
|
||||||
|
#define SURFACE7_INFO 0x0B7C
|
||||||
|
#define SURFACE_ACCESS_FLAGS 0x0BF8
|
||||||
|
#define SURFACE_ACCESS_CLR 0x0BFC
|
||||||
|
#define GEN_INT_CNTL 0x0040
|
||||||
|
#define GEN_INT_STATUS 0x0044
|
||||||
|
#define CRTC_EXT_CNTL 0x0054
|
||||||
|
#define RB3D_CNTL 0x1C3C
|
||||||
|
#define WAIT_UNTIL 0x1720
|
||||||
|
#define ISYNC_CNTL 0x1724
|
||||||
|
#define RBBM_GUICNTL 0x172C
|
||||||
|
#define RBBM_STATUS 0x0E40
|
||||||
|
#define RBBM_STATUS_alt_1 0x1740
|
||||||
|
#define RBBM_CNTL 0x00EC
|
||||||
|
#define RBBM_CNTL_alt_1 0x0E44
|
||||||
|
#define RBBM_SOFT_RESET 0x00F0
|
||||||
|
#define RBBM_SOFT_RESET_alt_1 0x0E48
|
||||||
|
#define NQWAIT_UNTIL 0x0E50
|
||||||
|
#define RBBM_DEBUG 0x0E6C
|
||||||
|
#define RBBM_CMDFIFO_ADDR 0x0E70
|
||||||
|
#define RBBM_CMDFIFO_DATAL 0x0E74
|
||||||
|
#define RBBM_CMDFIFO_DATAH 0x0E78
|
||||||
|
#define RBBM_CMDFIFO_STAT 0x0E7C
|
||||||
|
#define CRTC_STATUS 0x005C
|
||||||
|
#define GPIO_VGA_DDC 0x0060
|
||||||
|
#define GPIO_DVI_DDC 0x0064
|
||||||
|
#define GPIO_MONID 0x0068
|
||||||
|
#define PALETTE_INDEX 0x00B0
|
||||||
|
#define PALETTE_DATA 0x00B4
|
||||||
|
#define PALETTE_30_DATA 0x00B8
|
||||||
|
#define CRTC_H_TOTAL_DISP 0x0200
|
||||||
|
#define CRTC_H_SYNC_STRT_WID 0x0204
|
||||||
|
#define CRTC_V_TOTAL_DISP 0x0208
|
||||||
|
#define CRTC_V_SYNC_STRT_WID 0x020C
|
||||||
|
#define CRTC_VLINE_CRNT_VLINE 0x0210
|
||||||
|
#define CRTC_CRNT_FRAME 0x0214
|
||||||
|
#define CRTC_GUI_TRIG_VLINE 0x0218
|
||||||
|
#define CRTC_DEBUG 0x021C
|
||||||
|
#define CRTC_OFFSET_RIGHT 0x0220
|
||||||
|
#define CRTC_OFFSET 0x0224
|
||||||
|
#define CRTC_OFFSET_CNTL 0x0228
|
||||||
|
#define CRTC_PITCH 0x022C
|
||||||
|
#define OVR_CLR 0x0230
|
||||||
|
#define OVR_WID_LEFT_RIGHT 0x0234
|
||||||
|
#define OVR_WID_TOP_BOTTOM 0x0238
|
||||||
|
#define DISPLAY_BASE_ADDR 0x023C
|
||||||
|
#define SNAPSHOT_VH_COUNTS 0x0240
|
||||||
|
#define SNAPSHOT_F_COUNT 0x0244
|
||||||
|
#define N_VIF_COUNT 0x0248
|
||||||
|
#define SNAPSHOT_VIF_COUNT 0x024C
|
||||||
|
#define FP_CRTC_H_TOTAL_DISP 0x0250
|
||||||
|
#define FP_CRTC_V_TOTAL_DISP 0x0254
|
||||||
|
#define CRT_CRTC_H_SYNC_STRT_WID 0x0258
|
||||||
|
#define CRT_CRTC_V_SYNC_STRT_WID 0x025C
|
||||||
|
#define CUR_OFFSET 0x0260
|
||||||
|
#define CUR_HORZ_VERT_POSN 0x0264
|
||||||
|
#define CUR_HORZ_VERT_OFF 0x0268
|
||||||
|
#define CUR_CLR0 0x026C
|
||||||
|
#define CUR_CLR1 0x0270
|
||||||
|
#define FP_HORZ_VERT_ACTIVE 0x0278
|
||||||
|
#define CRTC_MORE_CNTL 0x027C
|
||||||
|
#define DAC_EXT_CNTL 0x0280
|
||||||
|
#define FP_GEN_CNTL 0x0284
|
||||||
|
#define FP_HORZ_STRETCH 0x028C
|
||||||
|
#define FP_VERT_STRETCH 0x0290
|
||||||
|
#define FP_H_SYNC_STRT_WID 0x02C4
|
||||||
|
#define FP_V_SYNC_STRT_WID 0x02C8
|
||||||
|
#define AUX_WINDOW_HORZ_CNTL 0x02D8
|
||||||
|
#define AUX_WINDOW_VERT_CNTL 0x02DC
|
||||||
|
#define DDA_CONFIG 0x02e0
|
||||||
|
#define DDA_ON_OFF 0x02e4
|
||||||
|
#define GRPH_BUFFER_CNTL 0x02F0
|
||||||
|
#define VGA_BUFFER_CNTL 0x02F4
|
||||||
|
#define OV0_Y_X_START 0x0400
|
||||||
|
#define OV0_Y_X_END 0x0404
|
||||||
|
#define OV0_PIPELINE_CNTL 0x0408
|
||||||
|
#define OV0_REG_LOAD_CNTL 0x0410
|
||||||
|
#define OV0_SCALE_CNTL 0x0420
|
||||||
|
#define OV0_V_INC 0x0424
|
||||||
|
#define OV0_P1_V_ACCUM_INIT 0x0428
|
||||||
|
#define OV0_P23_V_ACCUM_INIT 0x042C
|
||||||
|
#define OV0_P1_BLANK_LINES_AT_TOP 0x0430
|
||||||
|
#define OV0_P23_BLANK_LINES_AT_TOP 0x0434
|
||||||
|
#define OV0_BASE_ADDR 0x043C
|
||||||
|
#define OV0_VID_BUF0_BASE_ADRS 0x0440
|
||||||
|
#define OV0_VID_BUF1_BASE_ADRS 0x0444
|
||||||
|
#define OV0_VID_BUF2_BASE_ADRS 0x0448
|
||||||
|
#define OV0_VID_BUF3_BASE_ADRS 0x044C
|
||||||
|
#define OV0_VID_BUF4_BASE_ADRS 0x0450
|
||||||
|
#define OV0_VID_BUF5_BASE_ADRS 0x0454
|
||||||
|
#define OV0_VID_BUF_PITCH0_VALUE 0x0460
|
||||||
|
#define OV0_VID_BUF_PITCH1_VALUE 0x0464
|
||||||
|
#define OV0_AUTO_FLIP_CNTRL 0x0470
|
||||||
|
#define OV0_DEINTERLACE_PATTERN 0x0474
|
||||||
|
#define OV0_SUBMIT_HISTORY 0x0478
|
||||||
|
#define OV0_H_INC 0x0480
|
||||||
|
#define OV0_STEP_BY 0x0484
|
||||||
|
#define OV0_P1_H_ACCUM_INIT 0x0488
|
||||||
|
#define OV0_P23_H_ACCUM_INIT 0x048C
|
||||||
|
#define OV0_P1_X_START_END 0x0494
|
||||||
|
#define OV0_P2_X_START_END 0x0498
|
||||||
|
#define OV0_P3_X_START_END 0x049C
|
||||||
|
#define OV0_FILTER_CNTL 0x04A0
|
||||||
|
#define OV0_FOUR_TAP_COEF_0 0x04B0
|
||||||
|
#define OV0_FOUR_TAP_COEF_1 0x04B4
|
||||||
|
#define OV0_FOUR_TAP_COEF_2 0x04B8
|
||||||
|
#define OV0_FOUR_TAP_COEF_3 0x04BC
|
||||||
|
#define OV0_FOUR_TAP_COEF_4 0x04C0
|
||||||
|
#define OV0_FLAG_CNTRL 0x04DC
|
||||||
|
#define OV0_SLICE_CNTL 0x04E0
|
||||||
|
#define OV0_VID_KEY_CLR_LOW 0x04E4
|
||||||
|
#define OV0_VID_KEY_CLR_HIGH 0x04E8
|
||||||
|
#define OV0_GRPH_KEY_CLR_LOW 0x04EC
|
||||||
|
#define OV0_GRPH_KEY_CLR_HIGH 0x04F0
|
||||||
|
#define OV0_KEY_CNTL 0x04F4
|
||||||
|
#define OV0_TEST 0x04F8
|
||||||
|
#define SUBPIC_CNTL 0x0540
|
||||||
|
#define SUBPIC_DEFCOLCON 0x0544
|
||||||
|
#define SUBPIC_Y_X_START 0x054C
|
||||||
|
#define SUBPIC_Y_X_END 0x0550
|
||||||
|
#define SUBPIC_V_INC 0x0554
|
||||||
|
#define SUBPIC_H_INC 0x0558
|
||||||
|
#define SUBPIC_BUF0_OFFSET 0x055C
|
||||||
|
#define SUBPIC_BUF1_OFFSET 0x0560
|
||||||
|
#define SUBPIC_LC0_OFFSET 0x0564
|
||||||
|
#define SUBPIC_LC1_OFFSET 0x0568
|
||||||
|
#define SUBPIC_PITCH 0x056C
|
||||||
|
#define SUBPIC_BTN_HLI_COLCON 0x0570
|
||||||
|
#define SUBPIC_BTN_HLI_Y_X_START 0x0574
|
||||||
|
#define SUBPIC_BTN_HLI_Y_X_END 0x0578
|
||||||
|
#define SUBPIC_PALETTE_INDEX 0x057C
|
||||||
|
#define SUBPIC_PALETTE_DATA 0x0580
|
||||||
|
#define SUBPIC_H_ACCUM_INIT 0x0584
|
||||||
|
#define SUBPIC_V_ACCUM_INIT 0x0588
|
||||||
|
#define DISP_MISC_CNTL 0x0D00
|
||||||
|
#define DAC_MACRO_CNTL 0x0D04
|
||||||
|
#define DISP_PWR_MAN 0x0D08
|
||||||
|
#define DISP_TEST_DEBUG_CNTL 0x0D10
|
||||||
|
#define DISP_HW_DEBUG 0x0D14
|
||||||
|
#define DAC_CRC_SIG1 0x0D18
|
||||||
|
#define DAC_CRC_SIG2 0x0D1C
|
||||||
|
#define OV0_LIN_TRANS_A 0x0D20
|
||||||
|
#define OV0_LIN_TRANS_B 0x0D24
|
||||||
|
#define OV0_LIN_TRANS_C 0x0D28
|
||||||
|
#define OV0_LIN_TRANS_D 0x0D2C
|
||||||
|
#define OV0_LIN_TRANS_E 0x0D30
|
||||||
|
#define OV0_LIN_TRANS_F 0x0D34
|
||||||
|
#define OV0_GAMMA_0_F 0x0D40
|
||||||
|
#define OV0_GAMMA_10_1F 0x0D44
|
||||||
|
#define OV0_GAMMA_20_3F 0x0D48
|
||||||
|
#define OV0_GAMMA_40_7F 0x0D4C
|
||||||
|
#define OV0_GAMMA_380_3BF 0x0D50
|
||||||
|
#define OV0_GAMMA_3C0_3FF 0x0D54
|
||||||
|
#define DISP_MERGE_CNTL 0x0D60
|
||||||
|
#define DISP_OUTPUT_CNTL 0x0D64
|
||||||
|
#define DISP_LIN_TRANS_GRPH_A 0x0D80
|
||||||
|
#define DISP_LIN_TRANS_GRPH_B 0x0D84
|
||||||
|
#define DISP_LIN_TRANS_GRPH_C 0x0D88
|
||||||
|
#define DISP_LIN_TRANS_GRPH_D 0x0D8C
|
||||||
|
#define DISP_LIN_TRANS_GRPH_E 0x0D90
|
||||||
|
#define DISP_LIN_TRANS_GRPH_F 0x0D94
|
||||||
|
#define DISP_LIN_TRANS_VID_A 0x0D98
|
||||||
|
#define DISP_LIN_TRANS_VID_B 0x0D9C
|
||||||
|
#define DISP_LIN_TRANS_VID_C 0x0DA0
|
||||||
|
#define DISP_LIN_TRANS_VID_D 0x0DA4
|
||||||
|
#define DISP_LIN_TRANS_VID_E 0x0DA8
|
||||||
|
#define DISP_LIN_TRANS_VID_F 0x0DAC
|
||||||
|
#define RMX_HORZ_FILTER_0TAP_COEF 0x0DB0
|
||||||
|
#define RMX_HORZ_FILTER_1TAP_COEF 0x0DB4
|
||||||
|
#define RMX_HORZ_FILTER_2TAP_COEF 0x0DB8
|
||||||
|
#define RMX_HORZ_PHASE 0x0DBC
|
||||||
|
#define DAC_EMBEDDED_SYNC_CNTL 0x0DC0
|
||||||
|
#define DAC_BROAD_PULSE 0x0DC4
|
||||||
|
#define DAC_SKEW_CLKS 0x0DC8
|
||||||
|
#define DAC_INCR 0x0DCC
|
||||||
|
#define DAC_NEG_SYNC_LEVEL 0x0DD0
|
||||||
|
#define DAC_POS_SYNC_LEVEL 0x0DD4
|
||||||
|
#define DAC_BLANK_LEVEL 0x0DD8
|
||||||
|
#define CLOCK_CNTL_INDEX 0x0008
|
||||||
|
#define CLOCK_CNTL_DATA 0x000C
|
||||||
|
#define CP_RB_CNTL 0x0704
|
||||||
|
#define CP_RB_BASE 0x0700
|
||||||
|
#define CP_RB_RPTR_ADDR 0x070C
|
||||||
|
#define CP_RB_RPTR 0x0710
|
||||||
|
#define CP_RB_WPTR 0x0714
|
||||||
|
#define CP_RB_WPTR_DELAY 0x0718
|
||||||
|
#define CP_IB_BASE 0x0738
|
||||||
|
#define CP_IB_BUFSZ 0x073C
|
||||||
|
#define SCRATCH_REG0 0x15E0
|
||||||
|
#define GUI_SCRATCH_REG0 0x15E0
|
||||||
|
#define SCRATCH_REG1 0x15E4
|
||||||
|
#define GUI_SCRATCH_REG1 0x15E4
|
||||||
|
#define SCRATCH_REG2 0x15E8
|
||||||
|
#define GUI_SCRATCH_REG2 0x15E8
|
||||||
|
#define SCRATCH_REG3 0x15EC
|
||||||
|
#define GUI_SCRATCH_REG3 0x15EC
|
||||||
|
#define SCRATCH_REG4 0x15F0
|
||||||
|
#define GUI_SCRATCH_REG4 0x15F0
|
||||||
|
#define SCRATCH_REG5 0x15F4
|
||||||
|
#define GUI_SCRATCH_REG5 0x15F4
|
||||||
|
#define SCRATCH_UMSK 0x0770
|
||||||
|
#define SCRATCH_ADDR 0x0774
|
||||||
|
#define DP_BRUSH_FRGD_CLR 0x147C
|
||||||
|
#define DP_BRUSH_BKGD_CLR 0x1478
|
||||||
|
#define DST_LINE_START 0x1600
|
||||||
|
#define DST_LINE_END 0x1604
|
||||||
|
#define SRC_OFFSET 0x15AC
|
||||||
|
#define SRC_PITCH 0x15B0
|
||||||
|
#define SRC_TILE 0x1704
|
||||||
|
#define SRC_PITCH_OFFSET 0x1428
|
||||||
|
#define SRC_X 0x1414
|
||||||
|
#define SRC_Y 0x1418
|
||||||
|
#define SRC_X_Y 0x1590
|
||||||
|
#define SRC_Y_X 0x1434
|
||||||
|
#define DST_Y_X 0x1438
|
||||||
|
#define DST_WIDTH_HEIGHT 0x1598
|
||||||
|
#define DST_HEIGHT_WIDTH 0x143c
|
||||||
|
#define DST_OFFSET 0x1404
|
||||||
|
#define SRC_CLUT_ADDRESS 0x1780
|
||||||
|
#define SRC_CLUT_DATA 0x1784
|
||||||
|
#define SRC_CLUT_DATA_RD 0x1788
|
||||||
|
#define HOST_DATA0 0x17C0
|
||||||
|
#define HOST_DATA1 0x17C4
|
||||||
|
#define HOST_DATA2 0x17C8
|
||||||
|
#define HOST_DATA3 0x17CC
|
||||||
|
#define HOST_DATA4 0x17D0
|
||||||
|
#define HOST_DATA5 0x17D4
|
||||||
|
#define HOST_DATA6 0x17D8
|
||||||
|
#define HOST_DATA7 0x17DC
|
||||||
|
#define HOST_DATA_LAST 0x17E0
|
||||||
|
#define DP_SRC_ENDIAN 0x15D4
|
||||||
|
#define DP_SRC_FRGD_CLR 0x15D8
|
||||||
|
#define DP_SRC_BKGD_CLR 0x15DC
|
||||||
|
#define SC_LEFT 0x1640
|
||||||
|
#define SC_RIGHT 0x1644
|
||||||
|
#define SC_TOP 0x1648
|
||||||
|
#define SC_BOTTOM 0x164C
|
||||||
|
#define SRC_SC_RIGHT 0x1654
|
||||||
|
#define SRC_SC_BOTTOM 0x165C
|
||||||
|
#define DP_CNTL 0x16C0
|
||||||
|
#define DP_CNTL_XDIR_YDIR_YMAJOR 0x16D0
|
||||||
|
#define DP_DATATYPE 0x16C4
|
||||||
|
#define DP_MIX 0x16C8
|
||||||
|
#define DP_WRITE_MSK 0x16CC
|
||||||
|
#define DP_XOP 0x17F8
|
||||||
|
#define CLR_CMP_CLR_SRC 0x15C4
|
||||||
|
#define CLR_CMP_CLR_DST 0x15C8
|
||||||
|
#define CLR_CMP_CNTL 0x15C0
|
||||||
|
#define CLR_CMP_MSK 0x15CC
|
||||||
|
#define DSTCACHE_MODE 0x1710
|
||||||
|
#define DSTCACHE_CTLSTAT 0x1714
|
||||||
|
#define DEFAULT_PITCH_OFFSET 0x16E0
|
||||||
|
#define DEFAULT_SC_BOTTOM_RIGHT 0x16E8
|
||||||
|
#define DP_GUI_MASTER_CNTL 0x146C
|
||||||
|
#define SC_TOP_LEFT 0x16EC
|
||||||
|
#define SC_BOTTOM_RIGHT 0x16F0
|
||||||
|
#define SRC_SC_BOTTOM_RIGHT 0x16F4
|
||||||
|
#define RB2D_DSTCACHE_MODE 0x3428
|
||||||
|
#define RB2D_DSTCACHE_CTLSTAT 0x342C
|
||||||
|
#define LVDS_GEN_CNTL 0x02d0
|
||||||
|
#define LVDS_PLL_CNTL 0x02d4
|
||||||
|
#define TMDS_CRC 0x02a0
|
||||||
|
#define TMDS_TRANSMITTER_CNTL 0x02a4
|
||||||
|
|
||||||
|
#define RADEON_BASE_CODE 0x0f0b
|
||||||
|
#define RADEON_BIOS_0_SCRATCH 0x0010
|
||||||
|
#define RADEON_BIOS_1_SCRATCH 0x0014
|
||||||
|
#define RADEON_BIOS_2_SCRATCH 0x0018
|
||||||
|
#define RADEON_BIOS_3_SCRATCH 0x001c
|
||||||
|
#define RADEON_BIOS_4_SCRATCH 0x0020
|
||||||
|
#define RADEON_BIOS_5_SCRATCH 0x0024
|
||||||
|
#define RADEON_BIOS_6_SCRATCH 0x0028
|
||||||
|
#define RADEON_BIOS_7_SCRATCH 0x002c
|
||||||
|
|
||||||
|
|
||||||
|
#define CLK_PIN_CNTL 0x0001
|
||||||
|
#define PPLL_CNTL 0x0002
|
||||||
|
#define PPLL_REF_DIV 0x0003
|
||||||
|
#define PPLL_DIV_0 0x0004
|
||||||
|
#define PPLL_DIV_1 0x0005
|
||||||
|
#define PPLL_DIV_2 0x0006
|
||||||
|
#define PPLL_DIV_3 0x0007
|
||||||
|
#define VCLK_ECP_CNTL 0x0008
|
||||||
|
#define HTOTAL_CNTL 0x0009
|
||||||
|
#define M_SPLL_REF_FB_DIV 0x000a
|
||||||
|
#define AGP_PLL_CNTL 0x000b
|
||||||
|
#define SPLL_CNTL 0x000c
|
||||||
|
#define SCLK_CNTL 0x000d
|
||||||
|
#define MPLL_CNTL 0x000e
|
||||||
|
#define MDLL_CKO 0x000f
|
||||||
|
#define MCLK_CNTL 0x0012
|
||||||
|
#define AGP_PLL_CNTL 0x000b
|
||||||
|
#define PLL_TEST_CNTL 0x0013
|
||||||
|
|
||||||
|
/* MCLK_CNTL bit constants */
|
||||||
|
#define FORCEON_MCLKA (1 << 16)
|
||||||
|
#define FORCEON_MCLKB (1 << 17)
|
||||||
|
#define FORCEON_YCLKA (1 << 18)
|
||||||
|
#define FORCEON_YCLKB (1 << 19)
|
||||||
|
#define FORCEON_MC (1 << 20)
|
||||||
|
#define FORCEON_AIC (1 << 21)
|
||||||
|
|
||||||
|
|
||||||
|
/* BUS_CNTL bit constants */
|
||||||
|
#define BUS_DBL_RESYNC 0x00000001
|
||||||
|
#define BUS_MSTR_RESET 0x00000002
|
||||||
|
#define BUS_FLUSH_BUF 0x00000004
|
||||||
|
#define BUS_STOP_REQ_DIS 0x00000008
|
||||||
|
#define BUS_ROTATION_DIS 0x00000010
|
||||||
|
#define BUS_MASTER_DIS 0x00000040
|
||||||
|
#define BUS_ROM_WRT_EN 0x00000080
|
||||||
|
#define BUS_DIS_ROM 0x00001000
|
||||||
|
#define BUS_PCI_READ_RETRY_EN 0x00002000
|
||||||
|
#define BUS_AGP_AD_STEPPING_EN 0x00004000
|
||||||
|
#define BUS_PCI_WRT_RETRY_EN 0x00008000
|
||||||
|
#define BUS_MSTR_RD_MULT 0x00100000
|
||||||
|
#define BUS_MSTR_RD_LINE 0x00200000
|
||||||
|
#define BUS_SUSPEND 0x00400000
|
||||||
|
#define LAT_16X 0x00800000
|
||||||
|
#define BUS_RD_DISCARD_EN 0x01000000
|
||||||
|
#define BUS_RD_ABORT_EN 0x02000000
|
||||||
|
#define BUS_MSTR_WS 0x04000000
|
||||||
|
#define BUS_PARKING_DIS 0x08000000
|
||||||
|
#define BUS_MSTR_DISCONNECT_EN 0x10000000
|
||||||
|
#define BUS_WRT_BURST 0x20000000
|
||||||
|
#define BUS_READ_BURST 0x40000000
|
||||||
|
#define BUS_RDY_READ_DLY 0x80000000
|
||||||
|
|
||||||
|
|
||||||
|
/* CLOCK_CNTL_INDEX bit constants */
|
||||||
|
#define PLL_WR_EN 0x00000080
|
||||||
|
|
||||||
|
/* CONFIG_CNTL bit constants */
|
||||||
|
#define CFG_VGA_RAM_EN 0x00000100
|
||||||
|
|
||||||
|
/* CRTC_EXT_CNTL bit constants */
|
||||||
|
#define VGA_ATI_LINEAR 0x00000008
|
||||||
|
#define VGA_128KAP_PAGING 0x00000010
|
||||||
|
#define XCRT_CNT_EN (1 << 6)
|
||||||
|
#define CRTC_HSYNC_DIS (1 << 8)
|
||||||
|
#define CRTC_VSYNC_DIS (1 << 9)
|
||||||
|
#define CRTC_DISPLAY_DIS (1 << 10)
|
||||||
|
#define CRTC_CRT_ON (1 << 15)
|
||||||
|
|
||||||
|
|
||||||
|
/* DSTCACHE_CTLSTAT bit constants */
|
||||||
|
#define RB2D_DC_FLUSH (3 << 0)
|
||||||
|
#define RB2D_DC_FLUSH_ALL 0xf
|
||||||
|
#define RB2D_DC_BUSY (1 << 31)
|
||||||
|
|
||||||
|
|
||||||
|
/* CRTC_GEN_CNTL bit constants */
|
||||||
|
#define CRTC_DBL_SCAN_EN 0x00000001
|
||||||
|
#define CRTC_CUR_EN 0x00010000
|
||||||
|
#define CRTC_INTERLACE_EN (1 << 1)
|
||||||
|
#define CRTC_EXT_DISP_EN (1 << 24)
|
||||||
|
#define CRTC_EN (1 << 25)
|
||||||
|
#define CRTC_DISP_REQ_EN_B (1 << 26)
|
||||||
|
|
||||||
|
/* CRTC_STATUS bit constants */
|
||||||
|
#define CRTC_VBLANK 0x00000001
|
||||||
|
|
||||||
|
/* CRTC2_GEN_CNTL bit constants */
|
||||||
|
#define CRT2_ON (1 << 7)
|
||||||
|
#define CRTC2_DISPLAY_DIS (1 << 23)
|
||||||
|
#define CRTC2_EN (1 << 25)
|
||||||
|
#define CRTC2_DISP_REQ_EN_B (1 << 26)
|
||||||
|
|
||||||
|
/* CUR_OFFSET, CUR_HORZ_VERT_POSN, CUR_HORZ_VERT_OFF bit constants */
|
||||||
|
#define CUR_LOCK 0x80000000
|
||||||
|
|
||||||
|
|
||||||
|
/* FP bit constants */
|
||||||
|
#define FP_CRTC_H_TOTAL_MASK 0x000003ff
|
||||||
|
#define FP_CRTC_H_DISP_MASK 0x01ff0000
|
||||||
|
#define FP_CRTC_V_TOTAL_MASK 0x00000fff
|
||||||
|
#define FP_CRTC_V_DISP_MASK 0x0fff0000
|
||||||
|
#define FP_H_SYNC_STRT_CHAR_MASK 0x00001ff8
|
||||||
|
#define FP_H_SYNC_WID_MASK 0x003f0000
|
||||||
|
#define FP_V_SYNC_STRT_MASK 0x00000fff
|
||||||
|
#define FP_V_SYNC_WID_MASK 0x001f0000
|
||||||
|
#define FP_CRTC_H_TOTAL_SHIFT 0x00000000
|
||||||
|
#define FP_CRTC_H_DISP_SHIFT 0x00000010
|
||||||
|
#define FP_CRTC_V_TOTAL_SHIFT 0x00000000
|
||||||
|
#define FP_CRTC_V_DISP_SHIFT 0x00000010
|
||||||
|
#define FP_H_SYNC_STRT_CHAR_SHIFT 0x00000003
|
||||||
|
#define FP_H_SYNC_WID_SHIFT 0x00000010
|
||||||
|
#define FP_V_SYNC_STRT_SHIFT 0x00000000
|
||||||
|
#define FP_V_SYNC_WID_SHIFT 0x00000010
|
||||||
|
|
||||||
|
/* FP_GEN_CNTL bit constants */
|
||||||
|
#define FP_FPON (1 << 0)
|
||||||
|
#define FP_TMDS_EN (1 << 2)
|
||||||
|
#define FP_EN_TMDS (1 << 7)
|
||||||
|
#define FP_DETECT_SENSE (1 << 8)
|
||||||
|
#define FP_SEL_CRTC2 (1 << 13)
|
||||||
|
#define FP_CRTC_DONT_SHADOW_HPAR (1 << 15)
|
||||||
|
#define FP_CRTC_DONT_SHADOW_VPAR (1 << 16)
|
||||||
|
#define FP_CRTC_DONT_SHADOW_HEND (1 << 17)
|
||||||
|
#define FP_CRTC_USE_SHADOW_VEND (1 << 18)
|
||||||
|
#define FP_RMX_HVSYNC_CONTROL_EN (1 << 20)
|
||||||
|
#define FP_DFP_SYNC_SEL (1 << 21)
|
||||||
|
#define FP_CRTC_LOCK_8DOT (1 << 22)
|
||||||
|
#define FP_CRT_SYNC_SEL (1 << 23)
|
||||||
|
#define FP_USE_SHADOW_EN (1 << 24)
|
||||||
|
#define FP_CRT_SYNC_ALT (1 << 26)
|
||||||
|
|
||||||
|
/* LVDS_GEN_CNTL bit constants */
|
||||||
|
#define LVDS_ON (1 << 0)
|
||||||
|
#define LVDS_DISPLAY_DIS (1 << 1)
|
||||||
|
#define LVDS_PANEL_TYPE (1 << 2)
|
||||||
|
#define LVDS_PANEL_FORMAT (1 << 3)
|
||||||
|
#define LVDS_EN (1 << 7)
|
||||||
|
#define LVDS_BL_MOD_LEVEL_MASK 0x0000ff00
|
||||||
|
#define LVDS_BL_MOD_LEVEL_SHIFT 8
|
||||||
|
#define LVDS_BL_MOD_EN (1 << 16)
|
||||||
|
#define LVDS_DIGON (1 << 18)
|
||||||
|
#define LVDS_BLON (1 << 19)
|
||||||
|
#define LVDS_SEL_CRTC2 (1 << 23)
|
||||||
|
#define LVDS_STATE_MASK \
|
||||||
|
(LVDS_ON | LVDS_DISPLAY_DIS | LVDS_BL_MOD_LEVEL_MASK | \
|
||||||
|
LVDS_EN | LVDS_DIGON | LVDS_BLON)
|
||||||
|
|
||||||
|
/* LVDS_PLL_CNTL bit constatns */
|
||||||
|
#define HSYNC_DELAY_SHIFT 0x1c
|
||||||
|
#define HSYNC_DELAY_MASK (0xf << 0x1c)
|
||||||
|
|
||||||
|
/* TMDS_TRANSMITTER_CNTL bit constants */
|
||||||
|
#define TMDS_PLL_EN (1 << 0)
|
||||||
|
#define TMDS_PLLRST (1 << 1)
|
||||||
|
#define TMDS_RAN_PAT_RST (1 << 7)
|
||||||
|
#define ICHCSEL (1 << 28)
|
||||||
|
|
||||||
|
/* FP_HORZ_STRETCH bit constants */
|
||||||
|
#define HORZ_STRETCH_RATIO_MASK 0xffff
|
||||||
|
#define HORZ_STRETCH_RATIO_MAX 4096
|
||||||
|
#define HORZ_PANEL_SIZE (0x1ff << 16)
|
||||||
|
#define HORZ_PANEL_SHIFT 16
|
||||||
|
#define HORZ_STRETCH_PIXREP (0 << 25)
|
||||||
|
#define HORZ_STRETCH_BLEND (1 << 26)
|
||||||
|
#define HORZ_STRETCH_ENABLE (1 << 25)
|
||||||
|
#define HORZ_AUTO_RATIO (1 << 27)
|
||||||
|
#define HORZ_FP_LOOP_STRETCH (0x7 << 28)
|
||||||
|
#define HORZ_AUTO_RATIO_INC (1 << 31)
|
||||||
|
|
||||||
|
|
||||||
|
/* FP_VERT_STRETCH bit constants */
|
||||||
|
#define VERT_STRETCH_RATIO_MASK 0xfff
|
||||||
|
#define VERT_STRETCH_RATIO_MAX 4096
|
||||||
|
#define VERT_PANEL_SIZE (0xfff << 12)
|
||||||
|
#define VERT_PANEL_SHIFT 12
|
||||||
|
#define VERT_STRETCH_LINREP (0 << 26)
|
||||||
|
#define VERT_STRETCH_BLEND (1 << 26)
|
||||||
|
#define VERT_STRETCH_ENABLE (1 << 25)
|
||||||
|
#define VERT_AUTO_RATIO_EN (1 << 27)
|
||||||
|
#define VERT_FP_LOOP_STRETCH (0x7 << 28)
|
||||||
|
#define VERT_STRETCH_RESERVED 0xf1000000
|
||||||
|
|
||||||
|
/* DAC_CNTL bit constants */
|
||||||
|
#define DAC_8BIT_EN 0x00000100
|
||||||
|
#define DAC_4BPP_PIX_ORDER 0x00000200
|
||||||
|
#define DAC_CRC_EN 0x00080000
|
||||||
|
#define DAC_MASK_ALL (0xff << 24)
|
||||||
|
#define DAC_EXPAND_MODE (1 << 14)
|
||||||
|
#define DAC_VGA_ADR_EN (1 << 13)
|
||||||
|
#define DAC_RANGE_CNTL (3 << 0)
|
||||||
|
#define DAC_BLANKING (1 << 2)
|
||||||
|
|
||||||
|
/* GEN_RESET_CNTL bit constants */
|
||||||
|
#define SOFT_RESET_GUI 0x00000001
|
||||||
|
#define SOFT_RESET_VCLK 0x00000100
|
||||||
|
#define SOFT_RESET_PCLK 0x00000200
|
||||||
|
#define SOFT_RESET_ECP 0x00000400
|
||||||
|
#define SOFT_RESET_DISPENG_XCLK 0x00000800
|
||||||
|
|
||||||
|
/* MEM_CNTL bit constants */
|
||||||
|
#define MEM_CTLR_STATUS_IDLE 0x00000000
|
||||||
|
#define MEM_CTLR_STATUS_BUSY 0x00100000
|
||||||
|
#define MEM_SEQNCR_STATUS_IDLE 0x00000000
|
||||||
|
#define MEM_SEQNCR_STATUS_BUSY 0x00200000
|
||||||
|
#define MEM_ARBITER_STATUS_IDLE 0x00000000
|
||||||
|
#define MEM_ARBITER_STATUS_BUSY 0x00400000
|
||||||
|
#define MEM_REQ_UNLOCK 0x00000000
|
||||||
|
#define MEM_REQ_LOCK 0x00800000
|
||||||
|
|
||||||
|
|
||||||
|
/* RBBM_SOFT_RESET bit constants */
|
||||||
|
#define SOFT_RESET_CP (1 << 0)
|
||||||
|
#define SOFT_RESET_HI (1 << 1)
|
||||||
|
#define SOFT_RESET_SE (1 << 2)
|
||||||
|
#define SOFT_RESET_RE (1 << 3)
|
||||||
|
#define SOFT_RESET_PP (1 << 4)
|
||||||
|
#define SOFT_RESET_E2 (1 << 5)
|
||||||
|
#define SOFT_RESET_RB (1 << 6)
|
||||||
|
#define SOFT_RESET_HDP (1 << 7)
|
||||||
|
|
||||||
|
/* SURFACE_CNTL bit consants */
|
||||||
|
#define SURF_TRANSLATION_DIS (1 << 8)
|
||||||
|
#define NONSURF_AP0_SWP_16BPP (1 << 20)
|
||||||
|
#define NONSURF_AP0_SWP_32BPP (1 << 21)
|
||||||
|
|
||||||
|
/* DEFAULT_SC_BOTTOM_RIGHT bit constants */
|
||||||
|
#define DEFAULT_SC_RIGHT_MAX (0x1fff << 0)
|
||||||
|
#define DEFAULT_SC_BOTTOM_MAX (0x1fff << 16)
|
||||||
|
|
||||||
|
/* MM_INDEX bit constants */
|
||||||
|
#define MM_APER 0x80000000
|
||||||
|
|
||||||
|
/* CLR_CMP_CNTL bit constants */
|
||||||
|
#define COMPARE_SRC_FALSE 0x00000000
|
||||||
|
#define COMPARE_SRC_TRUE 0x00000001
|
||||||
|
#define COMPARE_SRC_NOT_EQUAL 0x00000004
|
||||||
|
#define COMPARE_SRC_EQUAL 0x00000005
|
||||||
|
#define COMPARE_SRC_EQUAL_FLIP 0x00000007
|
||||||
|
#define COMPARE_DST_FALSE 0x00000000
|
||||||
|
#define COMPARE_DST_TRUE 0x00000100
|
||||||
|
#define COMPARE_DST_NOT_EQUAL 0x00000400
|
||||||
|
#define COMPARE_DST_EQUAL 0x00000500
|
||||||
|
#define COMPARE_DESTINATION 0x00000000
|
||||||
|
#define COMPARE_SOURCE 0x01000000
|
||||||
|
#define COMPARE_SRC_AND_DST 0x02000000
|
||||||
|
|
||||||
|
|
||||||
|
/* DP_CNTL bit constants */
|
||||||
|
#define DST_X_RIGHT_TO_LEFT 0x00000000
|
||||||
|
#define DST_X_LEFT_TO_RIGHT 0x00000001
|
||||||
|
#define DST_Y_BOTTOM_TO_TOP 0x00000000
|
||||||
|
#define DST_Y_TOP_TO_BOTTOM 0x00000002
|
||||||
|
#define DST_X_MAJOR 0x00000000
|
||||||
|
#define DST_Y_MAJOR 0x00000004
|
||||||
|
#define DST_X_TILE 0x00000008
|
||||||
|
#define DST_Y_TILE 0x00000010
|
||||||
|
#define DST_LAST_PEL 0x00000020
|
||||||
|
#define DST_TRAIL_X_RIGHT_TO_LEFT 0x00000000
|
||||||
|
#define DST_TRAIL_X_LEFT_TO_RIGHT 0x00000040
|
||||||
|
#define DST_TRAP_FILL_RIGHT_TO_LEFT 0x00000000
|
||||||
|
#define DST_TRAP_FILL_LEFT_TO_RIGHT 0x00000080
|
||||||
|
#define DST_BRES_SIGN 0x00000100
|
||||||
|
#define DST_HOST_BIG_ENDIAN_EN 0x00000200
|
||||||
|
#define DST_POLYLINE_NONLAST 0x00008000
|
||||||
|
#define DST_RASTER_STALL 0x00010000
|
||||||
|
#define DST_POLY_EDGE 0x00040000
|
||||||
|
|
||||||
|
|
||||||
|
/* DP_CNTL_YDIR_XDIR_YMAJOR bit constants (short version of DP_CNTL) */
|
||||||
|
#define DST_X_MAJOR_S 0x00000000
|
||||||
|
#define DST_Y_MAJOR_S 0x00000001
|
||||||
|
#define DST_Y_BOTTOM_TO_TOP_S 0x00000000
|
||||||
|
#define DST_Y_TOP_TO_BOTTOM_S 0x00008000
|
||||||
|
#define DST_X_RIGHT_TO_LEFT_S 0x00000000
|
||||||
|
#define DST_X_LEFT_TO_RIGHT_S 0x80000000
|
||||||
|
|
||||||
|
|
||||||
|
/* DP_DATATYPE bit constants */
|
||||||
|
#define DST_8BPP 0x00000002
|
||||||
|
#define DST_15BPP 0x00000003
|
||||||
|
#define DST_16BPP 0x00000004
|
||||||
|
#define DST_24BPP 0x00000005
|
||||||
|
#define DST_32BPP 0x00000006
|
||||||
|
#define DST_8BPP_RGB332 0x00000007
|
||||||
|
#define DST_8BPP_Y8 0x00000008
|
||||||
|
#define DST_8BPP_RGB8 0x00000009
|
||||||
|
#define DST_16BPP_VYUY422 0x0000000b
|
||||||
|
#define DST_16BPP_YVYU422 0x0000000c
|
||||||
|
#define DST_32BPP_AYUV444 0x0000000e
|
||||||
|
#define DST_16BPP_ARGB4444 0x0000000f
|
||||||
|
#define BRUSH_SOLIDCOLOR 0x00000d00
|
||||||
|
#define SRC_MONO 0x00000000
|
||||||
|
#define SRC_MONO_LBKGD 0x00010000
|
||||||
|
#define SRC_DSTCOLOR 0x00030000
|
||||||
|
#define BYTE_ORDER_MSB_TO_LSB 0x00000000
|
||||||
|
#define BYTE_ORDER_LSB_TO_MSB 0x40000000
|
||||||
|
#define DP_CONVERSION_TEMP 0x80000000
|
||||||
|
#define HOST_BIG_ENDIAN_EN (1 << 29)
|
||||||
|
|
||||||
|
|
||||||
|
/* DP_GUI_MASTER_CNTL bit constants */
|
||||||
|
#define GMC_SRC_PITCH_OFFSET_DEFAULT 0x00000000
|
||||||
|
#define GMC_SRC_PITCH_OFFSET_LEAVE 0x00000001
|
||||||
|
#define GMC_DST_PITCH_OFFSET_DEFAULT 0x00000000
|
||||||
|
#define GMC_DST_PITCH_OFFSET_LEAVE 0x00000002
|
||||||
|
#define GMC_SRC_CLIP_DEFAULT 0x00000000
|
||||||
|
#define GMC_SRC_CLIP_LEAVE 0x00000004
|
||||||
|
#define GMC_DST_CLIP_DEFAULT 0x00000000
|
||||||
|
#define GMC_DST_CLIP_LEAVE 0x00000008
|
||||||
|
#define GMC_BRUSH_8x8MONO 0x00000000
|
||||||
|
#define GMC_BRUSH_8x8MONO_LBKGD 0x00000010
|
||||||
|
#define GMC_BRUSH_8x1MONO 0x00000020
|
||||||
|
#define GMC_BRUSH_8x1MONO_LBKGD 0x00000030
|
||||||
|
#define GMC_BRUSH_1x8MONO 0x00000040
|
||||||
|
#define GMC_BRUSH_1x8MONO_LBKGD 0x00000050
|
||||||
|
#define GMC_BRUSH_32x1MONO 0x00000060
|
||||||
|
#define GMC_BRUSH_32x1MONO_LBKGD 0x00000070
|
||||||
|
#define GMC_BRUSH_32x32MONO 0x00000080
|
||||||
|
#define GMC_BRUSH_32x32MONO_LBKGD 0x00000090
|
||||||
|
#define GMC_BRUSH_8x8COLOR 0x000000a0
|
||||||
|
#define GMC_BRUSH_8x1COLOR 0x000000b0
|
||||||
|
#define GMC_BRUSH_1x8COLOR 0x000000c0
|
||||||
|
#define GMC_BRUSH_SOLID_COLOR 0x000000d0
|
||||||
|
#define GMC_DST_8BPP 0x00000200
|
||||||
|
#define GMC_DST_15BPP 0x00000300
|
||||||
|
#define GMC_DST_16BPP 0x00000400
|
||||||
|
#define GMC_DST_24BPP 0x00000500
|
||||||
|
#define GMC_DST_32BPP 0x00000600
|
||||||
|
#define GMC_DST_8BPP_RGB332 0x00000700
|
||||||
|
#define GMC_DST_8BPP_Y8 0x00000800
|
||||||
|
#define GMC_DST_8BPP_RGB8 0x00000900
|
||||||
|
#define GMC_DST_16BPP_VYUY422 0x00000b00
|
||||||
|
#define GMC_DST_16BPP_YVYU422 0x00000c00
|
||||||
|
#define GMC_DST_32BPP_AYUV444 0x00000e00
|
||||||
|
#define GMC_DST_16BPP_ARGB4444 0x00000f00
|
||||||
|
#define GMC_SRC_MONO 0x00000000
|
||||||
|
#define GMC_SRC_MONO_LBKGD 0x00001000
|
||||||
|
#define GMC_SRC_DSTCOLOR 0x00003000
|
||||||
|
#define GMC_BYTE_ORDER_MSB_TO_LSB 0x00000000
|
||||||
|
#define GMC_BYTE_ORDER_LSB_TO_MSB 0x00004000
|
||||||
|
#define GMC_DP_CONVERSION_TEMP_9300 0x00008000
|
||||||
|
#define GMC_DP_CONVERSION_TEMP_6500 0x00000000
|
||||||
|
#define GMC_DP_SRC_RECT 0x02000000
|
||||||
|
#define GMC_DP_SRC_HOST 0x03000000
|
||||||
|
#define GMC_DP_SRC_HOST_BYTEALIGN 0x04000000
|
||||||
|
#define GMC_3D_FCN_EN_CLR 0x00000000
|
||||||
|
#define GMC_3D_FCN_EN_SET 0x08000000
|
||||||
|
#define GMC_DST_CLR_CMP_FCN_LEAVE 0x00000000
|
||||||
|
#define GMC_DST_CLR_CMP_FCN_CLEAR 0x10000000
|
||||||
|
#define GMC_AUX_CLIP_LEAVE 0x00000000
|
||||||
|
#define GMC_AUX_CLIP_CLEAR 0x20000000
|
||||||
|
#define GMC_WRITE_MASK_LEAVE 0x00000000
|
||||||
|
#define GMC_WRITE_MASK_SET 0x40000000
|
||||||
|
#define GMC_CLR_CMP_CNTL_DIS (1 << 28)
|
||||||
|
#define GMC_SRC_DATATYPE_COLOR (3 << 12)
|
||||||
|
#define ROP3_S 0x00cc0000
|
||||||
|
#define ROP3_SRCCOPY 0x00cc0000
|
||||||
|
#define ROP3_P 0x00f00000
|
||||||
|
#define ROP3_PATCOPY 0x00f00000
|
||||||
|
#define DP_SRC_SOURCE_MASK (7 << 24)
|
||||||
|
#define GMC_BRUSH_NONE (15 << 4)
|
||||||
|
#define DP_SRC_SOURCE_MEMORY (2 << 24)
|
||||||
|
#define GMC_BRUSH_SOLIDCOLOR 0x000000d0
|
||||||
|
|
||||||
|
/* DP_MIX bit constants */
|
||||||
|
#define DP_SRC_RECT 0x00000200
|
||||||
|
#define DP_SRC_HOST 0x00000300
|
||||||
|
#define DP_SRC_HOST_BYTEALIGN 0x00000400
|
||||||
|
|
||||||
|
/* MPLL_CNTL bit constants */
|
||||||
|
#define MPLL_RESET 0x00000001
|
||||||
|
|
||||||
|
/* MDLL_CKO bit constants */
|
||||||
|
#define MDLL_CKO__MCKOA_RESET 0x00000002
|
||||||
|
|
||||||
|
/* VCLK_ECP_CNTL constants */
|
||||||
|
#define PIXCLK_ALWAYS_ONb 0x00000040
|
||||||
|
#define PIXCLK_DAC_ALWAYS_ONb 0x00000080
|
||||||
|
|
||||||
|
/* masks */
|
||||||
|
|
||||||
|
#define CONFIG_MEMSIZE_MASK 0x1f000000
|
||||||
|
#define MEM_CFG_TYPE 0x40000000
|
||||||
|
#define DST_OFFSET_MASK 0x003fffff
|
||||||
|
#define DST_PITCH_MASK 0x3fc00000
|
||||||
|
#define DEFAULT_TILE_MASK 0xc0000000
|
||||||
|
#define PPLL_DIV_SEL_MASK 0x00000300
|
||||||
|
#define PPLL_RESET 0x00000001
|
||||||
|
#define PPLL_ATOMIC_UPDATE_EN 0x00010000
|
||||||
|
#define PPLL_REF_DIV_MASK 0x000003ff
|
||||||
|
#define PPLL_FB3_DIV_MASK 0x000007ff
|
||||||
|
#define PPLL_POST3_DIV_MASK 0x00070000
|
||||||
|
#define PPLL_ATOMIC_UPDATE_R 0x00008000
|
||||||
|
#define PPLL_ATOMIC_UPDATE_W 0x00008000
|
||||||
|
#define PPLL_VGA_ATOMIC_UPDATE_EN 0x00020000
|
||||||
|
|
||||||
|
#define GUI_ACTIVE 0x80000000
|
||||||
|
|
||||||
|
#endif /* _RADEON_H */
|
||||||
|
|
||||||
3370
src/kernel/fbdev/radeonfb/radeonfb.c
Normal file
3370
src/kernel/fbdev/radeonfb/radeonfb.c
Normal file
File diff suppressed because it is too large
Load Diff
15
src/kernel/fbdev/radeonfb/radeonfb.h
Normal file
15
src/kernel/fbdev/radeonfb/radeonfb.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef __LINUX_RADEONFB_H__
|
||||||
|
#define __LINUX_RADEONFB_H__
|
||||||
|
|
||||||
|
#include <asm/ioctl.h>
|
||||||
|
#include <asm/types.h>
|
||||||
|
|
||||||
|
#define ATY_RADEON_LCD_ON 0x00000001
|
||||||
|
#define ATY_RADEON_CRT_ON 0x00000002
|
||||||
|
|
||||||
|
|
||||||
|
#define FBIO_RADEON_GET_MIRROR _IOR('@', 3, sizeof(__u32*))
|
||||||
|
#define FBIO_RADEON_SET_MIRROR _IOW('@', 4, sizeof(__u32*))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# $Id: Makefile.X11,v 1.72 2002/10/29 23:09:40 brianp Exp $
|
# $Id: Makefile.X11,v 1.72.4.1 2002/11/21 14:59:05 brianp Exp $
|
||||||
|
|
||||||
# Mesa 3-D graphics library
|
# Mesa 3-D graphics library
|
||||||
# Version: 5.0
|
# Version: 5.0
|
||||||
@@ -144,6 +144,8 @@ CORE_SOURCES = \
|
|||||||
|
|
||||||
|
|
||||||
DRIVER_SOURCES = \
|
DRIVER_SOURCES = \
|
||||||
|
fbdev/glfbdev.c \
|
||||||
|
miniglx/miniglx.c \
|
||||||
FX/fxapi.c \
|
FX/fxapi.c \
|
||||||
FX/fxdd.c \
|
FX/fxdd.c \
|
||||||
FX/fxddspan.c \
|
FX/fxddspan.c \
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/* $Id: acache.h,v 1.4 2002/10/29 20:28:58 brianp Exp $ */
|
/* $Id: acache.h,v 1.4.4.1 2003/01/10 21:57:42 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 4.1
|
* Version: 5.0
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
@@ -23,10 +23,23 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 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.
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* Authors:
|
|
||||||
* Keith Whitwell <keith@tungstengraphics.com>
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \mainpage Mesa array_cache Module
|
||||||
|
*
|
||||||
|
* The array cache module is used for caching vertex arrays.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file array_cache/acache.h
|
||||||
|
* \brief Array cache functions (for vertex arrays).
|
||||||
|
* \author Keith Whitwell
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _ARRAYCACHE_H
|
#ifndef _ARRAYCACHE_H
|
||||||
#define _ARRAYCACHE_H
|
#define _ARRAYCACHE_H
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user