Compare commits
	
		
			258 Commits
		
	
	
		
			mesa-7.5.1
			...
			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
 | 
			
		||||
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
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
PROJECT_NAME           = "Mesa array_cache"
 | 
			
		||||
PROJECT_NUMBER         = 4.1
 | 
			
		||||
OUTPUT_DIRECTORY       = .
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
OUTPUT_DIRECTORY       = 
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
EXTRACT_ALL            = NO
 | 
			
		||||
EXTRACT_PRIVATE        = NO
 | 
			
		||||
EXTRACT_STATIC         = NO
 | 
			
		||||
EXTRACT_LOCAL_CLASSES  = YES
 | 
			
		||||
@@ -38,14 +38,14 @@ GENERATE_BUGLIST       = YES
 | 
			
		||||
ALIASES                = 
 | 
			
		||||
ENABLED_SECTIONS       = 
 | 
			
		||||
MAX_INITIALIZER_LINES  = 30
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = YES
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = NO
 | 
			
		||||
SHOW_USED_FILES        = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to warning and progress messages
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
QUIET                  = YES
 | 
			
		||||
WARNINGS               = YES
 | 
			
		||||
WARN_IF_UNDOCUMENTED   = YES
 | 
			
		||||
WARN_IF_UNDOCUMENTED   = NO
 | 
			
		||||
WARN_FORMAT            = 
 | 
			
		||||
WARN_LOGFILE           = 
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,12 @@
 | 
			
		||||
# General configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
PROJECT_NAME           = "Mesa Core"
 | 
			
		||||
PROJECT_NUMBER         = 4.1
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
OUTPUT_DIRECTORY       = 
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
EXTRACT_ALL            = NO
 | 
			
		||||
EXTRACT_PRIVATE        = NO
 | 
			
		||||
EXTRACT_STATIC         = NO
 | 
			
		||||
EXTRACT_STATIC         = YES
 | 
			
		||||
EXTRACT_LOCAL_CLASSES  = YES
 | 
			
		||||
HIDE_UNDOC_MEMBERS     = NO
 | 
			
		||||
HIDE_UNDOC_CLASSES     = NO
 | 
			
		||||
@@ -19,7 +19,7 @@ ALWAYS_DETAILED_SEC    = NO
 | 
			
		||||
INLINE_INHERITED_MEMB  = NO
 | 
			
		||||
FULL_PATH_NAMES        = NO
 | 
			
		||||
STRIP_FROM_PATH        = 
 | 
			
		||||
INTERNAL_DOCS          = NO
 | 
			
		||||
INTERNAL_DOCS          = YES
 | 
			
		||||
STRIP_CODE_COMMENTS    = YES
 | 
			
		||||
CASE_SENSE_NAMES       = YES
 | 
			
		||||
SHORT_NAMES            = NO
 | 
			
		||||
@@ -38,24 +38,24 @@ GENERATE_BUGLIST       = YES
 | 
			
		||||
ALIASES                = 
 | 
			
		||||
ENABLED_SECTIONS       = 
 | 
			
		||||
MAX_INITIALIZER_LINES  = 30
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = YES
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = NO
 | 
			
		||||
SHOW_USED_FILES        = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to warning and progress messages
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
QUIET                  = YES
 | 
			
		||||
WARNINGS               = YES
 | 
			
		||||
WARN_IF_UNDOCUMENTED   = YES
 | 
			
		||||
WARN_IF_UNDOCUMENTED   = NO
 | 
			
		||||
WARN_FORMAT            = 
 | 
			
		||||
WARN_LOGFILE           = 
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the input files
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
INPUT                  = ../src/
 | 
			
		||||
FILE_PATTERNS          = *.h *.c
 | 
			
		||||
FILE_PATTERNS          = *.c *.h
 | 
			
		||||
RECURSIVE              = NO
 | 
			
		||||
EXCLUDE                = ../src/glapitemp.h ../src/glapioffsets.h
 | 
			
		||||
EXCLUDE_PATTERNS       = 
 | 
			
		||||
EXCLUDE_PATTERNS       = subset_*
 | 
			
		||||
EXAMPLE_PATH           = 
 | 
			
		||||
EXAMPLE_PATTERNS       = 
 | 
			
		||||
EXAMPLE_RECURSIVE      = NO
 | 
			
		||||
@@ -65,16 +65,16 @@ FILTER_SOURCE_FILES    = NO
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to source browsing
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
SOURCE_BROWSER         = NO
 | 
			
		||||
SOURCE_BROWSER         = YES
 | 
			
		||||
INLINE_SOURCES         = NO
 | 
			
		||||
REFERENCED_BY_RELATION = YES
 | 
			
		||||
REFERENCES_RELATION    = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the alphabetical class index
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
ALPHABETICAL_INDEX     = YES
 | 
			
		||||
ALPHABETICAL_INDEX     = NO
 | 
			
		||||
COLS_IN_ALPHA_INDEX    = 5
 | 
			
		||||
IGNORE_PREFIX          = _
 | 
			
		||||
IGNORE_PREFIX          = 
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the HTML output
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
@@ -132,13 +132,13 @@ GENERATE_AUTOGEN_DEF   = NO
 | 
			
		||||
# Configuration options related to the preprocessor   
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
ENABLE_PREPROCESSING   = YES
 | 
			
		||||
MACRO_EXPANSION        = NO
 | 
			
		||||
EXPAND_ONLY_PREDEF     = NO
 | 
			
		||||
MACRO_EXPANSION        = YES
 | 
			
		||||
EXPAND_ONLY_PREDEF     = YES
 | 
			
		||||
SEARCH_INCLUDES        = YES
 | 
			
		||||
INCLUDE_PATH           = ../include/
 | 
			
		||||
INCLUDE_FILE_PATTERNS  = 
 | 
			
		||||
PREDEFINED             = 
 | 
			
		||||
EXPAND_AS_DEFINED      = 
 | 
			
		||||
PREDEFINED             = _HAVE_FULL_GL=1
 | 
			
		||||
EXPAND_AS_DEFINED      = _glthread_DECLARE_STATIC_MUTEX
 | 
			
		||||
SKIP_FUNCTION_MACROS   = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration::addtions related to external references   
 | 
			
		||||
@@ -148,8 +148,7 @@ TAGFILES		= tnl_dd.tag=../tnl_dd \
 | 
			
		||||
                         math.tag=../math \
 | 
			
		||||
                         swrast.tag=../swrast \
 | 
			
		||||
                         swrast_setup.tag=../swrast_setup \
 | 
			
		||||
                         tnl.tag=../tnl \
 | 
			
		||||
                         array_cache.tag=array_cache
 | 
			
		||||
                         tnl.tag=../tnl
 | 
			
		||||
GENERATE_TAGFILE       = core.tag
 | 
			
		||||
ALLEXTERNALS           = NO
 | 
			
		||||
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,12 +1,12 @@
 | 
			
		||||
<html><head><title>Mesa API docs</title>
 | 
			
		||||
<html><head><title>Mesa Source Code Documentation</title>
 | 
			
		||||
<link href="doxygen.css" rel="stylesheet" type="text/css">
 | 
			
		||||
</head>
 | 
			
		||||
<body><center>
 | 
			
		||||
<a href="../core/index.html">Mesa Core</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="../swrast/index.html">swrast</a> 
 | 
			
		||||
<a href="../swrast_setup/index.html">swrast_setup</a> 
 | 
			
		||||
<a href="../tnl/index.html">tnl</a> 
 | 
			
		||||
<a href="../tnl_dd/index.html">tnl_dd</a> 
 | 
			
		||||
</center>
 | 
			
		||||
</center>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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 array_cache.doxy
 | 
			
		||||
	doxygen math.doxy
 | 
			
		||||
@@ -13,9 +15,30 @@ default:
 | 
			
		||||
	doxygen swrast.doxy
 | 
			
		||||
	doxygen swrast_setup.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:
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,13 +3,13 @@
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# General configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
PROJECT_NAME           = "Mesa math"
 | 
			
		||||
PROJECT_NUMBER         = 4.1
 | 
			
		||||
PROJECT_NAME           = "Mesa math module"
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
OUTPUT_DIRECTORY       = .
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
EXTRACT_PRIVATE        = NO
 | 
			
		||||
EXTRACT_STATIC         = NO
 | 
			
		||||
EXTRACT_STATIC         = YES
 | 
			
		||||
EXTRACT_LOCAL_CLASSES  = YES
 | 
			
		||||
HIDE_UNDOC_MEMBERS     = NO
 | 
			
		||||
HIDE_UNDOC_CLASSES     = NO
 | 
			
		||||
@@ -73,7 +73,7 @@ REFERENCES_RELATION    = YES
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the alphabetical class index
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
ALPHABETICAL_INDEX     = YES
 | 
			
		||||
ALPHABETICAL_INDEX     = NO
 | 
			
		||||
COLS_IN_ALPHA_INDEX    = 5
 | 
			
		||||
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
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
PROJECT_NAME           = "Mesa swrast"
 | 
			
		||||
PROJECT_NUMBER         = 4.1
 | 
			
		||||
PROJECT_NAME           = "Mesa Software Rasterization (swrast)"
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
OUTPUT_DIRECTORY       = 
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
EXTRACT_ALL            = NO
 | 
			
		||||
@@ -19,7 +19,7 @@ ALWAYS_DETAILED_SEC    = NO
 | 
			
		||||
INLINE_INHERITED_MEMB  = NO
 | 
			
		||||
FULL_PATH_NAMES        = NO
 | 
			
		||||
STRIP_FROM_PATH        = 
 | 
			
		||||
INTERNAL_DOCS          = NO
 | 
			
		||||
INTERNAL_DOCS          = YES
 | 
			
		||||
STRIP_CODE_COMMENTS    = YES
 | 
			
		||||
CASE_SENSE_NAMES       = YES
 | 
			
		||||
SHORT_NAMES            = NO
 | 
			
		||||
@@ -38,22 +38,21 @@ GENERATE_BUGLIST       = YES
 | 
			
		||||
ALIASES                = 
 | 
			
		||||
ENABLED_SECTIONS       = 
 | 
			
		||||
MAX_INITIALIZER_LINES  = 30
 | 
			
		||||
OPTIMIZE_OUTPUT_FOR_C  = NO
 | 
			
		||||
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_IF_UNDOCUMENTED   = NO
 | 
			
		||||
WARN_FORMAT            = 
 | 
			
		||||
WARN_LOGFILE           = 
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# configuration options related to the input files
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
INPUT                  = ../src/swrast/
 | 
			
		||||
FILE_PATTERNS          = *.c \
 | 
			
		||||
                         *.h
 | 
			
		||||
FILE_PATTERNS          = *.c *.h
 | 
			
		||||
RECURSIVE              = NO
 | 
			
		||||
EXCLUDE                = 
 | 
			
		||||
EXCLUDE_PATTERNS       = 
 | 
			
		||||
@@ -136,7 +135,7 @@ ENABLE_PREPROCESSING   = YES
 | 
			
		||||
MACRO_EXPANSION        = NO
 | 
			
		||||
EXPAND_ONLY_PREDEF     = NO
 | 
			
		||||
SEARCH_INCLUDES        = YES
 | 
			
		||||
INCLUDE_PATH           = 
 | 
			
		||||
INCLUDE_PATH           = ../include/
 | 
			
		||||
INCLUDE_FILE_PATTERNS  = 
 | 
			
		||||
PREDEFINED             = 
 | 
			
		||||
EXPAND_AS_DEFINED      = 
 | 
			
		||||
@@ -156,7 +155,7 @@ PERL_PATH              =
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# Configuration options related to the dot tool   
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
CLASS_DIAGRAMS         = YES
 | 
			
		||||
CLASS_DIAGRAMS         = NO
 | 
			
		||||
HAVE_DOT               = NO
 | 
			
		||||
CLASS_GRAPH            = YES
 | 
			
		||||
COLLABORATION_GRAPH    = YES
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
# General configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
PROJECT_NAME           = "Mesa swrast_setup"
 | 
			
		||||
PROJECT_NUMBER         = 4.1
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
OUTPUT_DIRECTORY       = 
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,8 @@
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
# General configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
PROJECT_NAME           = "Mesa tnl"
 | 
			
		||||
PROJECT_NUMBER         = 4.1
 | 
			
		||||
PROJECT_NAME           = "Mesa Transform and Lighting (tnl)"
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
OUTPUT_DIRECTORY       = 
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
# General configuration options
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
PROJECT_NAME           = "Mesa tnl_dd"
 | 
			
		||||
PROJECT_NUMBER         = 4.1
 | 
			
		||||
PROJECT_NUMBER         = 
 | 
			
		||||
OUTPUT_DIRECTORY       = 
 | 
			
		||||
OUTPUT_LANGUAGE        = English
 | 
			
		||||
EXTRACT_ALL            = YES
 | 
			
		||||
@@ -52,7 +52,7 @@ WARN_LOGFILE           =
 | 
			
		||||
# configuration options related to the input files
 | 
			
		||||
#---------------------------------------------------------------------------
 | 
			
		||||
INPUT                  = ../src/tnl_dd/
 | 
			
		||||
FILE_PATTERNS          = *.h
 | 
			
		||||
FILE_PATTERNS          = *.c *.h
 | 
			
		||||
RECURSIVE              = YES
 | 
			
		||||
EXCLUDE                = 
 | 
			
		||||
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
 | 
			
		||||
 * 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
 | 
			
		||||
 * 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 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 
 | 
			
		||||
@@ -2423,6 +2423,11 @@ extern "C" {
 | 
			
		||||
#define GL_ACTIVE_STENCIL_FACE_EXT        0x8911
 | 
			
		||||
#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);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef GL_ATI_texture_env_combine3
 | 
			
		||||
#define GL_ATI_texture_env_combine3 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
@@ -295,7 +295,7 @@ extern void glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* GLX 1.4 and later */
 | 
			
		||||
extern void (*glXGetProcAddress(const GLubyte *procname))();
 | 
			
		||||
extern void (*glXGetProcAddress(const GLubyte *procname))( void );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef GLX_GLXEXT_LEGACY
 | 
			
		||||
 
 | 
			
		||||
@@ -58,12 +58,12 @@ typedef struct __GLinterfaceRec __GLinterface;
 | 
			
		||||
** and used by the "operating system".
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** Mode and limit information for a context.  This information is
 | 
			
		||||
** kept around in the context so that values can be used during
 | 
			
		||||
** command execution, and for returning information about the
 | 
			
		||||
** context to the application.
 | 
			
		||||
*/
 | 
			
		||||
/**
 | 
			
		||||
 * Mode and limit information for a context.  This information is
 | 
			
		||||
 * kept around in the context so that values can be used during
 | 
			
		||||
 * command execution, and for returning information about the
 | 
			
		||||
 * context to the application.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct __GLcontextModesRec {
 | 
			
		||||
    GLboolean rgbMode;
 | 
			
		||||
    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.
 | 
			
		||||
@@ -33,8 +33,8 @@ GLfloat Xmin = -4.0, Xmax = 4.0;
 | 
			
		||||
GLfloat Ymin = -3.8, Ymax = 4.0;
 | 
			
		||||
GLfloat G = -0.1;
 | 
			
		||||
 | 
			
		||||
static GLuint 
 | 
			
		||||
make_ball(void)
 | 
			
		||||
static void
 | 
			
		||||
draw_ball(void)
 | 
			
		||||
{
 | 
			
		||||
  GLuint list;
 | 
			
		||||
  GLfloat a, b;
 | 
			
		||||
@@ -43,9 +43,9 @@ make_ball(void)
 | 
			
		||||
  GLuint color;
 | 
			
		||||
  GLfloat x, y, z;
 | 
			
		||||
 | 
			
		||||
  list = glGenLists(1);
 | 
			
		||||
/*   list = glGenLists(1); */
 | 
			
		||||
 | 
			
		||||
  glNewList(list, GL_COMPILE);
 | 
			
		||||
/*   glNewList(list, GL_COMPILE); */
 | 
			
		||||
 | 
			
		||||
  color = 0;
 | 
			
		||||
  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) {
 | 
			
		||||
 | 
			
		||||
      if (color) {
 | 
			
		||||
	glIndexi(RED);
 | 
			
		||||
/* 	glIndexi(RED); */
 | 
			
		||||
        glColor3f(1, 0, 0);
 | 
			
		||||
      } else {
 | 
			
		||||
	glIndexi(WHITE);
 | 
			
		||||
/* 	glIndexi(WHITE); */
 | 
			
		||||
        glColor3f(1, 1, 1);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@@ -77,11 +77,12 @@ make_ball(void)
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  glEndList();
 | 
			
		||||
/*   glEndList(); */
 | 
			
		||||
 | 
			
		||||
  return list;
 | 
			
		||||
/*   return list; */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
reshape(int width, int height)
 | 
			
		||||
{
 | 
			
		||||
@@ -110,19 +111,19 @@ draw(void)
 | 
			
		||||
 | 
			
		||||
  glClear(GL_COLOR_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
  glIndexi(CYAN);
 | 
			
		||||
/*   glIndexi(CYAN); */
 | 
			
		||||
  glColor3f(0, 1, 1);
 | 
			
		||||
  glBegin(GL_LINES);
 | 
			
		||||
  for (i = -5; i <= 5; i++) {
 | 
			
		||||
    glVertex2i(i, -5);
 | 
			
		||||
    glVertex2i(i, 5);
 | 
			
		||||
    glVertex2f(i, -5);
 | 
			
		||||
    glVertex2f(i, 5);
 | 
			
		||||
  }
 | 
			
		||||
  for (i = -5; i <= 5; i++) {
 | 
			
		||||
    glVertex2i(-5, i);
 | 
			
		||||
    glVertex2i(5, i);
 | 
			
		||||
    glVertex2f(-5, i);
 | 
			
		||||
    glVertex2f(5, i);
 | 
			
		||||
  }
 | 
			
		||||
  for (i = -5; i <= 5; i++) {
 | 
			
		||||
    glVertex2i(i, -5);
 | 
			
		||||
    glVertex2f(i, -5);
 | 
			
		||||
    glVertex2f(i * 1.15, -5.9);
 | 
			
		||||
  }
 | 
			
		||||
  glVertex2f(-5.3, -5.35);
 | 
			
		||||
@@ -138,7 +139,8 @@ draw(void)
 | 
			
		||||
  glRotatef(90.0, 1.0, 0.0, 0.0);
 | 
			
		||||
  glRotatef(Zrot, 0.0, 0.0, 1.0);
 | 
			
		||||
 | 
			
		||||
  glCallList(Ball);
 | 
			
		||||
/*   glCallList(Ball); */
 | 
			
		||||
  draw_ball();
 | 
			
		||||
 | 
			
		||||
  glPopMatrix();
 | 
			
		||||
 | 
			
		||||
@@ -198,7 +200,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
 | 
			
		||||
 | 
			
		||||
  glutCreateWindow("Bounce");
 | 
			
		||||
  Ball = make_ball();
 | 
			
		||||
/*   Ball = make_ball(); */
 | 
			
		||||
  glCullFace(GL_BACK);
 | 
			
		||||
  glEnable(GL_CULL_FACE);
 | 
			
		||||
  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.
 | 
			
		||||
@@ -59,7 +59,7 @@ gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
 | 
			
		||||
 | 
			
		||||
  glShadeModel(GL_FLAT);
 | 
			
		||||
 | 
			
		||||
  glNormal3f(0.0, 0.0, 1.0);
 | 
			
		||||
/*   glNormal3f(0.0, 0.0, 1.0); */
 | 
			
		||||
 | 
			
		||||
  /* draw front face */
 | 
			
		||||
  glBegin(GL_QUAD_STRIP);
 | 
			
		||||
@@ -87,7 +87,7 @@ gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
 | 
			
		||||
  }
 | 
			
		||||
  glEnd();
 | 
			
		||||
 | 
			
		||||
  glNormal3f(0.0, 0.0, -1.0);
 | 
			
		||||
/*   glNormal3f(0.0, 0.0, -1.0); */
 | 
			
		||||
 | 
			
		||||
  /* draw back face */
 | 
			
		||||
  glBegin(GL_QUAD_STRIP);
 | 
			
		||||
@@ -127,18 +127,18 @@ gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
 | 
			
		||||
    len = sqrt(u * u + v * v);
 | 
			
		||||
    u /= 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);
 | 
			
		||||
    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);
 | 
			
		||||
    u = r1 * cos(angle + 3 * da) - r2 * cos(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);
 | 
			
		||||
    glNormal3f(cos(angle), sin(angle), 0.0);
 | 
			
		||||
/*     glNormal3f(cos(angle), sin(angle), 0.0); */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
 | 
			
		||||
  /* draw inside radius cylinder */
 | 
			
		||||
  glColor3f( .5, .5, .5 );
 | 
			
		||||
  glBegin(GL_QUAD_STRIP);
 | 
			
		||||
  for (i = 0; i <= teeth; i++) {
 | 
			
		||||
    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);
 | 
			
		||||
  }
 | 
			
		||||
@@ -167,6 +168,11 @@ static GLfloat angle = 0.0;
 | 
			
		||||
static 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);
 | 
			
		||||
 | 
			
		||||
  glPushMatrix();
 | 
			
		||||
@@ -177,19 +183,23 @@ draw(void)
 | 
			
		||||
    glPushMatrix();
 | 
			
		||||
      glTranslatef(-3.0, -2.0, 0.0);
 | 
			
		||||
      glRotatef(angle, 0.0, 0.0, 1.0);
 | 
			
		||||
      glCallList(gear1);
 | 
			
		||||
      glColor3fv( red);
 | 
			
		||||
      gear(1.0, 4.0, 1.0, 20, 0.7);
 | 
			
		||||
    glPopMatrix();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    glPushMatrix();
 | 
			
		||||
      glTranslatef(3.1, -2.0, 0.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();
 | 
			
		||||
 | 
			
		||||
    glPushMatrix();
 | 
			
		||||
      glTranslatef(-3.1, 4.2, 0.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();
 | 
			
		||||
@@ -284,37 +294,15 @@ static void
 | 
			
		||||
init(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  glLightfv(GL_LIGHT0, GL_POSITION, pos);
 | 
			
		||||
  glEnable(GL_CULL_FACE);
 | 
			
		||||
  glEnable(GL_LIGHTING);
 | 
			
		||||
  glEnable(GL_LIGHT0);
 | 
			
		||||
  glEnable(GL_DEPTH_TEST);
 | 
			
		||||
/*   glLightfv(GL_LIGHT0, GL_POSITION, pos); */
 | 
			
		||||
   glEnable(GL_CULL_FACE); 
 | 
			
		||||
/*   glEnable(GL_LIGHTING); */
 | 
			
		||||
/*   glEnable(GL_LIGHT0); */
 | 
			
		||||
/*   glEnable(GL_DEPTH_TEST); */
 | 
			
		||||
 | 
			
		||||
  /* make the gears */
 | 
			
		||||
  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);
 | 
			
		||||
/*   glEnable(GL_NORMALIZE); */
 | 
			
		||||
 | 
			
		||||
  for ( i=1; i<argc; i++ ) {
 | 
			
		||||
    if (strcmp(argv[i], "-info")==0) {
 | 
			
		||||
@@ -345,7 +333,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
  glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
 | 
			
		||||
 | 
			
		||||
  glutInitWindowPosition(0, 0);
 | 
			
		||||
  glutInitWindowSize(300, 300);
 | 
			
		||||
  glutInitWindowSize(900, 900);
 | 
			
		||||
  glutCreateWindow("Gears");
 | 
			
		||||
  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.
 | 
			
		||||
@@ -37,7 +37,7 @@
 | 
			
		||||
#define GL_GLEXT_LEGACY
 | 
			
		||||
#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 LIT		0x00000001
 | 
			
		||||
@@ -484,7 +484,7 @@ static void draw_surface( unsigned int with_state )
 | 
			
		||||
	    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col[j]);
 | 
			
		||||
	    glBegin( GL_TRIANGLES );
 | 
			
		||||
	    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] );
 | 
			
		||||
	    }
 | 
			
		||||
	    glEnd();
 | 
			
		||||
@@ -492,7 +492,7 @@ static void draw_surface( unsigned int with_state )
 | 
			
		||||
      } else {
 | 
			
		||||
	 glBegin( GL_TRIANGLES );
 | 
			
		||||
	 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] );
 | 
			
		||||
	 }
 | 
			
		||||
	 glEnd();
 | 
			
		||||
@@ -506,7 +506,7 @@ static void draw_surface( unsigned int with_state )
 | 
			
		||||
       */
 | 
			
		||||
      glBegin( GL_POINTS );
 | 
			
		||||
      for ( i = 0 ; i < numuniq ; i++ ) {
 | 
			
		||||
         glNormal3fv( &compressed_data[i][3] );
 | 
			
		||||
         glColor3fv( &compressed_data[i][3] );
 | 
			
		||||
         glVertex3fv( &compressed_data[i][0] );
 | 
			
		||||
      }
 | 
			
		||||
      glEnd();
 | 
			
		||||
@@ -515,7 +515,7 @@ static void draw_surface( unsigned int with_state )
 | 
			
		||||
   case (GLVERTEX|STRIPS):
 | 
			
		||||
      glBegin( GL_TRIANGLE_STRIP );
 | 
			
		||||
      for (i=0;i<numverts;i++) {
 | 
			
		||||
         glNormal3fv( &data[i][3] );
 | 
			
		||||
         glColor3fv( &data[i][0] );
 | 
			
		||||
         glVertex3fv( &data[i][0] );
 | 
			
		||||
      }
 | 
			
		||||
      glEnd();
 | 
			
		||||
@@ -595,24 +595,24 @@ static void InitMaterials(void)
 | 
			
		||||
    static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
 | 
			
		||||
    static float lmodel_twoside[] = {GL_FALSE};
 | 
			
		||||
 | 
			
		||||
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
 | 
			
		||||
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
 | 
			
		||||
    glLightfv(GL_LIGHT0, GL_POSITION, position0);
 | 
			
		||||
    glEnable(GL_LIGHT0);
 | 
			
		||||
/*     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); */
 | 
			
		||||
/*     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); */
 | 
			
		||||
/*     glLightfv(GL_LIGHT0, GL_POSITION, position0); */
 | 
			
		||||
/*     glEnable(GL_LIGHT0); */
 | 
			
		||||
 | 
			
		||||
    glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
 | 
			
		||||
    glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
 | 
			
		||||
    glLightfv(GL_LIGHT1, GL_POSITION, position1);
 | 
			
		||||
    glEnable(GL_LIGHT1);
 | 
			
		||||
/*     glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); */
 | 
			
		||||
/*     glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); */
 | 
			
		||||
/*     glLightfv(GL_LIGHT1, GL_POSITION, position1); */
 | 
			
		||||
/*     glEnable(GL_LIGHT1); */
 | 
			
		||||
 | 
			
		||||
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
 | 
			
		||||
    glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
 | 
			
		||||
/*     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); */
 | 
			
		||||
/*     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); */
 | 
			
		||||
 | 
			
		||||
    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_DIFFUSE, front_mat_diffuse);
 | 
			
		||||
/*     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_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("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
 | 
			
		||||
 | 
			
		||||
@@ -827,9 +768,9 @@ static void Init(int argc, char *argv[])
 | 
			
		||||
   plane[3] = 0.0;
 | 
			
		||||
 | 
			
		||||
   glClearColor(0.0, 0.0, 1.0, 0.0);
 | 
			
		||||
   glEnable( GL_DEPTH_TEST );
 | 
			
		||||
   glEnable( GL_VERTEX_ARRAY_EXT );
 | 
			
		||||
   glEnable( GL_NORMAL_ARRAY_EXT );
 | 
			
		||||
/*    glEnable( GL_DEPTH_TEST ); */
 | 
			
		||||
/*    glEnable( GL_VERTEX_ARRAY_EXT ); */
 | 
			
		||||
/*    glEnable( GL_NORMAL_ARRAY_EXT ); */
 | 
			
		||||
 | 
			
		||||
   glMatrixMode(GL_PROJECTION);
 | 
			
		||||
   glLoadIdentity();
 | 
			
		||||
@@ -837,24 +778,24 @@ static void Init(int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
   glMatrixMode(GL_MODELVIEW);
 | 
			
		||||
   glLoadIdentity();
 | 
			
		||||
   glClipPlane(GL_CLIP_PLANE0, plane);
 | 
			
		||||
/*    glClipPlane(GL_CLIP_PLANE0, plane); */
 | 
			
		||||
 | 
			
		||||
   InitMaterials();
 | 
			
		||||
 | 
			
		||||
   set_matrix();
 | 
			
		||||
 | 
			
		||||
   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_T, 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); */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* Green fog is easy to see */
 | 
			
		||||
   glFogi(GL_FOG_MODE,GL_EXP2);
 | 
			
		||||
   glFogfv(GL_FOG_COLOR,fogColor);
 | 
			
		||||
   glFogf(GL_FOG_DENSITY,0.15);
 | 
			
		||||
   glHint(GL_FOG_HINT,GL_DONT_CARE);
 | 
			
		||||
/*    glFogi(GL_FOG_MODE,GL_EXP2); */
 | 
			
		||||
/*    glFogfv(GL_FOG_COLOR,fogColor); */
 | 
			
		||||
/*    glFogf(GL_FOG_DENSITY,0.15); */
 | 
			
		||||
/*    glHint(GL_FOG_HINT,GL_DONT_CARE); */
 | 
			
		||||
 | 
			
		||||
   {
 | 
			
		||||
      static int firsttime = 1;
 | 
			
		||||
@@ -864,15 +805,15 @@ static void Init(int argc, char *argv[])
 | 
			
		||||
	 expand_arrays();
 | 
			
		||||
	 make_tri_indices();
 | 
			
		||||
 | 
			
		||||
	 if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
 | 
			
		||||
	    printf("Error: couldn't load texture image\n");
 | 
			
		||||
	    exit(1);
 | 
			
		||||
	 }
 | 
			
		||||
/* 	 if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) { */
 | 
			
		||||
/* 	    printf("Error: couldn't load texture image\n"); */
 | 
			
		||||
/* 	    exit(1); */
 | 
			
		||||
/* 	 } */
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   ModeMenu(SHADE_SMOOTH|
 | 
			
		||||
	    LIT|
 | 
			
		||||
	    UNLIT|
 | 
			
		||||
	    POINT_FILTER|
 | 
			
		||||
	    NO_USER_CLIP|
 | 
			
		||||
	    NO_MATERIALS|
 | 
			
		||||
@@ -1121,6 +1062,9 @@ int main(int argc, char **argv)
 | 
			
		||||
   glutSpecialFunc(SpecialKey);
 | 
			
		||||
   glutDisplayFunc(Display);
 | 
			
		||||
 | 
			
		||||
/*    Benchmark(5,0); */
 | 
			
		||||
/*    Benchmark(5,0); */
 | 
			
		||||
/*    Benchmark(5,0); */
 | 
			
		||||
   glutMainLoop();
 | 
			
		||||
   return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@ static GLfloat terraincolor[256 * 256][3];
 | 
			
		||||
 | 
			
		||||
static int win = 0;
 | 
			
		||||
 | 
			
		||||
static int fog = 1;
 | 
			
		||||
static int fog = 0;
 | 
			
		||||
static int bfcull = 1;
 | 
			
		||||
static int usetex = 1;
 | 
			
		||||
static int poutline = 0;
 | 
			
		||||
@@ -105,6 +105,21 @@ calcposobs(void)
 | 
			
		||||
      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
 | 
			
		||||
reshape(int width, int height)
 | 
			
		||||
{
 | 
			
		||||
@@ -113,7 +128,7 @@ reshape(int width, int height)
 | 
			
		||||
   glViewport(0, 0, (GLint) width, (GLint) height);
 | 
			
		||||
   glMatrixMode(GL_PROJECTION);
 | 
			
		||||
   glLoadIdentity();
 | 
			
		||||
   gluPerspective(50.0, ((GLfloat) width / (GLfloat) height),
 | 
			
		||||
   perspective(50.0, ((GLfloat) width / (GLfloat) height),
 | 
			
		||||
		  lenghtXmnt * stepYmnt * 0.01, lenghtXmnt * stepYmnt * 0.7);
 | 
			
		||||
   glMatrixMode(GL_MODELVIEW);
 | 
			
		||||
   glLoadIdentity();
 | 
			
		||||
@@ -209,13 +224,25 @@ printstring(void *font, char *string)
 | 
			
		||||
      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
 | 
			
		||||
printhelp(void)
 | 
			
		||||
{
 | 
			
		||||
   glEnable(GL_BLEND);
 | 
			
		||||
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 | 
			
		||||
   glColor4f(0.0, 0.0, 0.0, 0.5);
 | 
			
		||||
   glRecti(40, 40, 600, 440);
 | 
			
		||||
   _subset_Rectf(40, 40, 600, 440);
 | 
			
		||||
   glDisable(GL_BLEND);
 | 
			
		||||
 | 
			
		||||
   glColor3f(1.0, 0.0, 0.0);
 | 
			
		||||
@@ -351,6 +378,87 @@ dojoy(void)
 | 
			
		||||
#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
 | 
			
		||||
drawscene(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -359,24 +467,24 @@ drawscene(void)
 | 
			
		||||
   dojoy();
 | 
			
		||||
 | 
			
		||||
   glShadeModel(GL_SMOOTH);
 | 
			
		||||
   glEnable(GL_DEPTH_TEST);
 | 
			
		||||
/*    glEnable(GL_DEPTH_TEST); */
 | 
			
		||||
 | 
			
		||||
   if (usetex)
 | 
			
		||||
      glEnable(GL_TEXTURE_2D);
 | 
			
		||||
   else
 | 
			
		||||
      glDisable(GL_TEXTURE_2D);
 | 
			
		||||
 | 
			
		||||
   if (fog)
 | 
			
		||||
      glEnable(GL_FOG);
 | 
			
		||||
   else
 | 
			
		||||
      glDisable(GL_FOG);
 | 
			
		||||
/*    if (fog) */
 | 
			
		||||
/*       glEnable(GL_FOG); */
 | 
			
		||||
/*    else */
 | 
			
		||||
/*       glDisable(GL_FOG); */
 | 
			
		||||
 | 
			
		||||
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
   glPushMatrix();
 | 
			
		||||
 | 
			
		||||
   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],
 | 
			
		||||
	     0.0, 1.0, 0.0);
 | 
			
		||||
 | 
			
		||||
@@ -384,8 +492,8 @@ drawscene(void)
 | 
			
		||||
   glPopMatrix();
 | 
			
		||||
 | 
			
		||||
   glDisable(GL_TEXTURE_2D);
 | 
			
		||||
   glDisable(GL_DEPTH_TEST);
 | 
			
		||||
   glDisable(GL_FOG);
 | 
			
		||||
/*    glDisable(GL_DEPTH_TEST); */
 | 
			
		||||
/*    glDisable(GL_FOG); */
 | 
			
		||||
   glShadeModel(GL_FLAT);
 | 
			
		||||
 | 
			
		||||
   glMatrixMode(GL_PROJECTION);
 | 
			
		||||
@@ -549,7 +657,7 @@ calccolor(GLfloat height, GLfloat c[3])
 | 
			
		||||
static void
 | 
			
		||||
loadpic(void)
 | 
			
		||||
{
 | 
			
		||||
   GLubyte bufferter[256 * 256], terrainpic[256 * 256];
 | 
			
		||||
   GLubyte bufferter[256 * 256], terrainpic[256 * 256][4];
 | 
			
		||||
   FILE *FilePic;
 | 
			
		||||
   int i, tmp;
 | 
			
		||||
   GLenum gluerr;
 | 
			
		||||
@@ -565,25 +673,23 @@ loadpic(void)
 | 
			
		||||
      terrain[i] = (bufferter[i] * (heightMnt / 255.0f));
 | 
			
		||||
      calccolor((GLfloat) bufferter[i], terraincolor[i]);
 | 
			
		||||
      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);
 | 
			
		||||
   if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, 256, 256, GL_LUMINANCE,
 | 
			
		||||
				   GL_UNSIGNED_BYTE,
 | 
			
		||||
				   (GLvoid *) (&terrainpic[0])))) {
 | 
			
		||||
      fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
 | 
			
		||||
      exit(-1);
 | 
			
		||||
   }
 | 
			
		||||
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_RGBA, 256, 256, GL_RGBA,
 | 
			
		||||
		GL_UNSIGNED_BYTE, (GLvoid *) terrainpic);
 | 
			
		||||
 | 
			
		||||
   glTexParameterf(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_S, GL_REPEAT);
 | 
			
		||||
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 | 
			
		||||
 | 
			
		||||
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
 | 
			
		||||
		   GL_LINEAR_MIPMAP_LINEAR);
 | 
			
		||||
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 | 
			
		||||
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 | 
			
		||||
   glTexParameteri(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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -593,21 +699,21 @@ init(void)
 | 
			
		||||
   float fogcolor[4] = { 0.6, 0.7, 0.7, 1.0 };
 | 
			
		||||
 | 
			
		||||
   glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
 | 
			
		||||
   glClearDepth(1.0);
 | 
			
		||||
   glDepthFunc(GL_LEQUAL);
 | 
			
		||||
/*    glClearDepth(1.0); */
 | 
			
		||||
/*    glDepthFunc(GL_LEQUAL); */
 | 
			
		||||
   glShadeModel(GL_SMOOTH);
 | 
			
		||||
   glEnable(GL_DEPTH_TEST);
 | 
			
		||||
/*    glEnable(GL_DEPTH_TEST); */
 | 
			
		||||
   glEnable(GL_CULL_FACE);
 | 
			
		||||
 | 
			
		||||
   glDisable(GL_BLEND);
 | 
			
		||||
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 | 
			
		||||
 | 
			
		||||
   glEnable(GL_FOG);
 | 
			
		||||
   glFogi(GL_FOG_MODE, GL_EXP2);
 | 
			
		||||
   glFogfv(GL_FOG_COLOR, fogcolor);
 | 
			
		||||
   glFogf(GL_FOG_DENSITY, 0.0007);
 | 
			
		||||
/*    glEnable(GL_FOG); */
 | 
			
		||||
/*    glFogi(GL_FOG_MODE, GL_EXP2); */
 | 
			
		||||
/*    glFogfv(GL_FOG_COLOR, fogcolor); */
 | 
			
		||||
/*    glFogf(GL_FOG_DENSITY, 0.0007); */
 | 
			
		||||
#ifdef FX
 | 
			
		||||
   glHint(GL_FOG_HINT, GL_NICEST);
 | 
			
		||||
/*    glHint(GL_FOG_HINT, GL_NICEST); */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   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.
 | 
			
		||||
@@ -17,7 +17,7 @@ static GLuint Window = 0;
 | 
			
		||||
 | 
			
		||||
static GLuint TexObj[2];
 | 
			
		||||
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)
 | 
			
		||||
@@ -34,7 +34,7 @@ static GLboolean UseObj = GL_FALSE;
 | 
			
		||||
 | 
			
		||||
static void draw( void )
 | 
			
		||||
{
 | 
			
		||||
   glDepthFunc(GL_EQUAL);
 | 
			
		||||
/*    glDepthFunc(GL_EQUAL); */
 | 
			
		||||
   /*   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );*/
 | 
			
		||||
   glClear( GL_COLOR_BUFFER_BIT );
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +50,7 @@ static void draw( void )
 | 
			
		||||
#endif
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      glCallList( TexObj[0] );
 | 
			
		||||
/*       glCallList( TexObj[0] ); */
 | 
			
		||||
   }
 | 
			
		||||
   glBegin( GL_POLYGON );
 | 
			
		||||
   glTexCoord2f( 0.0, 0.0 );   glVertex2f( -1.0, -1.0 );
 | 
			
		||||
@@ -70,7 +70,7 @@ static void draw( void )
 | 
			
		||||
#endif
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      glCallList( TexObj[1] );
 | 
			
		||||
/*       glCallList( TexObj[1] ); */
 | 
			
		||||
   }
 | 
			
		||||
   glBegin( GL_POLYGON );
 | 
			
		||||
   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, 0, 0, 0, 0, 0, 0 };
 | 
			
		||||
 | 
			
		||||
   GLubyte tex[64][3];
 | 
			
		||||
   GLubyte tex[64][4];
 | 
			
		||||
   GLint i, j;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -156,7 +156,7 @@ static void init( void )
 | 
			
		||||
   /* Setup texturing */
 | 
			
		||||
   glEnable( GL_TEXTURE_2D );
 | 
			
		||||
   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 */
 | 
			
		||||
@@ -166,19 +166,19 @@ static void init( void )
 | 
			
		||||
#endif
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      TexObj[0] = glGenLists(2);
 | 
			
		||||
      TexObj[1] = TexObj[0]+1;
 | 
			
		||||
/*       TexObj[0] = glGenLists(2); */
 | 
			
		||||
/*       TexObj[1] = TexObj[0]+1; */
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* setup first texture object */
 | 
			
		||||
   if (UseObj) {
 | 
			
		||||
#ifdef TEXTURE_OBJECT
 | 
			
		||||
      glBindTexture( GL_TEXTURE_2D, TexObj[0] );
 | 
			
		||||
      assert(glIsTexture(TexObj[0]));
 | 
			
		||||
/*       assert(glIsTexture(TexObj[0])); */
 | 
			
		||||
#endif
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      glNewList( TexObj[0], GL_COMPILE );
 | 
			
		||||
/*       glNewList( TexObj[0], GL_COMPILE ); */
 | 
			
		||||
   }
 | 
			
		||||
   /* red on white */
 | 
			
		||||
   for (i=0;i<height;i++) {
 | 
			
		||||
@@ -190,17 +190,18 @@ static void init( void )
 | 
			
		||||
         else {
 | 
			
		||||
            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,
 | 
			
		||||
                 GL_RGB, GL_UNSIGNED_BYTE, tex );
 | 
			
		||||
   glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
 | 
			
		||||
                 GL_RGBA, GL_UNSIGNED_BYTE, tex );
 | 
			
		||||
   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_WRAP_S, GL_REPEAT );
 | 
			
		||||
   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
 | 
			
		||||
   if (!UseObj) {
 | 
			
		||||
      glEndList();
 | 
			
		||||
/*       glEndList(); */
 | 
			
		||||
   }
 | 
			
		||||
   /* end of texture object */
 | 
			
		||||
 | 
			
		||||
@@ -208,12 +209,12 @@ static void init( void )
 | 
			
		||||
   if (UseObj) {
 | 
			
		||||
#ifdef TEXTURE_OBJECT
 | 
			
		||||
      glBindTexture( GL_TEXTURE_2D, TexObj[1] );
 | 
			
		||||
      assert(glIsTexture(TexObj[1]));
 | 
			
		||||
/*       assert(glIsTexture(TexObj[1])); */
 | 
			
		||||
#endif
 | 
			
		||||
      assert(!glIsTexture(TexObj[1] + 999));
 | 
			
		||||
/*       assert(!glIsTexture(TexObj[1] + 999)); */
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      glNewList( TexObj[1], GL_COMPILE );
 | 
			
		||||
/*       glNewList( TexObj[1], GL_COMPILE ); */
 | 
			
		||||
   }
 | 
			
		||||
   /* green on blue */
 | 
			
		||||
   for (i=0;i<height;i++) {
 | 
			
		||||
@@ -227,14 +228,14 @@ static void init( void )
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
 | 
			
		||||
                 GL_RGB, GL_UNSIGNED_BYTE, tex );
 | 
			
		||||
   glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
 | 
			
		||||
                 GL_RGBA, GL_UNSIGNED_BYTE, tex );
 | 
			
		||||
   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_WRAP_S, GL_REPEAT );
 | 
			
		||||
   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
 | 
			
		||||
   if (!UseObj) {
 | 
			
		||||
      glEndList();
 | 
			
		||||
/*       glEndList(); */
 | 
			
		||||
   }
 | 
			
		||||
   /* end texture object */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -498,7 +498,7 @@ main(int ac, char **av)
 | 
			
		||||
   glEnable(GL_CULL_FACE);
 | 
			
		||||
   glEnable(GL_TEXTURE_2D);
 | 
			
		||||
 | 
			
		||||
   glEnable(GL_FOG);
 | 
			
		||||
/*    glEnable(GL_FOG); */
 | 
			
		||||
   glFogi(GL_FOG_MODE, GL_EXP2);
 | 
			
		||||
   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);
 | 
			
		||||
    glClearIndex(0.0);
 | 
			
		||||
/*     glClearIndex(0.0); */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void Reshape(int width, int height)
 | 
			
		||||
@@ -140,14 +140,14 @@ static void Draw(void)
 | 
			
		||||
    mapIA[0] = 1.0;
 | 
			
		||||
    mapIA[1] = 1.0;
 | 
			
		||||
    
 | 
			
		||||
    glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, mapIR);
 | 
			
		||||
    glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, mapI);
 | 
			
		||||
    glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, mapI);
 | 
			
		||||
    glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, mapIA);
 | 
			
		||||
    glPixelTransferi(GL_MAP_COLOR, GL_TRUE);
 | 
			
		||||
/*     glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, mapIR); */
 | 
			
		||||
/*     glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, mapI); */
 | 
			
		||||
/*     glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, mapI); */
 | 
			
		||||
/*     glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, mapIA); */
 | 
			
		||||
/*     glPixelTransferi(GL_MAP_COLOR, GL_TRUE); */
 | 
			
		||||
    
 | 
			
		||||
    SetColor(COLOR_WHITE);
 | 
			
		||||
    glRasterPos3fv(boxA);
 | 
			
		||||
    glRasterPos2fv(boxA);
 | 
			
		||||
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 24);
 | 
			
		||||
    glPixelStorei(GL_UNPACK_SKIP_PIXELS, 8);
 | 
			
		||||
    glPixelStorei(GL_UNPACK_SKIP_ROWS, 2);
 | 
			
		||||
@@ -162,28 +162,28 @@ static void Draw(void)
 | 
			
		||||
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 | 
			
		||||
 | 
			
		||||
    SetColor(COLOR_WHITE);
 | 
			
		||||
    glRasterPos3fv(boxB);
 | 
			
		||||
    glRasterPos2fv(boxB);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
	     OpenGL_bits1);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
	     OpenGL_bits2);
 | 
			
		||||
 | 
			
		||||
    SetColor(COLOR_YELLOW);
 | 
			
		||||
    glRasterPos3fv(boxC);
 | 
			
		||||
    glRasterPos2fv(boxC);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
	     OpenGL_bits1);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
	     OpenGL_bits2);
 | 
			
		||||
 | 
			
		||||
    SetColor(COLOR_CYAN);
 | 
			
		||||
    glRasterPos3fv(boxD);
 | 
			
		||||
    glRasterPos2fv(boxD);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
	     OpenGL_bits1);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
	     OpenGL_bits2);
 | 
			
		||||
 | 
			
		||||
    SetColor(COLOR_RED);
 | 
			
		||||
    glRasterPos3fv(boxE);
 | 
			
		||||
    glRasterPos2fv(boxE);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
	     OpenGL_bits1);
 | 
			
		||||
    glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
 | 
			
		||||
 
 | 
			
		||||
@@ -620,19 +620,19 @@ static void Init(void)
 | 
			
		||||
    GLint i;
 | 
			
		||||
 | 
			
		||||
    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_ALIGNMENT, 1);
 | 
			
		||||
    for (i = 0; i < 7; i++) {
 | 
			
		||||
	exp_lists[i] = glGenLists(1);
 | 
			
		||||
	glNewList(exp_lists[i], GL_COMPILE);
 | 
			
		||||
	    glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
 | 
			
		||||
	glEndList();
 | 
			
		||||
/* 	exp_lists[i] = glGenLists(1); */
 | 
			
		||||
/* 	glNewList(exp_lists[i], GL_COMPILE); */
 | 
			
		||||
/* 	    glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]); */
 | 
			
		||||
/* 	glEndList(); */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    abuse = GL_FALSE;
 | 
			
		||||
    useLists = GL_TRUE;
 | 
			
		||||
    useLists = GL_FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void Reshape(int width, int height)
 | 
			
		||||
@@ -696,10 +696,10 @@ static void Draw(void)
 | 
			
		||||
		SetColor(COLOR_RED);
 | 
			
		||||
		break;
 | 
			
		||||
	    }
 | 
			
		||||
	    glRasterPos3i((j*3)%5, (j*3)%8, 0);
 | 
			
		||||
	    glRasterPos2i((j*3)%5, (j*3)%8);
 | 
			
		||||
 | 
			
		||||
	    if (useLists) {
 | 
			
		||||
	    	glCallList(exp_lists[i]); 
 | 
			
		||||
/* 	    	glCallList(exp_lists[i]);  */
 | 
			
		||||
	    } else {
 | 
			
		||||
		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++) {
 | 
			
		||||
	    SetColor(COLOR_BLACK);
 | 
			
		||||
	    glRasterPos3i((j*3)%5, (j*3)%8, 0);
 | 
			
		||||
	    glRasterPos2i((j*3)%5, (j*3)%8);
 | 
			
		||||
	    if (useLists) {
 | 
			
		||||
		glCallList(exp_lists[i]); 
 | 
			
		||||
/* 		glCallList(exp_lists[i]);  */
 | 
			
		||||
	    } else {
 | 
			
		||||
		glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
 | 
			
		||||
	    }
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ static void Init(void)
 | 
			
		||||
    GLint i;
 | 
			
		||||
 | 
			
		||||
    glClearColor(0.0, 0.0, 0.0, 0.0);
 | 
			
		||||
    glClearIndex(0.0);
 | 
			
		||||
/*     glClearIndex(0.0); */
 | 
			
		||||
 | 
			
		||||
    if (!rgb) {
 | 
			
		||||
	for (i = 0; i < 16; i++) {
 | 
			
		||||
@@ -71,7 +71,7 @@ static void Init(void)
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    glPolygonStipple(stippleBits);
 | 
			
		||||
/*     glPolygonStipple(stippleBits); */
 | 
			
		||||
 | 
			
		||||
    antiAlias = GL_FALSE;
 | 
			
		||||
    stipple = GL_FALSE;
 | 
			
		||||
@@ -135,11 +135,11 @@ static void Draw(void)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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.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.0, -25.0);
 | 
			
		||||
 
 | 
			
		||||
@@ -141,13 +141,13 @@ static void Draw(void)
 | 
			
		||||
    for (i = 0; i < 360; i += 5) {
 | 
			
		||||
	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);
 | 
			
		||||
	    glVertex3fv(pntA);
 | 
			
		||||
	    glVertex3fv(pntB);
 | 
			
		||||
	glEnd();
 | 
			
		||||
 | 
			
		||||
	glPointSize(1);
 | 
			
		||||
/* 	glPointSize(1); */
 | 
			
		||||
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glBegin(GL_POINTS);
 | 
			
		||||
@@ -199,7 +199,7 @@ int main(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
    glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
 | 
			
		||||
 | 
			
		||||
    windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
 | 
			
		||||
    windType = GLUT_RGB;
 | 
			
		||||
    windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
 | 
			
		||||
    glutInitDisplayMode(windType);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -151,11 +151,11 @@ static void Draw(void)
 | 
			
		||||
	glDisable(GL_POINT_SMOOTH);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    glPointSize(size);
 | 
			
		||||
/*     glPointSize(size); */
 | 
			
		||||
    if (mode) {
 | 
			
		||||
	(rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_ANTI_ALIAS_RED);
 | 
			
		||||
       glColor3f(1.0, 0.0, 0.0);
 | 
			
		||||
    } else {
 | 
			
		||||
	(rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_RED);
 | 
			
		||||
       glColor3f(1.0, 0.0, 0.0);
 | 
			
		||||
    }
 | 
			
		||||
    glBegin(GL_POINTS);
 | 
			
		||||
	glVertex3fv(point);
 | 
			
		||||
@@ -164,7 +164,7 @@ static void Draw(void)
 | 
			
		||||
    glDisable(GL_POINT_SMOOTH);
 | 
			
		||||
    glDisable(GL_BLEND);
 | 
			
		||||
 | 
			
		||||
    glPointSize(1);
 | 
			
		||||
/*     glPointSize(1); */
 | 
			
		||||
    SetColor(COLOR_GREEN);
 | 
			
		||||
    glBegin(GL_POINTS);
 | 
			
		||||
	glVertex3fv(point);
 | 
			
		||||
 
 | 
			
		||||
@@ -52,27 +52,27 @@ static void Reshape(int width, int height)
 | 
			
		||||
    windH = (GLint)height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void RotateColorMask(void)
 | 
			
		||||
static void RotateRestoreColorMask( int rotate )
 | 
			
		||||
{
 | 
			
		||||
    static GLint rotation = 0;
 | 
			
		||||
    
 | 
			
		||||
    rotation = (rotation + 1) & 0x3;
 | 
			
		||||
    if (rotate) rotation = (rotation + 1) & 0x3;
 | 
			
		||||
    switch (rotation) {
 | 
			
		||||
      case 0:
 | 
			
		||||
	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 | 
			
		||||
	glIndexMask( 0xff );
 | 
			
		||||
/* 	glIndexMask( 0xff ); */
 | 
			
		||||
	break;
 | 
			
		||||
      case 1:
 | 
			
		||||
	glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
 | 
			
		||||
	glIndexMask(0xFE);
 | 
			
		||||
/* 	glIndexMask(0xFE); */
 | 
			
		||||
	break;
 | 
			
		||||
      case 2:
 | 
			
		||||
	glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
 | 
			
		||||
	glIndexMask(0xFD);
 | 
			
		||||
/* 	glIndexMask(0xFD); */
 | 
			
		||||
	break;
 | 
			
		||||
      case 3:
 | 
			
		||||
	glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
 | 
			
		||||
	glIndexMask(0xFB);
 | 
			
		||||
/* 	glIndexMask(0xFB); */
 | 
			
		||||
	break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -90,7 +90,7 @@ static void Key(unsigned char key, int x, int y)
 | 
			
		||||
	mode2 = !mode2;
 | 
			
		||||
	break;
 | 
			
		||||
      case '3':
 | 
			
		||||
	RotateColorMask();
 | 
			
		||||
	RotateRestoreColorMask( 1 );
 | 
			
		||||
	break;
 | 
			
		||||
      default:
 | 
			
		||||
	return;
 | 
			
		||||
@@ -126,18 +126,18 @@ static void Point(void)
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_POINTS);
 | 
			
		||||
	SetColor(COLOR_WHITE);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	for (i = 1; i < 8; i++) {
 | 
			
		||||
	    GLint j = i * 2;
 | 
			
		||||
	    SetColor(COLOR_BLACK+i);
 | 
			
		||||
	    glVertex2i(-j, -j);
 | 
			
		||||
	    glVertex2i(-j, 0);
 | 
			
		||||
	    glVertex2i(-j, j);
 | 
			
		||||
	    glVertex2i(0, j);
 | 
			
		||||
	    glVertex2i(j, j);
 | 
			
		||||
	    glVertex2i(j, 0);
 | 
			
		||||
	    glVertex2i(j, -j);
 | 
			
		||||
	    glVertex2i(0, -j);
 | 
			
		||||
	    glVertex2f(-j, -j);
 | 
			
		||||
	    glVertex2f(-j, 0);
 | 
			
		||||
	    glVertex2f(-j, j);
 | 
			
		||||
	    glVertex2f(0, j);
 | 
			
		||||
	    glVertex2f(j, j);
 | 
			
		||||
	    glVertex2f(j, 0);
 | 
			
		||||
	    glVertex2f(j, -j);
 | 
			
		||||
	    glVertex2f(0, -j);
 | 
			
		||||
	}
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
@@ -152,8 +152,8 @@ static void Lines(void)
 | 
			
		||||
    for (i = 1; i < 8; i++) {
 | 
			
		||||
	SetColor(COLOR_BLACK+i);
 | 
			
		||||
	glBegin(GL_LINES);
 | 
			
		||||
	    glVertex2i(-boxW/4, -boxH/4);
 | 
			
		||||
	    glVertex2i(boxW/4, boxH/4);
 | 
			
		||||
	    glVertex2f(-boxW/4, -boxH/4);
 | 
			
		||||
	    glVertex2f(boxW/4, boxH/4);
 | 
			
		||||
	glEnd();
 | 
			
		||||
	glTranslatef(4, 0, 0);
 | 
			
		||||
    }
 | 
			
		||||
@@ -161,7 +161,7 @@ static void Lines(void)
 | 
			
		||||
    glPopMatrix();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_LINES);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -180,7 +180,7 @@ static void LineStrip(void)
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_LINE_STRIP);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -218,11 +218,11 @@ static void LineLoop(void)
 | 
			
		||||
 | 
			
		||||
    SetColor(COLOR_GREEN);
 | 
			
		||||
    glBegin(GL_POINTS);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_LINE_LOOP);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -231,16 +231,16 @@ static void Bitmap(void)
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_LINES);
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glVertex2i(-boxW/2, 0);
 | 
			
		||||
	glVertex2i(boxW/2, 0);
 | 
			
		||||
	glVertex2i(0, -boxH/2);
 | 
			
		||||
	glVertex2i(0, boxH/2);
 | 
			
		||||
	glVertex2f(-boxW/2, 0);
 | 
			
		||||
	glVertex2f(boxW/2, 0);
 | 
			
		||||
	glVertex2f(0, -boxH/2);
 | 
			
		||||
	glVertex2f(0, boxH/2);
 | 
			
		||||
	SetColor(COLOR_RED);
 | 
			
		||||
	glVertex2i(0, -3);
 | 
			
		||||
	glVertex2i(0, -3+OPENGL_HEIGHT);
 | 
			
		||||
	glVertex2f(0, -3);
 | 
			
		||||
	glVertex2f(0, -3+OPENGL_HEIGHT);
 | 
			
		||||
	SetColor(COLOR_BLUE);
 | 
			
		||||
	glVertex2i(0, -3);
 | 
			
		||||
	glVertex2i(OPENGL_WIDTH, -3);
 | 
			
		||||
	glVertex2f(0, -3);
 | 
			
		||||
	glVertex2f(OPENGL_WIDTH, -3);
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    SetColor(COLOR_GREEN);
 | 
			
		||||
@@ -257,23 +257,23 @@ static void Triangles(void)
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_TRIANGLES);
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glVertex2i(-boxW/4, -boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_RED);
 | 
			
		||||
	glVertex2i(-boxW/8, -boxH/16);
 | 
			
		||||
	glVertex2f(-boxW/8, -boxH/16);
 | 
			
		||||
	SetColor(COLOR_BLUE);
 | 
			
		||||
	glVertex2i(boxW/8, -boxH/16);
 | 
			
		||||
	glVertex2f(boxW/8, -boxH/16);
 | 
			
		||||
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glVertex2i(-boxW/4, boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, boxH/4);
 | 
			
		||||
	SetColor(COLOR_RED);
 | 
			
		||||
	glVertex2i(-boxW/8, boxH/16);
 | 
			
		||||
	glVertex2f(-boxW/8, boxH/16);
 | 
			
		||||
	SetColor(COLOR_BLUE);
 | 
			
		||||
	glVertex2i(boxW/8, boxH/16);
 | 
			
		||||
	glVertex2f(boxW/8, boxH/16);
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_TRIANGLES);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2i(-100, 100);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	glVertex2f(-100, 100);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -282,28 +282,28 @@ static void TriangleStrip(void)
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_TRIANGLE_STRIP);
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glVertex2i(-boxW/4, -boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_RED);
 | 
			
		||||
	glVertex2i(-boxW/4, boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, boxH/4);
 | 
			
		||||
	SetColor(COLOR_BLUE);
 | 
			
		||||
	glVertex2i(0, -boxH/4);
 | 
			
		||||
	glVertex2f(0, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_WHITE);
 | 
			
		||||
	glVertex2i(0, boxH/4);
 | 
			
		||||
	glVertex2f(0, boxH/4);
 | 
			
		||||
	SetColor(COLOR_CYAN);
 | 
			
		||||
	glVertex2i(boxW/4, -boxH/4);
 | 
			
		||||
	glVertex2f(boxW/4, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_YELLOW);
 | 
			
		||||
	glVertex2i(boxW/4, boxH/4);
 | 
			
		||||
	glVertex2f(boxW/4, boxH/4);
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_TRIANGLE_STRIP);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2i(-100, 100);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	glVertex2f(-100, 100);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void TriangleFan(void)
 | 
			
		||||
{
 | 
			
		||||
    GLint vx[8][2];
 | 
			
		||||
    GLfloat vx[8][2];
 | 
			
		||||
    GLint x0, y0, x1, y1, x2, y2, x3, y3;
 | 
			
		||||
    GLint i;
 | 
			
		||||
 | 
			
		||||
@@ -327,16 +327,16 @@ static void TriangleFan(void)
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_TRIANGLE_FAN);
 | 
			
		||||
	SetColor(COLOR_WHITE);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	for (i = 0; i < 8; i++) {
 | 
			
		||||
	    SetColor(COLOR_WHITE-i);
 | 
			
		||||
	    glVertex2iv(vx[i]);
 | 
			
		||||
	    glVertex2fv(vx[i]);
 | 
			
		||||
	}
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_TRIANGLE_FAN);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2i(-100, 100);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	glVertex2f(-100, 100);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -344,12 +344,12 @@ static void Rect(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    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)
 | 
			
		||||
{
 | 
			
		||||
    GLint vx[8][2];
 | 
			
		||||
    GLfloat vx[8][2];
 | 
			
		||||
    GLint x0, y0, x1, y1, x2, y2, x3, y3;
 | 
			
		||||
    GLint i;
 | 
			
		||||
 | 
			
		||||
@@ -374,13 +374,13 @@ static void PolygonFunc(void)
 | 
			
		||||
    glBegin(GL_POLYGON);
 | 
			
		||||
	for (i = 0; i < 8; i++) {
 | 
			
		||||
	    SetColor(COLOR_WHITE-i);
 | 
			
		||||
	    glVertex2iv(vx[i]);
 | 
			
		||||
	    glVertex2fv(vx[i]);
 | 
			
		||||
	}
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_POLYGON);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2i(100, 100);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	glVertex2f(100, 100);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -389,28 +389,28 @@ static void Quads(void)
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_QUADS);
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glVertex2i(-boxW/4, -boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_RED);
 | 
			
		||||
	glVertex2i(-boxW/8, -boxH/16);
 | 
			
		||||
	glVertex2f(-boxW/8, -boxH/16);
 | 
			
		||||
	SetColor(COLOR_BLUE);
 | 
			
		||||
	glVertex2i(boxW/8, -boxH/16);
 | 
			
		||||
	glVertex2f(boxW/8, -boxH/16);
 | 
			
		||||
	SetColor(COLOR_WHITE);
 | 
			
		||||
	glVertex2i(boxW/4, -boxH/4);
 | 
			
		||||
	glVertex2f(boxW/4, -boxH/4);
 | 
			
		||||
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glVertex2i(-boxW/4, boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, boxH/4);
 | 
			
		||||
	SetColor(COLOR_RED);
 | 
			
		||||
	glVertex2i(-boxW/8, boxH/16);
 | 
			
		||||
	glVertex2f(-boxW/8, boxH/16);
 | 
			
		||||
	SetColor(COLOR_BLUE);
 | 
			
		||||
	glVertex2i(boxW/8, boxH/16);
 | 
			
		||||
	glVertex2f(boxW/8, boxH/16);
 | 
			
		||||
	SetColor(COLOR_WHITE);
 | 
			
		||||
	glVertex2i(boxW/4, boxH/4);
 | 
			
		||||
	glVertex2f(boxW/4, boxH/4);
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_QUADS);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2i(100, 100);
 | 
			
		||||
	glVertex2i(-100, 100);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	glVertex2f(100, 100);
 | 
			
		||||
	glVertex2f(-100, 100);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -419,41 +419,43 @@ static void QuadStrip(void)
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_QUAD_STRIP);
 | 
			
		||||
	SetColor(COLOR_GREEN);
 | 
			
		||||
	glVertex2i(-boxW/4, -boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_RED);
 | 
			
		||||
	glVertex2i(-boxW/4, boxH/4);
 | 
			
		||||
	glVertex2f(-boxW/4, boxH/4);
 | 
			
		||||
	SetColor(COLOR_BLUE);
 | 
			
		||||
	glVertex2i(0, -boxH/4);
 | 
			
		||||
	glVertex2f(0, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_WHITE);
 | 
			
		||||
	glVertex2i(0, boxH/4);
 | 
			
		||||
	glVertex2f(0, boxH/4);
 | 
			
		||||
	SetColor(COLOR_CYAN);
 | 
			
		||||
	glVertex2i(boxW/4, -boxH/4);
 | 
			
		||||
	glVertex2f(boxW/4, -boxH/4);
 | 
			
		||||
	SetColor(COLOR_YELLOW);
 | 
			
		||||
	glVertex2i(boxW/4, boxH/4);
 | 
			
		||||
	glVertex2f(boxW/4, boxH/4);
 | 
			
		||||
    glEnd();
 | 
			
		||||
 | 
			
		||||
    glBegin(GL_QUAD_STRIP);
 | 
			
		||||
	glVertex2i(0, 0);
 | 
			
		||||
	glVertex2i(100, 100);
 | 
			
		||||
	glVertex2i(-100, 100);
 | 
			
		||||
	glVertex2f(0, 0);
 | 
			
		||||
	glVertex2f(100, 100);
 | 
			
		||||
	glVertex2f(-100, 100);
 | 
			
		||||
    glEnd();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void Draw(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
   fprintf(stderr, "%s\n", __FUNCTION__);
 | 
			
		||||
   
 | 
			
		||||
    glViewport(0, 0, windW, windH);
 | 
			
		||||
    glDisable(GL_SCISSOR_TEST);
 | 
			
		||||
 | 
			
		||||
    glPushAttrib(GL_COLOR_BUFFER_BIT);
 | 
			
		||||
/*     glPushAttrib(GL_COLOR_BUFFER_BIT); */
 | 
			
		||||
 | 
			
		||||
    glColorMask(1, 1, 1, 1);
 | 
			
		||||
    glIndexMask(~0);
 | 
			
		||||
/*     glIndexMask(~0); */
 | 
			
		||||
 | 
			
		||||
    glClearColor(0.0, 0.0, 0.0, 0.0);
 | 
			
		||||
    glClear(GL_COLOR_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
    glPopAttrib();
 | 
			
		||||
/*     glPopAttrib(); */
 | 
			
		||||
    RotateRestoreColorMask( 0 );
 | 
			
		||||
 | 
			
		||||
    if (mode1) {
 | 
			
		||||
	glShadeModel(GL_SMOOTH);
 | 
			
		||||
@@ -461,11 +463,11 @@ static void Draw(void)
 | 
			
		||||
	glShadeModel(GL_FLAT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (mode2) {
 | 
			
		||||
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 | 
			
		||||
    } else {
 | 
			
		||||
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 | 
			
		||||
    }
 | 
			
		||||
/*     if (mode2) { */
 | 
			
		||||
/* 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); */
 | 
			
		||||
/*     } else { */
 | 
			
		||||
/* 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */
 | 
			
		||||
/*     } */
 | 
			
		||||
 | 
			
		||||
    Viewport(0, 0); Point();
 | 
			
		||||
    Viewport(0, 1); Lines();
 | 
			
		||||
@@ -478,10 +480,13 @@ static void Draw(void)
 | 
			
		||||
    Viewport(1, 2); Triangles();
 | 
			
		||||
    Viewport(1, 3); TriangleStrip();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Viewport(2, 0); Rect();
 | 
			
		||||
    Viewport(2, 1); PolygonFunc();
 | 
			
		||||
    Viewport(2, 2); Quads();
 | 
			
		||||
    Viewport(2, 3); QuadStrip();
 | 
			
		||||
    if (0) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    glFlush();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -255,7 +255,6 @@ static void Key(unsigned char key, int x, int y)
 | 
			
		||||
 | 
			
		||||
void Draw(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    MoveStars();
 | 
			
		||||
    ShowStars();
 | 
			
		||||
    if (nitro > 0) {
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,8 @@ static void SetColor(int c)
 | 
			
		||||
{
 | 
			
		||||
    if (glutGet(GLUT_WINDOW_RGBA))
 | 
			
		||||
        glColor3fv(RGBMap[c]);
 | 
			
		||||
    else
 | 
			
		||||
        glIndexf(c);
 | 
			
		||||
/*     else */
 | 
			
		||||
/*         glIndexf(c); */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void InitMap(void)
 | 
			
		||||
 
 | 
			
		||||
@@ -278,12 +278,12 @@ static void Draw(void)
 | 
			
		||||
	EndPrim();
 | 
			
		||||
 | 
			
		||||
	if (showVerticies) {
 | 
			
		||||
	    (rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1);
 | 
			
		||||
	    glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2);
 | 
			
		||||
	    (rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2);
 | 
			
		||||
	    glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2);
 | 
			
		||||
	    (rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3);
 | 
			
		||||
	    glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2);
 | 
			
		||||
	    glColor3fv(RGBMap[COLOR_RED]);
 | 
			
		||||
/* 	    glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2); */
 | 
			
		||||
	    glColor3fv(RGBMap[COLOR_GREEN]);
 | 
			
		||||
/* 	    glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2); */
 | 
			
		||||
	    glColor3fv(RGBMap[COLOR_BLUE]);
 | 
			
		||||
/* 	    glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2); */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	glPopMatrix();
 | 
			
		||||
@@ -306,7 +306,7 @@ static void Draw(void)
 | 
			
		||||
    glScalef(zoom, zoom, zoom);
 | 
			
		||||
    glRotatef(zRotation, 0,0,1);
 | 
			
		||||
 | 
			
		||||
    glPointSize(10);
 | 
			
		||||
/*     glPointSize(10); */
 | 
			
		||||
    glLineWidth(5);
 | 
			
		||||
    glEnable(GL_POINT_SMOOTH);
 | 
			
		||||
    glEnable(GL_LINE_STIPPLE);
 | 
			
		||||
@@ -314,15 +314,15 @@ static void Draw(void)
 | 
			
		||||
 | 
			
		||||
    SetColor(COLOR_RED);
 | 
			
		||||
    BeginPrim();
 | 
			
		||||
	(rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1);
 | 
			
		||||
	glColor3fv(RGBMap[COLOR_RED]);
 | 
			
		||||
	glVertex3fv(p0);
 | 
			
		||||
	(rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2);
 | 
			
		||||
	glColor3fv(RGBMap[COLOR_GREEN]);
 | 
			
		||||
	glVertex3fv(p1);
 | 
			
		||||
	(rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3);
 | 
			
		||||
	glColor3fv(RGBMap[COLOR_BLUE]);
 | 
			
		||||
	glVertex3fv(p2);
 | 
			
		||||
    EndPrim();
 | 
			
		||||
 | 
			
		||||
    glPointSize(1);
 | 
			
		||||
/*     glPointSize(1); */
 | 
			
		||||
    glLineWidth(1);
 | 
			
		||||
    glDisable(GL_POINT_SMOOTH);
 | 
			
		||||
    glDisable(GL_LINE_STIPPLE);
 | 
			
		||||
 
 | 
			
		||||
@@ -6,26 +6,9 @@
 | 
			
		||||
 | 
			
		||||
CC = gcc
 | 
			
		||||
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 \
 | 
			
		||||
	cva \
 | 
			
		||||
	dinoshade \
 | 
			
		||||
	fogcoord \
 | 
			
		||||
	getprocaddress \
 | 
			
		||||
	manytex \
 | 
			
		||||
	multipal \
 | 
			
		||||
	projtex \
 | 
			
		||||
	seccolor \
 | 
			
		||||
	sharedtex \
 | 
			
		||||
	stencilwrap \
 | 
			
		||||
	texline \
 | 
			
		||||
	texwrap \
 | 
			
		||||
	vptest1 \
 | 
			
		||||
	vptest2 \
 | 
			
		||||
	vptest3 \
 | 
			
		||||
	vptorus \
 | 
			
		||||
	vpwarpmesh
 | 
			
		||||
PROGS = miniglxtest miniglxsample manytex texline
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
##### RULES #####
 | 
			
		||||
@@ -45,10 +28,3 @@ clean:
 | 
			
		||||
	rm -f $(PROGS)
 | 
			
		||||
	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
 | 
			
		||||
@@ -191,8 +191,8 @@ static void Init( void )
 | 
			
		||||
 | 
			
		||||
      glBindTexture(GL_TEXTURE_2D, TextureID[i]);
 | 
			
		||||
 | 
			
		||||
      if (i < LowPriorityCount)
 | 
			
		||||
         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.5F);
 | 
			
		||||
/*       if (i < LowPriorityCount) */
 | 
			
		||||
/*          glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.5F); */
 | 
			
		||||
 | 
			
		||||
      if (RandomSize) {
 | 
			
		||||
#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.
 | 
			
		||||
@@ -59,7 +59,7 @@ static void Display( void )
 | 
			
		||||
            y = t * 2.0 - 1.0;
 | 
			
		||||
            if (!Texture)
 | 
			
		||||
               glColor3f(1, 0, 1);
 | 
			
		||||
            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, t, s);
 | 
			
		||||
/*             glMultiTexCoord2fARB(GL_TEXTURE1_ARB, t, s); */
 | 
			
		||||
            glTexCoord2f(s, t);
 | 
			
		||||
            glVertex2f(x, y);
 | 
			
		||||
         }
 | 
			
		||||
@@ -73,12 +73,12 @@ static void Display( void )
 | 
			
		||||
         if (!Texture)
 | 
			
		||||
            glColor3f(1, 0, 1);
 | 
			
		||||
         glTexCoord2f(t, 0.0);
 | 
			
		||||
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, t);
 | 
			
		||||
/*          glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, t); */
 | 
			
		||||
         glVertex2f(x, -1.0);
 | 
			
		||||
         if (!Texture)
 | 
			
		||||
            glColor3f(0, 1, 0);
 | 
			
		||||
         glTexCoord2f(t, 1.0);
 | 
			
		||||
         glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, t);
 | 
			
		||||
/*          glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, t); */
 | 
			
		||||
         glVertex2f(x, 1.0);
 | 
			
		||||
      }
 | 
			
		||||
      glEnd();
 | 
			
		||||
@@ -127,22 +127,22 @@ static void Key( unsigned char key, int x, int y )
 | 
			
		||||
         if (Texture > 2)
 | 
			
		||||
            Texture = 0;
 | 
			
		||||
         if (Texture == 0) {
 | 
			
		||||
            glActiveTextureARB(GL_TEXTURE0_ARB);
 | 
			
		||||
            glDisable(GL_TEXTURE_2D);
 | 
			
		||||
            glActiveTextureARB(GL_TEXTURE1_ARB);
 | 
			
		||||
/*             glActiveTextureARB(GL_TEXTURE0_ARB); */
 | 
			
		||||
            glDisable(GL_TEXTURE_2D);
 | 
			
		||||
/*             glActiveTextureARB(GL_TEXTURE1_ARB); */
 | 
			
		||||
/*             glDisable(GL_TEXTURE_2D); */
 | 
			
		||||
         }
 | 
			
		||||
         else if (Texture == 1) {
 | 
			
		||||
            glActiveTextureARB(GL_TEXTURE0_ARB);
 | 
			
		||||
/*             glActiveTextureARB(GL_TEXTURE0_ARB); */
 | 
			
		||||
            glEnable(GL_TEXTURE_2D);
 | 
			
		||||
            glActiveTextureARB(GL_TEXTURE1_ARB);
 | 
			
		||||
            glDisable(GL_TEXTURE_2D);
 | 
			
		||||
/*             glActiveTextureARB(GL_TEXTURE1_ARB); */
 | 
			
		||||
/*             glDisable(GL_TEXTURE_2D); */
 | 
			
		||||
         }
 | 
			
		||||
         else {
 | 
			
		||||
            glActiveTextureARB(GL_TEXTURE0_ARB);
 | 
			
		||||
            glEnable(GL_TEXTURE_2D);
 | 
			
		||||
            glActiveTextureARB(GL_TEXTURE1_ARB);
 | 
			
		||||
/*             glActiveTextureARB(GL_TEXTURE0_ARB); */
 | 
			
		||||
            glEnable(GL_TEXTURE_2D);
 | 
			
		||||
/*             glActiveTextureARB(GL_TEXTURE1_ARB); */
 | 
			
		||||
/*             glEnable(GL_TEXTURE_2D); */
 | 
			
		||||
         }
 | 
			
		||||
         break;
 | 
			
		||||
      case 'w':
 | 
			
		||||
@@ -212,8 +212,8 @@ static void SpecialKey( int key, int x, int y )
 | 
			
		||||
static void Init( int argc, char *argv[] )
 | 
			
		||||
{
 | 
			
		||||
   GLuint u;
 | 
			
		||||
   for (u = 0; u < 2; u++) {
 | 
			
		||||
      glActiveTextureARB(GL_TEXTURE0_ARB + u);
 | 
			
		||||
   for (u = 0; u < 1; u++) {
 | 
			
		||||
/*       glActiveTextureARB(GL_TEXTURE0_ARB + u); */
 | 
			
		||||
      glBindTexture(GL_TEXTURE_2D, 10+u);
 | 
			
		||||
      if (u == 0)
 | 
			
		||||
         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 <stdio.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/keysym.h>
 | 
			
		||||
#include <GL/gl.h>
 | 
			
		||||
#include <GL/glx.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define BENCHMARK
 | 
			
		||||
@@ -346,13 +352,18 @@ make_window( Display *dpy, const char *name,
 | 
			
		||||
   attr.background_pixel = 0;
 | 
			
		||||
   attr.border_pixel = 0;
 | 
			
		||||
   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;
 | 
			
		||||
 | 
			
		||||
   win = XCreateWindow( dpy, root, 0, 0, width, height,
 | 
			
		||||
		        0, visinfo->depth, InputOutput,
 | 
			
		||||
		        visinfo->visual, mask, &attr );
 | 
			
		||||
 | 
			
		||||
#if !USE_MINI_GLX
 | 
			
		||||
   /* set hints and properties */
 | 
			
		||||
   {
 | 
			
		||||
      XSizeHints sizehints;
 | 
			
		||||
@@ -365,6 +376,7 @@ make_window( Display *dpy, const char *name,
 | 
			
		||||
      XSetStandardProperties(dpy, win, name, name,
 | 
			
		||||
                              None, (char **)NULL, 0, &sizehints);
 | 
			
		||||
   }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   ctx = glXCreateContext( dpy, visinfo, NULL, True );
 | 
			
		||||
   if (!ctx) {
 | 
			
		||||
@@ -382,7 +394,12 @@ make_window( Display *dpy, const char *name,
 | 
			
		||||
static void
 | 
			
		||||
event_loop(Display *dpy, Window win)
 | 
			
		||||
{
 | 
			
		||||
#if USE_MINI_GLX
 | 
			
		||||
   reshape(300, 300);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   while (1) {
 | 
			
		||||
#if !USE_MINI_GLX
 | 
			
		||||
      while (XPending(dpy) > 0) {
 | 
			
		||||
         XEvent event;
 | 
			
		||||
         XNextEvent(dpy, &event);
 | 
			
		||||
@@ -421,6 +438,7 @@ event_loop(Display *dpy, Window win)
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
      /* next frame */
 | 
			
		||||
      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
 | 
			
		||||
# Version:  5.0
 | 
			
		||||
@@ -144,6 +144,8 @@ CORE_SOURCES = \
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DRIVER_SOURCES = \
 | 
			
		||||
	fbdev/glfbdev.c \
 | 
			
		||||
	miniglx/miniglx.c \
 | 
			
		||||
	FX/fxapi.c \
 | 
			
		||||
	FX/fxdd.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
 | 
			
		||||
 * Version:  4.1
 | 
			
		||||
 * Version:  5.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 * 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
 | 
			
		||||
#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