diff options
347 files changed, 18954 insertions, 15308 deletions
diff --git a/SConstruct b/SConstruct index 4785e39ec5..e7c10fcf52 100644 --- a/SConstruct +++ b/SConstruct @@ -65,7 +65,7 @@ platform = env['platform']  # derived options  x86 = machine == 'x86'  gcc = platform in ('linux', 'freebsd', 'darwin') -msvc = platform in ('win32', 'winddk') +msvc = platform in ('windows', 'winddk')  Export([  	'debug',  @@ -84,8 +84,6 @@ Export([  # TODO: put the compiler specific settings in separate files  # TODO: auto-detect as much as possible -common.generate(env) -  if platform == 'winddk':  	env.Tool('winddk', ['.']) @@ -96,37 +94,7 @@ if platform == 'winddk':  		env['CRT_INC_PATH'],  	]) -# Optimization flags -if gcc: -	if debug: -		env.Append(CFLAGS = '-O0 -g3') -		env.Append(CXXFLAGS = '-O0 -g3') -	else: -		env.Append(CFLAGS = '-O3 -g3') -		env.Append(CXXFLAGS = '-O3 -g3') - -	env.Append(CFLAGS = '-Wall -Wmissing-prototypes -Wno-long-long -ffast-math -pedantic') -	env.Append(CXXFLAGS = '-Wall -pedantic') -	 -	# Be nice to Eclipse -	env.Append(CFLAGS = '-fmessage-length=0') -	env.Append(CXXFLAGS = '-fmessage-length=0') - -if msvc: -	cflags = [ -		#'/Wp64', # enable 64 bit porting warnings -	] -	env.Append(CFLAGS = cflags) -	env.Append(CXXFLAGS = cflags) -	# Put debugging information in a separate .pdb file for each object file as -	# descrived in the scons manpage -	env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb' - -# Defines -if debug: -	env.Append(CPPDEFINES = ['DEBUG']) -else: -	env.Append(CPPDEFINES = ['NDEBUG']) +common.generate(env)  # Includes @@ -140,12 +108,6 @@ env.Append(CPPPATH = [  # x86 assembly  if x86: -	env.Append(CPPDEFINES = [ -		'USE_X86_ASM',  -		'USE_MMX_ASM', -		'USE_3DNOW_ASM', -		'USE_SSE_ASM', -	])  	if gcc:	  		env.Append(CFLAGS = '-m32')  		env.Append(CXXFLAGS = '-m32') @@ -188,12 +150,11 @@ if llvm:  	# See also http://www.scons.org/wiki/UsingPkgConfig  	env.ParseConfig('llvm-config --cflags --ldflags --libs')  	env.Append(CPPDEFINES = ['MESA_LLVM']) -	env.Append(CXXFLAGS = ['-Wno-long-long'])          # Force C++ linkage  	env['LINK'] = env['CXX']  # libGL -if platform not in ('winddk',): +if platform in ('linux', 'freebsd', 'darwin'):  	env.Append(LIBS = [  		'X11',  		'Xext', @@ -34,7 +34,7 @@ default_machine = _machine_map.get(default_machine, 'generic')  if default_platform in ('linux', 'freebsd', 'darwin'):  	default_dri = 'yes' -elif default_platform in ('winddk',): +elif default_platform in ('winddk', 'windows'):  	default_dri = 'no'  else:  	default_dri = 'no' @@ -44,14 +44,20 @@ else:  # Common options  def AddOptions(opts): -	from SCons.Options.BoolOption import BoolOption -	from SCons.Options.EnumOption import EnumOption +	try: +		from SCons.Options.BoolOption import BoolOption +	except ImportError: +		from SCons.Variables.BoolVariable import BoolVariable as BoolOption +	try: +		from SCons.Options.EnumOption import EnumOption +	except ImportError: +		from SCons.Variables.EnumVariable import EnumVariable as EnumOption  	opts.Add(BoolOption('debug', 'build debug version', 'no'))  	#opts.Add(BoolOption('quiet', 'quiet command lines', 'no'))  	opts.Add(EnumOption('machine', 'use machine-specific assembly code', default_machine,  											 allowed_values=('generic', 'x86', 'x86_64')))  	opts.Add(EnumOption('platform', 'target platform', default_platform, -											 allowed_values=('linux', 'cell', 'winddk'))) +											 allowed_values=('linux', 'cell', 'windows', 'winddk')))  	opts.Add(BoolOption('llvm', 'use LLVM', 'no'))  	opts.Add(BoolOption('dri', 'build DRI drivers', default_dri)) @@ -133,8 +139,162 @@ def generate(env):  	# FIXME: this is already too late  	#if env.get('quiet', False):  	#	quietCommandLines(env) -	createConvenienceLibBuilder(env) +	 +	# shortcuts +	debug = env['debug'] +	machine = env['machine'] +	platform = env['platform'] +	x86 = env['machine'] == 'x86' +	gcc = env['platform'] in ('linux', 'freebsd', 'darwin') +	msvc = env['platform'] in ('windows', 'winddk') + +	# C preprocessor options +	cppdefines = [] +	if debug: +		cppdefines += ['DEBUG'] +	else: +		cppdefines += ['NDEBUG'] +	if platform == 'windows': +		cppdefines += [ +			'WIN32',  +			'_WINDOWS',  +			'_UNICODE', +			'UNICODE', +			# http://msdn2.microsoft.com/en-us/library/6dwk3a1z.aspx, +			'WIN32_LEAN_AND_MEAN', +			'VC_EXTRALEAN',  +			'_CRT_SECURE_NO_DEPRECATE', +		] +		if debug: +			cppdefines += ['_DEBUG'] +	if platform == 'winddk': +		# Mimic WINDDK's builtin flags. See also: +		# - WINDDK's bin/makefile.new i386mk.inc for more info. +		# - buildchk_wxp_x86.log files, generated by the WINDDK's build +		# - http://alter.org.ua/docs/nt_kernel/vc8_proj/ +		cppdefines += [ +			('_X86_', '1'),  +			('i386', '1'),  +			'STD_CALL',  +			('CONDITION_HANDLING', '1'), +			('NT_INST', '0'),  +			('WIN32', '100'), +			('_NT1X_', '100'), +			('WINNT', '1'), +			('_WIN32_WINNT', '0x0501'), # minimum required OS version +			('WINVER', '0x0501'), +			('_WIN32_IE', '0x0603'), +			('WIN32_LEAN_AND_MEAN', '1'), +			('DEVL', '1'), +			('__BUILDMACHINE__', 'WinDDK'), +			('FPO', '0'), +		] +		if debug: +			cppdefines += [('DBG', 1)] +	if platform == 'windows': +		cppdefines += ['PIPE_SUBSYSTEM_USER'] +	if platform == 'winddk': +		cppdefines += ['PIPE_SUBSYSTEM_KERNEL'] +	env.Append(CPPDEFINES = cppdefines) + +	# C compiler options +	cflags = [] +	if gcc: +		if debug: +			cflags += ['-O0', '-g3'] +		else: +			cflags += ['-O3', '-g3'] +		cflags += [ +			'-Wall',  +			'-Wmissing-prototypes', +			'-Wno-long-long', +			'-ffast-math', +			'-pedantic', +			'-fmessage-length=0', # be nice to Eclipse  +		] +	if msvc: +		# See also: +		# - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx +		# - cl /? +		if debug: +			cflags += [ +			  '/Od', # disable optimizations +			  '/Oi', # enable intrinsic functions +			  '/Oy-', # disable frame pointer omission +			] +		else: +			cflags += [ +			  '/Ox', # maximum optimizations +			  '/Oi', # enable intrinsic functions +			  '/Os', # favor code space +			] +		if platform == 'windows': +			cflags += [ +				# TODO +				#'/Wp64', # enable 64 bit porting warnings +			] +		if platform == 'winddk': +			cflags += [ +				'/Zl', # omit default library name in .OBJ +				'/Zp8', # 8bytes struct member alignment +				'/Gy', # separate functions for linker +				'/Gm-', # disable minimal rebuild +				'/W3', # warning level +				'/WX', # treat warnings as errors +				'/Gz', # __stdcall Calling convention +				'/GX-', # disable C++ EH +				'/GR-', # disable C++ RTTI +				'/GF', # enable read-only string pooling +				'/GS', # enable security checks +				'/G6', # optimize for PPro, P-II, P-III +				'/Ze', # enable extensions +				#'/Gi-', # ??? +				'/QIfdiv-', # disable Pentium FDIV fix +				#'/hotpatch', # ??? +				#'/Z7', #enable old-style debug info +			] +		# Put debugging information in a separate .pdb file for each object file as +		# descrived in the scons manpage +		env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb' +	env.Append(CFLAGS = cflags) +	env.Append(CXXFLAGS = cflags) +	# Linker options +	if platform == 'winddk': +		# See also: +		# - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx +		env.Append(LINKFLAGS = [ +			'/merge:_PAGE=PAGE', +			'/merge:_TEXT=.text', +			'/section:INIT,d', +			'/opt:ref', +			'/opt:icf', +			'/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221', +			'/incremental:no', +			'/fullbuild', +			'/release', +			'/nodefaultlib', +			'/wx', +			'/debug', +			'/debugtype:cv', +			'/version:5.1', +			'/osversion:5.1', +			'/functionpadmin:5', +			'/safeseh', +			'/pdbcompress', +			'/stack:0x40000,0x1000', +			'/driver',  +			'/align:0x80', +			'/subsystem:native,5.01', +			'/base:0x10000', +			 +			'/entry:DrvEnableDriver', +		]) + + +	createConvenienceLibBuilder(env) +	 +	  	# for debugging  	#print env.Dump() diff --git a/configs/default b/configs/default index f0146c50ce..04604f8006 100644 --- a/configs/default +++ b/configs/default @@ -68,7 +68,7 @@ PROGRAM_DIRS = demos redbook samples glsl xdemos  # Gallium directories and  -GALLIUM_AUXILIARY_DIRS = draw cso_cache pipebuffer tgsi rtasm util sct +GALLIUM_AUXILIARY_DIRS = draw cso_cache pipebuffer tgsi sct translate rtasm util  GALLIUM_AUXILIARIES = $(foreach DIR,$(GALLIUM_AUXILIARY_DIRS),$(TOP)/src/gallium/auxiliary/$(DIR)/lib$(DIR).a)  GALLIUM_DRIVER_DIRS = softpipe i915simple i965simple failover  GALLIUM_DRIVERS = $(foreach DIR,$(GALLIUM_DRIVER_DIRS),$(TOP)/src/gallium/drivers/$(DIR)/lib$(DIR).a) diff --git a/include/GLES/egl.h b/include/GLES/egl.h index f18c86ca62..a211bbc3be 100644 --- a/include/GLES/egl.h +++ b/include/GLES/egl.h @@ -1,64 +1,24 @@ -#ifndef _EGL_H -#define _EGL_H +#ifndef __egl_h_ +#define __egl_h_  /* -** License Applicability. Except to the extent portions of this file are -** made subject to an alternative license as permitted in the SGI Free -** Software License B, Version 1.0 (the "License"), the contents of this -** file are subject only to the provisions of the License. You may not use -** this file except in compliance with the License. You may obtain a copy -** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 -** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** Copyright 2002-2003 Promoters of the Khronos Group (3Dlabs, ARM Ltd., +** ATI Technologies, Inc., Discreet, Ericsson Mobile, Imagination +** Technologies Group plc, Motorola, Inc., Nokia, Silicon Graphics, Inc., +** SK Telecom, and Sun Microsystems).  ** -** http://oss.sgi.com/projects/FreeB -** -** Note that, as provided in the License, the Software is distributed on an -** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS -** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND -** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A -** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -** -** Original Code. The Original Code is: OpenGL Sample Implementation, -** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, -** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. -** Copyright in any portions created by third parties is as indicated -** elsewhere herein. All Rights Reserved. -** -** Additional Notice Provisions: The application programming interfaces -** established by SGI in conjunction with the Original Code are The -** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released -** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version -** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X -** Window System(R) (Version 1.3), released October 19, 1998. This software -** was created using the OpenGL(R) version 1.2.1 Sample Implementation -** published by SGI, but has not been independently verified as being -** compliant with the OpenGL(R) version 1.2.1 Specification. +** This document is protected by copyright, and contains information +** proprietary to The Khronos Group. Any copying, adaptation, distribution, +** public performance, or public display of this document without the +** express written consent of the copyright holders is strictly prohibited. +** The receipt or possession of this document does not convey any rights to +** reproduce, disclose, or distribute its contents, or to manufacture, use, +** or sell anything that it may describe, in whole or in part.  */ -#if 0/*XXX TEMPORARY HACK*/  #include <GLES/gl.h> -#else -#include <GL/gl.h> -#endif  #include <GLES/egltypes.h> -/* XXX should go in eglext.h */ -#define GL_OES_VERSION_1_0  1 -#define GL_OES_read_format  1 -#define GL_OES_compressed_paletted_texture 1 -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#define GL_PALETTE4_RGB8_OES        0x8B90 -#define GL_PALETTE4_RGBA8_OES       0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES    0x8B92 -#define GL_PALETTE4_RGBA4_OES       0x8B93 -#define GL_PALETTE4_RGB5_A1_OES     0x8B94 -#define GL_PALETTE8_RGB8_OES        0x8B95 -#define GL_PALETTE8_RGBA8_OES       0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES    0x8B97 -#define GL_PALETTE8_RGBA4_OES       0x8B98 -#define GL_PALETTE8_RGB5_A1_OES     0x8B99 -/* XXX */  /*  ** Versioning and extensions @@ -194,7 +154,7 @@ GLAPI EGLDisplay APIENTRY eglGetDisplay (NativeDisplayType display);  GLAPI EGLBoolean APIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor);  GLAPI EGLBoolean APIENTRY eglTerminate (EGLDisplay dpy);  GLAPI const char * APIENTRY eglQueryString (EGLDisplay dpy, EGLint name); -GLAPI void (* APIENTRY eglGetProcAddress (const char *procname))(void); +GLAPI void (APIENTRY * eglGetProcAddress (const char *procname))();  GLAPI EGLBoolean APIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);  GLAPI EGLBoolean APIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); @@ -227,98 +187,79 @@ GLAPI EGLBoolean APIENTRY eglWaitNative (EGLint engine);  GLAPI EGLBoolean APIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface draw);  GLAPI EGLBoolean APIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, NativePixmapType target); +#ifdef __cplusplus +} +#endif + +#endif /* ___egl_h_ */ -/* EGL_MESA_screen extension  >>> PRELIMINARY <<< */ -#ifndef EGL_MESA_screen_surface -#define EGL_MESA_screen_surface 1 -#define EGL_BAD_SCREEN_MESA                    0x4000 -#define EGL_BAD_MODE_MESA                      0x4001 -#define EGL_SCREEN_COUNT_MESA                  0x4002 -#define EGL_SCREEN_POSITION_MESA               0x4003 -#define EGL_SCREEN_POSITION_GRANULARITY_MESA   0x4004 -#define EGL_MODE_ID_MESA                       0x4005 -#define EGL_REFRESH_RATE_MESA                  0x4006 -#define EGL_OPTIMAL_MESA                       0x4007 -#define EGL_INTERLACED_MESA                    0x4008 -#define EGL_SCREEN_BIT_MESA                    0x08 +/* usage -GLAPI EGLBoolean APIENTRY eglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen, const EGLint *attrib_list, EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes); -GLAPI EGLBoolean APIENTRY eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes); -GLAPI EGLBoolean APIENTRY eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, EGLint attribute, EGLint *value); -GLAPI EGLBoolean APIENTRY eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens, EGLint max_screens, EGLint *num_screens); -GLAPI EGLSurface APIENTRY eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); -GLAPI EGLBoolean APIENTRY eglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen, EGLSurface surface, EGLModeMESA mode); -GLAPI EGLBoolean APIENTRY eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y); -GLAPI EGLBoolean APIENTRY eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint attribute, EGLint *value); -GLAPI EGLBoolean APIENTRY eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLSurface *surface); -GLAPI EGLBoolean APIENTRY eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode); -GLAPI const char * APIENTRY eglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode); +	// ---------------------------------------------------------------------- +	// Initialization +	// ---------------------------------------------------------------------- -#endif /* EGL_MESA_screen_surface */ +    HDC hdc = GetDC(0);		// the screen or window device context, for example  +	EGLDisplay display = eglGetDisplay(hdc); +	 +	EGLint major, minor; -#ifndef EGL_MESA_copy_context -#define EGL_MESA_copy_context 1 +	if (!eglInitialize(display, &major, &minor)) { +		// could not initialize display +	} -GLAPI EGLBoolean APIENTRY eglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest, EGLint mask); +    EGLConfig configs[10]; +	EGLint matchingConfigs; +	EGLint attribList[] = { 0 };	// extend this -#endif /* EGL_MESA_copy_context */ +	if (!eglChooseConfig(display, attribList, &configs, 10, &matchingConfigs)) { +		// could not choose config +	} +	if (matchingConfigs < 1) { +		// did not find a suitable configuration +	} -/* XXX this is preliminary! */ -#ifndef EGL_VERSION_1_2 -#define EGL_VERSION_1_2 1 +	EGLConfig config = configs[0];	// pick any -typedef int EGLenum; -typedef int EGLClientBuffer; +	EGLSurface surface = eglCreatePbufferSurface(display, config, attribList); +	 +	// test for error  -#define EGL_DISPLAY_SCALING		10000 -#define EGL_UNKNOWN			((EGLint)-1) +	EGLContext context = eglCreateContext(display, config, 0, attribList); +	 +	// test for error -#define EGL_OPENGL_ES_BIT               0x1 -#define EGL_OPENVG_BIT                  0x2 +	// ---------------------------------------------------------------------- +	// Rendering Loop +	// ---------------------------------------------------------------------- -#define EGL_OPENGL_ES_API               0x30A0 -#define EGL_OPENVG_API                  0x30A1 +	eglMakeCurrent(display, surface, surface, context); -#define EGL_LUMINANCE_SIZE		0x303D -#define EGL_ALPHA_MASK_SIZE		0x303E -#define EGL_COLOR_BUFFER_TYPE		0x303F -#define EGL_RENDERABLE_TYPE		0x3040 +	// actual GL rendering goes here -#define EGL_SINGLE_BUFFER		0x3085 -#define EGL_RENDER_BUFFER		0x3086 -#define EGL_COLORSPACE			0x3087 -#define EGL_ALPHA_FORMAT		0x3088 -#define EGL_COLORSPACE_sRGB		0x3089 -#define EGL_COLORSPACE_LINEAR		0x308A -#define EGL_ALPHA_FORMAT_NONPRE		0x308B -#define EGL_ALPHA_FORMAT_PRE		0x308C -#define EGL_CLIENT_APIS			0x308D -#define EGL_RGB_BUFFER			0x308E -#define EGL_LUMINANCE_BUFFER		0x308F -#define EGL_HORIZONTAL_RESOLUTION	0x3090 -#define EGL_VERTICAL_RESOLUTION		0x3091 -#define EGL_PIXEL_ASPECT_RATIO		0x3092 -#define EGL_SWAP_BEHAVIOR		0x3093 -#define EGL_BUFFER_PRESERVED		0x3094 -#define EGL_BUFFER_DESTROYED		0x3095 -#define EGL_OPENVG_IMAGE		0x3096 -#define EGL_CONTEXT_CLIENT_TYPE		0x3097 +	eglWait(); +    eglSwapBuffers(display, surface); -GLAPI EGLBoolean APIENTRY eglBindAPI(EGLenum api); -GLAPI EGLenum APIENTRY eglQueryAPI(void); -GLAPI EGLBoolean APIENTRY eglWaitClient(void); -GLAPI EGLBoolean APIENTRY eglReleaseThread(void); -GLAPI EGLSurface APIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); +	// ---------------------------------------------------------------------- +	// Cleanup +	// ---------------------------------------------------------------------- -#endif /* EGL_VERSION_1_2 */ +	if (!eglDestoyContext(display, context)) { +		// error deallocating context +	} +	 +	if (!eglDestroySurface(display, surface)) { +		// error deallocating surface +	} -#ifdef __cplusplus -} -#endif +	if (!eglTerminate(display)) { +		// error while cleaning up display +	} -#endif /* _EGL_H */ +	 +*/ diff --git a/include/GLES/egltypes.h b/include/GLES/egltypes.h index 65cba8d579..ca1f5a9cb3 100644 --- a/include/GLES/egltypes.h +++ b/include/GLES/egltypes.h @@ -1,45 +1,100 @@ +#ifndef __egl_types_h_ +#define __egl_types_h_ +  /* -** egltypes.h for Mesa +** egltypes.h is platform dependent. It defines: +** +**     - EGL types and resources +**     - Native types +**     - EGL and native handle values  ** -** ONLY egl.h SHOULD INCLUDE THIS FILE! +** EGL types and resources are to be typedef'ed with appropriate platform +** dependent resource handle types. EGLint must be an integer of at least +** 32-bit.  ** -** See comments about egltypes.h in the standard egl.h file. +** NativeDisplayType, NativeWindowType and NativePixmapType are to be +** replaced with corresponding types of the native window system in egl.h. +** +** EGL and native handle values must match their types.  */ +#if (defined(WIN32) || defined(_WIN32_WCE)) -#include <sys/types.h> +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers +#endif +// Windows Header Files: +#include <windows.h> -/* -** These opaque EGL types are implemented as unsigned 32-bit integers: -*/ -typedef u_int32_t EGLDisplay; -typedef u_int32_t EGLConfig; -typedef u_int32_t EGLSurface; -typedef u_int32_t EGLContext; +typedef HDC		NativeDisplayType; +typedef HWND	NativeWindowType; +typedef HBITMAP NativePixmapType; + +#define EGL_DEFAULT_DISPLAY GetDC(0) + +#elif defined(__SYMBIAN32__) -/* EGL_MESA_screen_surface */ -typedef u_int32_t EGLModeMESA; -typedef u_int32_t EGLScreenMESA; +#include <e32def.h> + +class RWindow; +class CWindowGc; +class CFbsBitmap; + +typedef CWindowGc *		NativeDisplayType; +typedef RWindow *		NativeWindowType; +typedef CFbsBitmap * 	NativePixmapType; + +#define EGL_DEFAULT_DISPLAY ((NativeDisplayType) 0) + +#elif defined(__gnu_linux__) + +typedef void *		NativeDisplayType; +typedef void *		NativeWindowType; +typedef void * 		NativePixmapType; + +#define EGL_DEFAULT_DISPLAY ((NativeDisplayType) 0) + +#else + +#	error "Unsupported Operating System" + +#endif + +#ifdef __cplusplus + +namespace EGL { +	class Context; +	class Config; +	class Surface; +} + +typedef const EGL::Config *		EGLConfig; +typedef EGL::Surface *			EGLSurface; +typedef EGL::Context  *			EGLContext; + +#else + +typedef void *			EGLConfig; +typedef void *			EGLSurface; +typedef void *			EGLContext; + +#endif  /* -** Other basic EGL types: +** Types and resources  */ -typedef u_int8_t EGLBoolean; -typedef int32_t EGLint; - -typedef void * NativeDisplayType; -typedef int NativePixmapType; -typedef int NativeWindowType; +typedef int				EGLBoolean; +typedef int				EGLint; +typedef void *			EGLDisplay;  /* -** EGL and native handle null values: +** EGL and native handle values  */ -#define EGL_DEFAULT_DISPLAY ((NativeDisplayType) 0) -#define EGL_NO_CONTEXT ((EGLContext) 0) -#define EGL_NO_DISPLAY ((EGLDisplay) 0) -#define EGL_NO_SURFACE ((EGLSurface) 0) +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_SURFACE ((EGLSurface)0) + -/* EGL_MESA_screen_surface */ -#define EGL_NO_MODE_MESA ((EGLModeMESA) 0) +#endif //ndef __egl_types_h_ diff --git a/include/GLES/gl.h b/include/GLES/gl.h new file mode 100644 index 0000000000..5462c72458 --- /dev/null +++ b/include/GLES/gl.h @@ -0,0 +1,861 @@ +#ifndef __gl_h_ +#define __gl_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.0 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-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. +*/ + +#if defined(__SYMBIAN32__) + +#	include <e32def.h> + +#elif (defined(WIN32) || defined(_WIN32_WCE)) /*&& !defined(APIENTRY) && !defined(__CYGWIN__)*/ + +#	ifndef WIN32_LEAN_AND_MEAN +#		define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers +#	endif + +#	include <windows.h> + +#elif defined(__gnu_linux__) + +#	define GLAPI + +#	ifdef APIENTRY +#		undef APIENTRY +#	endif + +#else + +#	error "Unsupported Operating System" + +#endif + + +#ifndef APIENTRY +#define APIENTRY +#endif + +#ifndef GLAPI +	#ifdef OGLES_EXPORTS +		#define GLAPI __declspec(dllexport) +	#else +		#define GLAPI __declspec(dllimport) +	#endif +#endif + +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef signed char GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef float GLfloat; +typedef float GLclampf; +typedef void GLvoid; +typedef int GLintptr; +typedef int GLsizeiptr; +typedef int GLfixed; +typedef int GLclampx; +/* Internal convenience typedefs */ +typedef void (*_GLfuncptr)(); + +/*************************************************************/ + +/* OpenGL ES core versions */ +#define GL_OES_VERSION_1_0                1 +#define GL_OES_VERSION_1_1                1 + +/* Extensions */ +#define GL_OES_compressed_paletted_texture 1 +/*#define GL_OES_draw_texture             1*/ +#define GL_OES_matrix_get                 1 +/*#define GL_OES_matrix_palette		      1*/ +#define GL_OES_point_size_array           1 +#define GL_OES_point_sprite               1 +#define GL_OES_read_format                1 + +/* ClearBufferMask */ +#define GL_DEPTH_BUFFER_BIT               0x00000100 +#define GL_STENCIL_BUFFER_BIT             0x00000400 +#define GL_COLOR_BUFFER_BIT               0x00004000 + +/* Boolean */ +#define GL_FALSE                          0 +#define GL_TRUE                           1 + +/* BeginMode */ +#define GL_POINTS                         0x0000 +#define GL_LINES                          0x0001 +#define GL_LINE_LOOP                      0x0002 +#define GL_LINE_STRIP                     0x0003 +#define GL_TRIANGLES                      0x0004 +#define GL_TRIANGLE_STRIP                 0x0005 +#define GL_TRIANGLE_FAN                   0x0006 + +/* AlphaFunction */ +#define GL_NEVER                          0x0200 +#define GL_LESS                           0x0201 +#define GL_EQUAL                          0x0202 +#define GL_LEQUAL                         0x0203 +#define GL_GREATER                        0x0204 +#define GL_NOTEQUAL                       0x0205 +#define GL_GEQUAL                         0x0206 +#define GL_ALWAYS                         0x0207 + +/* BlendingFactorDest */ +#define GL_ZERO                           0 +#define GL_ONE                            1 +#define GL_SRC_COLOR                      0x0300 +#define GL_ONE_MINUS_SRC_COLOR            0x0301 +#define GL_SRC_ALPHA                      0x0302 +#define GL_ONE_MINUS_SRC_ALPHA            0x0303 +#define GL_DST_ALPHA                      0x0304 +#define GL_ONE_MINUS_DST_ALPHA            0x0305 + +/* BlendingFactorSrc */ +/*      GL_ZERO */ +/*      GL_ONE */ +#define GL_DST_COLOR                      0x0306 +#define GL_ONE_MINUS_DST_COLOR            0x0307 +#define GL_SRC_ALPHA_SATURATE             0x0308 +/*      GL_SRC_ALPHA */ +/*      GL_ONE_MINUS_SRC_ALPHA */ +/*      GL_DST_ALPHA */ +/*      GL_ONE_MINUS_DST_ALPHA */ + +/* ClipPlaneName */ +#define GL_CLIP_PLANE0                    0x3000 +#define GL_CLIP_PLANE1                    0x3001 +#define GL_CLIP_PLANE2                    0x3002 +#define GL_CLIP_PLANE3                    0x3003 +#define GL_CLIP_PLANE4                    0x3004 +#define GL_CLIP_PLANE5                    0x3005 + +/* ColorMaterialFace */ +/*      GL_FRONT_AND_BACK */ + +/* ColorMaterialParameter */ +/*      GL_AMBIENT_AND_DIFFUSE */ + +/* ColorPointerType */ +/*      GL_UNSIGNED_BYTE */ +/*      GL_FLOAT */ +/*      GL_FIXED */ + +/* CullFaceMode */ +#define GL_FRONT                          0x0404 +#define GL_BACK                           0x0405 +#define GL_FRONT_AND_BACK                 0x0408 + +/* DepthFunction */ +/*      GL_NEVER */ +/*      GL_LESS */ +/*      GL_EQUAL */ +/*      GL_LEQUAL */ +/*      GL_GREATER */ +/*      GL_NOTEQUAL */ +/*      GL_GEQUAL */ +/*      GL_ALWAYS */ + +/* EnableCap */ +#define GL_FOG                            0x0B60 +#define GL_LIGHTING                       0x0B50 +#define GL_TEXTURE_2D                     0x0DE1 +#define GL_CULL_FACE                      0x0B44 +#define GL_ALPHA_TEST                     0x0BC0 +#define GL_BLEND                          0x0BE2 +#define GL_COLOR_LOGIC_OP                 0x0BF2 +#define GL_DITHER                         0x0BD0 +#define GL_STENCIL_TEST                   0x0B90 +#define GL_DEPTH_TEST                     0x0B71 +/*      GL_LIGHT0 */ +/*      GL_LIGHT1 */ +/*      GL_LIGHT2 */ +/*      GL_LIGHT3 */ +/*      GL_LIGHT4 */ +/*      GL_LIGHT5 */ +/*      GL_LIGHT6 */ +/*      GL_LIGHT7 */ +#define GL_POINT_SMOOTH                   0x0B10 +#define GL_LINE_SMOOTH                    0x0B20 +#define GL_SCISSOR_TEST                   0x0C11 +#define GL_COLOR_MATERIAL                 0x0B57 +#define GL_NORMALIZE                      0x0BA1 +#define GL_RESCALE_NORMAL                 0x803A +#define GL_POLYGON_OFFSET_FILL            0x8037 +#define GL_VERTEX_ARRAY                   0x8074 +#define GL_NORMAL_ARRAY                   0x8075 +#define GL_COLOR_ARRAY                    0x8076 +#define GL_TEXTURE_COORD_ARRAY            0x8078 +#define GL_MULTISAMPLE                    0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E +#define GL_SAMPLE_ALPHA_TO_ONE            0x809F +#define GL_SAMPLE_COVERAGE                0x80A0 + +/* ErrorCode */ +#define GL_NO_ERROR                       0 +#define GL_INVALID_ENUM                   0x0500 +#define GL_INVALID_VALUE                  0x0501 +#define GL_INVALID_OPERATION              0x0502 +#define GL_STACK_OVERFLOW                 0x0503 +#define GL_STACK_UNDERFLOW                0x0504 +#define GL_OUT_OF_MEMORY                  0x0505 + +/* FogMode */ +/*      GL_LINEAR */ +#define GL_EXP                            0x0800 +#define GL_EXP2                           0x0801 + +/* FogParameter */ +#define GL_FOG_DENSITY                    0x0B62 +#define GL_FOG_START                      0x0B63 +#define GL_FOG_END                        0x0B64 +#define GL_FOG_MODE                       0x0B65 +#define GL_FOG_COLOR                      0x0B66 + +/* FrontFaceDirection */ +#define GL_CW                             0x0900 +#define GL_CCW                            0x0901 + +/* GetPName */ +#define GL_CURRENT_COLOR                  0x0B00 +#define GL_CURRENT_NORMAL                 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS         0x0B03 +#define GL_POINT_SIZE                     0x0B11 +#define GL_POINT_SIZE_MIN                 0x8126 +#define GL_POINT_SIZE_MAX                 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE      0x8128 +#define GL_POINT_DISTANCE_ATTENUATION     0x8129 +#define GL_SMOOTH_POINT_SIZE_RANGE        0x0B12 +#define GL_LINE_WIDTH                     0x0B21 +#define GL_SMOOTH_LINE_WIDTH_RANGE        0x0B22 +#define GL_ALIASED_POINT_SIZE_RANGE       0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE       0x846E +#define GL_CULL_FACE_MODE                 0x0B45 +#define GL_FRONT_FACE                     0x0B46 +#define GL_SHADE_MODEL                    0x0B54 +#define GL_DEPTH_RANGE                    0x0B70 +#define GL_DEPTH_WRITEMASK                0x0B72 +#define GL_DEPTH_CLEAR_VALUE              0x0B73 +#define GL_DEPTH_FUNC                     0x0B74 +#define GL_STENCIL_CLEAR_VALUE            0x0B91 +#define GL_STENCIL_FUNC                   0x0B92 +#define GL_STENCIL_VALUE_MASK             0x0B93 +#define GL_STENCIL_FAIL                   0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96 +#define GL_STENCIL_REF                    0x0B97 +#define GL_STENCIL_WRITEMASK              0x0B98 +#define GL_MATRIX_MODE                    0x0BA0 +#define GL_VIEWPORT                       0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH          0x0BA3 +#define GL_PROJECTION_STACK_DEPTH         0x0BA4 +#define GL_TEXTURE_STACK_DEPTH            0x0BA5 +#define GL_MODELVIEW_MATRIX               0x0BA6 +#define GL_PROJECTION_MATRIX              0x0BA7 +#define GL_TEXTURE_MATRIX                 0x0BA8 +#define GL_ALPHA_TEST_FUNC                0x0BC1 +#define GL_ALPHA_TEST_REF                 0x0BC2 +#define GL_BLEND_DST                      0x0BE0 +#define GL_BLEND_SRC                      0x0BE1 +#define GL_LOGIC_OP_MODE                  0x0BF0 +#define GL_SCISSOR_BOX                    0x0C10 +#define GL_SCISSOR_TEST                   0x0C11 +#define GL_COLOR_CLEAR_VALUE              0x0C22 +#define GL_COLOR_WRITEMASK                0x0C23 +#define GL_UNPACK_ALIGNMENT               0x0CF5 +#define GL_PACK_ALIGNMENT                 0x0D05 +#define GL_MAX_LIGHTS                     0x0D31 +#define GL_MAX_CLIP_PLANES                0x0D32 +#define GL_MAX_TEXTURE_SIZE               0x0D33 +#define GL_MAX_MODELVIEW_STACK_DEPTH      0x0D36 +#define GL_MAX_PROJECTION_STACK_DEPTH     0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH        0x0D39 +#define GL_MAX_VIEWPORT_DIMS              0x0D3A +#define GL_MAX_ELEMENTS_VERTICES          0x80E8 +#define GL_MAX_ELEMENTS_INDICES           0x80E9 +#define GL_MAX_TEXTURE_UNITS              0x84E2 +#define GL_SUBPIXEL_BITS                  0x0D50 +#define GL_RED_BITS                       0x0D52 +#define GL_GREEN_BITS                     0x0D53 +#define GL_BLUE_BITS                      0x0D54 +#define GL_ALPHA_BITS                     0x0D55 +#define GL_DEPTH_BITS                     0x0D56 +#define GL_STENCIL_BITS                   0x0D57 +#define GL_POLYGON_OFFSET_UNITS           0x2A00 +#define GL_POLYGON_OFFSET_FILL            0x8037 +#define GL_POLYGON_OFFSET_FACTOR          0x8038 +#define GL_TEXTURE_BINDING_2D             0x8069 +#define GL_VERTEX_ARRAY_SIZE              0x807A +#define GL_VERTEX_ARRAY_TYPE              0x807B +#define GL_VERTEX_ARRAY_STRIDE            0x807C +#define GL_NORMAL_ARRAY_TYPE              0x807E +#define GL_NORMAL_ARRAY_STRIDE            0x807F +#define GL_COLOR_ARRAY_SIZE               0x8081 +#define GL_COLOR_ARRAY_TYPE               0x8082 +#define GL_COLOR_ARRAY_STRIDE             0x8083 +#define GL_TEXTURE_COORD_ARRAY_SIZE       0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE       0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE     0x808A +#define GL_VERTEX_ARRAY_POINTER           0x808E +#define GL_NORMAL_ARRAY_POINTER           0x808F +#define GL_COLOR_ARRAY_POINTER            0x8090 +#define GL_TEXTURE_COORD_ARRAY_POINTER    0x8092 +#define GL_SAMPLE_BUFFERS                 0x80A8 +#define GL_SAMPLES                        0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE          0x80AA +#define GL_SAMPLE_COVERAGE_INVERT         0x80AB + +/* GetTextureParameter */ +/*      GL_TEXTURE_MAG_FILTER */ +/*      GL_TEXTURE_MIN_FILTER */ +/*      GL_TEXTURE_WRAP_S */ +/*      GL_TEXTURE_WRAP_T */ + +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES   0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS       0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS           0x86A3 + +/* OES_matrix_get */ +#define GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS   0x898D +#define GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS  0x898E +#define GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS     0x898F + +/* HintMode */ +#define GL_DONT_CARE                      0x1100 +#define GL_FASTEST                        0x1101 +#define GL_NICEST                         0x1102 + +/* HintTarget */ +#define GL_PERSPECTIVE_CORRECTION_HINT    0x0C50 +#define GL_POINT_SMOOTH_HINT              0x0C51 +#define GL_LINE_SMOOTH_HINT               0x0C52 +#define GL_POLYGON_SMOOTH_HINT            0x0C53 +#define GL_FOG_HINT                       0x0C54 +#define GL_GENERATE_MIPMAP_HINT           0x8192 + +/* LightModelParameter */ +#define GL_LIGHT_MODEL_AMBIENT            0x0B53 +#define GL_LIGHT_MODEL_TWO_SIDE           0x0B52 + +/* LightParameter */ +#define GL_AMBIENT                        0x1200 +#define GL_DIFFUSE                        0x1201 +#define GL_SPECULAR                       0x1202 +#define GL_POSITION                       0x1203 +#define GL_SPOT_DIRECTION                 0x1204 +#define GL_SPOT_EXPONENT                  0x1205 +#define GL_SPOT_CUTOFF                    0x1206 +#define GL_CONSTANT_ATTENUATION           0x1207 +#define GL_LINEAR_ATTENUATION             0x1208 +#define GL_QUADRATIC_ATTENUATION          0x1209 + +/* DataType */ +#define GL_BYTE                           0x1400 +#define GL_UNSIGNED_BYTE                  0x1401 +#define GL_SHORT                          0x1402 +#define GL_UNSIGNED_SHORT                 0x1403 +#define GL_FLOAT                          0x1406 +#define GL_FIXED                          0x140C + +/* LogicOp */ +#define GL_CLEAR                          0x1500 +#define GL_AND                            0x1501 +#define GL_AND_REVERSE                    0x1502 +#define GL_COPY                           0x1503 +#define GL_AND_INVERTED                   0x1504 +#define GL_NOOP                           0x1505 +#define GL_XOR                            0x1506 +#define GL_OR                             0x1507 +#define GL_NOR                            0x1508 +#define GL_EQUIV                          0x1509 +#define GL_INVERT                         0x150A +#define GL_OR_REVERSE                     0x150B +#define GL_COPY_INVERTED                  0x150C +#define GL_OR_INVERTED                    0x150D +#define GL_NAND                           0x150E +#define GL_SET                            0x150F + +/* MaterialFace */ +/*      GL_FRONT_AND_BACK */ + +/* MaterialParameter */ +#define GL_EMISSION                       0x1600 +#define GL_SHININESS                      0x1601 +#define GL_AMBIENT_AND_DIFFUSE            0x1602 +/*      GL_AMBIENT */ +/*      GL_DIFFUSE */ +/*      GL_SPECULAR */ + +/* MatrixMode */ +#define GL_MODELVIEW                      0x1700 +#define GL_PROJECTION                     0x1701 +#define GL_TEXTURE                        0x1702 + +/* NormalPointerType */ +/*      GL_BYTE */ +/*      GL_SHORT */ +/*      GL_FLOAT */ +/*      GL_FIXED */ + +/* PixelFormat */ +#define GL_ALPHA                          0x1906 +#define GL_RGB                            0x1907 +#define GL_RGBA                           0x1908 +#define GL_LUMINANCE                      0x1909 +#define GL_LUMINANCE_ALPHA                0x190A + +/* PixelStoreParameter */ +#define GL_UNPACK_ALIGNMENT               0x0CF5 +#define GL_PACK_ALIGNMENT                 0x0D05 + +/* PixelType */ +/*      GL_UNSIGNED_BYTE */ +#define GL_UNSIGNED_SHORT_4_4_4_4         0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1         0x8034 +#define GL_UNSIGNED_SHORT_5_6_5           0x8363 + +/* ShadingModel */ +#define GL_FLAT                           0x1D00 +#define GL_SMOOTH                         0x1D01 + +/* StencilFunction */ +/*      GL_NEVER */ +/*      GL_LESS */ +/*      GL_EQUAL */ +/*      GL_LEQUAL */ +/*      GL_GREATER */ +/*      GL_NOTEQUAL */ +/*      GL_GEQUAL */ +/*      GL_ALWAYS */ + +/* StencilOp */ +/*      GL_ZERO */ +#define GL_KEEP                           0x1E00 +#define GL_REPLACE                        0x1E01 +#define GL_INCR                           0x1E02 +#define GL_DECR                           0x1E03 +/*      GL_INVERT */ + +/* StringName */ +#define GL_VENDOR                         0x1F00 +#define GL_RENDERER                       0x1F01 +#define GL_VERSION                        0x1F02 +#define GL_EXTENSIONS                     0x1F03 + +/* TexCoordPointerType */ +/*      GL_SHORT */ +/*      GL_FLOAT */ +/*      GL_FIXED */ +/*      GL_BYTE */ + +/* TextureEnvMode */ +#define GL_MODULATE                       0x2100 +#define GL_DECAL                          0x2101 +/*      GL_BLEND */ +#define GL_ADD                            0x0104 +/*      GL_REPLACE */ + +/* TextureEnvParameter */ +#define GL_TEXTURE_ENV_MODE               0x2200 +#define GL_TEXTURE_ENV_COLOR              0x2201 + +/* TextureEnvTarget */ +#define GL_TEXTURE_ENV                    0x2300 + +/* TextureMagFilter */ +#define GL_NEAREST                        0x2600 +#define GL_LINEAR                         0x2601 + +/* TextureMinFilter */ +/*      GL_NEAREST */ +/*      GL_LINEAR */ +#define GL_NEAREST_MIPMAP_NEAREST         0x2700 +#define GL_LINEAR_MIPMAP_NEAREST          0x2701 +#define GL_NEAREST_MIPMAP_LINEAR          0x2702 +#define GL_LINEAR_MIPMAP_LINEAR           0x2703 + +/* TextureParameterName */ +#define GL_TEXTURE_MAG_FILTER             0x2800 +#define GL_TEXTURE_MIN_FILTER             0x2801 +#define GL_TEXTURE_WRAP_S                 0x2802 +#define GL_TEXTURE_WRAP_T                 0x2803 +#define GL_GENERATE_MIPMAP                0x8191 + +/* TextureTarget */ +/*      GL_TEXTURE_2D */ + +/* TextureUnit */ +#define GL_TEXTURE0                       0x84C0 +#define GL_TEXTURE1                       0x84C1 +#define GL_TEXTURE2                       0x84C2 +#define GL_TEXTURE3                       0x84C3 +#define GL_TEXTURE4                       0x84C4 +#define GL_TEXTURE5                       0x84C5 +#define GL_TEXTURE6                       0x84C6 +#define GL_TEXTURE7                       0x84C7 +#define GL_TEXTURE8                       0x84C8 +#define GL_TEXTURE9                       0x84C9 +#define GL_TEXTURE10                      0x84CA +#define GL_TEXTURE11                      0x84CB +#define GL_TEXTURE12                      0x84CC +#define GL_TEXTURE13                      0x84CD +#define GL_TEXTURE14                      0x84CE +#define GL_TEXTURE15                      0x84CF +#define GL_TEXTURE16                      0x84D0 +#define GL_TEXTURE17                      0x84D1 +#define GL_TEXTURE18                      0x84D2 +#define GL_TEXTURE19                      0x84D3 +#define GL_TEXTURE20                      0x84D4 +#define GL_TEXTURE21                      0x84D5 +#define GL_TEXTURE22                      0x84D6 +#define GL_TEXTURE23                      0x84D7 +#define GL_TEXTURE24                      0x84D8 +#define GL_TEXTURE25                      0x84D9 +#define GL_TEXTURE26                      0x84DA +#define GL_TEXTURE27                      0x84DB +#define GL_TEXTURE28                      0x84DC +#define GL_TEXTURE29                      0x84DD +#define GL_TEXTURE30                      0x84DE +#define GL_TEXTURE31                      0x84DF +#define GL_ACTIVE_TEXTURE                 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE          0x84E1 + +/* TextureWrapMode */ +#define GL_REPEAT                         0x2901 +#define GL_CLAMP_TO_EDGE                  0x812F + +/* PixelInternalFormat */ +#define GL_PALETTE4_RGB8_OES              0x8B90 +#define GL_PALETTE4_RGBA8_OES             0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES          0x8B92 +#define GL_PALETTE4_RGBA4_OES             0x8B93 +#define GL_PALETTE4_RGB5_A1_OES           0x8B94 +#define GL_PALETTE8_RGB8_OES              0x8B95 +#define GL_PALETTE8_RGBA8_OES             0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES          0x8B97 +#define GL_PALETTE8_RGBA4_OES             0x8B98 +#define GL_PALETTE8_RGB5_A1_OES           0x8B99 + +/* VertexPointerType */ +/*      GL_SHORT */ +/*      GL_FLOAT */ +/*      GL_FIXED */ +/*      GL_BYTE */ + +/* LightName */ +#define GL_LIGHT0                         0x4000 +#define GL_LIGHT1                         0x4001 +#define GL_LIGHT2                         0x4002 +#define GL_LIGHT3                         0x4003 +#define GL_LIGHT4                         0x4004 +#define GL_LIGHT5                         0x4005 +#define GL_LIGHT6                         0x4006 +#define GL_LIGHT7                         0x4007 + +/* Buffer Objects */ +#define GL_ARRAY_BUFFER                   0x8892 +#define GL_ELEMENT_ARRAY_BUFFER           0x8893 + +#define GL_ARRAY_BUFFER_BINDING           0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING   0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING    0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING    0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING     0x8898 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A + +#define GL_STATIC_DRAW                    0x88E4 +#define GL_DYNAMIC_DRAW                   0x88E8 + +#define GL_WRITE_ONLY                     0x88B9 + +#define GL_BUFFER_SIZE                    0x8764 +#define GL_BUFFER_USAGE                   0x8765 +#define GL_BUFFER_ACCESS                  0x88BB + + +/* Texture combine + dot3 */ +#define GL_SUBTRACT                       0x84E7 +#define GL_COMBINE                        0x8570 +#define GL_COMBINE_RGB                    0x8571 +#define GL_COMBINE_ALPHA                  0x8572 +#define GL_RGB_SCALE                      0x8573 +#define GL_ADD_SIGNED                     0x8574 +#define GL_INTERPOLATE                    0x8575 +#define GL_CONSTANT                       0x8576 +#define GL_PRIMARY_COLOR                  0x8577 +#define GL_PREVIOUS                       0x8578 +#define GL_OPERAND0_RGB                   0x8590 +#define GL_OPERAND1_RGB                   0x8591 +#define GL_OPERAND2_RGB                   0x8592 +#define GL_OPERAND0_ALPHA                 0x8598 +#define GL_OPERAND1_ALPHA                 0x8599 +#define GL_OPERAND2_ALPHA                 0x859A + +#define GL_ALPHA_SCALE                    0x0D1C + +#define GL_SRC0_RGB                       0x8580 +#define GL_SRC1_RGB                       0x8581 +#define GL_SRC2_RGB                       0x8582 +#define GL_SRC0_ALPHA                     0x8588 +#define GL_SRC1_ALPHA                     0x8589 +#define GL_SRC2_ALPHA                     0x858A + +#define GL_DOT3_RGB                       0x86AE +#define GL_DOT3_RGBA                      0x86AF + +/*****************************************************************************************/ +/*                                 OES extension functions                               */ +/*****************************************************************************************/ +/* OES_point_sprite */ +#define GL_POINT_SPRITE_OES               0x8861 +#define GL_COORD_REPLACE_OES              0x8862 + +/* OES_point_size_array */ +#define GL_POINT_SIZE_ARRAY_OES           0x8B9C +#define GL_POINT_SIZE_ARRAY_TYPE_OES      0x898A +#define GL_POINT_SIZE_ARRAY_STRIDE_OES    0x898B +#define GL_POINT_SIZE_ARRAY_POINTER_OES   0x898C +#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES 0x8B9F + +/* OES_matrix_palette */ +#define GL_MAX_VERTEX_UNITS_OES           0x86A4 +#define GL_MAX_PALETTE_MATRICES_OES       0x8842 +#define GL_MATRIX_PALETTE_OES             0x8840 +#define GL_MATRIX_INDEX_ARRAY_OES         0x8844 +#define GL_WEIGHT_ARRAY_OES               0x86AD + +#define GL_MATRIX_INDEX_ARRAY_SIZE_OES    0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_OES    0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_OES  0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_OES 0x8849 +#define GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES 0x8B9E + +#define GL_WEIGHT_ARRAY_SIZE_OES          0x86AB +#define GL_WEIGHT_ARRAY_TYPE_OES          0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_OES        0x86AA +#define GL_WEIGHT_ARRAY_POINTER_OES       0x86AC +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_OES 0x889E + +/* OES_draw_texture */ +#define GL_TEXTURE_CROP_RECT_OES          0x8B9D + +/*************************************************************/ + +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI void APIENTRY glAlphaFuncx (GLenum func, GLclampx ref); +GLAPI void APIENTRY glBindBuffer(GLenum target, GLuint buffer); +GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +GLAPI void APIENTRY glClear (GLbitfield mask); +GLAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void APIENTRY glClearColorx (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +GLAPI void APIENTRY glClearDepthf (GLclampf depth); +GLAPI void APIENTRY glClearDepthx (GLclampx depth); +GLAPI void APIENTRY glClearStencil (GLint s); +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glClipPlanex(GLenum plane, const GLfixed *equation); +GLAPI void APIENTRY glClipPlanef(GLenum plane, const GLfloat *equation); +GLAPI void APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +GLAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCullFace (GLenum mode); +GLAPI void APIENTRY glDeleteBuffers(GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glDepthFunc (GLenum func); +GLAPI void APIENTRY glDepthMask (GLboolean flag); +GLAPI void APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar); +GLAPI void APIENTRY glDepthRangex (GLclampx zNear, GLclampx zFar); +GLAPI void APIENTRY glDisable (GLenum cap); +GLAPI void APIENTRY glDisableClientState (GLenum array); +GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void APIENTRY glEnable (GLenum cap); +GLAPI void APIENTRY glEnableClientState (GLenum array); +GLAPI void APIENTRY glFinish (void); +GLAPI void APIENTRY glFlush (void); +GLAPI void APIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFogx (GLenum pname, GLfixed param); +GLAPI void APIENTRY glFogxv (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glFrontFace (GLenum mode); +GLAPI void APIENTRY glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +GLAPI void APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +GLAPI void APIENTRY glGetBooleanv(GLenum pname, GLboolean *params); +GLAPI void APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetClipPlanef(GLenum pname, GLfloat eqn[4]); +GLAPI void APIENTRY glGetClipPlanex(GLenum pname, GLfixed eqn[4]); +GLAPI void APIENTRY glGenBuffers(GLsizei n, GLuint *buffers); +GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI GLenum APIENTRY glGetError (void); +GLAPI void APIENTRY glGetFixedv(GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetFloatv(GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetLightfv(GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetLightxv(GLenum light, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetPointerv(GLenum pname, void **params); +GLAPI const GLubyte * APIENTRY glGetString (GLenum name); +GLAPI void APIENTRY glGetTexEnviv(GLenum env, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glHint (GLenum target, GLenum mode); +GLAPI GLboolean APIENTRY glIsBuffer(GLuint buffer); +GLAPI GLboolean APIENTRY glIsEnabled(GLenum cap); +GLAPI GLboolean APIENTRY glIsTexture(GLuint texture); +GLAPI void APIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glLightModelx (GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightModelxv (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glLightx (GLenum light, GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightxv (GLenum light, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLineWidth (GLfloat width); +GLAPI void APIENTRY glLineWidthx (GLfixed width); +GLAPI void APIENTRY glLoadIdentity (void); +GLAPI void APIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadMatrixx (const GLfixed *m); +GLAPI void APIENTRY glLogicOp (GLenum opcode); +GLAPI void APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMaterialx (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glMaterialxv (GLenum face, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glMatrixMode (GLenum mode); +GLAPI void APIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultMatrixx (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4x (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz); +GLAPI void APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +GLAPI void APIENTRY glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterf(GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv(GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameterx(GLenum pname, GLfixed param); +GLAPI void APIENTRY glPointParameterxv(GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glPointSize (GLfloat size); +GLAPI void APIENTRY glPointSizex (GLfixed size); +GLAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units); +GLAPI void APIENTRY glPopMatrix (void); +GLAPI void APIENTRY glPushMatrix (void); +GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSampleCoveragex (GLclampx value, GLboolean invert); +GLAPI void APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glShadeModel (GLenum mode); +GLAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMask (GLuint mask); +GLAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTexEnvx (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTexParameterx (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +/*****************************************************************************************/ +/*                                 OES extension functions                               */ +/*****************************************************************************************/ + +#ifdef GL_OES_matrix_palette + +GLAPI void APIENTRY glCurrentPaletteMatrixOES (GLuint matrixpaletteindex); +GLAPI void APIENTRY glLoadPaletteFromModelViewMatrixOES (void); +GLAPI void APIENTRY glMatrixIndexPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glWeightPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + +#endif /* OES_matrix_palette */ + +#ifdef GL_OES_point_size_array + +GLAPI void APIENTRY glPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *pointer); + +#endif /* OES_point_size_array */ + +#ifdef GL_OES_draw_texture + +GLAPI void APIENTRY glDrawTexsOES (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); +GLAPI void APIENTRY glDrawTexiOES (GLint x, GLint y, GLint z, GLint width, GLint height); +GLAPI void APIENTRY glDrawTexfOES (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); +GLAPI void APIENTRY glDrawTexxOES (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); + +GLAPI void APIENTRY glDrawTexsvOES (GLshort *coords); +GLAPI void APIENTRY glDrawTexivOES (GLint *coords); +GLAPI void APIENTRY glDrawTexfvOES (GLfloat *coords); +GLAPI void APIENTRY glDrawTexxvOES (GLfixed *coords); + +#endif /* GL_OES_draw_texture */ + +#ifdef __cplusplus +} +#endif + +#endif /* __gl_h_ */ diff --git a/include/GLES/glext.h b/include/GLES/glext.h new file mode 100644 index 0000000000..059c6bf1bb --- /dev/null +++ b/include/GLES/glext.h @@ -0,0 +1,80 @@ +#ifndef __glext_h_ +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 1992-2003, Silicon Graphics, Inc. +** All Rights Reserved. +** +** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; +** the contents of this file may not be disclosed to third parties, copied or +** duplicated in any form, in whole or in part, without the prior written +** permission of Silicon Graphics, Inc. +** +** RESTRICTED RIGHTS LEGEND: +** Use, duplication or disclosure by the Government is subject to restrictions +** as set forth in subdivision (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, DOD or NASA FAR Supplement. Unpublished - +** rights reserved under the Copyright Laws of the United States. +** +** -------------------------------------------------------------------------- +** +** Copyright (c) 2004, Hans-Martin Will. All rights reserved. +**  +** Redistribution and use in source and binary forms, with or without  +** modification, are permitted provided that the following conditions are  +** met: +**  +**	 *  Redistributions of source code must retain the above copyright +** 		notice, this list of conditions and the following disclaimer.  +**   *	Redistributions in binary form must reproduce the above copyright +** 		notice, this list of conditions and the following disclaimer in the  +** 		documentation and/or other materials provided with the distribution.  +**  +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE  +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,  +** OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF  +** THE POSSIBILITY OF SUCH DAMAGE. +** +*/ + +#ifndef WIN32 +#define APIENTRY +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif + +#ifdef EGL_ON_SYMBIAN +#	undef GLAPI +#	define GLAPI EXPORT_C +#else +#	ifndef GLAPI +#	define GLAPI +#	endif +#endif + + +#define GL_OES_query_matrix		    1 + +/* OES_query_matrix */ +GLAPI GLbitfield APIENTRY glQueryMatrixxOES(GLfixed *mantissa, GLint *exponent); + + +#ifdef __cplusplus +} +#endif + +#endif /* __glext_h_ */ diff --git a/progs/beos/.gitignore b/progs/beos/.gitignore new file mode 100644 index 0000000000..53011ca2e6 --- /dev/null +++ b/progs/beos/.gitignore @@ -0,0 +1,3 @@ +demo +GLInfo +sample diff --git a/progs/demos/drawpix.c b/progs/demos/drawpix.c index d2f5748674..5490bcc635 100644 --- a/progs/demos/drawpix.c +++ b/progs/demos/drawpix.c @@ -28,6 +28,7 @@ static GLfloat Zpos = -1.0;  static float Xzoom, Yzoom;  static GLboolean DrawFront = GL_FALSE;  static GLboolean Dither = GL_TRUE; +static int win = 0;  static void Reset( void ) @@ -215,6 +216,7 @@ static void Key( unsigned char key, int x, int y )           printf("glDrawBuffer(%s)\n", DrawFront ? "GL_FRONT" : "GL_BACK");           break;        case 27: +         glutDestroyWindow(win);           exit(0);           break;     } @@ -343,7 +345,7 @@ int main( int argc, char *argv[] )     else        glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE); -   glutCreateWindow(argv[0]); +   win = glutCreateWindow(argv[0]);     Init(ciMode, filename);     Usage(); diff --git a/progs/demos/lodbias.c b/progs/demos/lodbias.c index c5a2a1b457..30b1ed13d5 100644 --- a/progs/demos/lodbias.c +++ b/progs/demos/lodbias.c @@ -42,7 +42,7 @@ static GLfloat Xrot = 0, Yrot = -30, Zrot = 0;  static GLboolean Anim = GL_TRUE;  static GLint Bias = 0, BiasStepSign = +1; /* ints avoid fp precision problem */  static GLint BiasMin = -400, BiasMax = 400; - +static int win = 0;  static void @@ -172,6 +172,7 @@ static void Key( unsigned char key, int x, int y )           Bias = 100.0 * (key - '0');           break;        case 27: +         glutDestroyWindow(win);           exit(0);           break;     } @@ -281,7 +282,7 @@ int main( int argc, char *argv[] )     glutInitWindowPosition( 0, 0 );     glutInitWindowSize( 350, 350 );     glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); -   glutCreateWindow(argv[0]); +   win = glutCreateWindow(argv[0]);     glutReshapeFunc( Reshape );     glutKeyboardFunc( Key );     glutSpecialFunc( SpecialKey ); diff --git a/progs/demos/shadowtex.c b/progs/demos/shadowtex.c index 59253e8c1e..0574175935 100644 --- a/progs/demos/shadowtex.c +++ b/progs/demos/shadowtex.c @@ -650,6 +650,7 @@ Display(void)           glDisable(GL_FRAGMENT_PROGRAM_ARB);        } +      glDisable(GL_TEXTURE_1D);        glDisable(GL_TEXTURE_2D);     } diff --git a/progs/demos/streaming_rect.c b/progs/demos/streaming_rect.c index 86e00803c0..4c1d8535fd 100644 --- a/progs/demos/streaming_rect.c +++ b/progs/demos/streaming_rect.c @@ -1,13 +1,9 @@ -  /* - * GL_ARB_multitexture demo + * GL_ARB_pixel_buffer_object test   *   * Command line options: - *    -info      print GL implementation information - * + *    -w WIDTH -h HEIGHT   sets window size   * - * Brian Paul  November 1998  This program is in the public domain. - * Modified on 12 Feb 2002 for > 2 texture units.   */  #define GL_GLEXT_PROTOTYPES @@ -25,6 +21,8 @@  #define PBO 11  #define QUIT 100 +static GLuint DrawPBO; +  static GLboolean Animate = GL_TRUE;  static GLboolean use_pbo = 1;  static GLboolean whole_rect = 1; @@ -49,7 +47,7 @@ static void Idle( void )     }  } -static int max( int a, int b ) { return a > b ? a : b; } +/*static int max( int a, int b ) { return a > b ? a : b; }*/  static int min( int a, int b ) { return a < b ? a : b; }  static void DrawObject() @@ -62,6 +60,7 @@ static void DrawObject()         * release the old copy of the texture and allocate a new one         * without waiting for outstanding rendering to complete.         */ +      glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, DrawPBO);        glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_EXT, size, NULL, GL_STREAM_DRAW_ARB);        { @@ -69,7 +68,7 @@ static void DrawObject()  	 printf("char %d\n", (unsigned char)(Drift * 255)); -	 memset(image, size, (unsigned char)(Drift * 255)); +	 memset(image, (unsigned char)(Drift * 255), size);  	 glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT);        } @@ -86,7 +85,9 @@ static void DrawObject()        if (image == NULL)   	 image = malloc(size); -      memset(image, size, (unsigned char)(Drift * 255)); +      glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, 0); + +      memset(image, (unsigned char)(Drift * 255), size);        /* BGRA should be the fast path for regular uploads as well.         */ @@ -227,12 +228,12 @@ static void SpecialKey( int key, int x, int y )  static void Init( int argc, char *argv[] )  {     const char *exten = (const char *) glGetString(GL_EXTENSIONS); -   GLuint texObj, DrawPBO; +   GLuint texObj;     GLint size; -   if (!strstr(exten, "GL_ARB_multitexture")) { -      printf("Sorry, GL_ARB_multitexture not supported by this renderer.\n"); +   if (!strstr(exten, "GL_ARB_pixel_buffer_object")) { +      printf("Sorry, GL_ARB_pixel_buffer_object not supported by this renderer.\n");        exit(1);     } diff --git a/progs/directfb/.gitignore b/progs/directfb/.gitignore new file mode 100644 index 0000000000..55d65fb5b0 --- /dev/null +++ b/progs/directfb/.gitignore @@ -0,0 +1,4 @@ +df_gears +df_morph3d +df_reflect +multi_window diff --git a/progs/egl/.gitignore b/progs/egl/.gitignore new file mode 100644 index 0000000000..1751108235 --- /dev/null +++ b/progs/egl/.gitignore @@ -0,0 +1,5 @@ +demo1 +demo2 +demo3 +eglgears +eglinfo diff --git a/progs/fbdev/.gitignore b/progs/fbdev/.gitignore new file mode 100644 index 0000000000..b9ddf559fd --- /dev/null +++ b/progs/fbdev/.gitignore @@ -0,0 +1 @@ +glfbdevtest diff --git a/progs/glsl/.gitignore b/progs/glsl/.gitignore index 622e0417a8..81ecf5bdd5 100644 --- a/progs/glsl/.gitignore +++ b/progs/glsl/.gitignore @@ -1,5 +1,6 @@  brick  bump +convolutions  deriv  extfuncs.h  mandelbrot diff --git a/progs/glsl/Makefile b/progs/glsl/Makefile index 37fa312c30..b9cae66815 100644 --- a/progs/glsl/Makefile +++ b/progs/glsl/Makefile @@ -14,7 +14,8 @@ PROGS = \  	mandelbrot \  	noise \  	toyball \ -	texdemo1 +	texdemo1 \ +        convolutions  ##### RULES ##### @@ -62,6 +63,12 @@ texdemo1: texdemo1.o readtex.o  texdemo1.o: texdemo1.c readtex.h extfuncs.h  	$(CC) -c -I$(INCDIR) $(CFLAGS) texdemo1.c +convolutions: convolutions.o readtex.o +	$(CC) -I$(INCDIR) $(CFLAGS) convolutions.o readtex.o $(APP_LIB_DEPS) -o $@ + +convolutions.o: convolutions.c readtex.h +	$(CC) -c -I$(INCDIR) $(CFLAGS) convolutions.c +  clean:  	-rm -f $(PROGS) diff --git a/progs/glsl/convolution.frag b/progs/glsl/convolution.frag new file mode 100644 index 0000000000..e49b8acf54 --- /dev/null +++ b/progs/glsl/convolution.frag @@ -0,0 +1,21 @@ + +const int KernelSize = 9; + +//texture offsets +uniform vec2 Offset[KernelSize]; +//convolution kernel +uniform vec4 KernelValue[KernelSize]; +uniform sampler2D srcTex; +uniform vec4 ScaleFactor; +uniform vec4 BaseColor; + +void main(void) +{ +    int i; +    vec4 sum = vec4(0.0); +    for (i = 0; i < KernelSize; ++i) { +        vec4 tmp = texture2D(srcTex, gl_TexCoord[0].st + Offset[i]); +        sum += tmp * KernelValue[i]; +    } +    gl_FragColor = sum * ScaleFactor + BaseColor; +} diff --git a/progs/glsl/convolution.vert b/progs/glsl/convolution.vert new file mode 100644 index 0000000000..752c54671c --- /dev/null +++ b/progs/glsl/convolution.vert @@ -0,0 +1,5 @@ +void main() { +    gl_FrontColor = gl_Color; +    gl_TexCoord[0] = gl_MultiTexCoord0; +    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +} diff --git a/progs/glsl/convolutions.c b/progs/glsl/convolutions.c new file mode 100644 index 0000000000..be887714c4 --- /dev/null +++ b/progs/glsl/convolutions.c @@ -0,0 +1,441 @@ +#define GL_GLEXT_PROTOTYPES +#include "readtex.h" + +#include <GL/glut.h> +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <math.h> + +enum Filter { +   GAUSSIAN_BLUR, +   SHARPEN, +   MEAN_REMOVAL, +   EMBOSS, +   NO_FILTER, +   LAST +}; +#define QUIT LAST + +struct BoundingBox { +   float minx, miny, minz; +   float maxx, maxy, maxz; +}; +struct Texture { +   GLuint id; +   GLfloat x; +   GLfloat y; +   GLint width; +   GLint height; +   GLenum format; +}; + +static const char *textureLocation = "../images/girl2.rgb"; + +static GLfloat viewRotx = 0.0, viewRoty = 0.0, viewRotz = 0.0; +static struct BoundingBox box; +static struct Texture texture; +static GLuint program; +static GLint menuId; +static enum Filter filter = GAUSSIAN_BLUR; + + +static void checkError(int line) +{ +   GLenum err = glGetError(); +   if (err) { +      printf("GL Error %s (0x%x) at line %d\n", +             gluErrorString(err), (int) err, line); +   } +} + +static void loadAndCompileShader(GLuint shader, const char *text) +{ +   GLint stat; + +   glShaderSource(shader, 1, (const GLchar **) &text, NULL); + +   glCompileShader(shader); + +   glGetShaderiv(shader, GL_COMPILE_STATUS, &stat); +   if (!stat) { +      GLchar log[1000]; +      GLsizei len; +      glGetShaderInfoLog(shader, 1000, &len, log); +      fprintf(stderr, "Problem compiling shader: %s\n", log); +      exit(1); +   } +   else { +      printf("Shader compiled OK\n"); +   } +} + +static void readShader(GLuint shader, const char *filename) +{ +   const int max = 100*1000; +   int n; +   char *buffer = (char*) malloc(max); +   FILE *f = fopen(filename, "r"); +   if (!f) { +      fprintf(stderr, "Unable to open shader file %s\n", filename); +      exit(1); +   } + +   n = fread(buffer, 1, max, f); +   printf("Read %d bytes from shader file %s\n", n, filename); +   if (n > 0) { +      buffer[n] = 0; +      loadAndCompileShader(shader, buffer); +   } + +   fclose(f); +   free(buffer); +} + + +static void +checkLink(GLuint prog) +{ +   GLint stat; +   glGetProgramiv(prog, GL_LINK_STATUS, &stat); +   if (!stat) { +      GLchar log[1000]; +      GLsizei len; +      glGetProgramInfoLog(prog, 1000, &len, log); +      fprintf(stderr, "Linker error:\n%s\n", log); +   } +   else { +      fprintf(stderr, "Link success!\n"); +   } +} + +static void fillConvolution(GLint *k, +                            GLfloat *scale, +                            GLfloat *color) +{ +   switch(filter) { +   case GAUSSIAN_BLUR: +      k[0] = 1; k[1] = 2; k[2] = 1; +      k[3] = 2; k[4] = 4; k[5] = 2; +      k[6] = 1; k[7] = 2; k[8] = 1; + +      *scale = 1./16.; +      break; +   case SHARPEN: +      k[0] =  0; k[1] = -2; k[2] =  0; +      k[3] = -2; k[4] = 11; k[5] = -2; +      k[6] =  0; k[7] = -2; k[8] =  0; + +      *scale = 1./3.; +      break; +   case MEAN_REMOVAL: +      k[0] = -1; k[1] = -1; k[2] = -1; +      k[3] = -1; k[4] =  9; k[5] = -1; +      k[6] = -1; k[7] = -1; k[8] = -1; + +      *scale = 1./1.; +      break; +   case EMBOSS: +      k[0] = -1; k[1] =  0; k[2] = -1; +      k[3] =  0; k[4] =  4; k[5] =  0; +      k[6] = -1; k[7] =  0; k[8] = -1; + +      *scale = 1./1.; +      color[0] = 0.5; +      color[1] = 0.5; +      color[2] = 0.5; +      color[3] = 0.5; +      break; +   case NO_FILTER: +      k[0] =  0; k[1] =  0; k[2] =  0; +      k[3] =  0; k[4] =  1; k[5] =  0; +      k[6] =  0; k[7] =  0; k[8] =  0; + +      *scale = 1.; +      break; +   default: +      assert(!"Unhandled switch value"); +   } +} + +static void setupConvolution() +{ +   GLint *kernel = (GLint*)malloc(sizeof(GLint) * 9); +   GLfloat scale; +   GLfloat *vecKer = (GLfloat*)malloc(sizeof(GLfloat) * 9 * 4); +   GLuint loc; +   GLuint i; +   GLfloat baseColor[4]; +   baseColor[0] = 0; +   baseColor[1] = 0; +   baseColor[2] = 0; +   baseColor[3] = 0; + +   fillConvolution(kernel, &scale, baseColor); +   /*vector of 4*/ +   for (i = 0; i < 9; ++i) { +      vecKer[i*4 + 0] = kernel[i]; +      vecKer[i*4 + 1] = kernel[i]; +      vecKer[i*4 + 2] = kernel[i]; +      vecKer[i*4 + 3] = kernel[i]; +   } + +   loc = glGetUniformLocationARB(program, "KernelValue"); +   glUniform4fv(loc, 9, vecKer); +   loc = glGetUniformLocationARB(program, "ScaleFactor"); +   glUniform4f(loc, scale, scale, scale, scale); +   loc = glGetUniformLocationARB(program, "BaseColor"); +   glUniform4f(loc, baseColor[0], baseColor[1], +               baseColor[2], baseColor[3]); + +   free(vecKer); +   free(kernel); +} + +static void createProgram(const char *vertProgFile, +                          const char *fragProgFile) +{ +   GLuint fragShader = 0, vertShader = 0; + +   program = glCreateProgram(); +   if (vertProgFile) { +      vertShader = glCreateShader(GL_VERTEX_SHADER); +      readShader(vertShader, vertProgFile); +      glAttachShader(program, vertShader); +   } + +   if (fragProgFile) { +      fragShader = glCreateShader(GL_FRAGMENT_SHADER); +      readShader(fragShader, fragProgFile); +      glAttachShader(program, fragShader); +   } + +   glLinkProgram(program); +   checkLink(program); + +   glUseProgram(program); + +   assert(glIsProgram(program)); +   assert(glIsShader(fragShader)); +   assert(glIsShader(vertShader)); + +   checkError(__LINE__); +   {/*texture*/ +      GLuint texLoc = glGetUniformLocationARB(program, "srcTex"); +      glUniform1iARB(texLoc, 0); +   } +   {/*setup offsets */ +      float offsets[] = { 1.0 / texture.width,  1.0 / texture.height, +                          0.0                ,  1.0 / texture.height, +                          -1.0 / texture.width,  1.0 / texture.height, +                          1.0 / texture.width,  0.0, +                          0.0                ,  0.0, +                          -1.0 / texture.width,  0.0, +                          1.0 / texture.width, -1.0 / texture.height, +                          0.0                , -1.0 / texture.height, +                          -1.0 / texture.width, -1.0 / texture.height }; +      GLuint offsetLoc = glGetUniformLocationARB(program, "Offset"); +      glUniform2fv(offsetLoc, 9, offsets); +   } +   setupConvolution(); + +   checkError(__LINE__); +} + + +static void readTexture(const char *filename) +{ +   GLubyte *data; + +   texture.x = 0; +   texture.y = 0; + +   glGenTextures(1, &texture.id); +   glBindTexture(GL_TEXTURE_2D, texture.id); +   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_CLAMP); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); +   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +   data = LoadRGBImage(filename, &texture.width, &texture.height, +                       &texture.format); +   if (!data) { +      printf("Error: couldn't load texture image '%s'\n", filename); +      exit(1); +   } +   printf("Texture %s (%d x %d)\n", +          filename, texture.width, texture.height); +   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, +                texture.width, texture.height, 0, texture.format, +                GL_UNSIGNED_BYTE, data); +} + +static void menuSelected(int entry) +{ +   switch (entry) { +   case QUIT: +      exit(0); +      break; +   default: +      filter = (enum Filter)entry; +   } +   setupConvolution(); + +   glutPostRedisplay(); +} + +static void menuInit() +{ +   menuId = glutCreateMenu(menuSelected); + +   glutAddMenuEntry("Gaussian blur", GAUSSIAN_BLUR); +   glutAddMenuEntry("Sharpen", SHARPEN); +   glutAddMenuEntry("Mean removal", MEAN_REMOVAL); +   glutAddMenuEntry("Emboss", EMBOSS); +   glutAddMenuEntry("None", NO_FILTER); + +   glutAddMenuEntry("Quit", QUIT); + +   glutAttachMenu(GLUT_RIGHT_BUTTON); +} + +static void init() +{ +   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER)); +   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION)); +   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR)); + +   menuInit(); +   readTexture(textureLocation); +   createProgram("convolution.vert", "convolution.frag"); + +   glEnable(GL_TEXTURE_2D); +   glClearColor(1.0, 1.0, 1.0, 1.0); +   /*glShadeModel(GL_SMOOTH);*/ +   glShadeModel(GL_FLAT); +} + +static void reshape(int width, int height) +{ +   glViewport(0, 0, width, height); +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   box.minx = 0; +   box.maxx = width; +   box.miny = 0; +   box.maxy = height; +   box.minz = 0; +   box.maxz = 1; +   glOrtho(box.minx, box.maxx, box.miny, box.maxy, -999999, 999999); +   glMatrixMode(GL_MODELVIEW); +} + +static void keyPress(unsigned char key, int x, int y) +{ +   switch(key) { +   case 27: +      exit(0); +   default: +      return; +   } +   glutPostRedisplay(); +} + +static void +special(int k, int x, int y) +{ +   switch (k) { +   case GLUT_KEY_UP: +      viewRotx += 2.0; +      break; +   case GLUT_KEY_DOWN: +      viewRotx -= 2.0; +      break; +   case GLUT_KEY_LEFT: +      viewRoty += 2.0; +      break; +   case GLUT_KEY_RIGHT: +      viewRoty -= 2.0; +      break; +   default: +      return; +   } +   glutPostRedisplay(); +} + + +static void draw() +{ +   GLfloat center[2]; +   GLfloat anchor[2]; + +   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + +   glLoadIdentity(); +   glPushMatrix(); + +   center[0] = box.maxx/2; +   center[1] = box.maxy/2; +   anchor[0] = center[0] - texture.width/2; +   anchor[1] = center[1] - texture.height/2; + +   glTranslatef(center[0], center[1], 0); +   glRotatef(viewRotx, 1.0, 0.0, 0.0); +   glRotatef(viewRoty, 0.0, 1.0, 0.0); +   glRotatef(viewRotz, 0.0, 0.0, 1.0); +   glTranslatef(-center[0], -center[1], 0); + +   glTranslatef(anchor[0], anchor[1], 0); +   glBegin(GL_TRIANGLE_STRIP); +   { +      glColor3f(1., 0., 0.); +      glTexCoord2f(0, 0); +      glVertex3f(0, 0, 0); + +      glColor3f(0., 1., 0.); +      glTexCoord2f(0, 1.0); +      glVertex3f(0, texture.height, 0); + +      glColor3f(1., 0., 0.); +      glTexCoord2f(1.0, 0); +      glVertex3f(texture.width, 0, 0); + +      glColor3f(0., 1., 0.); +      glTexCoord2f(1, 1); +      glVertex3f(texture.width, texture.height, 0); +   } +   glEnd(); + +   glPopMatrix(); + +   glFlush(); + +   glutSwapBuffers(); +} + +int main(int argc, char **argv) +{ +   glutInit(&argc, argv); + +   glutInitWindowPosition(0, 0); +   glutInitWindowSize(400, 400); +   glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE); + +   if (!glutCreateWindow("Image Convolutions")) { +      fprintf(stderr, "Couldn't create window!\n"); +      exit(1); +   } + +   init(); + +   glutReshapeFunc(reshape); +   glutKeyboardFunc(keyPress); +   glutSpecialFunc(special); +   glutDisplayFunc(draw); + + +   glutMainLoop(); +   return 0; +} diff --git a/progs/glsl/texdemo1.c b/progs/glsl/texdemo1.c index d29ecf452b..3ceae14b96 100644 --- a/progs/glsl/texdemo1.c +++ b/progs/glsl/texdemo1.c @@ -48,6 +48,7 @@ static GLfloat TexXrot = 0, TexYrot = 0;  static GLfloat Xrot = 20.0, Yrot = 20.0, Zrot = 0.0;  static GLfloat EyeDist = 10;  static GLboolean Anim = GL_TRUE; +static int win = 0;  struct uniform_info { @@ -177,6 +178,7 @@ key(unsigned char k, int x, int y)           EyeDist = 90;        break;     case 27: +      glutDestroyWindow(win);        exit(0);     }     glutPostRedisplay(); @@ -554,7 +556,7 @@ main(int argc, char *argv[])     glutInit(&argc, argv);     glutInitWindowSize(500, 400);     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); -   glutCreateWindow(Demo); +   win = glutCreateWindow(Demo);     glutReshapeFunc(Reshape);     glutKeyboardFunc(key);     glutSpecialFunc(specialkey); diff --git a/progs/miniglx/.gitignore b/progs/miniglx/.gitignore new file mode 100644 index 0000000000..f630f591f6 --- /dev/null +++ b/progs/miniglx/.gitignore @@ -0,0 +1,6 @@ +manytex +miniglxsample +miniglxtest +sample_server +sample_server2 +texline diff --git a/progs/osdemos/.gitignore b/progs/osdemos/.gitignore new file mode 100644 index 0000000000..5c78f12481 --- /dev/null +++ b/progs/osdemos/.gitignore @@ -0,0 +1,8 @@ +osdemo +osdemo16 +osdemo32 +ostest1 +readtex.c +readtex.h +showbuffer.c +showbuffer.h diff --git a/progs/samples/.gitignore b/progs/samples/.gitignore index 9635c7f450..f60d6e94ea 100644 --- a/progs/samples/.gitignore +++ b/progs/samples/.gitignore @@ -1,24 +1,41 @@  .cvsignore  accum +anywin +bdemo +binfo  bitmap1  bitmap2  blendeq  blendxor +bugger  copy  cursor +demo  depth  eval +ffset  fog  font +font +incopy  line  logo +lthreads +lxdemo +lxgears +lxheads +lxinfo +lxpixmap  nurb  oglinfo  olympic  overlay +pend  point  prim  quad +readtex.c +readtex.h  select  shape  sphere @@ -28,20 +45,3 @@ stretch  texture  tri  wave -bugger -pend -lthreads -lxdemo -lxgears -lxheads -lxinfo -lxpixmap -anywin -ffset -bdemo -binfo -incopy -demo -font -readtex.c -readtex.h diff --git a/progs/slang/.gitignore b/progs/slang/.gitignore new file mode 100644 index 0000000000..8a42b018e6 --- /dev/null +++ b/progs/slang/.gitignore @@ -0,0 +1,3 @@ +cltest +sotest +vstest diff --git a/progs/tests/.gitignore b/progs/tests/.gitignore index 2c0e16c35e..a72f552f10 100644 --- a/progs/tests/.gitignore +++ b/progs/tests/.gitignore @@ -1,48 +1,75 @@  .cvsignore -getproclist.h +afsmultiarb  antialias  arbfpspec  arbfptest1  arbfptexture  arbfptrig +arbnpot +arbnpot-mipmap  arbvptest1  arbvptest3  arbvptorus  arbvpwarpmesh +arraytexture  blendminmax  blendsquare  bufferobj +bug_3050  bug_3101  bug_3195 +calibrate_rast +copypixrate  crossbar  cva  dinoshade +drawbuffers +extfuncs.h  fbotest1 +fbotest2  fbotexture +fillrate  floattex  fog  fogcoord  fptest1  fptexture  getprocaddress +getproclist.h +interleave  invert +jkrahntest  manytex +minmag +mipmap_limits +mipmap_view  multipal  no_s3tc  packedpixels  pbo +prog_parameter  projtex +random +readrate +readtex.c +readtex.h  seccolor  sharedtex -stencil_wrap  stencilwrap +stencil_wrap +subtex +subtexrate  tex1d  texcmp +texcompress2 +texfilt  texgenmix  texline  texobjshare  texrect  texwrap +vao-01 +vao-02  vparray  vptest1  vptest2 @@ -51,4 +78,6 @@ vptorus  vpwarpmesh  yuvrect  yuvsquare +zcomp +zdrawpix  zreaddraw diff --git a/progs/tests/Makefile b/progs/tests/Makefile index 27e2eafdfc..75d1eca08e 100644 --- a/progs/tests/Makefile +++ b/progs/tests/Makefile @@ -84,6 +84,8 @@ SOURCES = \  	vpwarpmesh.c \  	yuvrect.c \  	yuvsquare.c \ +	zcomp.c \ +	zdrawpix.c \  	zreaddraw.c  PROGS = $(SOURCES:%.c=%) diff --git a/progs/tests/manytex.c b/progs/tests/manytex.c index 61a1519ae6..900e5834fe 100644 --- a/progs/tests/manytex.c +++ b/progs/tests/manytex.c @@ -30,6 +30,7 @@ static GLboolean LinearFilter = GL_FALSE;  static GLboolean RandomSize = GL_FALSE;  static GLint Rows, Columns;  static GLint LowPriorityCount = 0; +static GLint Win;  static void Idle( void ) @@ -128,6 +129,14 @@ static int RandomInt(int min, int max)  } +static void DeleteTextures(void) +{ +   glDeleteTextures(NumTextures, TextureID); +   free(TextureID); +   TextureID = NULL; +} + +  static void Init( void )  { @@ -306,9 +315,12 @@ static void Key( unsigned char key, int x, int y )           Zrot += step;           break;        case ' ': +         DeleteTextures();           Init();           break;        case 27: +         DeleteTextures(); +         glutDestroyWindow(Win);           exit(0);           break;     } @@ -324,7 +336,7 @@ int main( int argc, char *argv[] )     glutInitWindowPosition( 0, 0 );     glutInitWindowSize( WinWidth, WinHeight );     glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); -   glutCreateWindow(argv[0]); +   Win = glutCreateWindow(argv[0]);     glutReshapeFunc( Reshape );     glutKeyboardFunc( Key );     glutDisplayFunc( Display ); diff --git a/progs/tests/mipmap_limits.c b/progs/tests/mipmap_limits.c index d6d6e467b0..8bdad826f7 100644 --- a/progs/tests/mipmap_limits.c +++ b/progs/tests/mipmap_limits.c @@ -59,6 +59,18 @@ static GLfloat LodBias = 0.0;  static GLboolean NearestFilter = GL_TRUE; +static void +InitValues(void) +{ +   BaseLevel = 0; +   MaxLevel = 8; +   MinLod = -1; +   MaxLod = 9; +   LodBias = 0.0; +   NearestFilter = GL_TRUE; +} + +  static void MakeImage(int level, int width, int height, const GLubyte color[4])  {     const int makeStripes = 0; @@ -108,6 +120,8 @@ static void makeImages(void)  static void myinit(void)  { +    InitValues(); +      glEnable(GL_DEPTH_TEST);      glDepthFunc(GL_LESS);      glShadeModel(GL_FLAT); @@ -125,7 +139,7 @@ static void myinit(void)  static void display(void)  {     GLfloat tcm = 4.0; -    printf("BASE_LEVEL = %d  MAX_LEVEL = %d  MIN_LOD = %f MAX_LOD = %f Bias = %.2g  filter = %s\n", +    printf("BASE_LEVEL=%d  MAX_LEVEL=%d  MIN_LOD=%.2g  MAX_LOD=%.2g  Bias=%.2g  Filter=%s\n",             BaseLevel, MaxLevel, MinLod, MaxLod, LodBias,             NearestFilter ? "NEAREST" : "LINEAR");      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, BaseLevel); @@ -214,6 +228,9 @@ key(unsigned char k, int x, int y)    case 'f':       NearestFilter = !NearestFilter;       break; +  case ' ': +     InitValues(); +     break;    case 27:  /* Escape */      exit(0);      break; @@ -227,12 +244,13 @@ key(unsigned char k, int x, int y)  static void usage(void)  {     printf("usage:\n"); -   printf("  b/B  decrease/increase GL_TEXTURE_BASE_LEVEL\n"); -   printf("  m/M  decrease/increase GL_TEXTURE_MAX_LEVEL\n"); -   printf("  n/N  decrease/increase GL_TEXTURE_MIN_LOD\n"); -   printf("  x/X  decrease/increase GL_TEXTURE_MAX_LOD\n"); -   printf("  l/L  decrease/increase GL_TEXTURE_LOD_BIAS\n"); -   printf("  f    toggle nearest/linear filtering\n"); +   printf("  b/B    decrease/increase GL_TEXTURE_BASE_LEVEL\n"); +   printf("  m/M    decrease/increase GL_TEXTURE_MAX_LEVEL\n"); +   printf("  n/N    decrease/increase GL_TEXTURE_MIN_LOD\n"); +   printf("  x/X    decrease/increase GL_TEXTURE_MAX_LOD\n"); +   printf("  l/L    decrease/increase GL_TEXTURE_LOD_BIAS\n"); +   printf("  f      toggle nearest/linear filtering\n"); +   printf("  SPACE  reset values\n");  } diff --git a/progs/tests/zcomp.c b/progs/tests/zcomp.c new file mode 100644 index 0000000000..b53079d07f --- /dev/null +++ b/progs/tests/zcomp.c @@ -0,0 +1,223 @@ +/** + * Test Z compositing with glDrawPixels(GL_DEPTH_COMPONENT) and stencil test. + */ + +#define GL_GLEXT_PROTOTYPES +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> +#include "../util/showbuffer.c" + + +static int Win; +static GLfloat Xrot = 0, Yrot = 0, Zpos = 6; +static GLboolean Anim = GL_FALSE; + +static int Width = 400, Height = 200; +static GLfloat *Zimg; +static GLubyte *Cimg; +static GLboolean showZ = 0; + + +static void +Idle(void) +{ +   Xrot += 3.0; +   Yrot += 4.0; +   glutPostRedisplay(); +} + + +/** + * Draw first object, save color+Z images + */ +static void +DrawFirst(void) +{ +   static const GLfloat red[4] = { 1.0, 0.0, 0.0, 0.0 }; + +   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red); + +   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + +   glPushMatrix(); +   glTranslatef(-1, 0, 0); +   glRotatef(45 + Xrot, 1, 0, 0); + +   glutSolidTorus(0.75, 2.0, 10, 20); + +   glPopMatrix(); + +   glReadPixels(0, 0, Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, Zimg); +   glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, Cimg); +} + + +/** + * Draw second object. + */ +static void +DrawSecond(void) +{ +   static const GLfloat blue[4] = { 0.0, 0.0, 1.0, 0.0 }; + +   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue); + +   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + +   glPushMatrix(); +   glTranslatef(+1, 0, 0); +   glRotatef(-45 + Xrot, 1, 0, 0); + +   glutSolidTorus(0.75, 2.0, 10, 20); + +   glPopMatrix(); +} + + +/** + * Composite first/saved image over second rendering. + */ +static void +Composite(void) +{ +   glWindowPos2i(0, 0); + +   /* Draw Z values, set stencil where Z test passes */ +   glEnable(GL_STENCIL_TEST); +   glStencilFunc(GL_ALWAYS, 1, ~0); +   glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); +   glColorMask(0,0,0,0); +   glDrawPixels(Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, Zimg); +   glColorMask(1,1,1,1); + +   /* Draw color where stencil==1 */ +   glStencilFunc(GL_EQUAL, 1, ~0); +   glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); +   glDisable(GL_DEPTH_TEST); +   glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, Cimg); +   glEnable(GL_DEPTH_TEST); + +   glDisable(GL_STENCIL_TEST); +} + + +static void +Draw(void) +{ +   DrawFirst(); +   DrawSecond(); +   Composite(); +   glutSwapBuffers(); +} + + +static void +Reshape(int width, int height) +{ +   GLfloat ar = (float) width / height; +   glViewport(0, 0, width, height); +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glFrustum(-ar, ar, -1.0, 1.0, 5.0, 30.0); +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glTranslatef(0.0, 0.0, -15.0); + +   Width = width; +   Height = height; + +   if (Zimg) +      free(Zimg); +   if (Cimg) +      free(Cimg); +   Zimg = (float *) malloc(width * height * 4); +   Cimg = (GLubyte *) malloc(width * height * 4); +} + + +static void +Key(unsigned char key, int x, int y) +{ +   const GLfloat step = 1.0; +   (void) x; +   (void) y; +   switch (key) { +      case 'a': +         Anim = !Anim; +         if (Anim) +            glutIdleFunc(Idle); +         else +            glutIdleFunc(NULL); +         break; +      case 'd': +         showZ = !showZ; +         break; +      case 'z': +         Zpos -= step; +         break; +      case 'Z': +         Zpos += step; +         break; +      case 27: +         glutDestroyWindow(Win); +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + +static void +SpecialKey(int key, int x, int y) +{ +   const GLfloat step = 3.0; +   (void) x; +   (void) y; +   switch (key) { +      case GLUT_KEY_UP: +         Xrot -= step; +         break; +      case GLUT_KEY_DOWN: +         Xrot += step; +         break; +      case GLUT_KEY_LEFT: +         Yrot -= step; +         break; +      case GLUT_KEY_RIGHT: +         Yrot += step; +         break; +   } +   glutPostRedisplay(); +} + + +static void +Init(void) +{ +   /* setup lighting, etc */ +   glEnable(GL_DEPTH_TEST); +   glEnable(GL_LIGHTING); +   glEnable(GL_LIGHT0); +} + + +int +main(int argc, char *argv[]) +{ +   glutInit(&argc, argv); +   glutInitWindowPosition(0, 0); +   glutInitWindowSize(Width, Height); +   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL); +   Win = glutCreateWindow(argv[0]); +   glutReshapeFunc(Reshape); +   glutKeyboardFunc(Key); +   glutSpecialFunc(SpecialKey); +   glutDisplayFunc(Draw); +   if (Anim) +      glutIdleFunc(Idle); +   Init(); +   glutMainLoop(); +   return 0; +} diff --git a/progs/tests/zdrawpix.c b/progs/tests/zdrawpix.c new file mode 100644 index 0000000000..dd222e7dd0 --- /dev/null +++ b/progs/tests/zdrawpix.c @@ -0,0 +1,192 @@ +/** + * Test glDrawPixels(GL_DEPTH_COMPONENT) + * + * We load a window-sized buffer of Z values so that Z=1 at the top and + * Z=0 at the bottom (and interpolate between). + * We draw that image into the Z buffer, then draw an ordinary cube. + * The bottom part of the cube should be "clipped" where the cube fails + * the Z test. + * + * Press 'd' to view the Z buffer as a grayscale image. + */ + +#define GL_GLEXT_PROTOTYPES +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> +#include "../util/showbuffer.c" + + +static int Win; +static GLfloat Xrot = 50, Yrot = 40, Zpos = 6; +static GLboolean Anim = GL_FALSE; + +static int Width = 200, Height = 200; +static GLfloat *z; +static GLboolean showZ = 0; + + +static void +Idle(void) +{ +   Xrot += 3.0; +   Yrot += 4.0; +   glutPostRedisplay(); +} + + +static void +Draw(void) +{ +   glClearColor(0, 0, 0.5, 0); +   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + +#if 1 +   glColor3f(1, 0, 0); +   glWindowPos2i(0,0); +   glColorMask(0,0,0,0); +   glDrawPixels(Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, z); +#elif 0 +   glPushMatrix(); +   glTranslatef(-0.75, 0, Zpos); +   glutSolidSphere(1.0, 20, 10); +   glPopMatrix(); +#endif +   glColorMask(1,1,1,1); + +   /* draw cube */ +   glPushMatrix(); +   glTranslatef(0, 0, Zpos); +   glRotatef(Xrot, 1, 0, 0); +   glRotatef(Yrot, 0, 1, 0); +   glutSolidCube(2.0); +   glPopMatrix(); + +#if 0 +   /* drawpixels after cube */ +   glColor3f(1, 0, 0); +   glWindowPos2i(0,0); +   //glColorMask(0,0,0,0); +   glDrawPixels(Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, z); +#endif + +   if (showZ) { +      ShowDepthBuffer(Width, Height, 0.0, 1.0); +   } + +   glutSwapBuffers(); +} + + +static void +Reshape(int width, int height) +{ +   glViewport(0, 0, width, height); +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 30.0); +   glMatrixMode(GL_MODELVIEW); +   glLoadIdentity(); +   glTranslatef(0.0, 0.0, -15.0); + +   Width = width; +   Height = height; + +   z = (float *) malloc(width * height * 4); +   { +      int i, j, k = 0; +      for (i = 0; i < height; i++) { +         float zval = (float) i / (height - 1); +         for (j = 0; j < width; j++) { +            z[k++] = zval; +         } +      } +   } +} + + +static void +Key(unsigned char key, int x, int y) +{ +   const GLfloat step = 1.0; +   (void) x; +   (void) y; +   switch (key) { +      case 'a': +         Anim = !Anim; +         if (Anim) +            glutIdleFunc(Idle); +         else +            glutIdleFunc(NULL); +         break; +      case 'd': +         showZ = !showZ; +         break; +      case 'z': +         Zpos -= step; +         break; +      case 'Z': +         Zpos += step; +         break; +      case 27: +         glutDestroyWindow(Win); +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + +static void +SpecialKey(int key, int x, int y) +{ +   const GLfloat step = 3.0; +   (void) x; +   (void) y; +   switch (key) { +      case GLUT_KEY_UP: +         Xrot -= step; +         break; +      case GLUT_KEY_DOWN: +         Xrot += step; +         break; +      case GLUT_KEY_LEFT: +         Yrot -= step; +         break; +      case GLUT_KEY_RIGHT: +         Yrot += step; +         break; +   } +   glutPostRedisplay(); +} + + +static void +Init(void) +{ +   /* setup lighting, etc */ +   glEnable(GL_DEPTH_TEST); +   glEnable(GL_LIGHTING); +   glEnable(GL_LIGHT0); +} + + +int +main(int argc, char *argv[]) +{ +   glutInit(&argc, argv); +   glutInitWindowPosition(0, 0); +   glutInitWindowSize(400, 400); +   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); +   Win = glutCreateWindow(argv[0]); +   glutReshapeFunc(Reshape); +   glutKeyboardFunc(Key); +   glutSpecialFunc(SpecialKey); +   glutDisplayFunc(Draw); +   if (Anim) +      glutIdleFunc(Idle); +   Init(); +   glutMainLoop(); +   return 0; +} diff --git a/progs/tools/trace/.gitignore b/progs/tools/trace/.gitignore new file mode 100644 index 0000000000..afe0c5829e --- /dev/null +++ b/progs/tools/trace/.gitignore @@ -0,0 +1 @@ +gltrace.cc diff --git a/progs/trivial/.gitignore b/progs/trivial/.gitignore index aafc4a7291..30f03e9103 100644 --- a/progs/trivial/.gitignore +++ b/progs/trivial/.gitignore @@ -14,6 +14,7 @@ fs-tri  line  line-clip  line-cull +line-smooth  line-stipple-wide  line-userclip  line-userclip-clip @@ -33,6 +34,7 @@ point-clip  point-param  point-sprite  point-wide +point-wide-smooth  poly  poly-flat  poly-unfilled @@ -77,6 +79,7 @@ tri-flat  tri-flat-clip  tri-fog  tri-mask-tri +tri-orig  tri-query  tri-scissor-tri  tri-stencil @@ -84,6 +87,7 @@ tri-tex-3d  tri-tri  tri-unfilled  tri-unfilled-clip +tri-unfilled-edgeflag  tri-unfilled-smooth  tri-unfilled-userclip  tri-unfilled-userclip-stip diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index 8bc6ad4e38..1dbc4721e8 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -45,6 +45,7 @@ SOURCES = \  	point-param.c \  	point-sprite.c \  	point-wide.c \ +	point-wide-smooth.c \  	point.c \  	poly-flat.c \  	poly-unfilled.c \ @@ -69,6 +70,7 @@ SOURCES = \  	quadstrip-cont.c \  	quadstrip-flat.c \  	quadstrip.c \ +	tri-orig.c \  	tri-alpha.c \  	tri-blend-color.c \  	tri-blend-max.c \ @@ -92,6 +94,7 @@ SOURCES = \  	tri-stencil.c \  	tri-tex-3d.c \  	tri-tri.c \ +	tri-unfilled-edgeflag.c \  	tri-unfilled-clip.c \  	tri-unfilled-smooth.c \  	tri-unfilled-userclip-stip.c \ diff --git a/progs/trivial/point-wide-smooth.c b/progs/trivial/point-wide-smooth.c new file mode 100644 index 0000000000..55cbcaec70 --- /dev/null +++ b/progs/trivial/point-wide-smooth.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "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 BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; + + +static void Init(void) +{ +   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER)); +   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION)); +   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR)); + +    glClearColor(0.0, 0.0, 1.0, 0.0); +} + +static void Reshape(int width, int height) +{ + +    glViewport(0, 0, (GLint)width, (GLint)height); + +    glMatrixMode(GL_PROJECTION); +    glLoadIdentity(); +    glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); +    glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + +    switch (key) { +      case 27: +	exit(1); +      default: +	return; +    } + +    glutPostRedisplay(); +} + +static void Draw(void) +{ +   glClear(GL_COLOR_BUFFER_BIT);  + +   glPointSize(8.0); + +   glEnable(GL_POINT_SMOOTH); +   glEnable(GL_BLEND); +   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + +   glBegin(GL_POINTS); +   glColor3f(1,0,0);  +   glVertex3f( 0.9, -0.9, -30.0); +   glColor3f(1,1,0);  +   glVertex3f( 0.9,  0.9, -30.0); +   glColor3f(1,0,1);  +   glVertex3f(-0.9,  0.9, -30.0); +   glColor3f(0,1,1);  +   glVertex3f(-0.9,  -0.9, -30.0); +   glEnd(); + +   glFlush(); + +   if (doubleBuffer) { +      glutSwapBuffers(); +   } +} + +static GLenum Args(int argc, char **argv) +{ +    GLint i; + +    doubleBuffer = GL_FALSE; + +    for (i = 1; i < argc; i++) { +        if (strcmp(argv[i], "-sb") == 0) { +	    doubleBuffer = GL_FALSE; +	} else if (strcmp(argv[i], "-db") == 0) { +	    doubleBuffer = GL_TRUE; +	} else { +	    fprintf(stderr, "%s (Bad option).\n", argv[i]); +	    return GL_FALSE; +	} +    } +    return GL_TRUE; +} + +int main(int argc, char **argv) +{ +    GLenum type; + +    glutInit(&argc, argv); + +    if (Args(argc, argv) == GL_FALSE) { +	exit(1); +    } + +    glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + +    type = GLUT_RGB | GLUT_ALPHA; +    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; +    glutInitDisplayMode(type); + +    if (glutCreateWindow("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/point-wide.c b/progs/trivial/point-wide.c index d1038ecfa1..265b20097b 100644 --- a/progs/trivial/point-wide.c +++ b/progs/trivial/point-wide.c @@ -33,7 +33,6 @@  GLenum doubleBuffer; -static GLboolean smooth = GL_FALSE;  static void Init(void) @@ -60,9 +59,6 @@ static void Key(unsigned char key, int x, int y)  {      switch (key) { -     case 's': -        smooth = !smooth; -        break;        case 27:  	exit(1);        default: @@ -75,19 +71,10 @@ static void Key(unsigned char key, int x, int y)  static void Draw(void)  {     glClear(GL_COLOR_BUFFER_BIT);  +   glDisable(GL_DEPTH_TEST);     glPointSize(8.0); -   if (smooth) { -      glEnable(GL_POINT_SMOOTH); -      glEnable(GL_BLEND); -      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -   } -   else { -      glDisable(GL_POINT_SMOOTH); -      glDisable(GL_BLEND); -   } -     glBegin(GL_POINTS);     glColor3f(1,0,0);      glVertex3f( 0.9, -0.9, -30.0); diff --git a/progs/trivial/quad-tex-2d.c b/progs/trivial/quad-tex-2d.c index 3a6e5237ed..97c9fc54d8 100644 --- a/progs/trivial/quad-tex-2d.c +++ b/progs/trivial/quad-tex-2d.c @@ -31,6 +31,7 @@ static GLenum Target = GL_TEXTURE_2D;  static GLenum Filter = GL_NEAREST;  GLenum doubleBuffer;  static float Rot = 0; +static int win = 0;  static void Init(void)  { @@ -88,6 +89,7 @@ static void Reshape(int width, int height)     glFrustum(-1, 1, -1, 1, 10, 20);  #endif     glMatrixMode(GL_MODELVIEW); +   glLoadIdentity();     glTranslatef(0, 0, -15);  } @@ -101,6 +103,7 @@ static void Key(unsigned char key, int x, int y)        Rot -= 10.0;        break;     case 27: +      glutDestroyWindow(win);        exit(0);     default:        return; @@ -170,7 +173,8 @@ int main(int argc, char **argv)      type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;      glutInitDisplayMode(type); -    if (glutCreateWindow("First Tri") == GL_FALSE) { +    win = glutCreateWindow("First Tri"); +    if (!win) {  	exit(1);      } diff --git a/progs/trivial/tri-orig.c b/progs/trivial/tri-orig.c new file mode 100644 index 0000000000..d5e6742ce1 --- /dev/null +++ b/progs/trivial/tri-orig.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "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 BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; + +static void Init(void) +{ +   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER)); +   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION)); +   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR)); + +    glClearColor(0.0, 0.0, 1.0, 0.0); +} + +static void Reshape(int width, int height) +{ + +    glViewport(0, 0, (GLint)width, (GLint)height); + +    glMatrixMode(GL_PROJECTION); +    glLoadIdentity(); +/*     glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); */ +    glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + +    switch (key) { +      case 27: +	exit(1); +      default: +	return; +    } + +    glutPostRedisplay(); +} + +static void Draw(void) +{ +   glClear(GL_COLOR_BUFFER_BIT);  + +   glBegin(GL_TRIANGLES); +   glColor3f(0,0,.7);  +   glVertex3f( 0.9, -0.9, -0.0); +   glColor3f(.8,0,0);  +   glVertex3f( 0.9,  0.9, -0.0); +   glColor3f(0,.9,0);  +   glVertex3f(-0.9,  0.0, -0.0); +   glEnd(); + +   glFlush(); + +   if (doubleBuffer) { +      glutSwapBuffers(); +   } +} + +static GLenum Args(int argc, char **argv) +{ +    GLint i; + +    doubleBuffer = GL_FALSE; + +    for (i = 1; i < argc; i++) { +        if (strcmp(argv[i], "-sb") == 0) { +	    doubleBuffer = GL_FALSE; +	} else if (strcmp(argv[i], "-db") == 0) { +	    doubleBuffer = GL_TRUE; +	} else { +	    fprintf(stderr, "%s (Bad option).\n", argv[i]); +	    return GL_FALSE; +	} +    } +    return GL_TRUE; +} + +int main(int argc, char **argv) +{ +    GLenum type; + +    glutInit(&argc, argv); + +    if (Args(argc, argv) == GL_FALSE) { +	exit(1); +    } + +    glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + +    type = GLUT_RGB | GLUT_ALPHA; +    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; +    glutInitDisplayMode(type); + +    if (glutCreateWindow("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/tri-unfilled-edgeflag.c b/progs/trivial/tri-unfilled-edgeflag.c new file mode 100644 index 0000000000..31f41f6220 --- /dev/null +++ b/progs/trivial/tri-unfilled-edgeflag.c @@ -0,0 +1,141 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "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 BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; + +static void Init(void) +{ +   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER)); +   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION)); +   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR)); + +    glClearColor(0.0, 0.0, 1.0, 0.0); +} + +static void Reshape(int width, int height) +{ + +    glViewport(0, 0, (GLint)width, (GLint)height); + +    glMatrixMode(GL_PROJECTION); +    glLoadIdentity(); +/*     glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); */ +    glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + +    switch (key) { +      case 27: +	exit(1); +      default: +	return; +    } + +    glutPostRedisplay(); +} + +static void Draw(void) +{ +   glClear(GL_COLOR_BUFFER_BIT);  +   glPolygonMode(GL_FRONT, GL_LINE); +   glPolygonMode(GL_BACK, GL_LINE); + +   glBegin(GL_TRIANGLES); +   glEdgeFlag(1); +   glColor3f(0,0,.7);  +   glVertex3f( 0.9, -0.9, -0.0); +   glEdgeFlag(0); +   glColor3f(.8,0,0);  +   glVertex3f( 0.9,  0.9, -0.0); +   glEdgeFlag(1); +   glColor3f(0,.9,0);  +   glVertex3f(-0.9,  0.0, -0.0); +   glEnd(); + +   glFlush(); + +   if (doubleBuffer) { +      glutSwapBuffers(); +   } +} + +static GLenum Args(int argc, char **argv) +{ +    GLint i; + +    doubleBuffer = GL_FALSE; + +    for (i = 1; i < argc; i++) { +        if (strcmp(argv[i], "-sb") == 0) { +	    doubleBuffer = GL_FALSE; +	} else if (strcmp(argv[i], "-db") == 0) { +	    doubleBuffer = GL_TRUE; +	} else { +	    fprintf(stderr, "%s (Bad option).\n", argv[i]); +	    return GL_FALSE; +	} +    } +    return GL_TRUE; +} + +int main(int argc, char **argv) +{ +    GLenum type; + +    glutInit(&argc, argv); + +    if (Args(argc, argv) == GL_FALSE) { +	exit(1); +    } + +    glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + +    type = GLUT_RGB | GLUT_ALPHA; +    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; +    glutInitDisplayMode(type); + +    if (glutCreateWindow("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/util/showbuffer.c b/progs/util/showbuffer.c index 17f84dc62b..b0cedea217 100644 --- a/progs/util/showbuffer.c +++ b/progs/util/showbuffer.c @@ -71,6 +71,8 @@ ShowDepthBuffer( GLsizei winWidth, GLsizei winHeight,     glPushMatrix();     glLoadIdentity(); +   glViewport(0, 0, winWidth, winHeight); +     glDisable(GL_STENCIL_TEST);     glDisable(GL_DEPTH_TEST);     glRasterPos2f(0, 0); @@ -120,6 +122,8 @@ ShowAlphaBuffer( GLsizei winWidth, GLsizei winHeight )     glPushMatrix();     glLoadIdentity(); +   glViewport(0, 0, winWidth, winHeight); +     glDisable(GL_STENCIL_TEST);     glDisable(GL_DEPTH_TEST);     glRasterPos2f(0, 0); @@ -170,6 +174,8 @@ ShowStencilBuffer( GLsizei winWidth, GLsizei winHeight,     glPushMatrix();     glLoadIdentity(); +   glViewport(0, 0, winWidth, winHeight); +     glDisable(GL_STENCIL_TEST);     glDisable(GL_DEPTH_TEST);     glRasterPos2f(0, 0); diff --git a/progs/vp/.gitignore b/progs/vp/.gitignore new file mode 100644 index 0000000000..a5ff993525 --- /dev/null +++ b/progs/vp/.gitignore @@ -0,0 +1 @@ +vp-tris diff --git a/progs/xdemos/.gitignore b/progs/xdemos/.gitignore index 250bc17d98..34551101cb 100644 --- a/progs/xdemos/.gitignore +++ b/progs/xdemos/.gitignore @@ -13,6 +13,7 @@ offset  overlay  pbdemo  pbinfo +sharedtex  texture_from_pixmap  wincopy  xdemo diff --git a/progs/xdemos/Makefile b/progs/xdemos/Makefile index d1d7fecea1..896b160878 100644 --- a/progs/xdemos/Makefile +++ b/progs/xdemos/Makefile @@ -23,6 +23,7 @@ PROGS = glthreads \  	overlay \  	pbinfo \  	pbdemo \ +	sharedtex \  	texture_from_pixmap \  	wincopy \  	xfont \ diff --git a/progs/xdemos/sharedtex.c b/progs/xdemos/sharedtex.c new file mode 100644 index 0000000000..81703fe0e7 --- /dev/null +++ b/progs/xdemos/sharedtex.c @@ -0,0 +1,324 @@ +/* + * Test sharing of texture objects by two rendering contexts. + * In particular, test that changing a texture object in one context + * effects the texture in the second context. + * + * Brian Paul + * 30 Apr 2008 + * + * Copyright (C) 2008  Brian Paul   All Rights Reserved. + *  + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + *  + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + *  + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include <GL/gl.h> +#include <GL/glx.h> +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <X11/keysym.h> + + +#define MAX_CONTEXTS 2 + +#define TEX_SIZE 32 + +static const char *DisplayName = NULL; +static Display *Dpy; +static XVisualInfo *VisInfo; +static Window Win; +static GLXContext Contexts[MAX_CONTEXTS]; +static int WinWidth = 300, WinHeight = 300; + +static int DrawContext = 0, TexContext = 1; + +static GLuint TexObj = 0; +static GLboolean NewTexture = GL_FALSE; + + +static void +Error(const char *msg) +{ +   fprintf(stderr, "sharedtex error: %s\n", msg); +   exit(1); +} + + +static void +CreateWindow(const char *name) +{ +   int attrib[] = { GLX_RGBA, +		    GLX_RED_SIZE, 1, +		    GLX_GREEN_SIZE, 1, +		    GLX_BLUE_SIZE, 1, +		    GLX_DOUBLEBUFFER, +		    None }; +   int scrnum; +   XSetWindowAttributes attr; +   unsigned long mask; +   Window root; +   int xpos = 0, ypos = 0; +   static int n = 0; + +   scrnum = DefaultScreen(Dpy); +   root = RootWindow(Dpy, scrnum); + +   VisInfo = glXChooseVisual(Dpy, scrnum, attrib); +   if (!VisInfo) { +      Error("Unable to find RGB, double-buffered visual"); +   } + +   /* window attributes */ +   xpos = (n % 10) * 100; +   ypos = (n / 10) * 100; +   n++; + +   attr.background_pixel = 0; +   attr.border_pixel = 0; +   attr.colormap = XCreateColormap(Dpy, root, VisInfo->visual, AllocNone); +   attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; +   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; + +   Win = XCreateWindow(Dpy, root, xpos, ypos, WinWidth, WinHeight, +		        0, VisInfo->depth, InputOutput, +		        VisInfo->visual, mask, &attr); +   if (!Win) { +      Error("Couldn't create window"); +   } + +   { +      XSizeHints sizehints; +      sizehints.x = xpos; +      sizehints.y = ypos; +      sizehints.width  = WinWidth; +      sizehints.height = WinHeight; +      sizehints.flags = USSize | USPosition; +      XSetNormalHints(Dpy, Win, &sizehints); +      XSetStandardProperties(Dpy, Win, name, name, +                              None, (char **)NULL, 0, &sizehints); +   } + +   XMapWindow(Dpy, Win); +} + + +/** + * Change texture image, using TexContext + */ +static void +ModifyTexture(void) +{ +   GLuint tex[TEX_SIZE][TEX_SIZE]; +   GLuint c0, c1; +   int i, j; + +   if (Win && !glXMakeCurrent(Dpy, Win, Contexts[TexContext])) { +      Error("glXMakeCurrent failed"); +   } + +   /* choose two random colors */ +   c0 = rand() & 0xffffffff; +   c1 = rand() & 0xffffffff; + +   for (i = 0; i < TEX_SIZE; i++) { +      for (j = 0; j < TEX_SIZE; j++) { +         if (((i / 4) ^ (j / 4)) & 1) { +            tex[i][j] = c0; +         } +         else { +            tex[i][j] = c1; +         } +      } +   } + +   glBindTexture(GL_TEXTURE_2D, TexObj); +   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0, +                GL_RGBA, GL_UNSIGNED_BYTE, tex); + +   NewTexture = GL_TRUE; +} + + +static void +InitContext(void) +{ +   glGenTextures(1, &TexObj); +   assert(TexObj); +   glBindTexture(GL_TEXTURE_2D, TexObj); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +   glEnable(GL_TEXTURE_2D); + +   printf("GL_RENDERER = %s\n", (char*) glGetString(GL_RENDERER)); +} + + +static void +Setup(void) +{ +   int i; + +   Dpy = XOpenDisplay(DisplayName); +   if (!Dpy) { +      Error("Unable to open display"); +   } + +   CreateWindow("sharedtex"); + +   for (i = 0; i < MAX_CONTEXTS; i++) { +      GLXContext share = i > 0 ? Contexts[0] : 0; + +      Contexts[i] = glXCreateContext(Dpy, VisInfo, share, True); +      if (!Contexts[i]) { +         Error("Unable to create GLX context"); +      } + +      if (!glXMakeCurrent(Dpy, Win, Contexts[i])) { +         Error("glXMakeCurrent failed"); +      } + +      InitContext(); +   } + +   ModifyTexture(); +} + + +/** + * Redraw window, using DrawContext + */ +static void +Redraw(void) +{ +   static float rot = 0.0; +   float ar; + +   rot += 1.0; + +   if (Win && !glXMakeCurrent(Dpy, Win, Contexts[DrawContext])) { +      Error("glXMakeCurrent failed"); +   } + +   glViewport(0, 0, WinWidth, WinHeight); +   ar = (float) WinWidth / (float) WinHeight; +   glMatrixMode(GL_PROJECTION); +   glLoadIdentity(); +   glOrtho(-ar, ar, -1.0, 1.0, -1.0, 1.0); +   glMatrixMode(GL_MODELVIEW); + +   glShadeModel(GL_FLAT); +   glClearColor(0.5, 0.5, 0.5, 1.0); +   glClear(GL_COLOR_BUFFER_BIT); + +   glPushMatrix(); +   glRotatef(rot, 0, 0, 1); +   glScalef(0.7, 0.7, 0.7); + +   if (NewTexture) { +      /* rebind to get new contents */ +      glBindTexture(GL_TEXTURE_2D, TexObj); +      NewTexture = GL_FALSE; +   } + +   /* draw textured quad */ +   glBegin(GL_POLYGON); +   glTexCoord2f( 0.0, 0.0 );   glVertex2f( -1.0, -1.0 ); +   glTexCoord2f( 1.0, 0.0 );   glVertex2f(  1.0, -1.0 ); +   glTexCoord2f( 1.0, 1.0 );   glVertex2f(  1.0,  1.0 ); +   glTexCoord2f( 0.0, 1.0 );   glVertex2f( -1.0,  1.0 ); +   glEnd(); + +   glPopMatrix(); + +   if (Win) +      glXSwapBuffers(Dpy, Win); +} + + +static void +EventLoop(void) +{ +   while (1) { +      while (XPending(Dpy) > 0) { +         XEvent event; +         XNextEvent(Dpy, &event); + +         switch (event.type) { +         case Expose: +            Redraw(); +            break; +         case ConfigureNotify: +            WinWidth = event.xconfigure.width; +            WinHeight = event.xconfigure.height; +            break; +         case KeyPress: +            { +               char buf[100]; +               KeySym keySym; +               XComposeStatus stat; +               XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat); +               switch (keySym) { +               case XK_Escape: +                  exit(0); +                  break; +               case XK_t: +               case XK_T: +                  ModifyTexture(); +                  break; +               default: +                  ; +               } +            } +            Redraw(); +            break; +         default: +            /*no-op*/ ; +         } +      } + +      Redraw(); +      usleep(10000); +   } +} + + + + +int +main(int argc, char *argv[]) +{ +   int i; + +   for (i = 1; i < argc; i++) { +      if (strcmp(argv[i], "-display") == 0 && i < argc) { +         DisplayName = argv[i+1]; +         i++; +      } +   } + +   Setup(); + +   printf("Press 't' to change texture image/colors\n"); + +   EventLoop(); + +   return 0; +} diff --git a/src/gallium/README.portability b/src/gallium/README.portability index ab0c197847..18a97f449b 100644 --- a/src/gallium/README.portability +++ b/src/gallium/README.portability @@ -24,6 +24,7 @@ headers in general, should stricly follow these guidelines to ensure  * Don't use variable number of macro arguments. Use static inline functions  instead. +* Don't use C99 features.  = Standard Library = @@ -42,3 +43,67 @@ portable way.  * Use the functions/macros in p_debug.h.  * Don't include assert.h, call abort, printf, etc. + + += Code Style = + +== Inherantice in C == + +The main thing we do is mimic inheritance by structure containment. + +Here's a silly made-up example: + +/* base class */ +struct buffer +{ +  int size; +  void (*validate)(struct buffer *buf); +}; + +/* sub-class of bufffer */ +struct texture_buffer +{ +  struct buffer base;  /* the base class, MUST COME FIRST! */ +  int format; +  int width, height; +}; + + +Then, we'll typically have cast-wrapper functions to convert base-class  +pointers to sub-class pointers where needed: + +static inline struct vertex_buffer *vertex_buffer(struct buffer *buf) +{ +  return (struct vertex_buffer *) buf; +} + + +To create/init a sub-classed object: + +struct buffer *create_texture_buffer(int w, int h, int format) +{ +  struct texture_buffer *t = malloc(sizeof(*t)); +  t->format = format; +  t->width = w; +  t->height = h; +  t->base.size = w * h; +  t->base.validate = tex_validate; +  return &t->base; +} + +Example sub-class method: + +void tex_validate(struct buffer *buf) +{ +  struct texture_buffer *tb = texture_buffer(buf); +  assert(tb->format); +  assert(tb->width); +  assert(tb->height); +} + + +Note that we typically do not use typedefs to make "class names"; we use +'struct whatever' everywhere. + +Gallium's pipe_context and the subclassed psb_context, etc are prime examples  +of this.  There's also many examples in Mesa and the Mesa state tracker. diff --git a/src/gallium/SConscript b/src/gallium/SConscript index f09778ce99..2653f91bd2 100644 --- a/src/gallium/SConscript +++ b/src/gallium/SConscript @@ -18,6 +18,7 @@ SConscript([  	'auxiliary/rtasm/SConscript',  	'auxiliary/tgsi/SConscript',  	'auxiliary/cso_cache/SConscript', +	'auxiliary/translate/SConscript',  	'auxiliary/draw/SConscript',  	'auxiliary/pipebuffer/SConscript',  ]) diff --git a/src/gallium/auxiliary/cso_cache/cso_cache.c b/src/gallium/auxiliary/cso_cache/cso_cache.c index 18acab0967..36dc46ff80 100644 --- a/src/gallium/auxiliary/cso_cache/cso_cache.c +++ b/src/gallium/auxiliary/cso_cache/cso_cache.c @@ -43,6 +43,9 @@ struct cso_cache {     struct cso_hash *rasterizer_hash;     struct cso_hash *sampler_hash;     int    max_size; + +   cso_sanitize_callback sanitize_cb; +   void                 *sanitize_data;  };  #if 1 @@ -205,9 +208,20 @@ static INLINE void delete_cso(void *state, enum cso_cache_type type)     }  } -static INLINE void sanitize_hash(struct cso_hash *hash, enum cso_cache_type type, + +static INLINE void sanitize_hash(struct cso_cache *sc, +                                 struct cso_hash *hash, +                                 enum cso_cache_type type,                                   int max_size)  { +   if (sc->sanitize_cb) +      sc->sanitize_cb(hash, type, max_size, sc->sanitize_data); +} + + +static INLINE void sanitize_cb(struct cso_hash *hash, enum cso_cache_type type, +                               int max_size, void *user_data) +{     /* if we're approach the maximum size, remove fourth of the entries      * otherwise every subsequent call will go through the same */     int hash_size = cso_hash_size(hash); @@ -231,7 +245,7 @@ cso_insert_state(struct cso_cache *sc,                   void *state)  {     struct cso_hash *hash = _cso_hash_for_type(sc, type); -   sanitize_hash(hash, type, sc->max_size); +   sanitize_hash(sc, hash, type, sc->max_size);     return cso_hash_insert(hash, hash_key, state);  } @@ -255,9 +269,9 @@ void *cso_hash_find_data_from_template( struct cso_hash *hash,     while (!cso_hash_iter_is_null(iter)) {        void *iter_data = cso_hash_iter_data(iter);        if (!memcmp(iter_data, templ, size)) { -	 /* Return the payload:  +	 /* We found a match  	  */ -         return (unsigned char *)iter_data + size; +         return iter_data;        }        iter = cso_hash_iter_next(iter);     } @@ -290,6 +304,8 @@ void * cso_take_state(struct cso_cache *sc,  struct cso_cache *cso_cache_create(void)  {     struct cso_cache *sc = MALLOC_STRUCT(cso_cache); +   if (sc == NULL) +      return NULL;     sc->max_size           = 4096;     sc->blend_hash         = cso_hash_create(); @@ -298,6 +314,8 @@ struct cso_cache *cso_cache_create(void)     sc->rasterizer_hash    = cso_hash_create();     sc->fs_hash            = cso_hash_create();     sc->vs_hash            = cso_hash_create(); +   sc->sanitize_cb        = sanitize_cb; +   sc->sanitize_data      = 0;     return sc;  } @@ -332,10 +350,10 @@ void cso_for_each_state(struct cso_cache *sc, enum cso_cache_type type,     iter = cso_hash_first_node(hash);     while (!cso_hash_iter_is_null(iter)) {        void *state = cso_hash_iter_data(iter); +      iter = cso_hash_iter_next(iter);        if (state) {           func(state, user_data);        } -      iter = cso_hash_iter_next(iter);     }  } @@ -363,13 +381,13 @@ void cso_set_maximum_cache_size(struct cso_cache *sc, int number)  {     sc->max_size = number; -   sanitize_hash(sc->blend_hash, CSO_BLEND, sc->max_size); -   sanitize_hash(sc->depth_stencil_hash, CSO_DEPTH_STENCIL_ALPHA, +   sanitize_hash(sc, sc->blend_hash, CSO_BLEND, sc->max_size); +   sanitize_hash(sc, sc->depth_stencil_hash, CSO_DEPTH_STENCIL_ALPHA,                   sc->max_size); -   sanitize_hash(sc->fs_hash, CSO_FRAGMENT_SHADER, sc->max_size); -   sanitize_hash(sc->vs_hash, CSO_VERTEX_SHADER, sc->max_size); -   sanitize_hash(sc->rasterizer_hash, CSO_RASTERIZER, sc->max_size); -   sanitize_hash(sc->sampler_hash, CSO_SAMPLER, sc->max_size); +   sanitize_hash(sc, sc->fs_hash, CSO_FRAGMENT_SHADER, sc->max_size); +   sanitize_hash(sc, sc->vs_hash, CSO_VERTEX_SHADER, sc->max_size); +   sanitize_hash(sc, sc->rasterizer_hash, CSO_RASTERIZER, sc->max_size); +   sanitize_hash(sc, sc->sampler_hash, CSO_SAMPLER, sc->max_size);  }  int cso_maximum_cache_size(const struct cso_cache *sc) @@ -377,3 +395,11 @@ int cso_maximum_cache_size(const struct cso_cache *sc)     return sc->max_size;  } +void cso_cache_set_sanitize_callback(struct cso_cache *sc, +                                     cso_sanitize_callback cb, +                                     void *user_data) +{ +   sc->sanitize_cb   = cb; +   sc->sanitize_data = user_data; +} + diff --git a/src/gallium/auxiliary/cso_cache/cso_cache.h b/src/gallium/auxiliary/cso_cache/cso_cache.h index e5edbbb556..6b5c230e8f 100644 --- a/src/gallium/auxiliary/cso_cache/cso_cache.h +++ b/src/gallium/auxiliary/cso_cache/cso_cache.h @@ -84,8 +84,22 @@  extern "C" {  #endif +enum cso_cache_type { +   CSO_BLEND, +   CSO_SAMPLER, +   CSO_DEPTH_STENCIL_ALPHA, +   CSO_RASTERIZER, +   CSO_FRAGMENT_SHADER, +   CSO_VERTEX_SHADER +}; +  typedef void (*cso_state_callback)(void *ctx, void *obj); +typedef void (*cso_sanitize_callback)(struct cso_hash *hash, +                                      enum cso_cache_type type, +                                      int max_size, +                                      void *user_data); +  struct cso_cache;  struct cso_blend { @@ -130,21 +144,15 @@ struct cso_sampler {     struct pipe_context *context;  }; - -enum cso_cache_type { -   CSO_BLEND, -   CSO_SAMPLER, -   CSO_DEPTH_STENCIL_ALPHA, -   CSO_RASTERIZER, -   CSO_FRAGMENT_SHADER, -   CSO_VERTEX_SHADER -}; -  unsigned cso_construct_key(void *item, int item_size);  struct cso_cache *cso_cache_create(void);  void cso_cache_delete(struct cso_cache *sc); +void cso_cache_set_sanitize_callback(struct cso_cache *sc, +                                     cso_sanitize_callback cb, +                                     void *user_data); +  struct cso_hash_iter cso_insert_state(struct cso_cache *sc,                                        unsigned hash_key, enum cso_cache_type type,                                        void *state); diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index 4a1a6cb79c..a1a3a9efaf 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -25,16 +25,20 @@   *   **************************************************************************/ - /* Wrap the cso cache & hash mechanisms in a simplified + /** +  * @file +  *  +  * Wrap the cso cache & hash mechanisms in a simplified    * pipe-driver-specific interface.    * -  * Authors: -  *   Zack Rusin <zack@tungstengraphics.com> -  *   Keith Whitwell <keith@tungstengraphics.com> +  * @author Zack Rusin <zack@tungstengraphics.com> +  * @author Keith Whitwell <keith@tungstengraphics.com>    */  #include "pipe/p_state.h"  #include "pipe/p_util.h" +#include "pipe/p_inlines.h" +#include "tgsi/util/tgsi_parse.h"  #include "cso_cache/cso_context.h"  #include "cso_cache/cso_cache.h" @@ -76,6 +80,131 @@ struct cso_context {  }; +static boolean delete_blend_state(struct cso_context *ctx, void *state) +{ +   struct cso_blend *cso = (struct cso_blend *)state; + +   if (ctx->blend == cso->data) +      return FALSE; + +   if (cso->delete_state) +      cso->delete_state(cso->context, cso->data); +   FREE(state); +   return TRUE; +} + +static boolean delete_depth_stencil_state(struct cso_context *ctx, void *state) +{ +   struct cso_depth_stencil_alpha *cso = (struct cso_depth_stencil_alpha *)state; + +   if (ctx->depth_stencil == cso->data) +      return FALSE; + +   if (cso->delete_state) +      cso->delete_state(cso->context, cso->data); +   FREE(state); + +   return TRUE; +} + +static boolean delete_sampler_state(struct cso_context *ctx, void *state) +{ +   struct cso_sampler *cso = (struct cso_sampler *)state; +   if (cso->delete_state) +      cso->delete_state(cso->context, cso->data); +   FREE(state); +   return TRUE; +} + +static boolean delete_rasterizer_state(struct cso_context *ctx, void *state) +{ +   struct cso_rasterizer *cso = (struct cso_rasterizer *)state; + +   if (ctx->rasterizer == cso->data) +      return FALSE; +   if (cso->delete_state) +      cso->delete_state(cso->context, cso->data); +   FREE(state); +   return TRUE; +} + +static boolean delete_fs_state(struct cso_context *ctx, void *state) +{ +   struct cso_fragment_shader *cso = (struct cso_fragment_shader *)state; +   if (ctx->fragment_shader == cso->data) +      return FALSE; +   if (cso->delete_state) +      cso->delete_state(cso->context, cso->data); +   FREE(state); +   return TRUE; +} + +static boolean delete_vs_state(struct cso_context *ctx, void *state) +{ +   struct cso_vertex_shader *cso = (struct cso_vertex_shader *)state; +   if (ctx->vertex_shader == cso->data) +      return TRUE; +   if (cso->delete_state) +      cso->delete_state(cso->context, cso->data); +   FREE(state); +   return FALSE; +} + + +static INLINE boolean delete_cso(struct cso_context *ctx, +                                 void *state, enum cso_cache_type type) +{ +   switch (type) { +   case CSO_BLEND: +      return delete_blend_state(ctx, state); +      break; +   case CSO_SAMPLER: +      return delete_sampler_state(ctx, state); +      break; +   case CSO_DEPTH_STENCIL_ALPHA: +      return delete_depth_stencil_state(ctx, state); +      break; +   case CSO_RASTERIZER: +      return delete_rasterizer_state(ctx, state); +      break; +   case CSO_FRAGMENT_SHADER: +      return delete_fs_state(ctx, state); +      break; +   case CSO_VERTEX_SHADER: +      return delete_vs_state(ctx, state); +      break; +   default: +      assert(0); +      FREE(state); +   } +   return FALSE; +} + +static INLINE void sanitize_hash(struct cso_hash *hash, enum cso_cache_type type, +                                 int max_size, void *user_data) +{ +   struct cso_context *ctx = (struct cso_context *)user_data; +   /* if we're approach the maximum size, remove fourth of the entries +    * otherwise every subsequent call will go through the same */ +   int hash_size = cso_hash_size(hash); +   int max_entries = (max_size > hash_size) ? max_size : hash_size; +   int to_remove =  (max_size < max_entries) * max_entries/4; +   struct cso_hash_iter iter = cso_hash_first_node(hash); +   if (hash_size > max_size) +      to_remove += hash_size - max_size; +   while (to_remove) { +      /*remove elements until we're good */ +      /*fixme: currently we pick the nodes to remove at random*/ +      void *cso = cso_hash_iter_data(iter); +      if (delete_cso(ctx, cso, type)) { +         iter = cso_hash_erase(hash, iter); +         --to_remove; +      } else +         iter = cso_hash_iter_next(iter); +   } +} + +  struct cso_context *cso_create_context( struct pipe_context *pipe )  {     struct cso_context *ctx = CALLOC_STRUCT(cso_context); @@ -85,6 +214,9 @@ struct cso_context *cso_create_context( struct pipe_context *pipe )     ctx->cache = cso_cache_create();     if (ctx->cache == NULL)        goto out; +   cso_cache_set_sanitize_callback(ctx->cache, +                                   sanitize_hash, +                                   ctx);     ctx->pipe = pipe; @@ -98,8 +230,14 @@ out:     return NULL;  } -static void cso_release_all( struct cso_context *ctx ) + +/** + * Prior to context destruction, this function unbinds all state objects. + */ +void cso_release_all( struct cso_context *ctx )  { +   unsigned i; +        if (ctx->pipe) {        ctx->pipe->bind_blend_state( ctx->pipe, NULL );        ctx->pipe->bind_rasterizer_state( ctx->pipe, NULL ); @@ -109,6 +247,11 @@ static void cso_release_all( struct cso_context *ctx )        ctx->pipe->bind_vs_state( ctx->pipe, NULL );     } +   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { +      pipe_texture_reference(&ctx->textures[i], NULL); +      pipe_texture_reference(&ctx->textures_saved[i], NULL); +   } +     if (ctx->cache) {        cso_cache_delete( ctx->cache );        ctx->cache = NULL; @@ -118,10 +261,10 @@ static void cso_release_all( struct cso_context *ctx )  void cso_destroy_context( struct cso_context *ctx )  { -   if (ctx) -      cso_release_all( ctx ); - -   FREE( ctx ); +   if (ctx) { +      //cso_release_all( ctx ); +      FREE( ctx ); +   }  } @@ -135,8 +278,8 @@ void cso_destroy_context( struct cso_context *ctx )   * the data member of the cso to be the template itself.   */ -void cso_set_blend(struct cso_context *ctx, -                   const struct pipe_blend_state *templ) +enum pipe_error cso_set_blend(struct cso_context *ctx, +                              const struct pipe_blend_state *templ)  {     unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_blend_state));     struct cso_hash_iter iter = cso_find_state_template(ctx->cache, @@ -146,6 +289,8 @@ void cso_set_blend(struct cso_context *ctx,     if (cso_hash_iter_is_null(iter)) {        struct cso_blend *cso = MALLOC(sizeof(struct cso_blend)); +      if (!cso) +         return PIPE_ERROR_OUT_OF_MEMORY;        cso->state = *templ;        cso->data = ctx->pipe->create_blend_state(ctx->pipe, &cso->state); @@ -153,6 +298,11 @@ void cso_set_blend(struct cso_context *ctx,        cso->context = ctx->pipe;        iter = cso_insert_state(ctx->cache, hash_key, CSO_BLEND, cso); +      if (cso_hash_iter_is_null(iter)) { +         FREE(cso); +         return PIPE_ERROR_OUT_OF_MEMORY; +      } +        handle = cso->data;     }     else { @@ -163,6 +313,7 @@ void cso_set_blend(struct cso_context *ctx,        ctx->blend = handle;        ctx->pipe->bind_blend_state(ctx->pipe, handle);     } +   return PIPE_OK;  }  void cso_save_blend(struct cso_context *ctx) @@ -182,12 +333,12 @@ void cso_restore_blend(struct cso_context *ctx) -void cso_single_sampler(struct cso_context *ctx, -                        unsigned idx, -                        const struct pipe_sampler_state *templ) +enum pipe_error cso_single_sampler(struct cso_context *ctx, +                                   unsigned idx, +                                   const struct pipe_sampler_state *templ)  {     void *handle = NULL; -    +     if (templ != NULL) {        unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_sampler_state));        struct cso_hash_iter iter = cso_find_state_template(ctx->cache, @@ -196,13 +347,20 @@ void cso_single_sampler(struct cso_context *ctx,        if (cso_hash_iter_is_null(iter)) {           struct cso_sampler *cso = MALLOC(sizeof(struct cso_sampler)); -          +         if (!cso) +            return PIPE_ERROR_OUT_OF_MEMORY; +           cso->state = *templ;           cso->data = ctx->pipe->create_sampler_state(ctx->pipe, &cso->state);           cso->delete_state = (cso_state_callback)ctx->pipe->delete_sampler_state;           cso->context = ctx->pipe;           iter = cso_insert_state(ctx->cache, hash_key, CSO_SAMPLER, cso); +         if (cso_hash_iter_is_null(iter)) { +            FREE(cso); +            return PIPE_ERROR_OUT_OF_MEMORY; +         } +           handle = cso->data;        }        else { @@ -211,11 +369,12 @@ void cso_single_sampler(struct cso_context *ctx,     }     ctx->samplers[idx] = handle; +   return PIPE_OK;  }  void cso_single_sampler_done( struct cso_context *ctx )  { -   unsigned i;  +   unsigned i;     /* find highest non-null sampler */     for (i = PIPE_MAX_SAMPLERS; i > 0; i--) { @@ -226,8 +385,8 @@ void cso_single_sampler_done( struct cso_context *ctx )     ctx->nr_samplers = i;     if (ctx->hw.nr_samplers != ctx->nr_samplers || -       memcmp(ctx->hw.samplers,  -              ctx->samplers,  +       memcmp(ctx->hw.samplers, +              ctx->samplers,                ctx->nr_samplers * sizeof(void *)) != 0)      {        memcpy(ctx->hw.samplers, ctx->samplers, ctx->nr_samplers * sizeof(void *)); @@ -237,22 +396,36 @@ void cso_single_sampler_done( struct cso_context *ctx )     }  } -void cso_set_samplers( struct cso_context *ctx, -                       unsigned nr, -                       const struct pipe_sampler_state **templates ) +/* + * If the function encouters any errors it will return the + * last one. Done to always try to set as many samplers + * as possible. + */ +enum pipe_error cso_set_samplers( struct cso_context *ctx, +                                  unsigned nr, +                                  const struct pipe_sampler_state **templates )  {     unsigned i; -    +   enum pipe_error temp, error = PIPE_OK; +     /* TODO: fastpath      */ -   for (i = 0; i < nr; i++) -      cso_single_sampler( ctx, i, templates[i] ); +   for (i = 0; i < nr; i++) { +      temp = cso_single_sampler( ctx, i, templates[i] ); +      if (temp != PIPE_OK) +         error = temp; +   } + +   for ( ; i < ctx->nr_samplers; i++) { +      temp = cso_single_sampler( ctx, i, NULL ); +      if (temp != PIPE_OK) +         error = temp; +   } -   for ( ; i < ctx->nr_samplers; i++) -      cso_single_sampler( ctx, i, NULL ); -        cso_single_sampler_done( ctx ); + +   return error;  }  void cso_save_samplers(struct cso_context *ctx) @@ -263,44 +436,64 @@ void cso_save_samplers(struct cso_context *ctx)  void cso_restore_samplers(struct cso_context *ctx)  { -   cso_set_samplers(ctx, ctx->nr_samplers_saved, -                    (const struct pipe_sampler_state **) ctx->samplers_saved); +   ctx->nr_samplers = ctx->nr_samplers_saved; +   memcpy(ctx->samplers, ctx->samplers_saved, sizeof(ctx->samplers)); +   cso_single_sampler_done( ctx );  } -void cso_set_sampler_textures( struct cso_context *ctx, -                               uint count, -                               struct pipe_texture **textures ) +enum pipe_error cso_set_sampler_textures( struct cso_context *ctx, +                                          uint count, +                                          struct pipe_texture **textures )  {     uint i;     ctx->nr_textures = count;     for (i = 0; i < count; i++) -      ctx->textures[i] = textures[i]; +      pipe_texture_reference(&ctx->textures[i], textures[i]);     for ( ; i < PIPE_MAX_SAMPLERS; i++) -      ctx->textures[i] = NULL; +      pipe_texture_reference(&ctx->textures[i], NULL);     ctx->pipe->set_sampler_textures(ctx->pipe, count, textures); + +   return PIPE_OK;  }  void cso_save_sampler_textures( struct cso_context *ctx )  { +   uint i; +     ctx->nr_textures_saved = ctx->nr_textures; -   memcpy(ctx->textures_saved, ctx->textures, sizeof(ctx->textures)); +   for (i = 0; i < ctx->nr_textures; i++) { +      assert(!ctx->textures_saved[i]); +      pipe_texture_reference(&ctx->textures_saved[i], ctx->textures[i]); +   }  }  void cso_restore_sampler_textures( struct cso_context *ctx )  { -   cso_set_sampler_textures(ctx, ctx->nr_textures_saved, ctx->textures_saved); +   uint i; + +   ctx->nr_textures = ctx->nr_textures_saved; + +   for (i = 0; i < ctx->nr_textures; i++) { +      pipe_texture_reference(&ctx->textures[i], NULL); +      ctx->textures[i] = ctx->textures_saved[i]; +      ctx->textures_saved[i] = NULL; +   } +   for ( ; i < PIPE_MAX_SAMPLERS; i++) +      pipe_texture_reference(&ctx->textures[i], NULL); + +   ctx->pipe->set_sampler_textures(ctx->pipe, ctx->nr_textures, ctx->textures); +     ctx->nr_textures_saved = 0;  } - -void cso_set_depth_stencil_alpha(struct cso_context *ctx, -                                 const struct pipe_depth_stencil_alpha_state *templ) +enum pipe_error cso_set_depth_stencil_alpha(struct cso_context *ctx, +                                            const struct pipe_depth_stencil_alpha_state *templ)  {     unsigned hash_key = cso_construct_key((void*)templ,                                           sizeof(struct pipe_depth_stencil_alpha_state)); @@ -312,13 +505,20 @@ void cso_set_depth_stencil_alpha(struct cso_context *ctx,     if (cso_hash_iter_is_null(iter)) {        struct cso_depth_stencil_alpha *cso = MALLOC(sizeof(struct cso_depth_stencil_alpha)); +      if (!cso) +         return PIPE_ERROR_OUT_OF_MEMORY;        cso->state = *templ;        cso->data = ctx->pipe->create_depth_stencil_alpha_state(ctx->pipe, &cso->state);        cso->delete_state = (cso_state_callback)ctx->pipe->delete_depth_stencil_alpha_state;        cso->context = ctx->pipe; -      cso_insert_state(ctx->cache, hash_key, CSO_DEPTH_STENCIL_ALPHA, cso); +      iter = cso_insert_state(ctx->cache, hash_key, CSO_DEPTH_STENCIL_ALPHA, cso); +      if (cso_hash_iter_is_null(iter)) { +         FREE(cso); +         return PIPE_ERROR_OUT_OF_MEMORY; +      } +        handle = cso->data;     }     else { @@ -329,6 +529,7 @@ void cso_set_depth_stencil_alpha(struct cso_context *ctx,        ctx->depth_stencil = handle;        ctx->pipe->bind_depth_stencil_alpha_state(ctx->pipe, handle);     } +   return PIPE_OK;  }  void cso_save_depth_stencil_alpha(struct cso_context *ctx) @@ -348,8 +549,8 @@ void cso_restore_depth_stencil_alpha(struct cso_context *ctx) -void cso_set_rasterizer(struct cso_context *ctx, -                        const struct pipe_rasterizer_state *templ) +enum pipe_error cso_set_rasterizer(struct cso_context *ctx, +                                   const struct pipe_rasterizer_state *templ)  {     unsigned hash_key = cso_construct_key((void*)templ,                                           sizeof(struct pipe_rasterizer_state)); @@ -360,13 +561,20 @@ void cso_set_rasterizer(struct cso_context *ctx,     if (cso_hash_iter_is_null(iter)) {        struct cso_rasterizer *cso = MALLOC(sizeof(struct cso_rasterizer)); +      if (!cso) +         return PIPE_ERROR_OUT_OF_MEMORY;        cso->state = *templ;        cso->data = ctx->pipe->create_rasterizer_state(ctx->pipe, &cso->state);        cso->delete_state = (cso_state_callback)ctx->pipe->delete_rasterizer_state;        cso->context = ctx->pipe; -      cso_insert_state(ctx->cache, hash_key, CSO_RASTERIZER, cso); +      iter = cso_insert_state(ctx->cache, hash_key, CSO_RASTERIZER, cso); +      if (cso_hash_iter_is_null(iter)) { +         FREE(cso); +         return PIPE_ERROR_OUT_OF_MEMORY; +      } +        handle = cso->data;     }     else { @@ -377,6 +585,7 @@ void cso_set_rasterizer(struct cso_context *ctx,        ctx->rasterizer = handle;        ctx->pipe->bind_rasterizer_state(ctx->pipe, handle);     } +   return PIPE_OK;  }  void cso_save_rasterizer(struct cso_context *ctx) @@ -395,36 +604,71 @@ void cso_restore_rasterizer(struct cso_context *ctx)  } -void cso_set_fragment_shader(struct cso_context *ctx, -                             const struct pipe_shader_state *templ) + +enum pipe_error cso_set_fragment_shader_handle(struct cso_context *ctx, +                                               void *handle ) +{ +   if (ctx->fragment_shader != handle) { +      ctx->fragment_shader = handle; +      ctx->pipe->bind_fs_state(ctx->pipe, handle); +   } +   return PIPE_OK; +} + +void cso_delete_fragment_shader(struct cso_context *ctx, void *handle ) +{ +   if (handle == ctx->fragment_shader) { +      /* unbind before deleting */ +      ctx->pipe->bind_fs_state(ctx->pipe, NULL); +      ctx->fragment_shader = NULL; +   } +   ctx->pipe->delete_fs_state(ctx->pipe, handle); +} + +/* Not really working: + */ +#if 0 +enum pipe_error cso_set_fragment_shader(struct cso_context *ctx, +                                        const struct pipe_shader_state *templ)  { -   unsigned hash_key = cso_construct_key((void*)templ, -                                         sizeof(struct pipe_shader_state)); +   const struct tgsi_token *tokens = templ->tokens; +   unsigned num_tokens = tgsi_num_tokens(tokens); +   size_t tokens_size = num_tokens*sizeof(struct tgsi_token); +   unsigned hash_key = cso_construct_key((void*)tokens, tokens_size);     struct cso_hash_iter iter = cso_find_state_template(ctx->cache, -                                                       hash_key, CSO_FRAGMENT_SHADER, -                                                       (void*)templ); +                                                       hash_key,  +                                                       CSO_FRAGMENT_SHADER, +                                                       (void*)tokens);     void *handle = NULL;     if (cso_hash_iter_is_null(iter)) { -      struct cso_fragment_shader *cso = MALLOC(sizeof(struct cso_fragment_shader)); +      struct cso_fragment_shader *cso = MALLOC(sizeof(struct cso_fragment_shader) + tokens_size); +      struct tgsi_token *cso_tokens = (struct tgsi_token *)((char *)cso + sizeof(*cso)); -      cso->state = *templ; +      if (!cso) +         return PIPE_ERROR_OUT_OF_MEMORY; + +      memcpy(cso_tokens, tokens, tokens_size); +      cso->state.tokens = cso_tokens;        cso->data = ctx->pipe->create_fs_state(ctx->pipe, &cso->state);        cso->delete_state = (cso_state_callback)ctx->pipe->delete_fs_state;        cso->context = ctx->pipe;        iter = cso_insert_state(ctx->cache, hash_key, CSO_FRAGMENT_SHADER, cso); +      if (cso_hash_iter_is_null(iter)) { +         FREE(cso); +         return PIPE_ERROR_OUT_OF_MEMORY; +      } +        handle = cso->data;     }     else {        handle = ((struct cso_fragment_shader *)cso_hash_iter_data(iter))->data;     } -   if (ctx->fragment_shader != handle) { -      ctx->fragment_shader = handle; -      ctx->pipe->bind_fs_state(ctx->pipe, handle); -   } +   return cso_set_fragment_shader_handle( ctx, handle );  } +#endif  void cso_save_fragment_shader(struct cso_context *ctx)  { @@ -434,7 +678,6 @@ void cso_save_fragment_shader(struct cso_context *ctx)  void cso_restore_fragment_shader(struct cso_context *ctx)  { -   assert(ctx->fragment_shader_saved);     if (ctx->fragment_shader_saved != ctx->fragment_shader) {        ctx->pipe->bind_fs_state(ctx->pipe, ctx->fragment_shader_saved);        ctx->fragment_shader = ctx->fragment_shader_saved; @@ -443,9 +686,32 @@ void cso_restore_fragment_shader(struct cso_context *ctx)  } +enum pipe_error cso_set_vertex_shader_handle(struct cso_context *ctx, +                                             void *handle ) +{ +   if (ctx->vertex_shader != handle) { +      ctx->vertex_shader = handle; +      ctx->pipe->bind_vs_state(ctx->pipe, handle); +   } +   return PIPE_OK; +} -void cso_set_vertex_shader(struct cso_context *ctx, -                           const struct pipe_shader_state *templ) +void cso_delete_vertex_shader(struct cso_context *ctx, void *handle ) +{ +   if (handle == ctx->vertex_shader) { +      /* unbind before deleting */ +      ctx->pipe->bind_vs_state(ctx->pipe, NULL); +      ctx->vertex_shader = NULL; +   } +   ctx->pipe->delete_vs_state(ctx->pipe, handle); +} + + +/* Not really working: + */ +#if 0 +enum pipe_error cso_set_vertex_shader(struct cso_context *ctx, +                                      const struct pipe_shader_state *templ)  {     unsigned hash_key = cso_construct_key((void*)templ,                                           sizeof(struct pipe_shader_state)); @@ -457,23 +723,31 @@ void cso_set_vertex_shader(struct cso_context *ctx,     if (cso_hash_iter_is_null(iter)) {        struct cso_vertex_shader *cso = MALLOC(sizeof(struct cso_vertex_shader)); +      if (!cso) +         return PIPE_ERROR_OUT_OF_MEMORY; +        cso->state = *templ;        cso->data = ctx->pipe->create_vs_state(ctx->pipe, &cso->state);        cso->delete_state = (cso_state_callback)ctx->pipe->delete_vs_state;        cso->context = ctx->pipe;        iter = cso_insert_state(ctx->cache, hash_key, CSO_VERTEX_SHADER, cso); +      if (cso_hash_iter_is_null(iter)) { +         FREE(cso); +         return PIPE_ERROR_OUT_OF_MEMORY; +      } +        handle = cso->data;     }     else {        handle = ((struct cso_vertex_shader *)cso_hash_iter_data(iter))->data;     } -   if (ctx->vertex_shader != handle) { -      ctx->vertex_shader = handle; -      ctx->pipe->bind_vs_state(ctx->pipe, handle); -   } +   return cso_set_vertex_shader_handle( ctx, handle );  } +#endif + +  void cso_save_vertex_shader(struct cso_context *ctx)  { @@ -483,9 +757,8 @@ void cso_save_vertex_shader(struct cso_context *ctx)  void cso_restore_vertex_shader(struct cso_context *ctx)  { -   assert(ctx->vertex_shader_saved);     if (ctx->vertex_shader_saved != ctx->vertex_shader) { -      ctx->pipe->bind_fs_state(ctx->pipe, ctx->vertex_shader_saved); +      ctx->pipe->bind_vs_state(ctx->pipe, ctx->vertex_shader_saved);        ctx->vertex_shader = ctx->vertex_shader_saved;     }     ctx->vertex_shader_saved = NULL; @@ -493,14 +766,15 @@ void cso_restore_vertex_shader(struct cso_context *ctx) -void cso_set_framebuffer(struct cso_context *ctx, -                         const struct pipe_framebuffer_state *fb) +enum pipe_error cso_set_framebuffer(struct cso_context *ctx, +                                    const struct pipe_framebuffer_state *fb)  {     /* XXX this memcmp() fails to detect buffer size changes */     if (1/*memcmp(&ctx->fb, fb, sizeof(*fb))*/) {        ctx->fb = *fb;        ctx->pipe->set_framebuffer_state(ctx->pipe, fb);     } +   return PIPE_OK;  }  void cso_save_framebuffer(struct cso_context *ctx) @@ -517,13 +791,14 @@ void cso_restore_framebuffer(struct cso_context *ctx)  } -void cso_set_viewport(struct cso_context *ctx, -                      const struct pipe_viewport_state *vp) +enum pipe_error cso_set_viewport(struct cso_context *ctx, +                                 const struct pipe_viewport_state *vp)  {     if (memcmp(&ctx->vp, vp, sizeof(*vp))) {        ctx->vp = *vp;        ctx->pipe->set_viewport_state(ctx->pipe, vp);     } +   return PIPE_OK;  }  void cso_save_viewport(struct cso_context *ctx) @@ -543,11 +818,12 @@ void cso_restore_viewport(struct cso_context *ctx) -void cso_set_blend_color(struct cso_context *ctx, -                         const struct pipe_blend_color *bc) +enum pipe_error cso_set_blend_color(struct cso_context *ctx, +                                    const struct pipe_blend_color *bc)  {     if (memcmp(&ctx->blend_color, bc, sizeof(ctx->blend_color))) {        ctx->blend_color = *bc;        ctx->pipe->set_blend_color(ctx->pipe, bc);     } +   return PIPE_OK;  } diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h index 665e8d9911..b04e98bfa1 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.h +++ b/src/gallium/auxiliary/cso_cache/cso_context.h @@ -31,6 +31,7 @@  #include "pipe/p_context.h"  #include "pipe/p_state.h" +#include "pipe/p_error.h"  #ifdef	__cplusplus @@ -41,51 +42,53 @@ struct cso_context;  struct cso_context *cso_create_context( struct pipe_context *pipe ); +void cso_release_all( struct cso_context *ctx ); +  void cso_destroy_context( struct cso_context *cso ); -void cso_set_blend( struct cso_context *cso, -                    const struct pipe_blend_state *blend ); +enum pipe_error cso_set_blend( struct cso_context *cso, +                               const struct pipe_blend_state *blend );  void cso_save_blend(struct cso_context *cso);  void cso_restore_blend(struct cso_context *cso); -void cso_set_depth_stencil_alpha( struct cso_context *cso, -                                  const struct pipe_depth_stencil_alpha_state *dsa ); +enum pipe_error cso_set_depth_stencil_alpha( struct cso_context *cso, +                                             const struct pipe_depth_stencil_alpha_state *dsa );  void cso_save_depth_stencil_alpha(struct cso_context *cso);  void cso_restore_depth_stencil_alpha(struct cso_context *cso); -void cso_set_rasterizer( struct cso_context *cso, -                         const struct pipe_rasterizer_state *rasterizer ); +enum pipe_error cso_set_rasterizer( struct cso_context *cso, +                                    const struct pipe_rasterizer_state *rasterizer );  void cso_save_rasterizer(struct cso_context *cso);  void cso_restore_rasterizer(struct cso_context *cso); -void cso_set_samplers( struct cso_context *cso, -                       unsigned count, -                       const struct pipe_sampler_state **states ); +enum pipe_error cso_set_samplers( struct cso_context *cso, +                                  unsigned count, +                                  const struct pipe_sampler_state **states );  void cso_save_samplers(struct cso_context *cso);  void cso_restore_samplers(struct cso_context *cso);  /* Alternate interface to support state trackers that like to modify   * samplers one at a time:   */ -void cso_single_sampler( struct cso_context *cso, -                         unsigned nr, -                         const struct pipe_sampler_state *states ); +enum pipe_error cso_single_sampler( struct cso_context *cso, +                                    unsigned nr, +                                    const struct pipe_sampler_state *states );  void cso_single_sampler_done( struct cso_context *cso ); -void cso_set_sampler_textures( struct cso_context *cso, -                               uint count, -                               struct pipe_texture **textures ); +enum pipe_error cso_set_sampler_textures( struct cso_context *cso, +                                          uint count, +                                          struct pipe_texture **textures );  void cso_save_sampler_textures( struct cso_context *cso );  void cso_restore_sampler_textures( struct cso_context *cso ); @@ -96,34 +99,43 @@ void cso_restore_sampler_textures( struct cso_context *cso );   * (eg mesa's internall-generated texenv programs), it will be up to   * the state tracker to implement their own specialized caching.   */ -void cso_set_fragment_shader( struct cso_context *cso, -                              const struct pipe_shader_state *shader ); +enum pipe_error cso_set_fragment_shader_handle(struct cso_context *ctx, +                                               void *handle ); +void cso_delete_fragment_shader(struct cso_context *ctx, void *handle ); +/* +enum pipe_error cso_set_fragment_shader( struct cso_context *cso, +                                         const struct pipe_shader_state *shader ); +*/  void cso_save_fragment_shader(struct cso_context *cso);  void cso_restore_fragment_shader(struct cso_context *cso); - -void cso_set_vertex_shader( struct cso_context *cso, -                            const struct pipe_shader_state *shader ); +enum pipe_error cso_set_vertex_shader_handle(struct cso_context *ctx, +                                             void *handle ); +void cso_delete_vertex_shader(struct cso_context *ctx, void *handle ); +/* +enum pipe_error cso_set_vertex_shader( struct cso_context *cso, +                                       const struct pipe_shader_state *shader ); +*/  void cso_save_vertex_shader(struct cso_context *cso);  void cso_restore_vertex_shader(struct cso_context *cso); -void cso_set_framebuffer(struct cso_context *cso, -                         const struct pipe_framebuffer_state *fb); +enum pipe_error cso_set_framebuffer(struct cso_context *cso, +                                    const struct pipe_framebuffer_state *fb);  void cso_save_framebuffer(struct cso_context *cso);  void cso_restore_framebuffer(struct cso_context *cso); -void cso_set_viewport(struct cso_context *cso, -                      const struct pipe_viewport_state *vp); +enum pipe_error cso_set_viewport(struct cso_context *cso, +                                 const struct pipe_viewport_state *vp);  void cso_save_viewport(struct cso_context *cso);  void cso_restore_viewport(struct cso_context *cso); -void cso_set_blend_color(struct cso_context *cso, -                         const struct pipe_blend_color *bc); +enum pipe_error cso_set_blend_color(struct cso_context *cso, +                                    const struct pipe_blend_color *bc);  #ifdef	__cplusplus diff --git a/src/gallium/auxiliary/cso_cache/cso_hash.c b/src/gallium/auxiliary/cso_cache/cso_hash.c index ddce3822f7..0646efd952 100644 --- a/src/gallium/auxiliary/cso_cache/cso_hash.c +++ b/src/gallium/auxiliary/cso_cache/cso_hash.c @@ -110,6 +110,10 @@ cso_hash_create_node(struct cso_hash *hash,                        struct cso_node **anextNode)  {     struct cso_node *node = cso_data_allocate_node(hash->data.d); + +   if (!node) +      return NULL; +     node->key = akey;     node->value = avalue; @@ -219,15 +223,30 @@ struct cso_hash_iter cso_hash_insert(struct cso_hash *hash,     {        struct cso_node **nextNode = cso_hash_find_node(hash, key);        struct cso_node *node = cso_hash_create_node(hash, key, data, nextNode); -      struct cso_hash_iter iter = {hash, node}; -      return iter; +      if (!node) { +         struct cso_hash_iter null_iter = {hash, 0}; +         return null_iter; +      } + +      { +         struct cso_hash_iter iter = {hash, node}; +         return iter; +      }     }  }  struct cso_hash * cso_hash_create(void)  {     struct cso_hash *hash = MALLOC_STRUCT(cso_hash); +   if (!hash) +      return NULL; +     hash->data.d = MALLOC_STRUCT(cso_hash_data); +   if (!hash->data.d) { +      FREE(hash); +      return NULL; +   } +     hash->data.d->fakeNext = 0;     hash->data.d->buckets = 0;     hash->data.d->size = 0; diff --git a/src/gallium/auxiliary/cso_cache/cso_hash.h b/src/gallium/auxiliary/cso_cache/cso_hash.h index 73c4742006..85f3e276c6 100644 --- a/src/gallium/auxiliary/cso_cache/cso_hash.h +++ b/src/gallium/auxiliary/cso_cache/cso_hash.h @@ -106,12 +106,12 @@ struct cso_hash_iter cso_hash_iter_prev(struct cso_hash_iter iter);  /** - * Convenience routine to iterate over the collision list while doing a memory  + * Convenience routine to iterate over the collision list while doing a memory   * comparison to see which entry in the list is a direct copy of our template   * and returns that entry.   */  void *cso_hash_find_data_from_template( struct cso_hash *hash, -				        unsigned hash_key,  +				        unsigned hash_key,  				        void *templ,  				        int size ); diff --git a/src/gallium/auxiliary/draw/Makefile b/src/gallium/auxiliary/draw/Makefile index 28262a92c6..da7eded21f 100644 --- a/src/gallium/auxiliary/draw/Makefile +++ b/src/gallium/auxiliary/draw/Makefile @@ -4,39 +4,37 @@ include $(TOP)/configs/current  LIBNAME = draw  C_SOURCES = \ -	draw_aaline.c \ -	draw_aapoint.c \ -	draw_clip.c \ -	draw_vs_exec.c \ -	draw_vs_sse.c \ -	draw_vs_llvm.c \ -	draw_context.c\ -	draw_cull.c \ -	draw_debug.c \ -	draw_flatshade.c \ -	draw_offset.c \ +	draw_context.c \ +	draw_pipe.c \ +	draw_pipe_aaline.c \ +	draw_pipe_aapoint.c \ +	draw_pipe_clip.c \ +	draw_pipe_cull.c \ +	draw_pipe_flatshade.c \ +	draw_pipe_offset.c \ +	draw_pipe_pstipple.c \ +	draw_pipe_stipple.c \ +	draw_pipe_twoside.c \ +	draw_pipe_unfilled.c \ +	draw_pipe_util.c \ +	draw_pipe_validate.c \ +	draw_pipe_vbuf.c \ +	draw_pipe_wide_line.c \ +	draw_pipe_wide_point.c \  	draw_pt.c \ -	draw_pt_vcache.c \ -	draw_pt_fetch_emit.c \ -	draw_pt_fetch_pipeline.c \ -	draw_pt_pipeline.c \  	draw_pt_elts.c \ -	draw_prim.c \ -	draw_pstipple.c \ -	draw_stipple.c \ -	draw_twoside.c \ -	draw_unfilled.c \ -	draw_validate.c \ -	draw_vbuf.c \ +	draw_pt_emit.c \ +	draw_pt_fetch.c \ +	draw_pt_fetch_emit.c \ +	draw_pt_fetch_shade_pipeline.c \ +	draw_pt_post_vs.c \ +        draw_pt_varray.c \ +	draw_pt_vcache.c \  	draw_vertex.c \ -	draw_vertex_cache.c \ -	draw_vertex_fetch.c \ -	draw_vertex_shader.c \ -	draw_vf.c \ -	draw_vf_generic.c \ -	draw_vf_sse.c \ -	draw_wide_line.c \ -	draw_wide_point.c +	draw_vs.c \ +	draw_vs_exec.c \ +	draw_vs_llvm.c \ +	draw_vs_sse.c   include ../../Makefile.template diff --git a/src/gallium/auxiliary/draw/SConscript b/src/gallium/auxiliary/draw/SConscript index 52107912f5..3b5d5ed492 100644 --- a/src/gallium/auxiliary/draw/SConscript +++ b/src/gallium/auxiliary/draw/SConscript @@ -3,39 +3,37 @@ Import('*')  draw = env.ConvenienceLibrary(  	target = 'draw',  	source = [ -		'draw_aaline.c', -		'draw_aapoint.c', -		'draw_clip.c', -		'draw_vs_exec.c', -		'draw_vs_sse.c', -		'draw_vs_llvm.c',  		'draw_context.c', -		'draw_cull.c', -		'draw_debug.c', -		'draw_flatshade.c', -		'draw_offset.c', +		'draw_pipe.c', +		'draw_pipe_aaline.c', +		'draw_pipe_aapoint.c', +		'draw_pipe_clip.c', +		'draw_pipe_cull.c', +		'draw_pipe_flatshade.c', +		'draw_pipe_offset.c', +		'draw_pipe_pstipple.c', +		'draw_pipe_stipple.c', +		'draw_pipe_twoside.c', +		'draw_pipe_unfilled.c', +        	'draw_pipe_util.c', +		'draw_pipe_validate.c', +		'draw_pipe_vbuf.c', +		'draw_pipe_wide_line.c', +		'draw_pipe_wide_point.c',  		'draw_pt.c', -		'draw_pt_vcache.c', -		'draw_pt_fetch_emit.c', -		'draw_pt_fetch_pipeline.c', -		'draw_pt_pipeline.c',  		'draw_pt_elts.c', -		'draw_prim.c', -		'draw_pstipple.c', -		'draw_stipple.c', -		'draw_twoside.c', -		'draw_unfilled.c', -		'draw_validate.c', -		'draw_vbuf.c', +		'draw_pt_emit.c', +		'draw_pt_fetch.c', +		'draw_pt_fetch_emit.c', +		'draw_pt_fetch_shade_pipeline.c', +		'draw_pt_post_vs.c', +		'draw_pt_varray.c', +		'draw_pt_vcache.c',  		'draw_vertex.c', -		'draw_vertex_cache.c', -		'draw_vertex_fetch.c', -		'draw_vertex_shader.c', -		'draw_vf.c', -		'draw_vf_generic.c', -		'draw_vf_sse.c', -		'draw_wide_point.c', -		'draw_wide_line.c' +		'draw_vs.c', +		'draw_vs_exec.c', +		'draw_vs_llvm.c', +		'draw_vs_sse.c',  	])  auxiliaries.insert(0, draw) diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index b3c65c90d6..98e23fa830 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -33,8 +33,10 @@  #include "pipe/p_util.h"  #include "draw_context.h" -#include "draw_private.h"  #include "draw_vbuf.h" +#include "draw_vs.h" +#include "draw_pt.h" +#include "draw_pipe.h"  struct draw_context *draw_create( void ) @@ -43,38 +45,6 @@ struct draw_context *draw_create( void )     if (draw == NULL)        goto fail; -#if defined(__i386__) || defined(__386__) -   draw->use_sse = GETENV( "GALLIUM_NOSSE" ) == NULL; -#else -   draw->use_sse = FALSE; -#endif - -   /* create pipeline stages */ -   draw->pipeline.wide_line  = draw_wide_line_stage( draw ); -   draw->pipeline.wide_point = draw_wide_point_stage( draw ); -   draw->pipeline.stipple   = draw_stipple_stage( draw ); -   draw->pipeline.unfilled  = draw_unfilled_stage( draw ); -   draw->pipeline.twoside   = draw_twoside_stage( draw ); -   draw->pipeline.offset    = draw_offset_stage( draw ); -   draw->pipeline.clip      = draw_clip_stage( draw ); -   draw->pipeline.flatshade = draw_flatshade_stage( draw ); -   draw->pipeline.cull      = draw_cull_stage( draw ); -   draw->pipeline.validate  = draw_validate_stage( draw ); -   draw->pipeline.first     = draw->pipeline.validate; - -   if (!draw->pipeline.wide_line || -       !draw->pipeline.wide_point || -       !draw->pipeline.stipple || -       !draw->pipeline.unfilled || -       !draw->pipeline.twoside || -       !draw->pipeline.offset || -       !draw->pipeline.clip || -       !draw->pipeline.flatshade || -       !draw->pipeline.cull || -       !draw->pipeline.validate) -      goto fail; - -     ASSIGN_4V( draw->plane[0], -1,  0,  0, 1 );     ASSIGN_4V( draw->plane[1],  1,  0,  0, 1 );     ASSIGN_4V( draw->plane[2],  0, -1,  0, 1 ); @@ -83,31 +53,18 @@ struct draw_context *draw_create( void )     ASSIGN_4V( draw->plane[5],  0,  0, -1, 1 ); /* mesa's a bit wonky */     draw->nr_planes = 6; -   /* Statically allocate maximum sized vertices for the cache - could be cleverer... -    */ -   { -      uint i; -      const unsigned size = (MAX_VERTEX_SIZE + 0x0f) & ~0x0f; -      char *tmp = align_malloc(Elements(draw->vs.queue) * size, 16); -      if (!tmp) -         goto fail; - -      for (i = 0; i < Elements(draw->vs.queue); i++) -	 draw->vs.queue[i].vertex = (struct vertex_header *)(tmp + i * size); -   } -   draw->shader_queue_flush = draw_vertex_shader_queue_flush; +   draw->reduced_prim = ~0; /* != any of PIPE_PRIM_x */ -   /* these defaults are oriented toward the needs of softpipe */ -   draw->wide_point_threshold = 1000000.0; /* infinity */ -   draw->wide_line_threshold = 1.0; -   draw->line_stipple = TRUE; -   draw->point_sprite = TRUE; +   tgsi_exec_machine_init(&draw->machine); -   draw->reduced_prim = ~0; /* != any of PIPE_PRIM_x */ +   /* FIXME: give this machine thing a proper constructor: +    */ +   draw->machine.Inputs = align_malloc(PIPE_MAX_ATTRIBS * sizeof(struct tgsi_exec_vector), 16); +   draw->machine.Outputs = align_malloc(PIPE_MAX_ATTRIBS * sizeof(struct tgsi_exec_vector), 16); -   draw_vertex_cache_invalidate( draw ); -   draw_set_mapped_element_buffer( draw, 0, NULL ); +   if (!draw_pipeline_init( draw )) +      goto fail;     if (!draw_pt_init( draw ))        goto fail; @@ -125,39 +82,14 @@ void draw_destroy( struct draw_context *draw )     if (!draw)        return; -   if (draw->pipeline.wide_line) -      draw->pipeline.wide_line->destroy( draw->pipeline.wide_line ); -   if (draw->pipeline.wide_point) -      draw->pipeline.wide_point->destroy( draw->pipeline.wide_point ); -   if (draw->pipeline.stipple) -      draw->pipeline.stipple->destroy( draw->pipeline.stipple ); -   if (draw->pipeline.unfilled) -      draw->pipeline.unfilled->destroy( draw->pipeline.unfilled ); -   if (draw->pipeline.twoside) -      draw->pipeline.twoside->destroy( draw->pipeline.twoside ); -   if (draw->pipeline.offset) -      draw->pipeline.offset->destroy( draw->pipeline.offset ); -   if (draw->pipeline.clip) -      draw->pipeline.clip->destroy( draw->pipeline.clip ); -   if (draw->pipeline.flatshade) -      draw->pipeline.flatshade->destroy( draw->pipeline.flatshade ); -   if (draw->pipeline.cull) -      draw->pipeline.cull->destroy( draw->pipeline.cull ); -   if (draw->pipeline.validate) -      draw->pipeline.validate->destroy( draw->pipeline.validate ); -   if (draw->pipeline.aaline) -      draw->pipeline.aaline->destroy( draw->pipeline.aaline ); -   if (draw->pipeline.aapoint) -      draw->pipeline.aapoint->destroy( draw->pipeline.aapoint ); -   if (draw->pipeline.pstipple) -      draw->pipeline.pstipple->destroy( draw->pipeline.pstipple ); -   if (draw->pipeline.rasterize) -      draw->pipeline.rasterize->destroy( draw->pipeline.rasterize ); + +   if (draw->machine.Inputs) +      align_free(draw->machine.Inputs); + +   if (draw->machine.Outputs) +      align_free(draw->machine.Outputs);     tgsi_exec_machine_free_data(&draw->machine); -    -   if (draw->vs.queue[0].vertex) -      align_free( draw->vs.queue[0].vertex ); /* Frees all the vertices. */     /* Not so fast -- we're just borrowing this at the moment.      *  @@ -165,6 +97,7 @@ void draw_destroy( struct draw_context *draw )        draw->render->destroy( draw->render );     */ +   draw_pipeline_destroy( draw );     draw_pt_destroy( draw );     FREE( draw ); @@ -189,6 +122,20 @@ void draw_set_rasterizer_state( struct draw_context *draw,     draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );     draw->rasterizer = raster; +   draw->bypass_clipping = +      ((draw->rasterizer && draw->rasterizer->bypass_clipping) || +       draw->driver.bypass_clipping); +} + + +void draw_set_driver_clipping( struct draw_context *draw, +                               boolean bypass_clipping ) +{ +   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); + +   draw->driver.bypass_clipping = bypass_clipping; +   draw->bypass_clipping = (draw->rasterizer->bypass_clipping ||  +                            draw->driver.bypass_clipping);  } @@ -247,9 +194,8 @@ draw_set_vertex_buffers(struct draw_context *draw,  {     assert(count <= PIPE_MAX_ATTRIBS); -   draw_do_flush( draw, DRAW_FLUSH_VERTEX_CACHE/*STATE_CHANGE*/ ); - -   memcpy(draw->vertex_buffer, buffers, count * sizeof(buffers[0])); +   memcpy(draw->pt.vertex_buffer, buffers, count * sizeof(buffers[0])); +   draw->pt.nr_vertex_buffers = count;  } @@ -260,9 +206,8 @@ draw_set_vertex_elements(struct draw_context *draw,  {     assert(count <= PIPE_MAX_ATTRIBS); -   draw_do_flush( draw, DRAW_FLUSH_VERTEX_CACHE/*STATE_CHANGE*/ ); - -   memcpy(draw->vertex_element, elements, count * sizeof(elements[0])); +   memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0])); +   draw->pt.nr_vertex_elements = count;  } @@ -273,8 +218,7 @@ void  draw_set_mapped_vertex_buffer(struct draw_context *draw,                                unsigned attr, const void *buffer)  { -   draw_do_flush( draw, DRAW_FLUSH_VERTEX_CACHE/*STATE_CHANGE*/ ); -   draw->user.vbuffer[attr] = buffer; +   draw->pt.user.vbuffer[attr] = buffer;  } @@ -282,8 +226,7 @@ void  draw_set_mapped_constant_buffer(struct draw_context *draw,                                  const void *buffer)  { -   draw_do_flush( draw, DRAW_FLUSH_VERTEX_CACHE/*STATE_CHANGE*/ ); -   draw->user.constants = buffer; +   draw->pt.user.constants = buffer;  } @@ -295,7 +238,7 @@ void  draw_wide_point_threshold(struct draw_context *draw, float threshold)  {     draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); -   draw->wide_point_threshold = threshold; +   draw->pipeline.wide_point_threshold = threshold;  } @@ -307,7 +250,7 @@ void  draw_wide_line_threshold(struct draw_context *draw, float threshold)  {     draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); -   draw->wide_line_threshold = threshold; +   draw->pipeline.wide_line_threshold = threshold;  } @@ -318,7 +261,7 @@ void  draw_enable_line_stipple(struct draw_context *draw, boolean enable)  {     draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); -   draw->line_stipple = enable; +   draw->pipeline.line_stipple = enable;  } @@ -329,7 +272,7 @@ void  draw_enable_point_sprites(struct draw_context *draw, boolean enable)  {     draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); -   draw->point_sprite = enable; +   draw->pipeline.point_sprite = enable;  } @@ -384,79 +327,56 @@ draw_num_vs_outputs(struct draw_context *draw)  } -/** - * Allocate space for temporary post-transform vertices, such as for clipping. - */ -void draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr ) -{ -   assert(!stage->tmp); - -   stage->nr_tmps = nr; - -   if (nr) { -      ubyte *store = (ubyte *) MALLOC( MAX_VERTEX_SIZE * nr ); -      unsigned i; -      stage->tmp = (struct vertex_header **) MALLOC( sizeof(struct vertex_header *) * nr ); -       -      for (i = 0; i < nr; i++) -	 stage->tmp[i] = (struct vertex_header *)(store + i * MAX_VERTEX_SIZE); -   } -} - - -void draw_free_temp_verts( struct draw_stage *stage ) +void draw_set_render( struct draw_context *draw,  +		      struct vbuf_render *render )  { -   if (stage->tmp) { -      FREE( stage->tmp[0] ); -      FREE( stage->tmp ); -      stage->tmp = NULL; -   } +   draw->render = render;  } - -boolean draw_use_sse(struct draw_context *draw) +void draw_set_edgeflags( struct draw_context *draw, +                         const unsigned *edgeflag )  { -   return (boolean) draw->use_sse; +   draw->pt.user.edgeflag = edgeflag;  } -void draw_reset_vertex_ids(struct draw_context *draw) -{ -   struct draw_stage *stage = draw->pipeline.first; -    -   while (stage) { -      unsigned i; - -      for (i = 0; i < stage->nr_tmps; i++) -	 stage->tmp[i]->vertex_id = UNDEFINED_VERTEX_ID; -      stage = stage->next; -   } -   draw_vertex_cache_reset_vertex_ids(draw); /* going away soon */ -   draw_pt_reset_vertex_ids(draw); +/** + * Tell the drawing context about the index/element buffer to use + * (ala glDrawElements) + * If no element buffer is to be used (i.e. glDrawArrays) then this + * should be called with eltSize=0 and elements=NULL. + * + * \param draw  the drawing context + * \param eltSize  size of each element (1, 2 or 4 bytes) + * \param elements  the element buffer ptr + */ +void +draw_set_mapped_element_buffer( struct draw_context *draw, +                                unsigned eltSize, void *elements ) +{ +   draw->pt.user.elts = elements; +   draw->pt.user.eltSize = eltSize;  } -void draw_set_render( struct draw_context *draw,  -		      struct vbuf_render *render ) +  +/* Revamp me please: + */ +void draw_do_flush( struct draw_context *draw, unsigned flags )  { -   draw->render = render; -} +   if (!draw->suspend_flushing) +   { +      assert(!draw->flushing); /* catch inadvertant recursion */ -void draw_set_edgeflags( struct draw_context *draw, -                         const unsigned *edgeflag ) -{ -   draw->user.edgeflag = edgeflag; -} +      draw->flushing = TRUE; +      draw_pipeline_flush( draw, flags ); -boolean draw_get_edgeflag( struct draw_context *draw, -                           unsigned idx ) -{ -   if (draw->user.edgeflag) -      return (draw->user.edgeflag[idx/32] & (1 << (idx%32))) != 0; -   else -      return 1; +      draw->reduced_prim = ~0; /* is reduced_prim needed any more? */ +       +      draw->flushing = FALSE; +   }  } diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h index c7ac32b452..c5c3d3b09e 100644 --- a/src/gallium/auxiliary/draw/draw_context.h +++ b/src/gallium/auxiliary/draw/draw_context.h @@ -42,37 +42,11 @@  struct pipe_context; -struct vertex_buffer; -struct vertex_info;  struct draw_context;  struct draw_stage;  struct draw_vertex_shader; -/** - * Clipmask flags - */ -/*@{*/ -#define CLIP_RIGHT_BIT   0x01 -#define CLIP_LEFT_BIT    0x02 -#define CLIP_TOP_BIT     0x04 -#define CLIP_BOTTOM_BIT  0x08 -#define CLIP_NEAR_BIT    0x10 -#define CLIP_FAR_BIT     0x20 -/*@}*/ - -/** - * Bitshift for each clip flag - */ -/*@{*/ -#define CLIP_RIGHT_SHIFT 	0 -#define CLIP_LEFT_SHIFT 	1 -#define CLIP_TOP_SHIFT  	2 -#define CLIP_BOTTOM_SHIFT       3 -#define CLIP_NEAR_SHIFT  	4 -#define CLIP_FAR_SHIFT  	5 -/*@}*/ -  struct draw_context *draw_create( void ); @@ -99,15 +73,13 @@ void draw_enable_line_stipple(struct draw_context *draw, boolean enable);  void draw_enable_point_sprites(struct draw_context *draw, boolean enable); -boolean draw_use_sse(struct draw_context *draw); - -void +boolean  draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe); -void +boolean  draw_install_aapoint_stage(struct draw_context *draw, struct pipe_context *pipe); -void +boolean  draw_install_pstipple_stage(struct draw_context *draw, struct pipe_context *pipe); @@ -168,17 +140,24 @@ void draw_arrays(struct draw_context *draw, unsigned prim,  void draw_flush(struct draw_context *draw); -/*********************************************************************** - * draw_debug.c  + +/******************************************************************************* + * Driver backend interface    */ -boolean draw_validate_prim( unsigned prim, unsigned length ); -unsigned draw_trim_prim( unsigned mode, unsigned count ); +struct vbuf_render; +void draw_set_render( struct draw_context *draw,  +		      struct vbuf_render *render ); +void draw_set_driver_clipping( struct draw_context *draw, +                               boolean bypass_clipping ); +/******************************************************************************* + * Draw pipeline  + */ +boolean draw_need_pipeline(const struct draw_context *draw, +                           const struct pipe_rasterizer_state *rasterizer, +                           unsigned prim ); -struct vbuf_render; -void draw_set_render( struct draw_context *draw,  -		      struct vbuf_render *render );  #endif /* DRAW_CONTEXT_H */ diff --git a/src/gallium/auxiliary/draw/draw_debug.c b/src/gallium/auxiliary/draw/draw_debug.c deleted file mode 100644 index d6220b5f62..0000000000 --- a/src/gallium/auxiliary/draw/draw_debug.c +++ /dev/null @@ -1,113 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: -  *   Keith Whitwell <keith@tungstengraphics.com> -  */ - -#include "draw_private.h" -#include "draw_context.h" - - - -static void -draw_prim_info(unsigned prim, unsigned *first, unsigned *incr) -{ -   assert(prim >= PIPE_PRIM_POINTS); -   assert(prim <= PIPE_PRIM_POLYGON); - -   switch (prim) { -   case PIPE_PRIM_POINTS: -      *first = 1; -      *incr = 1; -      break; -   case PIPE_PRIM_LINES: -      *first = 2; -      *incr = 2; -      break; -   case PIPE_PRIM_LINE_STRIP: -      *first = 2; -      *incr = 1; -      break; -   case PIPE_PRIM_LINE_LOOP: -      *first = 2; -      *incr = 1; -      break; -   case PIPE_PRIM_TRIANGLES: -      *first = 3; -      *incr = 3; -      break; -   case PIPE_PRIM_TRIANGLE_STRIP: -      *first = 3; -      *incr = 1; -      break; -   case PIPE_PRIM_TRIANGLE_FAN: -   case PIPE_PRIM_POLYGON: -      *first = 3; -      *incr = 1; -      break; -   case PIPE_PRIM_QUADS: -      *first = 4; -      *incr = 4; -      break; -   case PIPE_PRIM_QUAD_STRIP: -      *first = 4; -      *incr = 2; -      break; -   default: -      assert(0); -      *first = 1; -      *incr = 1; -      break; -   } -} - - -unsigned  -draw_trim_prim( unsigned mode, unsigned count ) -{ -   unsigned length, first, incr; - -   draw_prim_info( mode, &first, &incr ); - -   if (count < first) -      length = 0; -   else -      length = count - (count - first) % incr;  - -   return length; -} - - -boolean -draw_validate_prim( unsigned mode, unsigned count ) -{ -   return (count > 0 && -           count == draw_trim_prim( mode, count )); -} - diff --git a/src/gallium/auxiliary/draw/draw_pipe.c b/src/gallium/auxiliary/draw/draw_pipe.c new file mode 100644 index 0000000000..46afb0f41f --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pipe.c @@ -0,0 +1,222 @@ +/************************************************************************** + *  + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: +  *   Keith Whitwell <keith@tungstengraphics.com> +  */ + +#include "pipe/p_util.h" +#include "draw/draw_private.h" +#include "draw/draw_pipe.h" + + + +boolean draw_pipeline_init( struct draw_context *draw ) +{ +   /* create pipeline stages */ +   draw->pipeline.wide_line  = draw_wide_line_stage( draw ); +   draw->pipeline.wide_point = draw_wide_point_stage( draw ); +   draw->pipeline.stipple   = draw_stipple_stage( draw ); +   draw->pipeline.unfilled  = draw_unfilled_stage( draw ); +   draw->pipeline.twoside   = draw_twoside_stage( draw ); +   draw->pipeline.offset    = draw_offset_stage( draw ); +   draw->pipeline.clip      = draw_clip_stage( draw ); +   draw->pipeline.flatshade = draw_flatshade_stage( draw ); +   draw->pipeline.cull      = draw_cull_stage( draw ); +   draw->pipeline.validate  = draw_validate_stage( draw ); +   draw->pipeline.first     = draw->pipeline.validate; + +   if (!draw->pipeline.wide_line || +       !draw->pipeline.wide_point || +       !draw->pipeline.stipple || +       !draw->pipeline.unfilled || +       !draw->pipeline.twoside || +       !draw->pipeline.offset || +       !draw->pipeline.clip || +       !draw->pipeline.flatshade || +       !draw->pipeline.cull || +       !draw->pipeline.validate) +      return FALSE; + +   /* these defaults are oriented toward the needs of softpipe */ +   draw->pipeline.wide_point_threshold = 1000000.0; /* infinity */ +   draw->pipeline.wide_line_threshold = 1.0; +   draw->pipeline.line_stipple = TRUE; +   draw->pipeline.point_sprite = TRUE; + +   return TRUE; +} + + +void draw_pipeline_destroy( struct draw_context *draw ) +{ +   if (draw->pipeline.wide_line) +      draw->pipeline.wide_line->destroy( draw->pipeline.wide_line ); +   if (draw->pipeline.wide_point) +      draw->pipeline.wide_point->destroy( draw->pipeline.wide_point ); +   if (draw->pipeline.stipple) +      draw->pipeline.stipple->destroy( draw->pipeline.stipple ); +   if (draw->pipeline.unfilled) +      draw->pipeline.unfilled->destroy( draw->pipeline.unfilled ); +   if (draw->pipeline.twoside) +      draw->pipeline.twoside->destroy( draw->pipeline.twoside ); +   if (draw->pipeline.offset) +      draw->pipeline.offset->destroy( draw->pipeline.offset ); +   if (draw->pipeline.clip) +      draw->pipeline.clip->destroy( draw->pipeline.clip ); +   if (draw->pipeline.flatshade) +      draw->pipeline.flatshade->destroy( draw->pipeline.flatshade ); +   if (draw->pipeline.cull) +      draw->pipeline.cull->destroy( draw->pipeline.cull ); +   if (draw->pipeline.validate) +      draw->pipeline.validate->destroy( draw->pipeline.validate ); +   if (draw->pipeline.aaline) +      draw->pipeline.aaline->destroy( draw->pipeline.aaline ); +   if (draw->pipeline.aapoint) +      draw->pipeline.aapoint->destroy( draw->pipeline.aapoint ); +   if (draw->pipeline.pstipple) +      draw->pipeline.pstipple->destroy( draw->pipeline.pstipple ); +   if (draw->pipeline.rasterize) +      draw->pipeline.rasterize->destroy( draw->pipeline.rasterize ); +} + + + + + + + +static void do_point( struct draw_context *draw, +		      const char *v0 ) +{ +   struct prim_header prim; +    +   prim.flags = 0; +   prim.pad = 0; +   prim.v[0] = (struct vertex_header *)v0; + +   draw->pipeline.first->point( draw->pipeline.first, &prim ); +} + + +static void do_line( struct draw_context *draw, +                     ushort flags, +		     const char *v0, +		     const char *v1 ) +{ +   struct prim_header prim; +    +   prim.flags = flags; +   prim.pad = 0; +   prim.v[0] = (struct vertex_header *)v0; +   prim.v[1] = (struct vertex_header *)v1; + +   draw->pipeline.first->line( draw->pipeline.first, &prim ); +} + + +static void do_triangle( struct draw_context *draw, +                         ushort flags, +			 char *v0, +			 char *v1, +			 char *v2 ) +{ +   struct prim_header prim; +    +   prim.v[0] = (struct vertex_header *)v0; +   prim.v[1] = (struct vertex_header *)v1; +   prim.v[2] = (struct vertex_header *)v2; +   prim.flags = flags; +   prim.pad = 0; + +   draw->pipeline.first->tri( draw->pipeline.first, &prim ); +} + + + + +/* Code to run the pipeline on a fairly arbitary collection of vertices. + * + * Vertex headers must be pre-initialized with the + * UNDEFINED_VERTEX_ID, this code will cause that id to become + * overwritten, so it may have to be reset if there is the intention + * to reuse the vertices. + * + * This code provides a callback to reset the vertex id's which the + * draw_vbuf.c code uses when it has to perform a flush. + */ +void draw_pipeline_run( struct draw_context *draw, +                        unsigned prim, +                        struct vertex_header *vertices, +                        unsigned vertex_count, +                        unsigned stride, +                        const ushort *elts, +                        unsigned count ) +{ +   char *verts = (char *)vertices; +   unsigned i; + +   draw->pipeline.verts = verts; +   draw->pipeline.vertex_stride = stride; +   draw->pipeline.vertex_count = vertex_count; +    +   switch (prim) { +   case PIPE_PRIM_POINTS: +      for (i = 0; i < count; i++)  +         do_point( draw,  +                   verts + stride * elts[i] ); +      break; +   case PIPE_PRIM_LINES: +      for (i = 0; i+1 < count; i += 2)  +         do_line( draw,  +                  elts[i+0],  /* flags */ +                  verts + stride * (elts[i+0] & ~DRAW_PIPE_FLAG_MASK), +                  verts + stride * elts[i+1]); +      break; +   case PIPE_PRIM_TRIANGLES: +      for (i = 0; i+2 < count; i += 3) +         do_triangle( draw,  +                      elts[i+0],  /* flags */ +                      verts + stride * (elts[i+0] & ~DRAW_PIPE_FLAG_MASK), +                      verts + stride * elts[i+1], +                      verts + stride * elts[i+2]); +      break; +   } +    +   draw->pipeline.verts = NULL; +   draw->pipeline.vertex_count = 0; +} + + + +void draw_pipeline_flush( struct draw_context *draw,  +                          unsigned flags ) +{ +   draw->pipeline.first->flush( draw->pipeline.first, flags ); +   draw->pipeline.first = draw->pipeline.validate; +} diff --git a/src/gallium/auxiliary/draw/draw_pipe.h b/src/gallium/auxiliary/draw/draw_pipe.h new file mode 100644 index 0000000000..f1cb0891ca --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pipe.h @@ -0,0 +1,125 @@ +/************************************************************************** + *  + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: +  *   Keith Whitwell <keith@tungstengraphics.com> +  */ + +#ifndef DRAW_PIPE_H +#define DRAW_PIPE_H + +#include "pipe/p_compiler.h" +#include "draw_private.h"       /* for sizeof(vertex_header) */ + + +/** + * Basic info for a point/line/triangle primitive. + */ +struct prim_header { +   float det;                 /**< front/back face determinant */ +   ushort flags; +   ushort pad; +   struct vertex_header *v[3];  /**< 1 to 3 vertex pointers */ +}; + + + +/** + * Base class for all primitive drawing stages. + */ +struct draw_stage +{ +   struct draw_context *draw;   /**< parent context */ + +   struct draw_stage *next;     /**< next stage in pipeline */ + +   struct vertex_header **tmp;  /**< temp vert storage, such as for clipping */ +   unsigned nr_tmps; + +   void (*point)( struct draw_stage *, +		  struct prim_header * ); + +   void (*line)( struct draw_stage *, +		 struct prim_header * ); + +   void (*tri)( struct draw_stage *, +		struct prim_header * ); + +   void (*flush)( struct draw_stage *, +		  unsigned flags ); + +   void (*reset_stipple_counter)( struct draw_stage * ); + +   void (*destroy)( struct draw_stage * ); +}; + + +extern struct draw_stage *draw_unfilled_stage( struct draw_context *context ); +extern struct draw_stage *draw_twoside_stage( struct draw_context *context ); +extern struct draw_stage *draw_offset_stage( struct draw_context *context ); +extern struct draw_stage *draw_clip_stage( struct draw_context *context ); +extern struct draw_stage *draw_flatshade_stage( struct draw_context *context ); +extern struct draw_stage *draw_cull_stage( struct draw_context *context ); +extern struct draw_stage *draw_stipple_stage( struct draw_context *context ); +extern struct draw_stage *draw_wide_line_stage( struct draw_context *context ); +extern struct draw_stage *draw_wide_point_stage( struct draw_context *context ); +extern struct draw_stage *draw_validate_stage( struct draw_context *context ); + + +extern void draw_free_temp_verts( struct draw_stage *stage ); +extern boolean draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr ); + +extern void draw_reset_vertex_ids( struct draw_context *draw ); + +void draw_pipe_passthrough_tri(struct draw_stage *stage, struct prim_header *header); +void draw_pipe_passthrough_line(struct draw_stage *stage, struct prim_header *header); +void draw_pipe_passthrough_point(struct draw_stage *stage, struct prim_header *header); + + + +/** + * Get a writeable copy of a vertex. + * \param stage  drawing stage info + * \param vert  the vertex to copy (source) + * \param idx  index into stage's tmp[] array to put the copy (dest) + * \return  pointer to the copied vertex + */ +static INLINE struct vertex_header * +dup_vert( struct draw_stage *stage, +	  const struct vertex_header *vert, +	  unsigned idx ) +{    +   struct vertex_header *tmp = stage->tmp[idx]; +   const uint vsize = sizeof(struct vertex_header) +      + stage->draw->num_vs_outputs * 4 * sizeof(float); +   memcpy(tmp, vert, vsize); +   tmp->vertex_id = UNDEFINED_VERTEX_ID; +   return tmp; +} + +#endif diff --git a/src/gallium/auxiliary/draw/draw_aaline.c b/src/gallium/auxiliary/draw/draw_pipe_aaline.c index e8d2a45102..346a96e37f 100644 --- a/src/gallium/auxiliary/draw/draw_aaline.c +++ b/src/gallium/auxiliary/draw/draw_pipe_aaline.c @@ -43,6 +43,7 @@  #include "draw_context.h"  #include "draw_private.h" +#include "draw_pipe.h"  /** @@ -333,11 +334,10 @@ aa_transform_inst(struct tgsi_transform_context *ctx,   * Generate the frag shader we'll use for drawing AA lines.   * This will be the user's shader plus some texture/modulate instructions.   */ -static void +static boolean  generate_aaline_fs(struct aaline_stage *aaline)  {     const struct pipe_shader_state *orig_fs = &aaline->fs->state; -   //struct draw_context *draw = aaline->stage.draw;     struct pipe_shader_state aaline_fs;     struct aa_transform_context transform; @@ -345,6 +345,8 @@ generate_aaline_fs(struct aaline_stage *aaline)     aaline_fs = *orig_fs; /* copy to init */     aaline_fs.tokens = MALLOC(sizeof(struct tgsi_token) * MAX); +   if (aaline_fs.tokens == NULL) +      return FALSE;     memset(&transform, 0, sizeof(transform));     transform.colorOutput = -1; @@ -369,15 +371,18 @@ generate_aaline_fs(struct aaline_stage *aaline)     aaline->fs->aaline_fs        = aaline->driver_create_fs_state(aaline->pipe, &aaline_fs); +   if (aaline->fs->aaline_fs == NULL) +      return FALSE;     aaline->fs->generic_attrib = transform.maxGeneric + 1; +   return TRUE;  }  /**   * Create the texture map we'll use for antialiasing the lines.   */ -static void +static boolean  aaline_create_texture(struct aaline_stage *aaline)  {     struct pipe_context *pipe = aaline->pipe; @@ -387,7 +392,7 @@ aaline_create_texture(struct aaline_stage *aaline)     memset(&texTemp, 0, sizeof(texTemp));     texTemp.target = PIPE_TEXTURE_2D; -   texTemp.format = PIPE_FORMAT_U_A8; /* XXX verify supported by driver! */ +   texTemp.format = PIPE_FORMAT_A8_UNORM; /* XXX verify supported by driver! */     texTemp.last_level = MAX_TEXTURE_LEVEL;     texTemp.width[0] = 1 << MAX_TEXTURE_LEVEL;     texTemp.height[0] = 1 << MAX_TEXTURE_LEVEL; @@ -395,6 +400,8 @@ aaline_create_texture(struct aaline_stage *aaline)     texTemp.cpp = 1;     aaline->texture = screen->texture_create(screen, &texTemp); +   if (!aaline->texture) +      return FALSE;     /* Fill in mipmap images.      * Basically each level is solid opaque, except for the outermost @@ -410,6 +417,8 @@ aaline_create_texture(struct aaline_stage *aaline)        surface = screen->get_tex_surface(screen, aaline->texture, 0, level, 0);        data = pipe_surface_map(surface); +      if (data == NULL) +         return FALSE;        for (i = 0; i < size; i++) {           for (j = 0; j < size; j++) { @@ -435,6 +444,7 @@ aaline_create_texture(struct aaline_stage *aaline)        pipe_surface_reference(&surface, NULL);        pipe->texture_update(pipe, aaline->texture, 0, (1 << level));     } +   return TRUE;  } @@ -443,7 +453,7 @@ aaline_create_texture(struct aaline_stage *aaline)   * By using a mipmapped texture, we don't have to generate a different   * texture image for each line size.   */ -static void +static boolean  aaline_create_sampler(struct aaline_stage *aaline)  {     struct pipe_sampler_state sampler; @@ -461,6 +471,10 @@ aaline_create_sampler(struct aaline_stage *aaline)     sampler.max_lod = MAX_TEXTURE_LEVEL;     aaline->sampler_cso = pipe->create_sampler_state(pipe, &sampler); +   if (aaline->sampler_cso == NULL) +      return FALSE; + +   return TRUE;  } @@ -468,13 +482,20 @@ aaline_create_sampler(struct aaline_stage *aaline)   * When we're about to draw our first AA line in a batch, this function is   * called to tell the driver to bind our modified fragment shader.   */ -static void +static boolean  bind_aaline_fragment_shader(struct aaline_stage *aaline)  { -   if (!aaline->fs->aaline_fs) { -      generate_aaline_fs(aaline); -   } +   struct draw_context *draw = aaline->stage.draw; + +   if (!aaline->fs->aaline_fs &&  +       !generate_aaline_fs(aaline)) +      return FALSE; + +   draw->suspend_flushing = TRUE;     aaline->driver_bind_fs_state(aaline->pipe, aaline->fs->aaline_fs); +   draw->suspend_flushing = FALSE; + +   return TRUE;  } @@ -486,20 +507,6 @@ aaline_stage( struct draw_stage *stage )  } -static void -passthrough_point(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->point(stage->next, header); -} - - -static void -passthrough_tri(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->tri(stage->next, header); -} - -  /**   * Draw a wide line by drawing a quad, using geometry which will   * fullfill GL's antialiased line requirements. @@ -637,7 +644,11 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)     /*      * Bind (generate) our fragprog, sampler and texture      */ -   bind_aaline_fragment_shader(aaline); +   if (!bind_aaline_fragment_shader(aaline)) { +      stage->line = draw_pipe_passthrough_line; +      stage->line(stage, header); +      return; +   }     /* update vertex attrib info */     aaline->tex_slot = draw->num_vs_outputs; @@ -657,8 +668,10 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)     pipe_texture_reference(&aaline->state.texture[aaline->fs->sampler_unit],                            aaline->texture); +   draw->suspend_flushing = TRUE;     aaline->driver_bind_sampler_states(pipe, num_samplers, aaline->state.sampler);     aaline->driver_set_sampler_textures(pipe, num_samplers, aaline->state.texture); +   draw->suspend_flushing = FALSE;     /* now really draw first line */     stage->line = aaline_line; @@ -676,14 +689,14 @@ aaline_flush(struct draw_stage *stage, unsigned flags)     stage->line = aaline_first_line;     stage->next->flush( stage->next, flags ); -   /* restore original frag shader */ +   /* restore original frag shader, texture, sampler state */ +   draw->suspend_flushing = TRUE;     aaline->driver_bind_fs_state(pipe, aaline->fs->driver_fs); - -   /* XXX restore original texture, sampler state */     aaline->driver_bind_sampler_states(pipe, aaline->num_samplers,                                        aaline->state.sampler);     aaline->driver_set_sampler_textures(pipe, aaline->num_textures,                                         aaline->state.texture); +   draw->suspend_flushing = FALSE;     draw->extra_vp_outputs.slot = 0;  } @@ -700,10 +713,17 @@ static void  aaline_destroy(struct draw_stage *stage)  {     struct aaline_stage *aaline = aaline_stage(stage); +   uint i; + +   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { +      pipe_texture_reference(&aaline->state.texture[i], NULL); +   } -   aaline->pipe->delete_sampler_state(aaline->pipe, aaline->sampler_cso); +   if (aaline->sampler_cso) +      aaline->pipe->delete_sampler_state(aaline->pipe, aaline->sampler_cso); -   pipe_texture_release(&aaline->texture); +   if (aaline->texture) +      pipe_texture_release(&aaline->texture);     draw_free_temp_verts( stage ); @@ -715,19 +735,28 @@ static struct aaline_stage *  draw_aaline_stage(struct draw_context *draw)  {     struct aaline_stage *aaline = CALLOC_STRUCT(aaline_stage); +   if (aaline == NULL) +      return NULL; -   draw_alloc_temp_verts( &aaline->stage, 8 ); +   if (!draw_alloc_temp_verts( &aaline->stage, 8 )) +      goto fail;     aaline->stage.draw = draw;     aaline->stage.next = NULL; -   aaline->stage.point = passthrough_point; +   aaline->stage.point = draw_pipe_passthrough_point;     aaline->stage.line = aaline_first_line; -   aaline->stage.tri = passthrough_tri; +   aaline->stage.tri = draw_pipe_passthrough_tri;     aaline->stage.flush = aaline_flush;     aaline->stage.reset_stipple_counter = aaline_reset_stipple_counter;     aaline->stage.destroy = aaline_destroy;     return aaline; + + fail: +   if (aaline) +      aaline_destroy(&aaline->stage); + +   return NULL;  } @@ -749,13 +778,13 @@ aaline_create_fs_state(struct pipe_context *pipe,  {     struct aaline_stage *aaline = aaline_stage_from_pipe(pipe);     struct aaline_fragment_shader *aafs = CALLOC_STRUCT(aaline_fragment_shader); +   if (aafs == NULL) +      return NULL; -   if (aafs) { -      aafs->state = *fs; +   aafs->state = *fs; -      /* pass-through */ -      aafs->driver_fs = aaline->driver_create_fs_state(aaline->pipe, fs); -   } +   /* pass-through */ +   aafs->driver_fs = aaline->driver_create_fs_state(aaline->pipe, fs);     return aafs;  } @@ -766,6 +795,7 @@ aaline_bind_fs_state(struct pipe_context *pipe, void *fs)  {     struct aaline_stage *aaline = aaline_stage_from_pipe(pipe);     struct aaline_fragment_shader *aafs = (struct aaline_fragment_shader *) fs; +     /* save current */     aaline->fs = aafs;     /* pass-through */ @@ -790,9 +820,11 @@ aaline_bind_sampler_states(struct pipe_context *pipe,                             unsigned num, void **sampler)  {     struct aaline_stage *aaline = aaline_stage_from_pipe(pipe); +     /* save current */     memcpy(aaline->state.sampler, sampler, num * sizeof(void *));     aaline->num_samplers = num; +     /* pass-through */     aaline->driver_bind_sampler_states(aaline->pipe, num, sampler);  } @@ -809,6 +841,9 @@ aaline_set_sampler_textures(struct pipe_context *pipe,     for (i = 0; i < num; i++) {        pipe_texture_reference(&aaline->state.texture[i], texture[i]);     } +   for ( ; i < PIPE_MAX_SAMPLERS; i++) { +      pipe_texture_reference(&aaline->state.texture[i], NULL); +   }     aaline->num_textures = num;     /* pass-through */ @@ -821,7 +856,7 @@ aaline_set_sampler_textures(struct pipe_context *pipe,   * into the draw module's pipeline.  This will not be used if the   * hardware has native support for AA lines.   */ -void +boolean  draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe)  {     struct aaline_stage *aaline; @@ -832,14 +867,17 @@ draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe)      * Create / install AA line drawing / prim stage      */     aaline = draw_aaline_stage( draw ); -   assert(aaline); -   draw->pipeline.aaline = &aaline->stage; +   if (!aaline) +      goto fail;     aaline->pipe = pipe;     /* create special texture, sampler state */ -   aaline_create_texture(aaline); -   aaline_create_sampler(aaline); +   if (!aaline_create_texture(aaline)) +      goto fail; + +   if (!aaline_create_sampler(aaline)) +      goto fail;     /* save original driver functions */     aaline->driver_create_fs_state = pipe->create_fs_state; @@ -856,4 +894,16 @@ draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe)     pipe->bind_sampler_states = aaline_bind_sampler_states;     pipe->set_sampler_textures = aaline_set_sampler_textures; +    +   /* Install once everything is known to be OK: +    */ +   draw->pipeline.aaline = &aaline->stage; + +   return TRUE; + + fail: +   if (aaline) +      aaline->stage.destroy( &aaline->stage ); +    +   return FALSE;  } diff --git a/src/gallium/auxiliary/draw/draw_aapoint.c b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c index fcebe3e7a0..122a48660a 100644 --- a/src/gallium/auxiliary/draw/draw_aapoint.c +++ b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c @@ -48,7 +48,8 @@  #include "tgsi/util/tgsi_dump.h"  #include "draw_context.h" -#include "draw_private.h" +#include "draw_vs.h" +#include "draw_pipe.h"  /* @@ -480,10 +481,10 @@ aa_transform_inst(struct tgsi_transform_context *ctx,  /** - * Generate the frag shader we'll use for drawing AA lines. + * Generate the frag shader we'll use for drawing AA points.   * This will be the user's shader plus some texture/modulate instructions.   */ -static void +static boolean  generate_aapoint_fs(struct aapoint_stage *aapoint)  {     const struct pipe_shader_state *orig_fs = &aapoint->fs->state; @@ -494,6 +495,8 @@ generate_aapoint_fs(struct aapoint_stage *aapoint)     aapoint_fs = *orig_fs; /* copy to init */     aapoint_fs.tokens = MALLOC(sizeof(struct tgsi_token) * MAX); +   if (aapoint_fs.tokens == NULL) +      return FALSE;     memset(&transform, 0, sizeof(transform));     transform.colorOutput = -1; @@ -518,22 +521,33 @@ generate_aapoint_fs(struct aapoint_stage *aapoint)     aapoint->fs->aapoint_fs        = aapoint->driver_create_fs_state(aapoint->pipe, &aapoint_fs); +   if (aapoint->fs->aapoint_fs == NULL) +      return FALSE;     aapoint->fs->generic_attrib = transform.maxGeneric + 1; + +   return TRUE;  }  /** - * When we're about to draw our first AA line in a batch, this function is + * When we're about to draw our first AA point in a batch, this function is   * called to tell the driver to bind our modified fragment shader.   */ -static void +static boolean  bind_aapoint_fragment_shader(struct aapoint_stage *aapoint)  { -   if (!aapoint->fs->aapoint_fs) { -      generate_aapoint_fs(aapoint); -   } +   struct draw_context *draw = aapoint->stage.draw; + +   if (!aapoint->fs->aapoint_fs && +       !generate_aapoint_fs(aapoint)) +      return FALSE; + +   draw->suspend_flushing = TRUE;     aapoint->driver_bind_fs_state(aapoint->pipe, aapoint->fs->aapoint_fs); +   draw->suspend_flushing = FALSE; + +   return TRUE;  } @@ -545,18 +559,6 @@ aapoint_stage( struct draw_stage *stage )  } -static void -passthrough_line(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->line(stage->next, header); -} - - -static void -passthrough_tri(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->tri(stage->next, header); -}  /** @@ -700,7 +702,7 @@ aapoint_first_point(struct draw_stage *stage, struct prim_header *header)        }     } -   /* now really draw first line */ +   /* now really draw first point */     stage->point = aapoint_point;     stage->point(stage, header);  } @@ -717,7 +719,9 @@ aapoint_flush(struct draw_stage *stage, unsigned flags)     stage->next->flush( stage->next, flags );     /* restore original frag shader */ +   draw->suspend_flushing = TRUE;     aapoint->driver_bind_fs_state(pipe, aapoint->fs->driver_fs); +   draw->suspend_flushing = FALSE;     draw->extra_vp_outputs.slot = 0;  } @@ -742,19 +746,29 @@ static struct aapoint_stage *  draw_aapoint_stage(struct draw_context *draw)  {     struct aapoint_stage *aapoint = CALLOC_STRUCT(aapoint_stage); +   if (aapoint == NULL) +      goto fail; -   draw_alloc_temp_verts( &aapoint->stage, 4 ); +   if (!draw_alloc_temp_verts( &aapoint->stage, 4 )) +      goto fail;     aapoint->stage.draw = draw;     aapoint->stage.next = NULL;     aapoint->stage.point = aapoint_first_point; -   aapoint->stage.line = passthrough_line; -   aapoint->stage.tri = passthrough_tri; +   aapoint->stage.line = draw_pipe_passthrough_line; +   aapoint->stage.tri = draw_pipe_passthrough_tri;     aapoint->stage.flush = aapoint_flush;     aapoint->stage.reset_stipple_counter = aapoint_reset_stipple_counter;     aapoint->stage.destroy = aapoint_destroy;     return aapoint; + + fail: +   if (aapoint) +      aapoint_destroy(&aapoint->stage); + +   return NULL; +  } @@ -776,13 +790,13 @@ aapoint_create_fs_state(struct pipe_context *pipe,  {     struct aapoint_stage *aapoint = aapoint_stage_from_pipe(pipe);     struct aapoint_fragment_shader *aafs = CALLOC_STRUCT(aapoint_fragment_shader); +   if (aafs == NULL)  +      return NULL; -   if (aafs) { -      aafs->state = *fs; +   aafs->state = *fs; -      /* pass-through */ -      aafs->driver_fs = aapoint->driver_create_fs_state(aapoint->pipe, fs); -   } +   /* pass-through */ +   aafs->driver_fs = aapoint->driver_create_fs_state(aapoint->pipe, fs);     return aafs;  } @@ -817,7 +831,7 @@ aapoint_delete_fs_state(struct pipe_context *pipe, void *fs)   * into the draw module's pipeline.  This will not be used if the   * hardware has native support for AA points.   */ -void +boolean  draw_install_aapoint_stage(struct draw_context *draw,                             struct pipe_context *pipe)  { @@ -829,8 +843,8 @@ draw_install_aapoint_stage(struct draw_context *draw,      * Create / install AA point drawing / prim stage      */     aapoint = draw_aapoint_stage( draw ); -   assert(aapoint); -   draw->pipeline.aapoint = &aapoint->stage; +   if (aapoint == NULL) +      goto fail;     aapoint->pipe = pipe; @@ -843,4 +857,14 @@ draw_install_aapoint_stage(struct draw_context *draw,     pipe->create_fs_state = aapoint_create_fs_state;     pipe->bind_fs_state = aapoint_bind_fs_state;     pipe->delete_fs_state = aapoint_delete_fs_state; + +   draw->pipeline.aapoint = &aapoint->stage; + +   return TRUE; + + fail: +   if (aapoint) +      aapoint->stage.destroy( &aapoint->stage ); + +   return FALSE;  } diff --git a/src/gallium/auxiliary/draw/draw_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c index e24c5d8032..ce80c94163 100644 --- a/src/gallium/auxiliary/draw/draw_clip.c +++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c @@ -35,8 +35,8 @@  #include "pipe/p_util.h"  #include "pipe/p_shader_tokens.h" -#include "draw_context.h" -#include "draw_private.h" +#include "draw_vs.h" +#include "draw_pipe.h"  #ifndef IS_NEGATIVE @@ -119,7 +119,7 @@ static void interp( const struct clipper *clip,      */     {        dst->clipmask = 0; -      dst->edgeflag = 0; +      dst->edgeflag = 0;        /* will get overwritten later */        dst->pad = 0;        dst->vertex_id = UNDEFINED_VERTEX_ID;     } @@ -162,49 +162,50 @@ static void emit_poly( struct draw_stage *stage,     struct prim_header header;     unsigned i; +   const ushort edge_first  = DRAW_PIPE_EDGE_FLAG_2; +   const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0; +   const ushort edge_last   = DRAW_PIPE_EDGE_FLAG_1; +     /* later stages may need the determinant, but only the sign matters */     header.det = origPrim->det; +   header.flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle; +   header.pad = 0; -   for (i = 2; i < n; i++) { +   for (i = 2; i < n; i++, header.flags = 0) {        header.v[0] = inlist[i-1];        header.v[1] = inlist[i];        header.v[2] = inlist[0];	/* keep in v[2] for flatshading */ -	 -      { -	 unsigned tmp1 = header.v[1]->edgeflag; -	 unsigned tmp2 = header.v[2]->edgeflag; - -	 if (i != n-1) header.v[1]->edgeflag = 0; -	 if (i != 2)   header.v[2]->edgeflag = 0; -         header.edgeflags = ((header.v[0]->edgeflag << 0) |  -                             (header.v[1]->edgeflag << 1) |  -                             (header.v[2]->edgeflag << 2)); +      if (i == n-1) +        header.flags |= edge_last; -         if (0) { -            const struct draw_vertex_shader *vs = stage->draw->vertex_shader; -            uint j, k; -            debug_printf("Clipped tri:\n"); -            for (j = 0; j < 3; j++) { -               for (k = 0; k < vs->info.num_outputs; k++) { -                  debug_printf("  Vert %d: Attr %d:  %f %f %f %f\n", j, k, -                         header.v[j]->data[k][0], -                         header.v[j]->data[k][1], -                         header.v[j]->data[k][2], -                         header.v[j]->data[k][3]); -               } +      if (0) { +         const struct draw_vertex_shader *vs = stage->draw->vertex_shader; +         uint j, k; +         debug_printf("Clipped tri:\n"); +         for (j = 0; j < 3; j++) { +            for (k = 0; k < vs->info.num_outputs; k++) { +               debug_printf("  Vert %d: Attr %d:  %f %f %f %f\n", j, k, +                            header.v[j]->data[k][0], +                            header.v[j]->data[k][1], +                            header.v[j]->data[k][2], +                            header.v[j]->data[k][3]);              }           } - -	 stage->next->tri( stage->next, &header ); - -	 header.v[1]->edgeflag = tmp1; -	 header.v[2]->edgeflag = tmp2;        } + +      stage->next->tri( stage->next, &header );     }  } - +static INLINE float +dot4(const float *a, const float *b) +{ +   return (a[0]*b[0] + +           a[1]*b[1] + +           a[2]*b[2] + +           a[3]*b[3]); +}  /* Clip a triangle against the viewport and user clip planes. @@ -486,8 +487,11 @@ static void clip_destroy( struct draw_stage *stage )  struct draw_stage *draw_clip_stage( struct draw_context *draw )  {     struct clipper *clipper = CALLOC_STRUCT(clipper); +   if (clipper == NULL) +      goto fail; -   draw_alloc_temp_verts( &clipper->stage, MAX_CLIPPED_VERTICES+1 ); +   if (!draw_alloc_temp_verts( &clipper->stage, MAX_CLIPPED_VERTICES+1 )) +      goto fail;     clipper->stage.draw = draw;     clipper->stage.point = clip_point; @@ -500,4 +504,10 @@ struct draw_stage *draw_clip_stage( struct draw_context *draw )     clipper->plane = draw->plane;     return &clipper->stage; + + fail: +   if (clipper) +      clipper->stage.destroy( &clipper->stage ); + +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_cull.c b/src/gallium/auxiliary/draw/draw_pipe_cull.c index 8177b0ac86..87aaf1f85b 100644 --- a/src/gallium/auxiliary/draw/draw_cull.c +++ b/src/gallium/auxiliary/draw/draw_pipe_cull.c @@ -35,7 +35,7 @@  #include "pipe/p_util.h"  #include "pipe/p_defines.h" -#include "draw_private.h" +#include "draw_pipe.h"  struct cull_stage { @@ -95,20 +95,6 @@ static void cull_first_tri( struct draw_stage *stage, -static void cull_line( struct draw_stage *stage, -		       struct prim_header *header ) -{ -   stage->next->line( stage->next, header ); -} - - -static void cull_point( struct draw_stage *stage, -			struct prim_header *header ) -{ -   stage->next->point( stage->next, header ); -} - -  static void cull_flush( struct draw_stage *stage, unsigned flags )  {     stage->tri = cull_first_tri; @@ -134,17 +120,26 @@ static void cull_destroy( struct draw_stage *stage )  struct draw_stage *draw_cull_stage( struct draw_context *draw )  {     struct cull_stage *cull = CALLOC_STRUCT(cull_stage); +   if (cull == NULL) +      goto fail; -   draw_alloc_temp_verts( &cull->stage, 0 ); +   if (!draw_alloc_temp_verts( &cull->stage, 0 )) +      goto fail;     cull->stage.draw = draw;     cull->stage.next = NULL; -   cull->stage.point = cull_point; -   cull->stage.line = cull_line; +   cull->stage.point = draw_pipe_passthrough_point; +   cull->stage.line = draw_pipe_passthrough_line;     cull->stage.tri = cull_first_tri;     cull->stage.flush = cull_flush;     cull->stage.reset_stipple_counter = cull_reset_stipple_counter;     cull->stage.destroy = cull_destroy;     return &cull->stage; + + fail: +   if (cull) +      cull->stage.destroy( &cull->stage ); + +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_flatshade.c b/src/gallium/auxiliary/draw/draw_pipe_flatshade.c index af2cb05c98..09b68c4559 100644 --- a/src/gallium/auxiliary/draw/draw_flatshade.c +++ b/src/gallium/auxiliary/draw/draw_pipe_flatshade.c @@ -30,7 +30,8 @@  #include "pipe/p_util.h"  #include "pipe/p_shader_tokens.h" -#include "draw_private.h" +#include "draw_vs.h" +#include "draw_pipe.h"  /** subclass of draw_stage */ @@ -90,7 +91,8 @@ static void flatshade_tri_0( struct draw_stage *stage,     struct prim_header tmp;     tmp.det = header->det; -   tmp.edgeflags = header->edgeflags; +   tmp.flags = header->flags; +   tmp.pad = header->pad;     tmp.v[0] = header->v[0];     tmp.v[1] = dup_vert(stage, header->v[1], 0);     tmp.v[2] = dup_vert(stage, header->v[2], 1); @@ -107,7 +109,8 @@ static void flatshade_tri_2( struct draw_stage *stage,     struct prim_header tmp;     tmp.det = header->det; -   tmp.edgeflags = header->edgeflags; +   tmp.flags = header->flags; +   tmp.pad = header->pad;     tmp.v[0] = dup_vert(stage, header->v[0], 0);     tmp.v[1] = dup_vert(stage, header->v[1], 1);     tmp.v[2] = header->v[2]; @@ -151,13 +154,6 @@ static void flatshade_line_1( struct draw_stage *stage,  } -/* Flatshade point -- passthrough. - */ -static void flatshade_point( struct draw_stage *stage, -                             struct prim_header *header ) -{ -   stage->next->point( stage->next, header ); -}  static void flatshade_init_state( struct draw_stage *stage ) @@ -230,12 +226,15 @@ static void flatshade_destroy( struct draw_stage *stage )  struct draw_stage *draw_flatshade_stage( struct draw_context *draw )  {     struct flat_stage *flatshade = CALLOC_STRUCT(flat_stage); +   if (flatshade == NULL) +      goto fail; -   draw_alloc_temp_verts( &flatshade->stage, 2 ); +   if (!draw_alloc_temp_verts( &flatshade->stage, 2 )) +      goto fail;     flatshade->stage.draw = draw;     flatshade->stage.next = NULL; -   flatshade->stage.point = flatshade_point; +   flatshade->stage.point = draw_pipe_passthrough_point;     flatshade->stage.line = flatshade_first_line;     flatshade->stage.tri = flatshade_first_tri;     flatshade->stage.flush = flatshade_flush; @@ -243,6 +242,12 @@ struct draw_stage *draw_flatshade_stage( struct draw_context *draw )     flatshade->stage.destroy = flatshade_destroy;     return &flatshade->stage; + + fail: +   if (flatshade) +      flatshade->stage.destroy( &flatshade->stage ); + +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_offset.c b/src/gallium/auxiliary/draw/draw_pipe_offset.c index dbc676deae..ea6de8c571 100644 --- a/src/gallium/auxiliary/draw/draw_offset.c +++ b/src/gallium/auxiliary/draw/draw_pipe_offset.c @@ -33,7 +33,7 @@   */  #include "pipe/p_util.h" -#include "draw_private.h" +#include "draw_pipe.h" @@ -106,7 +106,8 @@ static void offset_tri( struct draw_stage *stage,     struct prim_header tmp;     tmp.det = header->det; -   tmp.edgeflags = header->edgeflags; +   tmp.flags = header->flags; +   tmp.pad = header->pad;     tmp.v[0] = dup_vert(stage, header->v[0], 0);     tmp.v[1] = dup_vert(stage, header->v[1], 1);     tmp.v[2] = dup_vert(stage, header->v[2], 2); @@ -129,18 +130,6 @@ static void offset_first_tri( struct draw_stage *stage,  } -static void offset_line( struct draw_stage *stage, -			 struct prim_header *header ) -{ -   stage->next->line( stage->next, header ); -} - - -static void offset_point( struct draw_stage *stage, -			  struct prim_header *header ) -{ -   stage->next->point( stage->next, header ); -}  static void offset_flush( struct draw_stage *stage, @@ -170,17 +159,25 @@ static void offset_destroy( struct draw_stage *stage )  struct draw_stage *draw_offset_stage( struct draw_context *draw )  {     struct offset_stage *offset = CALLOC_STRUCT(offset_stage); +   if (offset == NULL) +      goto fail;     draw_alloc_temp_verts( &offset->stage, 3 );     offset->stage.draw = draw;     offset->stage.next = NULL; -   offset->stage.point = offset_point; -   offset->stage.line = offset_line; +   offset->stage.point = draw_pipe_passthrough_point; +   offset->stage.line = draw_pipe_passthrough_line;     offset->stage.tri = offset_first_tri;     offset->stage.flush = offset_flush;     offset->stage.reset_stipple_counter = offset_reset_stipple_counter;     offset->stage.destroy = offset_destroy;     return &offset->stage; + + fail: +   if (offset) +      offset->stage.destroy( &offset->stage ); + +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_pstipple.c b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c index 4dddb72906..2dfd1800d5 100644 --- a/src/gallium/auxiliary/draw/draw_pstipple.c +++ b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c @@ -44,7 +44,7 @@  #include "tgsi/util/tgsi_dump.h"  #include "draw_context.h" -#include "draw_private.h" +#include "draw_pipe.h" @@ -256,7 +256,7 @@ pstip_transform_inst(struct tgsi_transform_context *ctx,           uint size = 4;           immed = tgsi_default_full_immediate();           immed.Immediate.Size = 1 + size; /* one for the token itself */ -         immed.u.ImmediateFloat32 = (struct tgsi_immediate_float32 *) value; +         immed.u.Pointer = (void *) value;           ctx->emit_immediate(ctx, &immed);        } @@ -320,7 +320,7 @@ pstip_transform_inst(struct tgsi_transform_context *ctx,   * Generate the frag shader we'll use for doing polygon stipple.   * This will be the user's shader prefixed with a TEX and KIL instruction.   */ -static void +static boolean  generate_pstip_fs(struct pstip_stage *pstip)  {     const struct pipe_shader_state *orig_fs = &pstip->fs->state; @@ -332,6 +332,8 @@ generate_pstip_fs(struct pstip_stage *pstip)     pstip_fs = *orig_fs; /* copy to init */     pstip_fs.tokens = MALLOC(sizeof(struct tgsi_token) * MAX); +   if (pstip_fs.tokens == NULL) +      return FALSE;     memset(&transform, 0, sizeof(transform));     transform.wincoordInput = -1; @@ -355,6 +357,8 @@ generate_pstip_fs(struct pstip_stage *pstip)     assert(pstip->fs->sampler_unit < PIPE_MAX_SAMPLERS);     pstip->fs->pstip_fs = pstip->driver_create_fs_state(pstip->pipe, &pstip_fs); + +   return TRUE;  } @@ -404,7 +408,7 @@ pstip_update_texture(struct pstip_stage *pstip)  /**   * Create the texture map we'll use for stippling.   */ -static void +static boolean  pstip_create_texture(struct pstip_stage *pstip)  {     struct pipe_context *pipe = pstip->pipe; @@ -413,7 +417,7 @@ pstip_create_texture(struct pstip_stage *pstip)     memset(&texTemp, 0, sizeof(texTemp));     texTemp.target = PIPE_TEXTURE_2D; -   texTemp.format = PIPE_FORMAT_U_A8; /* XXX verify supported by driver! */ +   texTemp.format = PIPE_FORMAT_A8_UNORM; /* XXX verify supported by driver! */     texTemp.last_level = 0;     texTemp.width[0] = 32;     texTemp.height[0] = 32; @@ -421,16 +425,17 @@ pstip_create_texture(struct pstip_stage *pstip)     texTemp.cpp = 1;     pstip->texture = screen->texture_create(screen, &texTemp); -   assert(pstip->texture->refcount == 1); +   if (pstip->texture == NULL) +      return FALSE; + +   return TRUE;  }  /** - * Create the sampler CSO that'll be used for antialiasing. - * By using a mipmapped texture, we don't have to generate a different - * texture image for each line size. + * Create the sampler CSO that'll be used for stippling.   */ -static void +static boolean  pstip_create_sampler(struct pstip_stage *pstip)  {     struct pipe_sampler_state sampler; @@ -448,24 +453,32 @@ pstip_create_sampler(struct pstip_stage *pstip)     sampler.max_lod = 0.0f;     pstip->sampler_cso = pipe->create_sampler_state(pipe, &sampler); +   if (pstip->sampler_cso == NULL) +      return FALSE; +    +   return TRUE;  }  /** - * When we're about to draw our first AA line in a batch, this function is - * called to tell the driver to bind our modified fragment shader. + * When we're about to draw our first stipple polygon in a batch, this function + * is called to tell the driver to bind our modified fragment shader.   */ -static void +static boolean  bind_pstip_fragment_shader(struct pstip_stage *pstip)  { -   if (!pstip->fs->pstip_fs) { -      generate_pstip_fs(pstip); -   } +   struct draw_context *draw = pstip->stage.draw; +   if (!pstip->fs->pstip_fs && +       !generate_pstip_fs(pstip)) +      return FALSE; + +   draw->suspend_flushing = TRUE;     pstip->driver_bind_fs_state(pstip->pipe, pstip->fs->pstip_fs); +   draw->suspend_flushing = FALSE; +   return TRUE;  } -  static INLINE struct pstip_stage *  pstip_stage( struct draw_stage *stage )  { @@ -474,38 +487,22 @@ pstip_stage( struct draw_stage *stage )  static void -passthrough_point(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->point(stage->next, header); -} - - -static void -passthrough_line(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->line(stage->next, header); -} - - -static void -passthrough_tri(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->tri(stage->next, header); -} - - - -static void  pstip_first_tri(struct draw_stage *stage, struct prim_header *header)  {     struct pstip_stage *pstip = pstip_stage(stage);     struct pipe_context *pipe = pstip->pipe; +   struct draw_context *draw = stage->draw;     uint num_samplers;     assert(stage->draw->rasterizer->poly_stipple_enable);     /* bind our fragprog */ -   bind_pstip_fragment_shader(pstip); +   if (!bind_pstip_fragment_shader(pstip)) { +      stage->tri = draw_pipe_passthrough_tri; +      stage->tri(stage, header); +      return; +   } +           /* how many samplers? */     /* we'll use sampler/texture[pstip->sampler_unit] for the stipple */ @@ -519,11 +516,13 @@ pstip_first_tri(struct draw_stage *stage, struct prim_header *header)     assert(num_samplers <= PIPE_MAX_SAMPLERS); +   draw->suspend_flushing = TRUE;     pstip->driver_bind_sampler_states(pipe, num_samplers, pstip->state.samplers);     pstip->driver_set_sampler_textures(pipe, num_samplers, pstip->state.textures); +   draw->suspend_flushing = FALSE; -   /* now really draw first line */ -   stage->tri = passthrough_tri; +   /* now really draw first triangle */ +   stage->tri = draw_pipe_passthrough_tri;     stage->tri(stage, header);  } @@ -531,21 +530,21 @@ pstip_first_tri(struct draw_stage *stage, struct prim_header *header)  static void  pstip_flush(struct draw_stage *stage, unsigned flags)  { -   /*struct draw_context *draw = stage->draw;*/ +   struct draw_context *draw = stage->draw;     struct pstip_stage *pstip = pstip_stage(stage);     struct pipe_context *pipe = pstip->pipe;     stage->tri = pstip_first_tri;     stage->next->flush( stage->next, flags ); -   /* restore original frag shader */ +   /* restore original frag shader, texture, sampler state */ +   draw->suspend_flushing = TRUE;     pstip->driver_bind_fs_state(pipe, pstip->fs->driver_fs); - -   /* XXX restore original texture, sampler state */     pstip->driver_bind_sampler_states(pipe, pstip->num_samplers,                                       pstip->state.samplers);     pstip->driver_set_sampler_textures(pipe, pstip->num_textures,                                        pstip->state.textures); +   draw->suspend_flushing = FALSE;  } @@ -560,6 +559,11 @@ static void  pstip_destroy(struct draw_stage *stage)  {     struct pstip_stage *pstip = pstip_stage(stage); +   uint i; + +   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { +      pipe_texture_reference(&pstip->state.textures[i], NULL); +   }     pstip->pipe->delete_sampler_state(pstip->pipe, pstip->sampler_cso); @@ -579,8 +583,8 @@ draw_pstip_stage(struct draw_context *draw)     pstip->stage.draw = draw;     pstip->stage.next = NULL; -   pstip->stage.point = passthrough_point; -   pstip->stage.line = passthrough_line; +   pstip->stage.point = draw_pipe_passthrough_point; +   pstip->stage.line = draw_pipe_passthrough_line;     pstip->stage.tri = pstip_first_tri;     pstip->stage.flush = pstip_flush;     pstip->stage.reset_stipple_counter = pstip_reset_stipple_counter; @@ -690,8 +694,10 @@ pstip_set_polygon_stipple(struct pipe_context *pipe,                            const struct pipe_poly_stipple *stipple)  {     struct pstip_stage *pstip = pstip_stage_from_pipe(pipe); +     /* save current */     pstip->state.stipple = stipple; +     /* pass-through */     pstip->driver_set_polygon_stipple(pstip->pipe, stipple); @@ -699,13 +705,12 @@ pstip_set_polygon_stipple(struct pipe_context *pipe,  } -  /** - * Called by drivers that want to install this AA line prim stage + * Called by drivers that want to install this polygon stipple stage   * into the draw module's pipeline.  This will not be used if the - * hardware has native support for AA lines. + * hardware has native support for polygon stipple.   */ -void +boolean  draw_install_pstipple_stage(struct draw_context *draw,                              struct pipe_context *pipe)  { @@ -714,17 +719,22 @@ draw_install_pstipple_stage(struct draw_context *draw,     pipe->draw = (void *) draw;     /* -    * Create / install AA line drawing / prim stage +    * Create / install pgon stipple drawing / prim stage      */     pstip = draw_pstip_stage( draw ); -   assert(pstip); +   if (pstip == NULL) +      goto fail; +     draw->pipeline.pstipple = &pstip->stage;     pstip->pipe = pipe;     /* create special texture, sampler state */ -   pstip_create_texture(pstip); -   pstip_create_sampler(pstip); +   if (!pstip_create_texture(pstip)) +      goto fail; + +   if (!pstip_create_sampler(pstip)) +      goto fail;     /* save original driver functions */     pstip->driver_create_fs_state = pipe->create_fs_state; @@ -743,4 +753,12 @@ draw_install_pstipple_stage(struct draw_context *draw,     pipe->bind_sampler_states = pstip_bind_sampler_states;     pipe->set_sampler_textures = pstip_set_sampler_textures;     pipe->set_polygon_stipple = pstip_set_polygon_stipple; + +   return TRUE; + + fail: +   if (pstip) +      pstip->stage.destroy( &pstip->stage ); + +   return FALSE;  } diff --git a/src/gallium/auxiliary/draw/draw_stipple.c b/src/gallium/auxiliary/draw/draw_pipe_stipple.c index 506f33512c..3cbced362e 100644 --- a/src/gallium/auxiliary/draw/draw_stipple.c +++ b/src/gallium/auxiliary/draw/draw_pipe_stipple.c @@ -39,7 +39,7 @@  #include "pipe/p_util.h"  #include "pipe/p_defines.h"  #include "pipe/p_shader_tokens.h" -#include "draw_private.h" +#include "draw_pipe.h"  /** Subclass of draw_stage */ @@ -135,6 +135,10 @@ stipple_line(struct draw_stage *stage, struct prim_header *header)     float length = MAX2(dx, dy);     int i; +   if (header->flags & DRAW_PIPE_RESET_STIPPLE) +      stipple->counter = 0; + +     /* XXX ToDo: intead of iterating pixel-by-pixel, use a look-up table.      */     for (i = 0; i < length; i++) { @@ -195,18 +199,6 @@ stipple_flush(struct draw_stage *stage, unsigned flags)  } -static void -passthrough_point(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->point( stage->next, header ); -} - - -static void -passthrough_tri(struct draw_stage *stage, struct prim_header *header) -{ -   stage->next->tri(stage->next, header); -}  static void  @@ -228,9 +220,9 @@ struct draw_stage *draw_stipple_stage( struct draw_context *draw )     stipple->stage.draw = draw;     stipple->stage.next = NULL; -   stipple->stage.point = passthrough_point; +   stipple->stage.point = draw_pipe_passthrough_point;     stipple->stage.line = stipple_first_line; -   stipple->stage.tri = passthrough_tri; +   stipple->stage.tri = draw_pipe_passthrough_tri;     stipple->stage.reset_stipple_counter = reset_stipple_counter;     stipple->stage.flush = stipple_flush;     stipple->stage.destroy = stipple_destroy; diff --git a/src/gallium/auxiliary/draw/draw_twoside.c b/src/gallium/auxiliary/draw/draw_pipe_twoside.c index 3debaac282..50872fdbe9 100644 --- a/src/gallium/auxiliary/draw/draw_twoside.c +++ b/src/gallium/auxiliary/draw/draw_pipe_twoside.c @@ -31,8 +31,8 @@  #include "pipe/p_util.h"  #include "pipe/p_defines.h"  #include "pipe/p_shader_tokens.h" -#include "draw_private.h" - +#include "draw_vs.h" +#include "draw_pipe.h"  struct twoside_stage {     struct draw_stage stage; @@ -85,7 +85,8 @@ static void twoside_tri( struct draw_stage *stage,        struct prim_header tmp;        tmp.det = header->det; -      tmp.edgeflags = header->edgeflags; +      tmp.flags = header->flags; +      tmp.pad = header->pad;        /* copy back attribs to front attribs */        tmp.v[0] = copy_bfc(twoside, header->v[0], 0);        tmp.v[1] = copy_bfc(twoside, header->v[1], 1); @@ -99,21 +100,6 @@ static void twoside_tri( struct draw_stage *stage,  } -static void twoside_line( struct draw_stage *stage, -		       struct prim_header *header ) -{ -   /* pass-through */ -   stage->next->line( stage->next, header ); -} - - -static void twoside_point( struct draw_stage *stage, -			struct prim_header *header ) -{ -   /* pass-through */ -   stage->next->point( stage->next, header ); -} -  static void twoside_first_tri( struct draw_stage *stage,   			       struct prim_header *header ) @@ -187,17 +173,26 @@ static void twoside_destroy( struct draw_stage *stage )  struct draw_stage *draw_twoside_stage( struct draw_context *draw )  {     struct twoside_stage *twoside = CALLOC_STRUCT(twoside_stage); +   if (twoside == NULL) +      goto fail; -   draw_alloc_temp_verts( &twoside->stage, 3 ); +   if (!draw_alloc_temp_verts( &twoside->stage, 3 )) +      goto fail;     twoside->stage.draw = draw;     twoside->stage.next = NULL; -   twoside->stage.point = twoside_point; -   twoside->stage.line = twoside_line; +   twoside->stage.point = draw_pipe_passthrough_point; +   twoside->stage.line = draw_pipe_passthrough_line;     twoside->stage.tri = twoside_first_tri;     twoside->stage.flush = twoside_flush;     twoside->stage.reset_stipple_counter = twoside_reset_stipple_counter;     twoside->stage.destroy = twoside_destroy;     return &twoside->stage; + + fail: +   if (twoside) +      twoside->stage.destroy( &twoside->stage ); + +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_unfilled.c b/src/gallium/auxiliary/draw/draw_pipe_unfilled.c index b07860cd9e..8f97fdedaa 100644 --- a/src/gallium/auxiliary/draw/draw_unfilled.c +++ b/src/gallium/auxiliary/draw/draw_pipe_unfilled.c @@ -36,6 +36,7 @@  #include "pipe/p_util.h"  #include "pipe/p_defines.h"  #include "draw_private.h" +#include "draw_pipe.h"  struct unfilled_stage { @@ -82,9 +83,9 @@ static void points( struct draw_stage *stage,     struct vertex_header *v1 = header->v[1];     struct vertex_header *v2 = header->v[2]; -   if (header->edgeflags & 0x1) point( stage, v0 ); -   if (header->edgeflags & 0x2) point( stage, v1 ); -   if (header->edgeflags & 0x4) point( stage, v2 ); +   if ((header->flags & DRAW_PIPE_EDGE_FLAG_0) && v0->edgeflag) point( stage, v0 ); +   if ((header->flags & DRAW_PIPE_EDGE_FLAG_1) && v1->edgeflag) point( stage, v1 ); +   if ((header->flags & DRAW_PIPE_EDGE_FLAG_2) && v2->edgeflag) point( stage, v2 );  } @@ -95,22 +96,22 @@ static void lines( struct draw_stage *stage,     struct vertex_header *v1 = header->v[1];     struct vertex_header *v2 = header->v[2]; -#if 0 -   assert(((header->edgeflags & 0x1) >> 0) == header->v[0]->edgeflag); -   assert(((header->edgeflags & 0x2) >> 1) == header->v[1]->edgeflag); -   assert(((header->edgeflags & 0x4) >> 2) == header->v[2]->edgeflag); -#endif +   if (header->flags & DRAW_PIPE_RESET_STIPPLE) +      stage->next->reset_stipple_counter( stage->next ); -   if (header->edgeflags & 0x4) line( stage, v2, v0 ); -   if (header->edgeflags & 0x1) line( stage, v0, v1 ); -   if (header->edgeflags & 0x2) line( stage, v1, v2 ); +   if ((header->flags & DRAW_PIPE_EDGE_FLAG_2) && v2->edgeflag) line( stage, v2, v0 ); +   if ((header->flags & DRAW_PIPE_EDGE_FLAG_0) && v0->edgeflag) line( stage, v0, v1 ); +   if ((header->flags & DRAW_PIPE_EDGE_FLAG_1) && v1->edgeflag) line( stage, v1, v2 );  }  /* Unfilled tri:     *   * Note edgeflags in the vertex struct is not sufficient as we will - * need to manipulate them when decomposing primitives??? + * need to manipulate them when decomposing primitives.   + *  + * We currently keep the vertex edgeflag and primitive edgeflag mask + * separate until the last possible moment.   */  static void unfilled_tri( struct draw_stage *stage,  			  struct prim_header *header ) @@ -147,19 +148,6 @@ static void unfilled_first_tri( struct draw_stage *stage,  } -static void unfilled_line( struct draw_stage *stage, -                           struct prim_header *header ) -{ -   stage->next->line( stage->next, header ); -} - - -static void unfilled_point( struct draw_stage *stage, -                            struct prim_header *header ) -{ -   stage->next->point( stage->next, header ); -} -  static void unfilled_flush( struct draw_stage *stage,  			    unsigned flags ) @@ -189,18 +177,27 @@ static void unfilled_destroy( struct draw_stage *stage )  struct draw_stage *draw_unfilled_stage( struct draw_context *draw )  {     struct unfilled_stage *unfilled = CALLOC_STRUCT(unfilled_stage); +   if (unfilled == NULL) +      goto fail; -   draw_alloc_temp_verts( &unfilled->stage, 0 ); +   if (!draw_alloc_temp_verts( &unfilled->stage, 0 )) +      goto fail;     unfilled->stage.draw = draw;     unfilled->stage.next = NULL;     unfilled->stage.tmp = NULL; -   unfilled->stage.point = unfilled_point; -   unfilled->stage.line = unfilled_line; +   unfilled->stage.point = draw_pipe_passthrough_point; +   unfilled->stage.line = draw_pipe_passthrough_line;     unfilled->stage.tri = unfilled_first_tri;     unfilled->stage.flush = unfilled_flush;     unfilled->stage.reset_stipple_counter = unfilled_reset_stipple_counter;     unfilled->stage.destroy = unfilled_destroy;     return &unfilled->stage; + + fail: +   if (unfilled) +      unfilled->stage.destroy( &unfilled->stage ); + +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_pipe_util.c b/src/gallium/auxiliary/draw/draw_pipe_util.c new file mode 100644 index 0000000000..04438f4dd0 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pipe_util.c @@ -0,0 +1,137 @@ +/************************************************************************** + *  + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: +  *   Keith Whitwell <keith@tungstengraphics.com> +  */ + +#include "pipe/p_util.h" +#include "draw/draw_private.h" +#include "draw/draw_pipe.h" + + + +void +draw_pipe_passthrough_point(struct draw_stage *stage, struct prim_header *header) +{ +   stage->next->point(stage->next, header); +} + +void +draw_pipe_passthrough_line(struct draw_stage *stage, struct prim_header *header) +{ +   stage->next->line(stage->next, header); +} + +void +draw_pipe_passthrough_tri(struct draw_stage *stage, struct prim_header *header) +{ +   stage->next->tri(stage->next, header); +} + + + + + +/* This is only used for temporary verts. + */ +#define MAX_VERTEX_SIZE ((2 + PIPE_MAX_SHADER_OUTPUTS) * 4 * sizeof(float)) + + +/** + * Allocate space for temporary post-transform vertices, such as for clipping. + */ +boolean draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr ) +{ +   assert(!stage->tmp); + +   stage->tmp = NULL; +   stage->nr_tmps = nr; + +   if (nr != 0) +   { +      unsigned i; +      ubyte *store = (ubyte *) MALLOC( MAX_VERTEX_SIZE * nr ); + +      if (store == NULL) +         return FALSE; + +      stage->tmp = (struct vertex_header **) MALLOC( sizeof(struct vertex_header *) * nr ); +      if (stage->tmp == NULL) { +         FREE(store); +         return FALSE; +      } +          +      for (i = 0; i < nr; i++) +         stage->tmp[i] = (struct vertex_header *)(store + i * MAX_VERTEX_SIZE); +   } + +   return TRUE; +} + + +void draw_free_temp_verts( struct draw_stage *stage ) +{ +   if (stage->tmp) { +      FREE( stage->tmp[0] ); +      FREE( stage->tmp ); +      stage->tmp = NULL; +   } +} + + +/* Reset vertex ids.  This is basically a type of flush. + * + * Called only from draw_pipe_vbuf.c + */ +void draw_reset_vertex_ids(struct draw_context *draw) +{ +   struct draw_stage *stage = draw->pipeline.first; +    +   while (stage) { +      unsigned i; + +      for (i = 0; i < stage->nr_tmps; i++) +	 stage->tmp[i]->vertex_id = UNDEFINED_VERTEX_ID; + +      stage = stage->next; +   } + +   if (draw->pipeline.verts) +   { +      unsigned i; +      char *verts = draw->pipeline.verts; +      unsigned stride = draw->pipeline.vertex_stride; + +      for (i = 0; i < draw->pipeline.vertex_count; i++) { +         ((struct vertex_header *)verts)->vertex_id = UNDEFINED_VERTEX_ID; +         verts += stride; +      } +   } +} + diff --git a/src/gallium/auxiliary/draw/draw_validate.c b/src/gallium/auxiliary/draw/draw_pipe_validate.c index e163e078f0..6be1d369c3 100644 --- a/src/gallium/auxiliary/draw/draw_validate.c +++ b/src/gallium/auxiliary/draw/draw_pipe_validate.c @@ -31,6 +31,8 @@  #include "pipe/p_util.h"  #include "pipe/p_defines.h"  #include "draw_private.h" +#include "draw_pipe.h" +#include "draw_context.h"  static boolean points( unsigned prim )  { @@ -56,7 +58,8 @@ static boolean triangles( unsigned prim )   * pipeline stages.   */  boolean -draw_need_pipeline(const struct draw_context *draw,  +draw_need_pipeline(const struct draw_context *draw, +                   const struct pipe_rasterizer_state *rasterizer,                     unsigned int prim )  {     /* Don't have to worry about triangles turning into lines/points @@ -66,30 +69,30 @@ draw_need_pipeline(const struct draw_context *draw,     if (lines(prim))      {        /* line stipple */ -      if (draw->rasterizer->line_stipple_enable && draw->line_stipple) +      if (rasterizer->line_stipple_enable && draw->pipeline.line_stipple)           return TRUE;        /* wide lines */ -      if (draw->rasterizer->line_width > draw->wide_line_threshold) +      if (rasterizer->line_width > draw->pipeline.wide_line_threshold)           return TRUE;        /* AA lines */ -      if (draw->rasterizer->line_smooth && draw->pipeline.aaline) +      if (rasterizer->line_smooth && draw->pipeline.aaline)           return TRUE;     }     if (points(prim))     {        /* large points */ -      if (draw->rasterizer->point_size > draw->wide_point_threshold) +      if (rasterizer->point_size > draw->pipeline.wide_point_threshold)           return TRUE;        /* AA points */ -      if (draw->rasterizer->point_smooth && draw->pipeline.aapoint) +      if (rasterizer->point_smooth && draw->pipeline.aapoint)           return TRUE;        /* point sprites */ -      if (draw->rasterizer->point_sprite && draw->point_sprite) +      if (rasterizer->point_sprite && draw->pipeline.point_sprite)           return TRUE;     } @@ -97,20 +100,20 @@ draw_need_pipeline(const struct draw_context *draw,     if (triangles(prim))      {        /* polygon stipple */ -      if (draw->rasterizer->poly_stipple_enable && draw->pipeline.pstipple) +      if (rasterizer->poly_stipple_enable && draw->pipeline.pstipple)           return TRUE;        /* unfilled polygons */ -      if (draw->rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL || -          draw->rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL) +      if (rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL || +          rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL)           return TRUE;        /* polygon offset */ -      if (draw->rasterizer->offset_cw || draw->rasterizer->offset_ccw) +      if (rasterizer->offset_cw || rasterizer->offset_ccw)           return TRUE;        /* two-side lighting */ -      if (draw->rasterizer->light_twoside) +      if (rasterizer->light_twoside)           return TRUE;     } @@ -119,7 +122,7 @@ draw_need_pipeline(const struct draw_context *draw,      *       * Generally this isn't a reason to require the pipeline, though.      * -   if (draw->rasterizer->cull_mode) +   if (rasterizer->cull_mode)        return TRUE;      */ @@ -145,15 +148,15 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )     stage->next = next;     /* drawing wide lines? */ -   wide_lines = (draw->rasterizer->line_width > draw->wide_line_threshold +   wide_lines = (draw->rasterizer->line_width > draw->pipeline.wide_line_threshold                   && !draw->rasterizer->line_smooth);     /* drawing large points? */ -   if (draw->rasterizer->point_sprite && draw->point_sprite) +   if (draw->rasterizer->point_sprite && draw->pipeline.point_sprite)        wide_points = TRUE;     else if (draw->rasterizer->point_smooth && draw->pipeline.aapoint)        wide_points = FALSE; -   else if (draw->rasterizer->point_size > draw->wide_point_threshold) +   else if (draw->rasterizer->point_size > draw->pipeline.wide_point_threshold)        wide_points = TRUE;     else        wide_points = FALSE; @@ -186,7 +189,7 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )        next = draw->pipeline.wide_point;     } -   if (draw->rasterizer->line_stipple_enable && draw->line_stipple) { +   if (draw->rasterizer->line_stipple_enable && draw->pipeline.line_stipple) {        draw->pipeline.stipple->next = next;        next = draw->pipeline.stipple;        precalc_flat = 1;		/* only needed for lines really */ @@ -238,7 +241,7 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage )     /* Clip stage      */ -   if (!draw->rasterizer->bypass_clipping) +   if (!draw->bypass_clipping)     {        draw->pipeline.clip->next = next;        next = draw->pipeline.clip; @@ -298,6 +301,8 @@ static void validate_destroy( struct draw_stage *stage )  struct draw_stage *draw_validate_stage( struct draw_context *draw )  {     struct draw_stage *stage = CALLOC_STRUCT(draw_stage); +   if (stage == NULL) +      return NULL;     stage->draw = draw;     stage->next = NULL; diff --git a/src/gallium/auxiliary/draw/draw_vbuf.c b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c index f83b441e93..86a7d1c730 100644 --- a/src/gallium/auxiliary/draw/draw_vbuf.c +++ b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c @@ -40,7 +40,9 @@  #include "draw_vbuf.h"  #include "draw_private.h"  #include "draw_vertex.h" -#include "draw_vf.h" +#include "draw_pipe.h" +#include "translate/translate.h" +#include "translate/translate_cache.h"  /** @@ -56,7 +58,7 @@ struct vbuf_stage {     /** Vertex size in bytes */     unsigned vertex_size; -   struct draw_vertex_fetch *vf; +   struct translate *translate;     /* FIXME: we have no guarantee that 'unsigned' is 32bit */ @@ -71,8 +73,11 @@ struct vbuf_stage {     unsigned max_indices;     unsigned nr_indices; -   /** Pipe primitive */ -   unsigned prim; +   /* Cache point size somewhere it's address won't change: +    */ +   float point_size; + +   struct translate_cache *cache;  }; @@ -113,68 +118,6 @@ check_space( struct vbuf_stage *vbuf, unsigned nr )  } -#if 0 -static INLINE void -dump_emitted_vertex(const struct vertex_info *vinfo, const uint8_t *data) -{ -   assert(vinfo == vbuf->render->get_vertex_info(vbuf->render)); -   unsigned i, j, k; - -   for (i = 0; i < vinfo->num_attribs; i++) { -      j = vinfo->src_index[i]; -      switch (vinfo->emit[i]) { -      case EMIT_OMIT: -         debug_printf("EMIT_OMIT:"); -         break; -      case EMIT_ALL: -         assert(i == 0); -         assert(j == 0); -         debug_printf("EMIT_ALL:\t"); -         for(k = 0; k < vinfo->size*4; ++k) -            debug_printf("%02x ", *data++); -         break; -      case EMIT_1F: -         debug_printf("EMIT_1F:\t"); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         break; -      case EMIT_1F_PSIZE: -         debug_printf("EMIT_1F_PSIZE:\t"); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         break; -      case EMIT_2F: -         debug_printf("EMIT_2F:\t"); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         break; -      case EMIT_3F: -         debug_printf("EMIT_3F:\t"); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         data += sizeof(float); -         break; -      case EMIT_4F: -         debug_printf("EMIT_4F:\t"); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         debug_printf("%f ", *(float *)data); data += sizeof(float); -         break; -      case EMIT_4UB: -         debug_printf("EMIT_4UB:\t"); -         debug_printf("%u ", *data++); -         debug_printf("%u ", *data++); -         debug_printf("%u ", *data++); -         debug_printf("%u ", *data++); -         break; -      default: -         assert(0); -      } -      debug_printf("\n"); -   } -   debug_printf("\n"); -} -#endif  /** @@ -184,109 +127,25 @@ dump_emitted_vertex(const struct vertex_info *vinfo, const uint8_t *data)   * have a couple of slots at the beginning (1-dword header, 4-dword   * clip pos) that we ignore here.  We only use the vertex->data[] fields.   */ -static INLINE void  +static INLINE ushort   emit_vertex( struct vbuf_stage *vbuf,               struct vertex_header *vertex )  { -#if 0 -   debug_printf("emit vertex %d to %p\n",  -           vbuf->nr_vertices, vbuf->vertex_ptr); -#endif - -   if(vertex->vertex_id != UNDEFINED_VERTEX_ID) { -      if(vertex->vertex_id < vbuf->nr_vertices) -	 return; -      else -	 debug_printf("Bad vertex id 0x%04x (>= 0x%04x)\n",  -	         vertex->vertex_id, vbuf->nr_vertices); -      return; -   } -       -   vertex->vertex_id = vbuf->nr_vertices++; +   if(vertex->vertex_id == UNDEFINED_VERTEX_ID) {       +      /* Hmm - vertices are emitted one at a time - better make sure +       * set_buffer is efficient.  Consider a special one-shot mode for +       * translate. +       */ +      vbuf->translate->set_buffer(vbuf->translate, 0, vertex->data[0], 0); +      vbuf->translate->run(vbuf->translate, 0, 1, vbuf->vertex_ptr); -   if(!vbuf->vf) { -      const struct vertex_info *vinfo = vbuf->vinfo; -      uint i; -      uint count = 0;  /* for debug/sanity */ +      if (0) draw_dump_emitted_vertex(vbuf->vinfo, (uint8_t *)vbuf->vertex_ptr); -      assert(vinfo == vbuf->render->get_vertex_info(vbuf->render)); - -      for (i = 0; i < vinfo->num_attribs; i++) { -         uint j = vinfo->src_index[i]; -         switch (vinfo->emit[i]) { -         case EMIT_OMIT: -            /* no-op */ -            break; -         case EMIT_ALL: -            /* just copy the whole vertex as-is to the vbuf */ -            assert(i == 0); -            assert(j == 0); -            memcpy(vbuf->vertex_ptr, vertex, vinfo->size * 4); -            vbuf->vertex_ptr += vinfo->size; -            count += vinfo->size; -            break; -         case EMIT_HEADER: -            memcpy(vbuf->vertex_ptr, vertex, sizeof(*vertex)); -            *vbuf->vertex_ptr += sizeof(*vertex) / 4; -            count += sizeof(*vertex) / 4; -            break; -         case EMIT_1F: -            *vbuf->vertex_ptr++ = fui(vertex->data[j][0]); -            count++; -            break; -         case EMIT_1F_PSIZE: -            *vbuf->vertex_ptr++ = fui(vbuf->stage.draw->rasterizer->point_size); -            count++; -            break; -         case EMIT_2F: -            *vbuf->vertex_ptr++ = fui(vertex->data[j][0]); -            *vbuf->vertex_ptr++ = fui(vertex->data[j][1]); -            count += 2; -            break; -         case EMIT_3F: -            *vbuf->vertex_ptr++ = fui(vertex->data[j][0]); -            *vbuf->vertex_ptr++ = fui(vertex->data[j][1]); -            *vbuf->vertex_ptr++ = fui(vertex->data[j][2]); -            count += 3; -            break; -         case EMIT_4F: -            *vbuf->vertex_ptr++ = fui(vertex->data[j][0]); -            *vbuf->vertex_ptr++ = fui(vertex->data[j][1]); -            *vbuf->vertex_ptr++ = fui(vertex->data[j][2]); -            *vbuf->vertex_ptr++ = fui(vertex->data[j][3]); -            count += 4; -            break; -         case EMIT_4UB: -            *vbuf->vertex_ptr++ = pack_ub4(float_to_ubyte( vertex->data[j][2] ), -                                           float_to_ubyte( vertex->data[j][1] ), -                                           float_to_ubyte( vertex->data[j][0] ), -                                           float_to_ubyte( vertex->data[j][3] )); -            count += 1; -            break; -         default: -            assert(0); -         } -      } -      assert(count == vinfo->size); -#if 0 -      { -	 static float data[256];  -	 draw_vf_emit_vertex(vbuf->vf, vertex, data); -	 if(memcmp((uint8_t *)vbuf->vertex_ptr - vbuf->vertex_size, data, vbuf->vertex_size)) { -            debug_printf("With VF:\n"); -            dump_emitted_vertex(vbuf->vinfo, (uint8_t *)data); -	    debug_printf("Without VF:\n"); -	    dump_emitted_vertex(vbuf->vinfo, (uint8_t *)vbuf->vertex_ptr - vbuf->vertex_size); -	    assert(0); -	 } -      } -#endif -   } -   else { -      draw_vf_emit_vertex(vbuf->vf, vertex, vbuf->vertex_ptr); -           vbuf->vertex_ptr += vbuf->vertex_size/4; +      vertex->vertex_id = vbuf->nr_vertices++;     } + +   return vertex->vertex_id;  } @@ -300,9 +159,7 @@ vbuf_tri( struct draw_stage *stage,     check_space( vbuf, 3 );     for (i = 0; i < 3; i++) { -      emit_vertex( vbuf, prim->v[i] ); -       -      vbuf->indices[vbuf->nr_indices++] = (ushort) prim->v[i]->vertex_id; +      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] );     }  } @@ -317,9 +174,7 @@ vbuf_line( struct draw_stage *stage,     check_space( vbuf, 2 );     for (i = 0; i < 2; i++) { -      emit_vertex( vbuf, prim->v[i] ); - -      vbuf->indices[vbuf->nr_indices++] = (ushort) prim->v[i]->vertex_id; +      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] );     }     } @@ -332,43 +187,110 @@ vbuf_point( struct draw_stage *stage,     check_space( vbuf, 1 ); -   emit_vertex( vbuf, prim->v[0] ); -    -   vbuf->indices[vbuf->nr_indices++] = (ushort) prim->v[0]->vertex_id; +   vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[0] );  } + +  /**   * Set the prim type for subsequent vertices.   * This may result in a new vertex size.  The existing vbuffer (if any)   * will be flushed if needed and a new one allocated.   */  static void -vbuf_set_prim( struct vbuf_stage *vbuf, uint newprim ) +vbuf_set_prim( struct vbuf_stage *vbuf, uint prim )  { -   const struct vertex_info *vinfo; -   unsigned vertex_size; - -   assert(newprim == PIPE_PRIM_POINTS || -          newprim == PIPE_PRIM_LINES || -          newprim == PIPE_PRIM_TRIANGLES); +   struct translate_key hw_key; +   unsigned dst_offset; +   unsigned i; -   vbuf->prim = newprim; -   vbuf->render->set_primitive(vbuf->render, newprim); +   vbuf->render->set_primitive(vbuf->render, prim); -   vinfo = vbuf->render->get_vertex_info(vbuf->render); -   vertex_size = vinfo->size * sizeof(float); +   /* Must do this after set_primitive() above: +    *  +    * XXX: need some state managment to track when this needs to be +    * recalculated.  The driver should tell us whether there was a +    * state change. +    */ +   vbuf->vinfo = vbuf->render->get_vertex_info(vbuf->render); -   if (vertex_size != vbuf->vertex_size) +   if (vbuf->vertex_size != vbuf->vinfo->size * sizeof(float)) {        vbuf_flush_vertices(vbuf); +      vbuf->vertex_size = vbuf->vinfo->size * sizeof(float); +   } -   vbuf->vinfo = vinfo; -   vbuf->vertex_size = vertex_size; -   if(vbuf->vf) -      draw_vf_set_vertex_info(vbuf->vf,  -                              vbuf->vinfo, -                              vbuf->stage.draw->rasterizer->point_size); -    +   /* Translate from pipeline vertices to hw vertices. +    */ +   dst_offset = 0; + +   for (i = 0; i < vbuf->vinfo->num_attribs; i++) { +      unsigned emit_sz = 0; +      unsigned src_buffer = 0; +      unsigned output_format; +      unsigned src_offset = (vbuf->vinfo->src_index[i] * 4 * sizeof(float) ); + +      switch (vbuf->vinfo->emit[i]) { +      case EMIT_4F: +	 output_format = PIPE_FORMAT_R32G32B32A32_FLOAT; +	 emit_sz = 4 * sizeof(float); +	 break; +      case EMIT_3F: +	 output_format = PIPE_FORMAT_R32G32B32_FLOAT; +	 emit_sz = 3 * sizeof(float); +	 break; +      case EMIT_2F: +	 output_format = PIPE_FORMAT_R32G32_FLOAT; +	 emit_sz = 2 * sizeof(float); +	 break; +      case EMIT_1F: +	 output_format = PIPE_FORMAT_R32_FLOAT; +	 emit_sz = 1 * sizeof(float); +	 break; +      case EMIT_1F_PSIZE: +	 output_format = PIPE_FORMAT_R32_FLOAT; +	 emit_sz = 1 * sizeof(float); +	 src_buffer = 1; +	 src_offset = 0; +	 break; +      case EMIT_4UB: +	 output_format = PIPE_FORMAT_B8G8R8A8_UNORM; +	 emit_sz = 4 * sizeof(ubyte); +         break; +      default: +	 assert(0); +	 output_format = PIPE_FORMAT_NONE; +	 emit_sz = 0; +	 break; +      } +       +      hw_key.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT; +      hw_key.element[i].input_buffer = src_buffer; +      hw_key.element[i].input_offset = src_offset; +      hw_key.element[i].output_format = output_format; +      hw_key.element[i].output_offset = dst_offset; + +      dst_offset += emit_sz; +   } + +   hw_key.nr_elements = vbuf->vinfo->num_attribs; +   hw_key.output_stride = vbuf->vinfo->size * 4; + +   /* Don't bother with caching at this stage: +    */ +   if (!vbuf->translate || +       translate_key_compare(&vbuf->translate->key, &hw_key) != 0)  +   { +      translate_key_sanitize(&hw_key); +      vbuf->translate = translate_cache_find(vbuf->cache, &hw_key); + +      vbuf->translate->set_buffer(vbuf->translate, 1, &vbuf->point_size, 0); +   } + +   vbuf->point_size = vbuf->stage.draw->rasterizer->point_size; + +   /* Allocate new buffer? +    */     if (!vbuf->vertices)        vbuf_alloc_vertices(vbuf);  } @@ -422,29 +344,9 @@ vbuf_flush_indices( struct vbuf_stage *vbuf )     assert((uint) (vbuf->vertex_ptr - vbuf->vertices) ==             vbuf->nr_vertices * vbuf->vertex_size / sizeof(unsigned)); -   switch(vbuf->prim) { -   case PIPE_PRIM_POINTS: -      break; -   case PIPE_PRIM_LINES: -      assert(vbuf->nr_indices % 2 == 0); -      break; -   case PIPE_PRIM_TRIANGLES: -      assert(vbuf->nr_indices % 3 == 0); -      break; -   default: -      assert(0); -   } -        vbuf->render->draw(vbuf->render, vbuf->indices, vbuf->nr_indices);     vbuf->nr_indices = 0; - -   /* don't need to reset point/line/tri functions */ -#if 0 -   stage->point = vbuf_first_point; -   stage->line = vbuf_first_line; -   stage->tri = vbuf_first_tri; -#endif  } @@ -486,8 +388,8 @@ vbuf_alloc_vertices( struct vbuf_stage *vbuf )     /* Allocate a new vertex buffer */     vbuf->max_vertices = vbuf->render->max_vertex_buffer_bytes / vbuf->vertex_size;     vbuf->vertices = (uint *) vbuf->render->allocate_vertices(vbuf->render, -                                                    (ushort) vbuf->vertex_size, -                                                    (ushort) vbuf->max_vertices); +							     (ushort) vbuf->vertex_size, +							     (ushort) vbuf->max_vertices);     vbuf->vertex_ptr = vbuf->vertices;  } @@ -525,12 +427,15 @@ static void vbuf_destroy( struct draw_stage *stage )     if(vbuf->indices)        align_free( vbuf->indices ); -   if(vbuf->vf) -      draw_vf_destroy( vbuf->vf ); +   if(vbuf->translate) +      vbuf->translate->release( vbuf->translate );     if (vbuf->render)        vbuf->render->destroy( vbuf->render ); +   if (vbuf->cache) +      translate_cache_destroy(vbuf->cache); +     FREE( stage );  } @@ -542,9 +447,8 @@ struct draw_stage *draw_vbuf_stage( struct draw_context *draw,                                      struct vbuf_render *render )  {     struct vbuf_stage *vbuf = CALLOC_STRUCT(vbuf_stage); - -   if(!vbuf) -      return NULL; +   if (vbuf == NULL) +      goto fail;     vbuf->stage.draw = draw;     vbuf->stage.point = vbuf_first_point; @@ -555,21 +459,27 @@ struct draw_stage *draw_vbuf_stage( struct draw_context *draw,     vbuf->stage.destroy = vbuf_destroy;     vbuf->render = render; +   vbuf->max_indices = MAX2(render->max_indices, UNDEFINED_VERTEX_ID-1); -   assert(render->max_indices < UNDEFINED_VERTEX_ID); -   vbuf->max_indices = render->max_indices; -   vbuf->indices = (ushort *) -      align_malloc( vbuf->max_indices * sizeof(vbuf->indices[0]), 16 ); -   if(!vbuf->indices) -      vbuf_destroy(&vbuf->stage); +   vbuf->indices = (ushort *) align_malloc( vbuf->max_indices *  +					    sizeof(vbuf->indices[0]),  +					    16 ); +   if (!vbuf->indices) +      goto fail; + +   vbuf->cache = translate_cache_create(); +   if (!vbuf->cache)  +      goto fail; +           vbuf->vertices = NULL;     vbuf->vertex_ptr = vbuf->vertices; - -   vbuf->prim = ~0; -    -   if(!GETENV("GALLIUM_NOVF")) -      vbuf->vf = draw_vf_create();     return &vbuf->stage; + + fail: +   if (vbuf) +      vbuf_destroy(&vbuf->stage); +    +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_wide_line.c b/src/gallium/auxiliary/draw/draw_pipe_wide_line.c index 9a168ce8bd..878c9c7169 100644 --- a/src/gallium/auxiliary/draw/draw_wide_line.c +++ b/src/gallium/auxiliary/draw/draw_pipe_wide_line.c @@ -32,6 +32,7 @@  #include "pipe/p_defines.h"  #include "pipe/p_shader_tokens.h"  #include "draw_private.h" +#include "draw_pipe.h"  struct wideline_stage { @@ -48,19 +49,6 @@ static INLINE struct wideline_stage *wideline_stage( struct draw_stage *stage )  } -static void wideline_point( struct draw_stage *stage, -                               struct prim_header *header ) -{ -   stage->next->point( stage->next, header ); -} - - -static void wideline_tri( struct draw_stage *stage, -                             struct prim_header *header ) -{ -   stage->next->tri(stage->next, header); -} -  /**   * Draw a wide line by drawing a quad (two triangles). @@ -179,9 +167,9 @@ struct draw_stage *draw_wide_line_stage( struct draw_context *draw )     wide->stage.draw = draw;     wide->stage.next = NULL; -   wide->stage.point = wideline_point; +   wide->stage.point = draw_pipe_passthrough_point;     wide->stage.line = wideline_line; -   wide->stage.tri = wideline_tri; +   wide->stage.tri = draw_pipe_passthrough_tri;     wide->stage.flush = wideline_flush;     wide->stage.reset_stipple_counter = wideline_reset_stipple_counter;     wide->stage.destroy = wideline_destroy; diff --git a/src/gallium/auxiliary/draw/draw_wide_point.c b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c index 6fc7c9fcd7..ed08573382 100644 --- a/src/gallium/auxiliary/draw/draw_wide_point.c +++ b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c @@ -31,7 +31,8 @@  #include "pipe/p_util.h"  #include "pipe/p_defines.h"  #include "pipe/p_shader_tokens.h" -#include "draw_private.h" +#include "draw_vs.h" +#include "draw_pipe.h"  struct widepoint_stage { @@ -60,23 +61,6 @@ widepoint_stage( struct draw_stage *stage )  } -static void passthrough_point( struct draw_stage *stage, -                             struct prim_header *header ) -{ -   stage->next->point( stage->next, header ); -} - -static void widepoint_line( struct draw_stage *stage, -                            struct prim_header *header ) -{ -   stage->next->line(stage->next, header); -} - -static void widepoint_tri( struct draw_stage *stage, -                           struct prim_header *header ) -{ -   stage->next->tri(stage->next, header); -}  /** @@ -199,16 +183,16 @@ static void widepoint_first_point( struct draw_stage *stage,     wide->ybias = 0.0;     if (draw->rasterizer->gl_rasterization_rules) { -      wide->ybias = -0.125; +      wide->xbias = 0.125;     }     /* XXX we won't know the real size if it's computed by the vertex shader! */ -   if ((draw->rasterizer->point_size > draw->wide_point_threshold) || -       (draw->rasterizer->point_sprite && draw->point_sprite)) { +   if ((draw->rasterizer->point_size > draw->pipeline.wide_point_threshold) || +       (draw->rasterizer->point_sprite && draw->pipeline.point_sprite)) {        stage->point = widepoint_point;     }     else { -      stage->point = passthrough_point; +      stage->point = draw_pipe_passthrough_point;     }     if (draw->rasterizer->point_sprite) { @@ -265,17 +249,26 @@ static void widepoint_destroy( struct draw_stage *stage )  struct draw_stage *draw_wide_point_stage( struct draw_context *draw )  {     struct widepoint_stage *wide = CALLOC_STRUCT(widepoint_stage); +   if (wide == NULL) +      goto fail; -   draw_alloc_temp_verts( &wide->stage, 4 ); +   if (!draw_alloc_temp_verts( &wide->stage, 4 )) +      goto fail;     wide->stage.draw = draw;     wide->stage.next = NULL;     wide->stage.point = widepoint_first_point; -   wide->stage.line = widepoint_line; -   wide->stage.tri = widepoint_tri; +   wide->stage.line = draw_pipe_passthrough_line; +   wide->stage.tri = draw_pipe_passthrough_tri;     wide->stage.flush = widepoint_flush;     wide->stage.reset_stipple_counter = widepoint_reset_stipple_counter;     wide->stage.destroy = widepoint_destroy;     return &wide->stage; + + fail: +   if (wide) +      wide->stage.destroy( &wide->stage ); +    +   return NULL;  } diff --git a/src/gallium/auxiliary/draw/draw_prim.c b/src/gallium/auxiliary/draw/draw_prim.c deleted file mode 100644 index 51b6950334..0000000000 --- a/src/gallium/auxiliary/draw/draw_prim.c +++ /dev/null @@ -1,523 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: -  *   Keith Whitwell <keith@tungstengraphics.com> -  */ - -#include "pipe/p_debug.h" -#include "pipe/p_util.h" - -#include "draw_private.h" -#include "draw_context.h" - - - -#define RP_NONE  0 -#define RP_POINT 1 -#define RP_LINE  2 -#define RP_TRI   3 - - -static unsigned reduced_prim[PIPE_PRIM_POLYGON + 1] = { -   RP_POINT, -   RP_LINE, -   RP_LINE, -   RP_LINE, -   RP_TRI, -   RP_TRI, -   RP_TRI, -   RP_TRI, -   RP_TRI, -   RP_TRI -}; - - -static void draw_prim_queue_flush( struct draw_context *draw ) -{ -   unsigned i; - -   if (0) -      debug_printf("Flushing with %d prims, %d verts\n", -                   draw->pq.queue_nr, draw->vs.queue_nr); - -   assert (draw->pq.queue_nr != 0); - -   /* NOTE: we cannot save draw->pipeline->first in a local var because -    * draw->pipeline->first is often changed by the first call to tri(), -    * line(), etc. -    */ -   if (draw->rasterizer->line_stipple_enable) { -      switch (draw->reduced_prim) { -      case RP_TRI: -	 for (i = 0; i < draw->pq.queue_nr; i++) { -	    if (draw->pq.queue[i].reset_line_stipple) -	       draw->pipeline.first->reset_stipple_counter( draw->pipeline.first ); -	     -	    draw->pipeline.first->tri( draw->pipeline.first, &draw->pq.queue[i] ); -	 } -	 break; -      case RP_LINE: -	 for (i = 0; i < draw->pq.queue_nr; i++) { -	    if (draw->pq.queue[i].reset_line_stipple) -	       draw->pipeline.first->reset_stipple_counter( draw->pipeline.first ); -	     -	    draw->pipeline.first->line( draw->pipeline.first, &draw->pq.queue[i] ); -	 } -	 break; -      case RP_POINT: -	 draw->pipeline.first->reset_stipple_counter( draw->pipeline.first ); -	 for (i = 0; i < draw->pq.queue_nr; i++) -	    draw->pipeline.first->point( draw->pipeline.first, &draw->pq.queue[i] ); -	 break; -      } -   } -   else { -      switch (draw->reduced_prim) { -      case RP_TRI: -	 for (i = 0; i < draw->pq.queue_nr; i++)  -	    draw->pipeline.first->tri( draw->pipeline.first, &draw->pq.queue[i] ); -	 break; -      case RP_LINE: -	 for (i = 0; i < draw->pq.queue_nr; i++)  -	    draw->pipeline.first->line( draw->pipeline.first, &draw->pq.queue[i] ); -	 break; -      case RP_POINT: -	 for (i = 0; i < draw->pq.queue_nr; i++) -	    draw->pipeline.first->point( draw->pipeline.first, &draw->pq.queue[i] ); -	 break; -      } -   } - -   draw->pq.queue_nr = 0;    -   draw->vs.post_nr = 0;    -   draw_vertex_cache_unreference( draw ); -} - -void draw_do_flush( struct draw_context *draw, unsigned flags ) -{ -   if (0) -      debug_printf("Flushing with %d verts, %d prims\n", -                   draw->vs.queue_nr, -                   draw->pq.queue_nr ); - -   if (draw->flushing) -      return; - -   draw->flushing = TRUE; - -   if (flags >= DRAW_FLUSH_SHADER_QUEUE) { -      if (draw->vs.queue_nr) { -         (*draw->shader_queue_flush)(draw); -      } - -      if (flags >= DRAW_FLUSH_PRIM_QUEUE) { -	 if (draw->pq.queue_nr) -	    draw_prim_queue_flush(draw); - -	 if (flags >= DRAW_FLUSH_VERTEX_CACHE) { -            draw_vertex_cache_invalidate(draw); - -	    if (flags >= DRAW_FLUSH_STATE_CHANGE) { -               draw->pipeline.first->flush( draw->pipeline.first, flags ); -               draw->pipeline.first = draw->pipeline.validate; -               draw->reduced_prim = ~0; -	    } -	 } -      }     -   } - -   draw->flushing = FALSE; -} - - - -/* Return a pointer to a freshly queued primitive header.  Ensure that - * there is room in the vertex cache for a maximum of "nr_verts" new - * vertices.  Flush primitive and/or vertex queues if necessary to - * make space. - */ -static struct prim_header *get_queued_prim( struct draw_context *draw, -					    unsigned nr_verts ) -{ -   if (!draw_vertex_cache_check_space( draw, nr_verts )) { -//      debug_printf("v"); -      draw_do_flush( draw, DRAW_FLUSH_VERTEX_CACHE ); -   } -   else if (draw->pq.queue_nr == PRIM_QUEUE_LENGTH) { -//      debug_printf("p"); -      draw_do_flush( draw, DRAW_FLUSH_PRIM_QUEUE ); -   } - -   assert(draw->pq.queue_nr < PRIM_QUEUE_LENGTH); - -   return &draw->pq.queue[draw->pq.queue_nr++]; -} - - - -/** - * Add a point to the primitive queue. - * \param i0  index into user's vertex arrays - */ -static void do_point( struct draw_context *draw, -		      unsigned i0 ) -{ -   struct prim_header *prim = get_queued_prim( draw, 1 ); -    -   prim->reset_line_stipple = 0; -   prim->edgeflags = 1; -   prim->pad = 0; -   prim->v[0] = draw->vcache.get_vertex( draw, i0 ); -} - - -/** - * Add a line to the primitive queue. - * \param i0  index into user's vertex arrays - * \param i1  index into user's vertex arrays - */ -static void do_line( struct draw_context *draw, -		     boolean reset_stipple, -		     unsigned i0, -		     unsigned i1 ) -{ -   struct prim_header *prim = get_queued_prim( draw, 2 ); -    -   prim->reset_line_stipple = reset_stipple; -   prim->edgeflags = 1; -   prim->pad = 0; -   prim->v[0] = draw->vcache.get_vertex( draw, i0 ); -   prim->v[1] = draw->vcache.get_vertex( draw, i1 ); -} - -/** - * Add a triangle to the primitive queue. - */ -static void do_triangle( struct draw_context *draw, -			 unsigned i0, -			 unsigned i1, -			 unsigned i2 ) -{ -   struct prim_header *prim = get_queued_prim( draw, 3 ); -    -//   _mesa_printf("tri %d %d %d\n", i0, i1, i2); -   prim->reset_line_stipple = 1; -   prim->edgeflags = ~0; -   prim->pad = 0; -   prim->v[0] = draw->vcache.get_vertex( draw, i0 ); -   prim->v[1] = draw->vcache.get_vertex( draw, i1 ); -   prim->v[2] = draw->vcache.get_vertex( draw, i2 ); -} -			   -static void do_ef_triangle( struct draw_context *draw, -			    boolean reset_stipple, -			    unsigned ef_mask, -			    unsigned i0, -			    unsigned i1, -			    unsigned i2 ) -{ -   struct prim_header *prim = get_queued_prim( draw, 3 ); -   struct vertex_header *v0 = draw->vcache.get_vertex( draw, i0 ); -   struct vertex_header *v1 = draw->vcache.get_vertex( draw, i1 ); -   struct vertex_header *v2 = draw->vcache.get_vertex( draw, i2 ); - -   prim->reset_line_stipple = reset_stipple; - -   prim->edgeflags = ef_mask & ((v0->edgeflag << 0) |  -				(v1->edgeflag << 1) |  -				(v2->edgeflag << 2)); -   prim->pad = 0; -   prim->v[0] = v0; -   prim->v[1] = v1; -   prim->v[2] = v2; -} - - -static void do_ef_quad( struct draw_context *draw, -		     unsigned v0, -		     unsigned v1, -		     unsigned v2, -		     unsigned v3 ) -{ -   const unsigned omitEdge2 = ~(1 << 1); -   const unsigned omitEdge3 = ~(1 << 2); -   do_ef_triangle( draw, 1, omitEdge2, v0, v1, v3 ); -   do_ef_triangle( draw, 0, omitEdge3, v1, v2, v3 ); -} - -static void do_quad( struct draw_context *draw, -		     unsigned v0, -		     unsigned v1, -		     unsigned v2, -		     unsigned v3 ) -{ -   do_triangle( draw, v0, v1, v3 ); -   do_triangle( draw, v1, v2, v3 ); -} - - -/** - * Main entrypoint to draw some number of points/lines/triangles - */ -static void -draw_prim( struct draw_context *draw,  -	   unsigned prim, unsigned start, unsigned count ) -{ -   unsigned i; -   boolean unfilled = (draw->rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL || -		       draw->rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL); -   boolean flatfirst = -      (draw->rasterizer->flatshade & draw->rasterizer->flatshade_first) ? TRUE : FALSE; - -//   debug_printf("%s (%d) %d/%d\n", __FUNCTION__, draw->prim, start, count ); - -   switch (prim) { -   case PIPE_PRIM_POINTS: -      for (i = 0; i < count; i ++) { -	 do_point( draw, -		   start + i ); -      } -      break; - -   case PIPE_PRIM_LINES: -      for (i = 0; i+1 < count; i += 2) { -         do_line( draw,  -                  TRUE, -                  start + i + 0, -                  start + i + 1); -      } -      break; - -   case PIPE_PRIM_LINE_LOOP:   -      if (count >= 2) { -	 for (i = 1; i < count; i++) { -	    do_line( draw,  -		     i == 1, 	/* XXX: only if vb not split */ -		     start + i - 1, -		     start + i ); -	 } - -	 do_line( draw,  -		  0, -		  start + count - 1, -		  start + 0 ); -      } -      break; - -   case PIPE_PRIM_LINE_STRIP: -      for (i = 1; i < count; i++) { -         do_line( draw, -                  i == 1, -                  start + i - 1, -                  start + i ); -      } -      break; - -   case PIPE_PRIM_TRIANGLES: -      if (unfilled) { -         for (i = 0; i+2 < count; i += 3) { -            do_ef_triangle( draw, -                            1,  -                            ~0, -                            start + i + 0, -                            start + i + 1, -                            start + i + 2 ); -         } -      }  -      else { -         for (i = 0; i+2 < count; i += 3) { -            do_triangle( draw, -                         start + i + 0, -                         start + i + 1, -                         start + i + 2 ); -         } -      } -      break; - -   case PIPE_PRIM_TRIANGLE_STRIP: -      if (flatfirst) { -         for (i = 0; i+2 < count; i++) { -            if (i & 1) { -               do_triangle( draw, -                  start + i + 0, -                  start + i + 2, -                  start + i + 1 ); -            } -            else { -               do_triangle( draw, -                  start + i + 0, -                  start + i + 1, -                  start + i + 2 ); -            } -         } -      } -      else { -         for (i = 0; i+2 < count; i++) { -            if (i & 1) { -               do_triangle( draw, -                  start + i + 1, -                  start + i + 0, -                  start + i + 2 ); -            } -            else { -               do_triangle( draw, -                  start + i + 0, -                  start + i + 1, -                  start + i + 2 ); -            } -         } -      } -      break; - -   case PIPE_PRIM_TRIANGLE_FAN: -      if (count >= 3) { -         if (flatfirst) { -            for (i = 0; i+2 < count; i++) { -               do_triangle( draw, -                  start + i + 1, -                  start + i + 2, -                  start + 0 ); -            } -         } -         else { -            for (i = 0; i+2 < count; i++) { -               do_triangle( draw, -                  start + 0, -                  start + i + 1, -                  start + i + 2 ); -            } -         } -      } -      break; - - -   case PIPE_PRIM_QUADS: -      if (unfilled) { -	 for (i = 0; i+3 < count; i += 4) { -	    do_ef_quad( draw, -			start + i + 0, -			start + i + 1, -			start + i + 2, -			start + i + 3); -	 } -      } -      else { -	 for (i = 0; i+3 < count; i += 4) { -	    do_quad( draw, -		     start + i + 0, -		     start + i + 1, -		     start + i + 2, -		     start + i + 3); -	 } -      } -      break; - -   case PIPE_PRIM_QUAD_STRIP: -      if (unfilled) { -	 for (i = 0; i+3 < count; i += 2) { -	    do_ef_quad( draw, -			start + i + 2, -			start + i + 0, -			start + i + 1, -			start + i + 3); -	 } -      } -      else { -	 for (i = 0; i+3 < count; i += 2) { -	    do_quad( draw, -		     start + i + 2, -		     start + i + 0, -		     start + i + 1, -		     start + i + 3); -	 } -      } -      break; - -   case PIPE_PRIM_POLYGON: -      if (unfilled) { -	 unsigned ef_mask = (1<<2) | (1<<0); - -	 for (i = 0; i+2 < count; i++) { - -            if (i + 3 >= count) -	       ef_mask |= (1<<1); - -	    do_ef_triangle( draw, -			    i == 0, -			    ef_mask, -			    start + i + 1, -			    start + i + 2, -			    start + 0); - -	    ef_mask &= ~(1<<2); -	 } -      } -      else { -	 for (i = 0; i+2 < count; i++) { -	    do_triangle( draw, -			 start + i + 1, -			 start + i + 2, -			 start + 0); -	 } -      } -      break; - -   default: -      assert(0); -      break; -   } -} - - - - -/** - * Draw vertex arrays - * This is the main entrypoint into the drawing module. - * \param prim  one of PIPE_PRIM_x - * \param start  index of first vertex to draw - * \param count  number of vertices to draw - */ -void -draw_arrays(struct draw_context *draw, unsigned prim, -            unsigned start, unsigned count) -{ -   if (reduced_prim[prim] != draw->reduced_prim) { -      draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); -      draw->reduced_prim = reduced_prim[prim]; -   } - -   /* drawing done here: */ -   if (!draw_pt_arrays(draw, prim, start, count)) { -      /* we have to run the whole pipeline */ -      draw_prim(draw, prim, start, count); -   } -} - - diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index 4d056f6dba..cee58bbf73 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -44,7 +44,6 @@  #include "pipe/p_state.h"  #include "pipe/p_defines.h" -#include "rtasm/rtasm_x86sse.h"  #include "tgsi/exec/tgsi_exec.h"  #include "tgsi/util/tgsi_scan.h" @@ -52,9 +51,11 @@  struct pipe_context;  struct gallivm_prog;  struct gallivm_cpu_engine; +struct draw_vertex_shader; +struct draw_context; +struct draw_stage; +struct vbuf_render; -struct draw_pt_middle_end; -struct draw_pt_front_end;  /**   * Basic vertex info. @@ -68,115 +69,14 @@ struct vertex_header {     float clip[4]; -   float data[][4];		/* Note variable size */ +   /* This will probably become float (*data)[4] soon: +    */ +   float data[][4];  };  /* NOTE: It should match vertex_id size above */  #define UNDEFINED_VERTEX_ID 0xffff -/* XXX This is too large */ -#define MAX_VERTEX_SIZE ((2 + PIPE_MAX_SHADER_OUTPUTS) * 4 * sizeof(float)) - - - -/** - * Basic info for a point/line/triangle primitive. - */ -struct prim_header { -   float det;                 /**< front/back face determinant */ -   unsigned reset_line_stipple:1; -   unsigned edgeflags:3; -   unsigned pad:28; -   struct vertex_header *v[3];  /**< 1 to 3 vertex pointers */ -}; - - - -struct draw_context; - -/** - * Base class for all primitive drawing stages. - */ -struct draw_stage -{ -   struct draw_context *draw;   /**< parent context */ - -   struct draw_stage *next;     /**< next stage in pipeline */ - -   struct vertex_header **tmp;  /**< temp vert storage, such as for clipping */ -   unsigned nr_tmps; - -   void (*point)( struct draw_stage *, -		  struct prim_header * ); - -   void (*line)( struct draw_stage *, -		 struct prim_header * ); - -   void (*tri)( struct draw_stage *, -		struct prim_header * ); - -   void (*flush)( struct draw_stage *, -		  unsigned flags ); - -   void (*reset_stipple_counter)( struct draw_stage * ); - -   void (*destroy)( struct draw_stage * ); -}; - - -#define PRIM_QUEUE_LENGTH      32 -#define VCACHE_SIZE            32 -#define VCACHE_OVERFLOW        4 -#define VS_QUEUE_LENGTH        (VCACHE_SIZE + VCACHE_OVERFLOW + 1)	/* can never fill up */ - -/** - * Private version of the compiled vertex_shader - */ -struct draw_vertex_shader { - -   /* This member will disappear shortly: -    */ -   struct pipe_shader_state   state; - -   struct tgsi_shader_info info; - -   void (*prepare)( struct draw_vertex_shader *shader, -		    struct draw_context *draw ); - -   /* Run the shader - this interface will get cleaned up in the -    * future: -    */ -   void (*run)( struct draw_vertex_shader *shader, -		struct draw_context *draw, -		const unsigned *elts,  -		unsigned count, -		struct vertex_header *vOut[] ); -		     - -   void (*delete)( struct draw_vertex_shader * ); -}; - - -/* Internal function for vertex fetch. - */ -typedef void (*fetch_func)(const void *ptr, float *attrib); - -fetch_func draw_get_fetch_func( enum pipe_format format ); - - - -typedef void (*full_fetch_func)( struct draw_context *draw, -				 struct tgsi_exec_machine *machine, -				 const unsigned *elts, -				 unsigned count ); - -typedef void (*pt_fetch_func)( struct draw_context *draw, -			      float *out, -			      unsigned start, -			       unsigned count ); - - -struct vbuf_render;  /**   * Private context for the drawing module. @@ -203,6 +103,17 @@ struct draw_context        struct draw_stage *wide_line;        struct draw_stage *wide_point;        struct draw_stage *rasterize; + +      float wide_point_threshold; /**< convert pnts to tris if larger than this */ +      float wide_line_threshold;  /**< convert lines to tris if wider than this */ +      boolean line_stipple;       /**< do line stipple? */ +      boolean point_sprite;       /**< convert points to quads for sprites? */ + +      /* Temporary storage while the pipeline is being run: +       */ +      char *verts; +      unsigned vertex_stride; +      unsigned vertex_count;     } pipeline; @@ -211,70 +122,64 @@ struct draw_context     /* Support prototype passthrough path:      */     struct { -      unsigned prim;           /* XXX: to be removed */ -      unsigned hw_vertex_size; /* XXX: to be removed */ -        struct {           struct draw_pt_middle_end *fetch_emit; -         struct draw_pt_middle_end *fetch_pipeline; -         struct draw_pt_middle_end *fetch_shade_emit; -         struct draw_pt_middle_end *fetch_shade_cliptest_pipeline_or_emit; +         struct draw_pt_middle_end *general;        } middle;        struct { -         struct draw_pt_front_end *noop; -         struct draw_pt_front_end *split_arrays;           struct draw_pt_front_end *vcache; +         struct draw_pt_front_end *varray;        } front; +      struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; +      unsigned nr_vertex_buffers; + +      struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS]; +      unsigned nr_vertex_elements; + +      /* user-space vertex data, buffers */        struct { -         char *verts; -         unsigned vertex_stride; -         unsigned vertex_count; -      } pipeline; +         const unsigned *edgeflag; + +         /** vertex element/index buffer (ex: glDrawElements) */ +         const void *elts; +         /** bytes per index (0, 1, 2 or 4) */ +         unsigned eltSize; +          +         /** vertex arrays */ +         const void *vbuffer[PIPE_MAX_ATTRIBS]; +          +         /** constant buffer (for vertex shader) */ +         const void *constants; +      } user;     } pt; -   boolean flushing; +   struct { +      boolean bypass_clipping; +   } driver; + +   boolean flushing;         /**< debugging/sanity */ +   boolean suspend_flushing; /**< internally set */ +   boolean bypass_clipping;  /**< set if either api or driver bypass_clipping true */     /* pipe state that we need: */     const struct pipe_rasterizer_state *rasterizer;     struct pipe_viewport_state viewport; -   struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; -   struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS]; +     struct draw_vertex_shader *vertex_shader;     boolean identity_viewport;     uint num_vs_outputs;  /**< convenience, from vertex_shader */ -   /* user-space vertex data, buffers */ -   struct { -      const unsigned *edgeflag; - -      /** vertex element/index buffer (ex: glDrawElements) */ -      const void *elts; -      /** bytes per index (0, 1, 2 or 4) */ -      unsigned eltSize; - -      /** vertex arrays */ -      const void *vbuffer[PIPE_MAX_ATTRIBS]; - -      /** constant buffer (for vertex shader) */ -      const void *constants; -   } user;     /* Clip derived state:      */     float plane[12][4];     unsigned nr_planes; -   float wide_point_threshold; /**< convert pnts to tris if larger than this */ -   float wide_line_threshold;  /**< convert lines to tris if wider than this */ -   boolean line_stipple;       /**< do line stipple? */ -   boolean point_sprite;       /**< convert points to quads for sprites? */ -   boolean use_sse; -     /* If a prim stage introduces new vertex attributes, they'll be stored here      */     struct { @@ -288,61 +193,6 @@ struct draw_context     /** TGSI program interpreter runtime state */     struct tgsi_exec_machine machine; -   /* Vertex fetch internal state -    */ -   struct { -      const ubyte *src_ptr[PIPE_MAX_ATTRIBS]; -      unsigned pitch[PIPE_MAX_ATTRIBS]; -      fetch_func fetch[PIPE_MAX_ATTRIBS]; -      unsigned nr_attrs; -      full_fetch_func fetch_func; -      pt_fetch_func pt_fetch; -   } vertex_fetch; - -   /* Post-tnl vertex cache: -    */ -   struct { -      unsigned referenced;  /**< bitfield */ - -      struct { -	 unsigned in;		/* client array element */ -	 unsigned out;		/* index in vs queue/array */ -      } idx[VCACHE_SIZE + VCACHE_OVERFLOW]; - -      unsigned overflow; - -      /** To find space in the vertex cache: */ -      struct vertex_header *(*get_vertex)( struct draw_context *draw, -                                           unsigned i ); -   } vcache; - -   /* Vertex shader queue: -    */ -   struct { -      struct { -	 unsigned elt;   /**< index into the user's vertex arrays */ -	 struct vertex_header *vertex; -      } queue[VS_QUEUE_LENGTH]; -      unsigned queue_nr; -      unsigned post_nr; -   } vs; - -   /** -    * Run the vertex shader on all vertices in the vertex queue. -    */ -   void (*shader_queue_flush)(struct draw_context *draw); - -   /* Prim pipeline queue: -    */ -   struct { -      /* Need to queue up primitives until their vertices have been -       * transformed by a vs queue flush. -       */ -      struct prim_header queue[PRIM_QUEUE_LENGTH]; -      unsigned queue_nr; -   } pq; - -     /* This (and the tgsi_exec_machine struct) probably need to be moved somewhere private.      */     struct gallivm_cpu_engine *engine;    @@ -351,101 +201,70 @@ struct draw_context -extern struct draw_stage *draw_unfilled_stage( struct draw_context *context ); -extern struct draw_stage *draw_twoside_stage( struct draw_context *context ); -extern struct draw_stage *draw_offset_stage( struct draw_context *context ); -extern struct draw_stage *draw_clip_stage( struct draw_context *context ); -extern struct draw_stage *draw_flatshade_stage( struct draw_context *context ); -extern struct draw_stage *draw_cull_stage( struct draw_context *context ); -extern struct draw_stage *draw_stipple_stage( struct draw_context *context ); -extern struct draw_stage *draw_wide_line_stage( struct draw_context *context ); -extern struct draw_stage *draw_wide_point_stage( struct draw_context *context ); -extern struct draw_stage *draw_validate_stage( struct draw_context *context ); -extern void draw_free_temp_verts( struct draw_stage *stage ); -extern void draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr ); -extern void draw_reset_vertex_ids( struct draw_context *draw ); +/******************************************************************************* + * Vertex processing (was passthrough) code: + */ +boolean draw_pt_init( struct draw_context *draw ); +void draw_pt_destroy( struct draw_context *draw ); +void draw_pt_reset_vertex_ids( struct draw_context *draw ); -extern int draw_vertex_cache_check_space( struct draw_context *draw,  -					  unsigned nr_verts ); +/******************************************************************************* + * Primitive processing (pipeline) code:  + */ -extern void draw_vertex_cache_invalidate( struct draw_context *draw ); -extern void draw_vertex_cache_unreference( struct draw_context *draw ); -extern void draw_vertex_cache_reset_vertex_ids( struct draw_context *draw ); +boolean draw_pipeline_init( struct draw_context *draw ); +void draw_pipeline_destroy( struct draw_context *draw ); -extern void draw_vertex_shader_queue_flush( struct draw_context *draw ); -extern void draw_update_vertex_fetch( struct draw_context *draw ); -extern boolean draw_need_pipeline(const struct draw_context *draw, -                                  unsigned prim ); -/* Passthrough mode (second attempt): +/* We use the top few bits in the elts[] parameter to convey a little + * API information.  This limits the number of vertices we can address + * to only 4096 -- if that becomes a problem, we can switch to 32-bit + * draw indices. + * + * These flags expected at first vertex of lines & triangles when + * unfilled and/or line stipple modes are operational.   */ -boolean draw_pt_init( struct draw_context *draw ); -void draw_pt_destroy( struct draw_context *draw ); -boolean draw_pt_arrays( struct draw_context *draw, +#define DRAW_PIPE_EDGE_FLAG_0   (0x1<<12) +#define DRAW_PIPE_EDGE_FLAG_1   (0x2<<12) +#define DRAW_PIPE_EDGE_FLAG_2   (0x4<<12) +#define DRAW_PIPE_EDGE_FLAG_ALL (0x7<<12) +#define DRAW_PIPE_RESET_STIPPLE (0x8<<12) +#define DRAW_PIPE_FLAG_MASK     (0xf<<12) + +void draw_pipeline_run( struct draw_context *draw,                          unsigned prim, -                        unsigned start, +                        struct vertex_header *vertices, +                        unsigned vertex_count, +                        unsigned stride, +                        const ushort *elts,                          unsigned count ); -void draw_pt_reset_vertex_ids( struct draw_context *draw ); -void draw_pt_run_pipeline( struct draw_context *draw, -                           unsigned prim, -                           char *verts, -                           unsigned vertex_stride, -                           unsigned vertex_count, -                           const ushort *elts, -                           unsigned count ); -#define DRAW_FLUSH_SHADER_QUEUE              0x1 /* sized not to overflow, never raised */ -#define DRAW_FLUSH_PRIM_QUEUE                0x2 -#define DRAW_FLUSH_VERTEX_CACHE              0x4 +void draw_pipeline_flush( struct draw_context *draw,  +                          unsigned flags ); + + + +/******************************************************************************* + * Flushing  + */ +  #define DRAW_FLUSH_STATE_CHANGE              0x8  #define DRAW_FLUSH_BACKEND                   0x10  void draw_do_flush( struct draw_context *draw, unsigned flags ); -boolean draw_get_edgeflag( struct draw_context *draw, -                           unsigned idx ); - - -/** - * Get a writeable copy of a vertex. - * \param stage  drawing stage info - * \param vert  the vertex to copy (source) - * \param idx  index into stage's tmp[] array to put the copy (dest) - * \return  pointer to the copied vertex - */ -static INLINE struct vertex_header * -dup_vert( struct draw_stage *stage, -	  const struct vertex_header *vert, -	  unsigned idx ) -{    -   struct vertex_header *tmp = stage->tmp[idx]; -   const uint vsize = sizeof(struct vertex_header) -      + stage->draw->num_vs_outputs * 4 * sizeof(float); -   memcpy(tmp, vert, vsize); -   tmp->vertex_id = UNDEFINED_VERTEX_ID; -   return tmp; -} -static INLINE float -dot4(const float *a, const float *b) -{ -   float result = (a[0]*b[0] + -                   a[1]*b[1] + -                   a[2]*b[2] + -                   a[3]*b[3]); -   return result; -}  #endif /* DRAW_PRIVATE_H */ diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c index f59fb86f78..c9c5d18313 100644 --- a/src/gallium/auxiliary/draw/draw_pt.c +++ b/src/gallium/auxiliary/draw/draw_pt.c @@ -36,153 +36,63 @@  #include "draw/draw_pt.h" -/* XXX: Shouldn't those two functions below use the '>' operator??? - */ - -static boolean too_many_verts( struct draw_context *draw, -                               unsigned verts ) -{ -   return verts < 1024; -} -static boolean too_many_elts( struct draw_context *draw, -                              unsigned elts ) -{ -   return elts < (16 * 1024); -} - -boolean +/* Overall we split things into: + *     - frontend -- prepare fetch_elts, draw_elts - eg vcache + *     - middle   -- fetch, shade, cliptest, viewport + *     - pipeline -- the prim pipeline: clipping, wide lines, etc  + *     - backend  -- the vbuf_render provided by the driver. + */ +static boolean  draw_pt_arrays(struct draw_context *draw,                  unsigned prim,                 unsigned start,                  unsigned count)  { -   const boolean pipeline = draw_need_pipeline(draw, prim); -   const boolean cliptest = !draw->rasterizer->bypass_clipping; -   const boolean shading  = !draw->rasterizer->bypass_vs;     struct draw_pt_front_end *frontend = NULL;     struct draw_pt_middle_end *middle = NULL; +   unsigned opt = 0; - -   /* Overall we do: -    *     - frontend -- prepare fetch_elts, draw_elts - eg vcache -    *     - middle   -- fetch, shade, cliptest, viewport -    *     - pipeline -- the prim pipeline: clipping, wide lines, etc  -    *     - backend  -- the vbuf_render provided by the driver. -    */ - - -   if (!cliptest && !pipeline && !shading) { -      /* This is the 'passthrough' path: -       */ -      /* Fetch user verts, emit hw verts: -       */ -      middle = draw->pt.middle.fetch_emit; -   } -   else if (!cliptest && !shading) { -      /* This is the 'passthrough' path targetting the pipeline backend. -       */ -      /* Fetch user verts, emit pipeline verts, run pipeline: -       */ -      middle = draw->pt.middle.fetch_pipeline; -   } -#if 0 -   else if (!cliptest && !pipeline) { -      /* Fetch user verts, run vertex shader, emit hw verts: -       */ -      middle = draw->pt.middle.fetch_shade_emit; +   if (!draw->render) { +      opt |= PT_PIPELINE;     } -   else if (!pipeline) { -      /* Even though !pipeline, we have to run it to get clipping.  We -       * do know that the pipeline is just the clipping operation, but -       * that probably doesn't help much. -       * -       * This is going to be the most important path for a lot of -       * swtnl cards. -       */ -      /* Fetch user verts,  -       *    run vertex shader,  -       *    cliptest and viewport trasform -       *    if no clipped vertices, -       *        emit hw verts -       *    else -       *        run pipline -       */ -      middle = draw->pt.middle.fetch_shade_cliptest_pipeline_or_emit; -   } -   else if (!cliptest) { -      /* Fetch user verts, run vertex shader, run pipeline: -       */ -      middle = draw->pt.middle.fetch_shade_pipeline; -   } -   else { -      /* This is what we're currently always doing: -       */ -      /* Fetch user verts, run vertex shader, cliptest, run pipeline: -       */ -      middle = draw->pt.middle.fetch_shade_cliptest_pipeline; -   } -#else -   else { -      return FALSE; -   } -#endif - -   /* If !pipeline, need to make sure we respect the driver's limited -    * capabilites to receive blocks of vertex data and elements. -    */ -#if 0 -   if (!pipeline) { -      unsigned vertex_mode = passthrough; -      unsigned nr_verts = count_vertices( draw, start, count ); -      unsigned hw_prim = prim; +   if (draw_need_pipeline(draw, +                          draw->rasterizer, +                          prim)) { +      opt |= PT_PIPELINE; +   } -      if (is_elts(draw)) { -         frontend = draw->pt.front.vcache; -         hw_prim = reduced_prim(prim); -      } -       -      if (too_many_verts(nr_verts)) { -         /* if (is_verts(draw) && can_split(prim)) { -            draw = draw_arrays_split; -         } -         else */ { -            frontend = draw->pt.front.vcache; -            hw_prim = reduced_prim(prim); -         } -      } +   if (!draw->bypass_clipping) { +      opt |= PT_CLIPTEST; +   } -      if (too_many_elts(count)) { +   if (!draw->rasterizer->bypass_vs) { +      opt |= PT_SHADE; +   } -         /* if (is_elts(draw) && can_split(prim)) { -            draw = draw_elts_split; -         } -         else */ { -            frontend = draw->pt.front.vcache; -            hw_prim = reduced_prim(prim); -         } -      } +   if (opt) +      middle = draw->pt.middle.general; +   else +      middle = draw->pt.middle.fetch_emit; -      if (!good_prim(hw_prim)) { -         draw = draw->pt.front.vcache; -      } -   } -#else -   frontend = draw->pt.front.vcache; -#endif    -   /* XXX: need to flush to get prim_vbuf.c to release its allocation??  +   /* Pick the right frontend      */ -   draw_do_flush( draw, DRAW_FLUSH_BACKEND ); +   if (draw->pt.user.elts || +       count >= 256) { +      frontend = draw->pt.front.vcache; +   } else { +      frontend = draw->pt.front.varray; +   } -   frontend->prepare( frontend, prim, middle ); +   frontend->prepare( frontend, prim, middle, opt ); -   frontend->run( frontend, -                  draw_pt_elt_func( draw ), -                  draw_pt_elt_ptr( draw, start ), -                  count ); +   frontend->run(frontend,  +                 draw_pt_elt_func(draw), +                 draw_pt_elt_ptr(draw, start), +                 count);     frontend->finish( frontend ); @@ -192,16 +102,20 @@ draw_pt_arrays(struct draw_context *draw,  boolean draw_pt_init( struct draw_context *draw )  { -   draw->pt.middle.fetch_emit = draw_pt_fetch_emit( draw ); -   if (!draw->pt.middle.fetch_emit) +   draw->pt.front.vcache = draw_pt_vcache( draw ); +   if (!draw->pt.front.vcache)        return FALSE; -   draw->pt.middle.fetch_pipeline = draw_pt_fetch_pipeline( draw ); -   if (!draw->pt.middle.fetch_pipeline) +   draw->pt.front.varray = draw_pt_varray(draw); +   if (!draw->pt.front.varray)        return FALSE; -   draw->pt.front.vcache = draw_pt_vcache( draw ); -   if (!draw->pt.front.vcache) +   draw->pt.middle.fetch_emit = draw_pt_fetch_emit( draw ); +   if (!draw->pt.middle.fetch_emit) +      return FALSE; + +   draw->pt.middle.general = draw_pt_fetch_pipeline_or_emit( draw ); +   if (!draw->pt.middle.general)        return FALSE;     return TRUE; @@ -210,18 +124,68 @@ boolean draw_pt_init( struct draw_context *draw )  void draw_pt_destroy( struct draw_context *draw )  { +   if (draw->pt.middle.general) { +      draw->pt.middle.general->destroy( draw->pt.middle.general ); +      draw->pt.middle.general = NULL; +   } +     if (draw->pt.middle.fetch_emit) {        draw->pt.middle.fetch_emit->destroy( draw->pt.middle.fetch_emit );        draw->pt.middle.fetch_emit = NULL;     } -   if (draw->pt.middle.fetch_pipeline) { -      draw->pt.middle.fetch_pipeline->destroy( draw->pt.middle.fetch_pipeline ); -      draw->pt.middle.fetch_pipeline = NULL; -   } -     if (draw->pt.front.vcache) {        draw->pt.front.vcache->destroy( draw->pt.front.vcache );        draw->pt.front.vcache = NULL;     } + +   if (draw->pt.front.varray) { +      draw->pt.front.varray->destroy( draw->pt.front.varray ); +      draw->pt.front.varray = NULL; +   } +} + + + +static unsigned reduced_prim[PIPE_PRIM_POLYGON + 1] = { +   PIPE_PRIM_POINTS, +   PIPE_PRIM_LINES, +   PIPE_PRIM_LINES, +   PIPE_PRIM_LINES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES +}; + + +/** + * Draw vertex arrays + * This is the main entrypoint into the drawing module. + * \param prim  one of PIPE_PRIM_x + * \param start  index of first vertex to draw + * \param count  number of vertices to draw + */ +void +draw_arrays(struct draw_context *draw, unsigned prim, +            unsigned start, unsigned count) +{ +   if (reduced_prim[prim] != draw->reduced_prim) { +      draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); +      draw->reduced_prim = reduced_prim[prim]; +   } + +   /* drawing done here: */ +   draw_pt_arrays(draw, prim, start, count); +} + +boolean draw_pt_get_edgeflag( struct draw_context *draw, +                              unsigned idx ) +{ +   if (draw->pt.user.edgeflag) +      return (draw->pt.user.edgeflag[idx/32] & (1 << (idx%32))) != 0; +   else +      return 1;  } diff --git a/src/gallium/auxiliary/draw/draw_pt.h b/src/gallium/auxiliary/draw/draw_pt.h index 590823fd33..2dec376cee 100644 --- a/src/gallium/auxiliary/draw/draw_pt.h +++ b/src/gallium/auxiliary/draw/draw_pt.h @@ -40,14 +40,11 @@ typedef unsigned (*pt_elt_func)( const void *elts, unsigned idx );  struct draw_pt_middle_end;  struct draw_context; -/* We use the top couple of bits in the vertex fetch index to convey a - * little API information.  This limits the number of vertices we can - * address to only 1 billion -- if that becomes a problem, these could - * be moved out & passed separately. - */ -#define DRAW_PT_EDGEFLAG      (1<<30) -#define DRAW_PT_RESET_STIPPLE (1<<31) -#define DRAW_PT_FLAG_MASK     (3<<30) + +#define PT_SHADE      0x1 +#define PT_CLIPTEST   0x2 +#define PT_PIPELINE   0x4 +#define PT_MAX_MIDDLE 0x8  /* The "front end" - prepare sets of fetch, draw elements for the @@ -64,7 +61,8 @@ struct draw_context;  struct draw_pt_front_end {     void (*prepare)( struct draw_pt_front_end *,                      unsigned prim, -                    struct draw_pt_middle_end * ); +                    struct draw_pt_middle_end *, +		    unsigned opt );     void (*run)( struct draw_pt_front_end *,                  pt_elt_func elt_func, @@ -82,15 +80,11 @@ struct draw_pt_front_end {   * Currently two versions of this:   *     - fetch, vertex shade, cliptest, prim-pipeline   *     - fetch, emit (ie passthrough) - * Later: - *     - fetch, vertex shade, cliptest, maybe-pipeline, maybe-emit - *     - fetch, vertex shade, emit - * - * Currenly only using the passthrough version.   */  struct draw_pt_middle_end {     void (*prepare)( struct draw_pt_middle_end *, -                    unsigned prim ); +                    unsigned prim, +		    unsigned opt );     void (*run)( struct draw_pt_middle_end *,                  const unsigned *fetch_elts, @@ -104,12 +98,9 @@ struct draw_pt_middle_end {  /* The "back end" - supplied by the driver, defined in draw_vbuf.h. - * - * Not sure whether to wrap the prim pipeline up as an alternate - * backend.  Would be a win for everything except pure passthrough - * mode...     */  struct vbuf_render; +struct vertex_header;  /* Helper functions. @@ -118,12 +109,89 @@ pt_elt_func draw_pt_elt_func( struct draw_context *draw );  const void *draw_pt_elt_ptr( struct draw_context *draw,                               unsigned start ); -/* Implementations: +/* Frontends:  + * + * Currently only the general-purpose vcache implementation, could add + * a special case for tiny vertex buffers.   */  struct draw_pt_front_end *draw_pt_vcache( struct draw_context *draw ); +struct draw_pt_front_end *draw_pt_varray(struct draw_context *draw); + +/* Middle-ends: + * + * Currently one general-purpose case which can do all possibilities, + * at the slight expense of creating a vertex_header in some cases + * unecessarily. + * + * The special case fetch_emit code avoids pipeline vertices + * altogether and builds hardware vertices directly from API + * vertex_elements. + */  struct draw_pt_middle_end *draw_pt_fetch_emit( struct draw_context *draw ); -struct draw_pt_middle_end *draw_pt_fetch_pipeline( struct draw_context *draw ); +struct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit(struct draw_context *draw); + + +/* More helpers: + */ +boolean draw_pt_get_edgeflag( struct draw_context *draw, +                              unsigned idx ); + + +/******************************************************************************* + * HW vertex emit: + */ +struct pt_emit; + +void draw_pt_emit_prepare( struct pt_emit *emit, +			   unsigned prim ); + +void draw_pt_emit( struct pt_emit *emit, +		   const float (*vertex_data)[4], +		   unsigned vertex_count, +		   unsigned stride, +		   const ushort *elts, +		   unsigned count ); + +void draw_pt_emit_destroy( struct pt_emit *emit ); + +struct pt_emit *draw_pt_emit_create( struct draw_context *draw ); + + +/******************************************************************************* + * API vertex fetch: + */ + +struct pt_fetch; +void draw_pt_fetch_prepare( struct pt_fetch *fetch, +			    unsigned vertex_size ); + +void draw_pt_fetch_run( struct pt_fetch *fetch, +			const unsigned *elts, +			unsigned count, +			char *verts ); + +void draw_pt_fetch_destroy( struct pt_fetch *fetch ); + +struct pt_fetch *draw_pt_fetch_create( struct draw_context *draw ); + +/******************************************************************************* + * Post-VS: cliptest, rhw, viewport + */ +struct pt_post_vs; + +boolean draw_pt_post_vs_run( struct pt_post_vs *pvs, +			     struct vertex_header *pipeline_verts, +			     unsigned stride, +			     unsigned count ); + +void draw_pt_post_vs_prepare( struct pt_post_vs *pvs, +			      boolean bypass_clipping, +			      boolean identity_viewport, +			      boolean opengl ); + +struct pt_post_vs *draw_pt_post_vs_create( struct draw_context *draw ); +void draw_pt_post_vs_destroy( struct pt_post_vs *pvs );  #endif diff --git a/src/gallium/auxiliary/draw/draw_pt_elts.c b/src/gallium/auxiliary/draw/draw_pt_elts.c index d49770e7b2..2094c081ed 100644 --- a/src/gallium/auxiliary/draw/draw_pt_elts.c +++ b/src/gallium/auxiliary/draw/draw_pt_elts.c @@ -59,7 +59,7 @@ static unsigned elt_vert( const void *elts, unsigned idx )  pt_elt_func draw_pt_elt_func( struct draw_context *draw )  { -   switch (draw->user.eltSize) { +   switch (draw->pt.user.eltSize) {     case 0: return elt_vert;     case 1: return elt_ubyte;     case 2: return elt_ushort;  @@ -71,9 +71,9 @@ pt_elt_func draw_pt_elt_func( struct draw_context *draw )  const void *draw_pt_elt_ptr( struct draw_context *draw,                               unsigned start )  { -   const char *elts = draw->user.elts; +   const char *elts = draw->pt.user.elts; -   switch (draw->user.eltSize) { +   switch (draw->pt.user.eltSize) {     case 0:         return (const void *)(((const ubyte *)NULL) + start);     case 1:  diff --git a/src/gallium/auxiliary/draw/draw_pt_emit.c b/src/gallium/auxiliary/draw/draw_pt_emit.c new file mode 100644 index 0000000000..ce3a153f64 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pt_emit.c @@ -0,0 +1,203 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +#include "pipe/p_util.h" +#include "draw/draw_context.h" +#include "draw/draw_private.h" +#include "draw/draw_vbuf.h" +#include "draw/draw_vertex.h" +#include "draw/draw_pt.h" +#include "translate/translate.h" +#include "translate/translate_cache.h" + +struct pt_emit { +   struct draw_context *draw; + +   struct translate *translate; + +   struct translate_cache *cache; +}; + +void draw_pt_emit_prepare( struct pt_emit *emit, +			   unsigned prim ) +{ +   struct draw_context *draw = emit->draw; +   const struct vertex_info *vinfo; +   unsigned dst_offset; +   struct translate_key hw_key; +   unsigned i; +   boolean ok; + +   ok = draw->render->set_primitive(draw->render, prim); +   if (!ok) { +      assert(0); +      return; +   } + +   /* Must do this after set_primitive() above: +    */ +   vinfo = draw->render->get_vertex_info(draw->render); + + +   /* Translate from pipeline vertices to hw vertices. +    */ +   dst_offset = 0; +   for (i = 0; i < vinfo->num_attribs; i++) { +      unsigned emit_sz = 0; +      unsigned src_buffer = 0; +      unsigned output_format; +      unsigned src_offset = (vinfo->src_index[i] * 4 * sizeof(float) ); + + +          +      switch (vinfo->emit[i]) { +      case EMIT_4F: +	 output_format = PIPE_FORMAT_R32G32B32A32_FLOAT; +	 emit_sz = 4 * sizeof(float); +	 break; +      case EMIT_3F: +	 output_format = PIPE_FORMAT_R32G32B32_FLOAT; +	 emit_sz = 3 * sizeof(float); +	 break; +      case EMIT_2F: +	 output_format = PIPE_FORMAT_R32G32_FLOAT; +	 emit_sz = 2 * sizeof(float); +	 break; +      case EMIT_1F: +	 output_format = PIPE_FORMAT_R32_FLOAT; +	 emit_sz = 1 * sizeof(float); +	 break; +      case EMIT_1F_PSIZE: +	 output_format = PIPE_FORMAT_R32_FLOAT; +	 emit_sz = 1 * sizeof(float); +	 src_buffer = 1; +	 src_offset = 0; +	 break; +      case EMIT_4UB: +	 output_format = PIPE_FORMAT_B8G8R8A8_UNORM; +	 emit_sz = 4 * sizeof(ubyte); +      default: +	 assert(0); +	 output_format = PIPE_FORMAT_NONE; +	 emit_sz = 0; +	 break; +      } +       +      hw_key.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT; +      hw_key.element[i].input_buffer = src_buffer; +      hw_key.element[i].input_offset = src_offset; +      hw_key.element[i].output_format = output_format; +      hw_key.element[i].output_offset = dst_offset; + +      dst_offset += emit_sz; +   } + +   hw_key.nr_elements = vinfo->num_attribs; +   hw_key.output_stride = vinfo->size * 4; + +   if (!emit->translate || +       translate_key_compare(&emit->translate->key, &hw_key) != 0) +   { +      translate_key_sanitize(&hw_key); +      emit->translate = translate_cache_find(emit->cache, &hw_key); +   } +} + + +void draw_pt_emit( struct pt_emit *emit, +		   const float (*vertex_data)[4], +		   unsigned vertex_count, +		   unsigned stride, +		   const ushort *elts, +		   unsigned count ) +{ +   struct draw_context *draw = emit->draw; +   struct translate *translate = emit->translate; +   struct vbuf_render *render = draw->render; +   void *hw_verts; + +   /* XXX: need to flush to get prim_vbuf.c to release its allocation??  +    */ +   draw_do_flush( draw, DRAW_FLUSH_BACKEND ); + +   hw_verts = render->allocate_vertices(render, +					(ushort)translate->key.output_stride, +					(ushort)vertex_count); +   if (!hw_verts) { +      assert(0); +      return; +   } + +   translate->set_buffer(translate,  +			 0,  +			 vertex_data, +			 stride ); + +   translate->set_buffer(translate,  +			 1,  +			 &draw->rasterizer->point_size, +			 0); + +   translate->run( translate, +		   0,  +		   vertex_count, +		   hw_verts ); + +   render->draw(render, +		elts, +		count); + +   render->release_vertices(render, +			    hw_verts, +			    translate->key.output_stride, +			    vertex_count); +} + + +struct pt_emit *draw_pt_emit_create( struct draw_context *draw ) +{ +   struct pt_emit *emit = CALLOC_STRUCT(pt_emit); +   if (!emit) +      return NULL; + +   emit->draw = draw; +   emit->cache = translate_cache_create(); +   if (!emit->cache) { +      FREE(emit); +      return NULL; +   } + +   return emit; +} + +void draw_pt_emit_destroy( struct pt_emit *emit ) +{ +   if (emit->cache) +      translate_cache_destroy(emit->cache); + +   FREE(emit); +} diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c b/src/gallium/auxiliary/draw/draw_pt_fetch.c new file mode 100644 index 0000000000..100117a9ae --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c @@ -0,0 +1,191 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +#include "pipe/p_util.h" +#include "draw/draw_context.h" +#include "draw/draw_private.h" +#include "draw/draw_vbuf.h" +#include "draw/draw_vertex.h" +#include "draw/draw_pt.h" +#include "translate/translate.h" +#include "translate/translate_cache.h" + + +struct pt_fetch { +   struct draw_context *draw; + +   struct translate *translate; + +   unsigned vertex_size; +   boolean need_edgeflags; + +   struct translate_cache *cache; +}; + +/* Perform the fetch from API vertex elements & vertex buffers, to a + * contiguous set of float[4] attributes as required for the + * vertex_shader->run_linear() method. + * + * This is used in all cases except pure passthrough + * (draw_pt_fetch_emit.c) which has its own version to translate + * directly to hw vertices. + * + */ +void draw_pt_fetch_prepare( struct pt_fetch *fetch, +			    unsigned vertex_size ) +{ +   struct draw_context *draw = fetch->draw; +   unsigned i, nr = 0; +   unsigned dst_offset = 0; +   struct translate_key key; + +   fetch->vertex_size = vertex_size; + +   /* Always emit/leave space for a vertex header. +    * +    * It's worth considering whether the vertex headers should contain +    * a pointer to the 'data', rather than having it inline. +    * Something to look at after we've fully switched over to the pt +    * paths. +    */ +   { +      /* Need to set header->vertex_id = 0xffff somehow. +       */ +      key.element[nr].input_format = PIPE_FORMAT_R32_FLOAT; +      key.element[nr].input_buffer = draw->pt.nr_vertex_buffers; +      key.element[nr].input_offset = 0; +      key.element[nr].output_format = PIPE_FORMAT_R32_FLOAT; +      key.element[nr].output_offset = dst_offset; +      dst_offset += 1 * sizeof(float); +      nr++; + + +      /* Just leave the clip[] array untouched. +       */ +      dst_offset += 4 * sizeof(float); +   } +       + +   for (i = 0; i < draw->pt.nr_vertex_elements; i++) { +      key.element[nr].input_format = draw->pt.vertex_element[i].src_format; +      key.element[nr].input_buffer = draw->pt.vertex_element[i].vertex_buffer_index; +      key.element[nr].input_offset = draw->pt.vertex_element[i].src_offset; +      key.element[nr].output_format = PIPE_FORMAT_R32G32B32A32_FLOAT; +      key.element[nr].output_offset = dst_offset; + +      dst_offset += 4 * sizeof(float); +      nr++; +   } + +   assert(dst_offset <= vertex_size); + +   key.nr_elements = nr; +   key.output_stride = vertex_size; + + +   if (!fetch->translate || +       translate_key_compare(&fetch->translate->key, &key) != 0) +   { +      translate_key_sanitize(&key); +      fetch->translate = translate_cache_find(fetch->cache, &key); + +      { +	 static struct vertex_header vh = { 0, 1, 0, 0xffff }; +	 fetch->translate->set_buffer(fetch->translate, +				      draw->pt.nr_vertex_buffers, +				      &vh, +				      0); +      } +   } + +   fetch->need_edgeflags = ((draw->rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL || +                             draw->rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL) && +                            draw->pt.user.edgeflag); +} + + + + +void draw_pt_fetch_run( struct pt_fetch *fetch, +			const unsigned *elts, +			unsigned count, +			char *verts ) +{ +   struct draw_context *draw = fetch->draw; +   struct translate *translate = fetch->translate; +   unsigned i; + +   for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { +      translate->set_buffer(translate,  +			    i,  +			    ((char *)draw->pt.user.vbuffer[i] +  +			     draw->pt.vertex_buffer[i].buffer_offset), +			    draw->pt.vertex_buffer[i].pitch ); +   } + +   translate->run_elts( translate, +			elts,  +			count, +			verts ); + +   /* Edgeflags are hard to fit into a translate program, populate +    * them separately if required.  In the setup above they are +    * defaulted to one, so only need this if there is reason to change +    * that default: +    */ +   if (fetch->need_edgeflags) { +      for (i = 0; i < count; i++) { +         struct vertex_header *vh = (struct vertex_header *)(verts + i * fetch->vertex_size); +         vh->edgeflag = draw_pt_get_edgeflag( draw, elts[i] ); +      } +   } +} + + +struct pt_fetch *draw_pt_fetch_create( struct draw_context *draw ) +{ +   struct pt_fetch *fetch = CALLOC_STRUCT(pt_fetch); +   if (!fetch) +      return NULL; + +   fetch->draw = draw; +   fetch->cache = translate_cache_create(); +   if (!fetch->cache) { +      FREE(fetch); +      return NULL; +   } + +   return fetch; +} + +void draw_pt_fetch_destroy( struct pt_fetch *fetch ) +{ +   translate_cache_destroy(fetch->cache); + +   FREE(fetch); +} + diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c index 0806076956..b7b970a297 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c @@ -36,6 +36,8 @@  #include "draw/draw_vbuf.h"  #include "draw/draw_vertex.h"  #include "draw/draw_pt.h" +#include "translate/translate.h" +#include "translate/translate_cache.h"  /* The simplest 'middle end' in the new vertex code.     *  @@ -72,107 +74,30 @@  struct fetch_emit_middle_end {     struct draw_pt_middle_end base;     struct draw_context *draw; - -   struct { -      const ubyte *ptr; -      unsigned pitch; -      void (*fetch)( const void *from, float *attrib); -      void (*emit)( const float *attrib, float **out ); -   } fetch[PIPE_MAX_ATTRIBS]; -   unsigned nr_fetch; -   unsigned hw_vertex_size; -}; - - - -static void fetch_R32_FLOAT( const void *from, -                             float *attrib ) -{ -   float *f = (float *) from; -   attrib[0] = f[0]; -   attrib[1] = 0.0; -   attrib[2] = 0.0; -   attrib[3] = 1.0; -} - - -static void emit_R32_FLOAT( const float *attrib, -                            float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out) += 1; -} - -static void emit_R32G32_FLOAT( const float *attrib, -                               float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out)[1] = attrib[1]; -   (*out) += 2; -} - -static void emit_R32G32B32_FLOAT( const float *attrib, -                                  float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out)[1] = attrib[1]; -   (*out)[2] = attrib[2]; -   (*out) += 3; -} - -static void emit_R32G32B32A32_FLOAT( const float *attrib, -                                     float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out)[1] = attrib[1]; -   (*out)[2] = attrib[2]; -   (*out)[3] = attrib[3]; -   (*out) += 4; -} +   struct translate *translate; +   const struct vertex_info *vinfo; +   /* Cache point size somewhere it's address won't change: +    */ +   float point_size; -/** - * General-purpose fetch from user's vertex arrays, emit to driver's - * vertex buffer. - * - * XXX this is totally temporary. - */ -static void -fetch_store_general( struct fetch_emit_middle_end *feme, -                     void *out_ptr, -                     const unsigned *fetch_elts, -                     unsigned count ) -{ -   float *out = (float *)out_ptr; -   struct vbuf_render *render = feme->draw->render; -   uint i, j; +   struct translate_cache *cache; +}; -   for (i = 0; i < count; i++) { -      unsigned elt = fetch_elts[i] & ~DRAW_PT_FLAG_MASK; -       -      for (j = 0; j < feme->nr_fetch; j++) { -         float attrib[4]; -         const ubyte *from = (feme->fetch[j].ptr + -                              feme->fetch[j].pitch * elt); -          -         feme->fetch[j].fetch( from, attrib ); -         feme->fetch[j].emit( attrib, &out ); -      } -   } -}  static void fetch_emit_prepare( struct draw_pt_middle_end *middle, -                                unsigned prim ) +                                unsigned prim, +				unsigned opt )  { -   static const float zero = 0;     struct fetch_emit_middle_end *feme = (struct fetch_emit_middle_end *)middle;     struct draw_context *draw = feme->draw;     const struct vertex_info *vinfo; -   unsigned i; +   unsigned i, dst_offset;     boolean ok; +   struct translate_key key;     ok = draw->render->set_primitive( draw->render,  @@ -184,55 +109,93 @@ static void fetch_emit_prepare( struct draw_pt_middle_end *middle,     /* Must do this after set_primitive() above:      */ -   vinfo = draw->render->get_vertex_info(draw->render); +   vinfo = feme->vinfo = draw->render->get_vertex_info(draw->render); +    +    -   for (i = 0; i < vinfo->num_attribs; i++) { -      unsigned src_element = vinfo->src_index[i]; -      unsigned src_buffer = draw->vertex_element[src_element].vertex_buffer_index; -          -      feme->fetch[i].ptr = ((const ubyte *)draw->user.vbuffer[src_buffer] +  -                            draw->vertex_buffer[src_buffer].buffer_offset +  -                            draw->vertex_element[src_element].src_offset); +   /* Transform from API vertices to HW vertices, skipping the +    * pipeline_vertex intermediate step. +    */ +   dst_offset = 0; +   memset(&key, 0, sizeof(key)); -      feme->fetch[i].pitch = draw->vertex_buffer[src_buffer].pitch; -          -      feme->fetch[i].fetch = draw_get_fetch_func(draw->vertex_element[src_element].src_format); +   for (i = 0; i < vinfo->num_attribs; i++) { +      const struct pipe_vertex_element *src = &draw->pt.vertex_element[vinfo->src_index[i]]; +      unsigned emit_sz = 0; +      unsigned input_format = src->src_format; +      unsigned input_buffer = src->vertex_buffer_index; +      unsigned input_offset = src->src_offset; +      unsigned output_format;        switch (vinfo->emit[i]) {        case EMIT_4F: -         feme->fetch[i].emit = emit_R32G32B32A32_FLOAT; +	 output_format = PIPE_FORMAT_R32G32B32A32_FLOAT; +	 emit_sz = 4 * sizeof(float);           break;        case EMIT_3F: -         feme->fetch[i].emit = emit_R32G32B32_FLOAT; +	 output_format = PIPE_FORMAT_R32G32B32_FLOAT; +	 emit_sz = 3 * sizeof(float);           break;        case EMIT_2F: -         feme->fetch[i].emit = emit_R32G32_FLOAT; +	 output_format = PIPE_FORMAT_R32G32_FLOAT; +	 emit_sz = 2 * sizeof(float);           break;        case EMIT_1F: -         feme->fetch[i].emit = emit_R32_FLOAT; -         break; -      case EMIT_HEADER: -         feme->fetch[i].ptr = (const ubyte *)&zero; -         feme->fetch[i].pitch = 0; -         feme->fetch[i].fetch = fetch_R32_FLOAT; -         feme->fetch[i].emit = emit_R32_FLOAT; +	 output_format = PIPE_FORMAT_R32_FLOAT; +	 emit_sz = 1 * sizeof(float);           break;        case EMIT_1F_PSIZE: -         feme->fetch[i].ptr = (const ubyte *)&feme->draw->rasterizer->point_size; -         feme->fetch[i].pitch = 0; -         feme->fetch[i].fetch = fetch_R32_FLOAT; -         feme->fetch[i].emit = emit_R32_FLOAT; +	 input_format = PIPE_FORMAT_R32_FLOAT; +	 input_buffer = draw->pt.nr_vertex_buffers; +	 input_offset = 0; +	 output_format = PIPE_FORMAT_R32_FLOAT; +	 emit_sz = 1 * sizeof(float);           break;        default:           assert(0); -         feme->fetch[i].emit = NULL; -         break; +	 output_format = PIPE_FORMAT_NONE; +	 emit_sz = 0; +	 continue;        } + +      key.element[i].input_format = input_format; +      key.element[i].input_buffer = input_buffer; +      key.element[i].input_offset = input_offset; +      key.element[i].output_format = output_format; +      key.element[i].output_offset = dst_offset; +       +      dst_offset += emit_sz; +   } + +   key.nr_elements = vinfo->num_attribs; +   key.output_stride = vinfo->size * 4; + +   /* Don't bother with caching at this stage: +    */ +   if (!feme->translate || +       translate_key_compare(&feme->translate->key, &key) != 0)  +   { +      translate_key_sanitize(&key); +      feme->translate = translate_cache_find(feme->cache, +                                             &key); + + +      feme->translate->set_buffer(feme->translate,  +				  draw->pt.nr_vertex_buffers,  +				  &feme->point_size, +				  0);     } +    +   feme->point_size = draw->rasterizer->point_size; -   feme->nr_fetch = vinfo->num_attribs; -   feme->hw_vertex_size = vinfo->size * 4; +   for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { +      feme->translate->set_buffer(feme->translate,  +                                  i,  +                                  ((char *)draw->pt.user.vbuffer[i] +  +                                   draw->pt.vertex_buffer[i].buffer_offset), +                                  draw->pt.vertex_buffer[i].pitch ); +   }  } @@ -249,8 +212,12 @@ static void fetch_emit_run( struct draw_pt_middle_end *middle,     struct draw_context *draw = feme->draw;     void *hw_verts; +   /* XXX: need to flush to get prim_vbuf.c to release its allocation??  +    */ +   draw_do_flush( draw, DRAW_FLUSH_BACKEND ); +     hw_verts = draw->render->allocate_vertices( draw->render, -                                               (ushort)feme->hw_vertex_size, +                                               (ushort)feme->translate->key.output_stride,                                                 (ushort)fetch_count );     if (!hw_verts) {        assert(0); @@ -260,10 +227,19 @@ static void fetch_emit_run( struct draw_pt_middle_end *middle,     /* Single routine to fetch vertices and emit HW verts.      */ -   fetch_store_general( feme,  -                        hw_verts, -                        fetch_elts, -                        fetch_count ); +   feme->translate->run_elts( feme->translate,  +			      fetch_elts, +			      fetch_count, +			      hw_verts ); + +   if (0) { +      unsigned i; +      for (i = 0; i < fetch_count; i++) { +         debug_printf("\n\nvertex %d:\n", i); +         draw_dump_emitted_vertex( feme->vinfo,  +                                   (const uint8_t *)hw_verts + feme->vinfo->size * 4 * i ); +      } +   }     /* XXX: Draw arrays path to avoid re-emitting index list again and      * again. @@ -276,7 +252,7 @@ static void fetch_emit_run( struct draw_pt_middle_end *middle,      */     draw->render->release_vertices( draw->render,                                      hw_verts,  -                                   feme->hw_vertex_size,  +                                   feme->translate->key.output_stride,                                      fetch_count );  } @@ -290,6 +266,10 @@ static void fetch_emit_finish( struct draw_pt_middle_end *middle )  static void fetch_emit_destroy( struct draw_pt_middle_end *middle )  { +   struct fetch_emit_middle_end *feme = (struct fetch_emit_middle_end *)middle; + +   translate_cache_destroy(feme->cache); +     FREE(middle);  } @@ -297,7 +277,15 @@ static void fetch_emit_destroy( struct draw_pt_middle_end *middle )  struct draw_pt_middle_end *draw_pt_fetch_emit( struct draw_context *draw )  {     struct fetch_emit_middle_end *fetch_emit = CALLOC_STRUCT( fetch_emit_middle_end ); -  +   if (fetch_emit == NULL) +      return NULL; + +   fetch_emit->cache = translate_cache_create(); +   if (!fetch_emit->cache) { +      FREE(fetch_emit); +      return NULL; +   } +     fetch_emit->base.prepare = fetch_emit_prepare;     fetch_emit->base.run     = fetch_emit_run;     fetch_emit->base.finish  = fetch_emit_finish; diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_pipeline.c deleted file mode 100644 index 4c2a281b29..0000000000 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_pipeline.c +++ /dev/null @@ -1,328 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: -  *   Keith Whitwell <keith@tungstengraphics.com> -  */ - -#include "pipe/p_util.h" -#include "draw/draw_context.h" -#include "draw/draw_private.h" -#include "draw/draw_vertex.h" -#include "draw/draw_pt.h" - -/* The simplest 'middle end' in the new vertex code.   - *  - * The responsibilities of a middle end are to: - *  - perform vertex fetch using - *       - draw vertex element/buffer state - *       - a list of fetch indices we received as an input - *  - run the vertex shader - *  - cliptest,  - *  - clip coord calculation  - *  - viewport transformation - *  - if necessary, run the primitive pipeline, passing it: - *       - a linear array of vertex_header vertices constructed here - *       - a set of draw indices we received as an input - *  - otherwise, drive the hw backend, - *       - allocate space for hardware format vertices - *       - translate the vertex-shader output vertices to hw format - *       - calling the backend draw functions. - * - * For convenience, we provide a helper function to drive the hardware - * backend given similar inputs to those required to run the pipeline. - * - * In the case of passthrough mode, many of these actions are disabled - * or noops, so we end up doing: - * - *  - perform vertex fetch - *  - drive the hw backend - * - * IE, basically just vertex fetch to post-vs-format vertices, - * followed by a call to the backend helper function. - */ - - -struct fetch_pipeline_middle_end { -   struct draw_pt_middle_end base; -   struct draw_context *draw; - -   void (*header)( unsigned idx, float **out); - -   struct { -      const ubyte *ptr; -      unsigned pitch; -      void (*fetch)( const void *from, float *attrib); -      void (*emit)( const float *attrib, float **out ); -   } fetch[PIPE_MAX_ATTRIBS]; -    -   unsigned nr_fetch; -   unsigned pipeline_vertex_size; -   unsigned prim; -}; - - - -static void emit_R32_FLOAT( const float *attrib, -                            float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out) += 1; -} - -static void emit_R32G32_FLOAT( const float *attrib, -                               float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out)[1] = attrib[1]; -   (*out) += 2; -} - -static void emit_R32G32B32_FLOAT( const float *attrib, -                                  float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out)[1] = attrib[1]; -   (*out)[2] = attrib[2]; -   (*out) += 3; -} - -static void emit_R32G32B32A32_FLOAT( const float *attrib, -                                     float **out ) -{ -   (*out)[0] = attrib[0]; -   (*out)[1] = attrib[1]; -   (*out)[2] = attrib[2]; -   (*out)[3] = attrib[3]; -   (*out) += 4; -} - -static void header( unsigned idx, -                    float **out ) -{ -   struct vertex_header *header = (struct vertex_header *) (*out); - -   header->clipmask = 0; -   header->edgeflag = 1; -   header->pad = 0; -   header->vertex_id = UNDEFINED_VERTEX_ID; - -   (*out)[1] = 0; -   (*out)[2] = 0; -   (*out)[3] = 0; -   (*out)[3] = 1; -   (*out) += 5; -} - - -static void header_ef( unsigned idx, -                       float **out ) -{ -   struct vertex_header *header = (struct vertex_header *) (*out); - -   /* XXX: need a reset_stipple flag in the vertex header too?  -    */ -   header->clipmask = 0; -   header->edgeflag = (idx & DRAW_PT_EDGEFLAG) != 0; -   header->pad = 0; -   header->vertex_id = UNDEFINED_VERTEX_ID; - -   (*out)[1] = 0; -   (*out)[2] = 0; -   (*out)[3] = 0; -   (*out)[3] = 1; -   (*out) += 5; -} - - -/** - * General-purpose fetch from user's vertex arrays, emit to driver's - * vertex buffer. - * - * XXX this is totally temporary. - */ -static void -fetch_store_general( struct fetch_pipeline_middle_end *fpme, -                     void *out_ptr, -                     const unsigned *fetch_elts, -                     unsigned count ) -{ -   float *out = (float *)out_ptr; -   uint i, j; - -   for (i = 0; i < count; i++) { -      unsigned elt = fetch_elts[i]; -       -      fpme->header( elt, &out ); -      elt &= ~DRAW_PT_FLAG_MASK; - -      for (j = 0; j < fpme->nr_fetch; j++) { -         float attrib[4]; -         const ubyte *from = (fpme->fetch[j].ptr + -                              fpme->fetch[j].pitch * elt); -          -         fpme->fetch[j].fetch( from, attrib ); -         fpme->fetch[j].emit( attrib, &out ); -      } -   } -} - - -/* We aren't running a vertex shader, but are running the pipeline. - * That means the vertices we need to build look like: - * - * dw0: vertex header (zero?) - * dw1: clip coord 0 - * dw2: clip coord 1 - * dw3: clip coord 2 - * dw4: clip coord 4 - * dw5: screen coord 0 - * dw6: screen coord 0 - * dw7: screen coord 0 - * dw8: screen coord 0 - * dw9: other attribs... - * - */ -static void fetch_pipeline_prepare( struct draw_pt_middle_end *middle, -                                    unsigned prim ) -{ -   static const float zero = 0; -   struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; -   struct draw_context *draw = fpme->draw; -   unsigned i, nr = 0; - -   fpme->prim = prim; - -   /* Emit the vertex header and empty clipspace coord field: -    */ -   if (draw->user.edgeflag) { -      fpme->header = header_ef; -   } -   else { -      fpme->header = header; -   } -    - -   /* Need to look at vertex shader inputs (we know it is a -    * passthrough shader, so these define the outputs too).  If we -    * were running a shader, we'd still be looking at the inputs at -    * this point. -    */ -   for (i = 0; i < draw->vertex_shader->info.num_inputs; i++) { -      unsigned buf = draw->vertex_element[i].vertex_buffer_index; -      enum pipe_format format  = draw->vertex_element[i].src_format; - -      fpme->fetch[nr].ptr = ((const ubyte *) draw->user.vbuffer[buf] +  -                            draw->vertex_buffer[buf].buffer_offset +  -                            draw->vertex_element[i].src_offset); - -      fpme->fetch[nr].pitch = draw->vertex_buffer[buf].pitch; -      fpme->fetch[nr].fetch = draw_get_fetch_func( format ); - -      /* Always do this -- somewhat redundant... -       */ -      fpme->fetch[nr].emit = emit_R32G32B32A32_FLOAT; -      nr++; -   } - -   fpme->nr_fetch = nr; -   fpme->pipeline_vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float); -} - - - - -static void fetch_pipeline_run( struct draw_pt_middle_end *middle, -                            const unsigned *fetch_elts, -                            unsigned fetch_count, -                            const ushort *draw_elts, -                            unsigned draw_count ) -{ -   struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; -   struct draw_context *draw = fpme->draw; -   char *pipeline_verts; -    -   pipeline_verts = MALLOC( fpme->pipeline_vertex_size *  -                            fetch_count ); -   if (!pipeline_verts) { -      assert(0); -      return; -   } -          -					 -   /* Single routine to fetch vertices and emit pipeline verts. -    */ -   fetch_store_general( fpme,  -                        pipeline_verts, -                        fetch_elts, -                        fetch_count ); - -    -   /* Run the pipeline -    */ -   draw_pt_run_pipeline( fpme->draw, -                         fpme->prim, -                         pipeline_verts, -                         fpme->pipeline_vertex_size, -                         fetch_count, -                         draw_elts, -                         draw_count ); -                  - -   /* Done -- that was easy, wasn't it:  -    */ -   FREE( pipeline_verts ); -} - - - -static void fetch_pipeline_finish( struct draw_pt_middle_end *middle ) -{ -   /* nothing to do */ -} - -static void fetch_pipeline_destroy( struct draw_pt_middle_end *middle ) -{ -   FREE(middle); -} - - -struct draw_pt_middle_end *draw_pt_fetch_pipeline( struct draw_context *draw ) -{ -   struct fetch_pipeline_middle_end *fetch_pipeline = CALLOC_STRUCT( fetch_pipeline_middle_end ); -  -   fetch_pipeline->base.prepare = fetch_pipeline_prepare; -   fetch_pipeline->base.run     = fetch_pipeline_run; -   fetch_pipeline->base.finish  = fetch_pipeline_finish; -   fetch_pipeline->base.destroy = fetch_pipeline_destroy; - -   fetch_pipeline->draw = draw; -      -   return &fetch_pipeline->base; -} - diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c new file mode 100644 index 0000000000..4ec20493c4 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c @@ -0,0 +1,235 @@ +/************************************************************************** + * + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +#include "pipe/p_util.h" +#include "draw/draw_context.h" +#include "draw/draw_vbuf.h" +#include "draw/draw_vertex.h" +#include "draw/draw_pt.h" +#include "draw/draw_vs.h" +#include "translate/translate.h" + + +struct fetch_pipeline_middle_end { +   struct draw_pt_middle_end base; +   struct draw_context *draw; + +   struct pt_emit *emit; +   struct pt_fetch *fetch; +   struct pt_post_vs *post_vs; + +   unsigned vertex_data_offset; +   unsigned vertex_size; +   unsigned prim; +   unsigned opt; +}; + + +static void fetch_pipeline_prepare( struct draw_pt_middle_end *middle, +                                    unsigned prim, +				    unsigned opt ) +{ +   struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; +   struct draw_context *draw = fpme->draw; +   struct draw_vertex_shader *vs = draw->vertex_shader; + +   /* Add one to num_outputs because the pipeline occasionally tags on +    * an additional texcoord, eg for AA lines. +    */ +   unsigned nr = MAX2( vs->info.num_inputs, +		       vs->info.num_outputs + 1 ); + +   fpme->prim = prim; +   fpme->opt = opt; + +   /* Always leave room for the vertex header whether we need it or +    * not.  It's hard to get rid of it in particular because of the +    * viewport code in draw_pt_post_vs.c.   +    */ +   fpme->vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float); + +    + +   draw_pt_fetch_prepare( fpme->fetch,  +			  fpme->vertex_size ); + +   /* XXX: it's not really gl rasterization rules we care about here, +    * but gl vs dx9 clip spaces. +    */ +   draw_pt_post_vs_prepare( fpme->post_vs, +			    draw->bypass_clipping, +			    draw->identity_viewport, +			    draw->rasterizer->gl_rasterization_rules ); +			     + +   if (!(opt & PT_PIPELINE))  +      draw_pt_emit_prepare( fpme->emit,  +			    prim ); + +   /* No need to prepare the shader. +    */ +   vs->prepare(vs, draw); + +} + + + + +static void fetch_pipeline_run( struct draw_pt_middle_end *middle, +                                const unsigned *fetch_elts, +                                unsigned fetch_count, +                                const ushort *draw_elts, +                                unsigned draw_count ) +{ +   struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; +   struct draw_context *draw = fpme->draw; +   struct draw_vertex_shader *shader = draw->vertex_shader; +   unsigned opt = fpme->opt; +   unsigned alloc_count = align_int( fetch_count, 4 ); + +   struct vertex_header *pipeline_verts =  +      (struct vertex_header *)MALLOC(fpme->vertex_size * alloc_count); + +   if (!pipeline_verts) { +      /* Not much we can do here - just skip the rendering. +       */ +      assert(0); +      return; +   } + +   /* Fetch into our vertex buffer +    */ +   draw_pt_fetch_run( fpme->fetch, +		      fetch_elts,  +		      fetch_count, +		      (char *)pipeline_verts ); + +   /* Run the shader, note that this overwrites the data[] parts of +    * the pipeline verts.  If there is no shader, ie a bypass shader, +    * then the inputs == outputs, and are already in the correct +    * place. +    */ +   if (opt & PT_SHADE) +   { +      shader->run_linear(shader,  +			 (const float (*)[4])pipeline_verts->data, +			 (      float (*)[4])pipeline_verts->data, +			 (const float (*)[4])draw->pt.user.constants, +			 fetch_count, +			 fpme->vertex_size, +			 fpme->vertex_size); +   } + +   if (draw_pt_post_vs_run( fpme->post_vs, +			    pipeline_verts, +			    fetch_count, +			    fpme->vertex_size )) +   { +      opt |= PT_PIPELINE; +   } + +   /* Do we need to run the pipeline? +    */ +   if (opt & PT_PIPELINE) { +      draw_pipeline_run( fpme->draw, +                         fpme->prim, +                         pipeline_verts, +                         fetch_count, +                         fpme->vertex_size, +                         draw_elts, +                         draw_count ); +   }  +   else { +      draw_pt_emit( fpme->emit, +		    (const float (*)[4])pipeline_verts->data, +		    fetch_count, +		    fpme->vertex_size, +		    draw_elts, +		    draw_count ); +   } + + +   FREE(pipeline_verts); +} + + + +static void fetch_pipeline_finish( struct draw_pt_middle_end *middle ) +{ +   /* nothing to do */ +} + +static void fetch_pipeline_destroy( struct draw_pt_middle_end *middle ) +{ +   struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; + +   if (fpme->fetch) +      draw_pt_fetch_destroy( fpme->fetch ); + +   if (fpme->emit) +      draw_pt_emit_destroy( fpme->emit ); + +   if (fpme->post_vs) +      draw_pt_post_vs_destroy( fpme->post_vs ); + +   FREE(middle); +} + + +struct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit( struct draw_context *draw ) +{ +   struct fetch_pipeline_middle_end *fpme = CALLOC_STRUCT( fetch_pipeline_middle_end ); +   if (!fpme) +      goto fail; + +   fpme->base.prepare = fetch_pipeline_prepare; +   fpme->base.run     = fetch_pipeline_run; +   fpme->base.finish  = fetch_pipeline_finish; +   fpme->base.destroy = fetch_pipeline_destroy; + +   fpme->draw = draw; + +   fpme->fetch = draw_pt_fetch_create( draw ); +   if (!fpme->fetch) +      goto fail; + +   fpme->post_vs = draw_pt_post_vs_create( draw ); +   if (!fpme->post_vs) +      goto fail; + +   fpme->emit = draw_pt_emit_create( draw ); +   if (!fpme->emit)  +      goto fail; + +   return &fpme->base; + + fail: +   if (fpme) +      fetch_pipeline_destroy( &fpme->base ); + +   return NULL; +} diff --git a/src/gallium/auxiliary/draw/draw_pt_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_pipeline.c deleted file mode 100644 index e70e63d08f..0000000000 --- a/src/gallium/auxiliary/draw/draw_pt_pipeline.c +++ /dev/null @@ -1,168 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: -  *   Keith Whitwell <keith@tungstengraphics.com> -  */ - -#include "pipe/p_util.h" -#include "draw/draw_context.h" -#include "draw/draw_private.h" -#include "draw/draw_vertex.h" -#include "draw/draw_pt.h" - - -/** - * Add a point to the primitive queue. - * \param i0  index into user's vertex arrays - */ -static void do_point( struct draw_context *draw, -		      const char *v0 ) -{ -   struct prim_header prim; -    -   prim.reset_line_stipple = 0; -   prim.edgeflags = 1; -   prim.pad = 0; -   prim.v[0] = (struct vertex_header *)v0; - -   draw->pipeline.first->point( draw->pipeline.first, &prim ); -} - - -/** - * Add a line to the primitive queue. - * \param i0  index into user's vertex arrays - * \param i1  index into user's vertex arrays - */ -static void do_line( struct draw_context *draw, -		     const char *v0, -		     const char *v1 ) -{ -   struct prim_header prim; -    -   prim.reset_line_stipple = 1; /* fixme */ -   prim.edgeflags = 1; -   prim.pad = 0; -   prim.v[0] = (struct vertex_header *)v0; -   prim.v[1] = (struct vertex_header *)v1; - -   draw->pipeline.first->line( draw->pipeline.first, &prim ); -} - -/** - * Add a triangle to the primitive queue. - */ -static void do_triangle( struct draw_context *draw, -			 char *v0, -			 char *v1, -			 char *v2 ) -{ -   struct prim_header prim; -    -   prim.v[0] = (struct vertex_header *)v0; -   prim.v[1] = (struct vertex_header *)v1; -   prim.v[2] = (struct vertex_header *)v2; -   prim.reset_line_stipple = 1; -   prim.edgeflags = ((prim.v[0]->edgeflag)      | -                     (prim.v[1]->edgeflag << 1) | -                     (prim.v[2]->edgeflag << 2)); -   prim.pad = 0; - -   if (0) debug_printf("tri ef: %d %d %d\n",  -                       prim.v[0]->edgeflag, -                       prim.v[1]->edgeflag, -                       prim.v[2]->edgeflag); -    -   draw->pipeline.first->tri( draw->pipeline.first, &prim ); -} - - - -void draw_pt_reset_vertex_ids( struct draw_context *draw ) -{ -   unsigned i; -   char *verts = draw->pt.pipeline.verts; -   unsigned stride = draw->pt.pipeline.vertex_stride; - -   for (i = 0; i < draw->pt.pipeline.vertex_count; i++) { -      ((struct vertex_header *)verts)->vertex_id = UNDEFINED_VERTEX_ID; -      verts += stride; -   } -} - - -/* Code to run the pipeline on a fairly arbitary collection of vertices. - * - * Vertex headers must be pre-initialized with the - * UNDEFINED_VERTEX_ID, this code will cause that id to become - * overwritten, so it may have to be reset if there is the intention - * to reuse the vertices. - * - * This code provides a callback to reset the vertex id's which the - * draw_vbuf.c code uses when it has to perform a flush. - */ -void draw_pt_run_pipeline( struct draw_context *draw, -                           unsigned prim, -                           char *verts, -                           unsigned stride, -                           unsigned vertex_count, -                           const ushort *elts, -                           unsigned count ) -{ -   unsigned i; - -   draw->pt.pipeline.verts = verts; -   draw->pt.pipeline.vertex_stride = stride; -   draw->pt.pipeline.vertex_count = vertex_count; -    -   switch (prim) { -   case PIPE_PRIM_POINTS: -      for (i = 0; i < count; i++)  -         do_point( draw,  -                   verts + stride * elts[i] ); -      break; -   case PIPE_PRIM_LINES: -      for (i = 0; i+1 < count; i += 2)  -         do_line( draw,  -                  verts + stride * elts[i+0], -                  verts + stride * elts[i+1]); -      break; -   case PIPE_PRIM_TRIANGLES: -      for (i = 0; i+2 < count; i += 3) -         do_triangle( draw,  -                      verts + stride * elts[i+0], -                      verts + stride * elts[i+1], -                      verts + stride * elts[i+2]); -      break; -   } -    -   draw->pt.pipeline.verts = NULL; -   draw->pt.pipeline.vertex_count = 0; -} - diff --git a/src/gallium/auxiliary/draw/draw_pt_post_vs.c b/src/gallium/auxiliary/draw/draw_pt_post_vs.c new file mode 100644 index 0000000000..c4a67c8289 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pt_post_vs.c @@ -0,0 +1,227 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +#include "pipe/p_util.h" +#include "pipe/p_context.h" +#include "draw/draw_context.h" +#include "draw/draw_private.h" +#include "draw/draw_vbuf.h" +#include "draw/draw_vertex.h" +#include "draw/draw_pt.h" + +struct pt_post_vs { +   struct draw_context *draw; + +   boolean (*run)( struct pt_post_vs *pvs, +		struct vertex_header *vertices, +		unsigned count, +		unsigned stride ); +}; + + + +static INLINE float +dot4(const float *a, const float *b) +{ +   return (a[0]*b[0] + +           a[1]*b[1] + +           a[2]*b[2] + +           a[3]*b[3]); +} + + + +static INLINE unsigned +compute_clipmask_gl(const float *clip, /*const*/ float plane[][4], unsigned nr) +{ +   unsigned mask = 0x0; +   unsigned i; + +#if 0 +   debug_printf("compute clipmask %f %f %f %f\n", +                clip[0], clip[1], clip[2], clip[3]); +   assert(clip[3] != 0.0); +#endif + +   /* Do the hardwired planes first: +    */ +   if (-clip[0] + clip[3] < 0) mask |= (1<<0); +   if ( clip[0] + clip[3] < 0) mask |= (1<<1); +   if (-clip[1] + clip[3] < 0) mask |= (1<<2); +   if ( clip[1] + clip[3] < 0) mask |= (1<<3); +   if ( clip[2] + clip[3] < 0) mask |= (1<<4); /* match mesa clipplane numbering - for now */ +   if (-clip[2] + clip[3] < 0) mask |= (1<<5); /* match mesa clipplane numbering - for now */ + +   /* Followed by any remaining ones: +    */ +   for (i = 6; i < nr; i++) { +      if (dot4(clip, plane[i]) < 0)  +         mask |= (1<<i); +   } + +   return mask; +} + + +/* The normal case - cliptest, rhw divide, viewport transform. + * + * Also handle identity viewport here at the expense of a few wasted + * instructions + */ +static boolean post_vs_cliptest_viewport_gl( struct pt_post_vs *pvs, +					  struct vertex_header *vertices, +					  unsigned count, +					  unsigned stride ) +{ +   struct vertex_header *out = vertices; +   const float *scale = pvs->draw->viewport.scale; +   const float *trans = pvs->draw->viewport.translate; +   unsigned clipped = 0; +   unsigned j; + +   if (0) debug_printf("%s\n"); + +   for (j = 0; j < count; j++) { +      out->clip[0] = out->data[0][0]; +      out->clip[1] = out->data[0][1]; +      out->clip[2] = out->data[0][2]; +      out->clip[3] = out->data[0][3]; + +      out->vertex_id = 0xffff; +      out->clipmask = compute_clipmask_gl(out->clip,  +					  pvs->draw->plane, +					  pvs->draw->nr_planes); +      clipped += out->clipmask; + +      if (out->clipmask == 0) +      { +	 /* divide by w */ +	 float w = 1.0f / out->data[0][3]; + +	 /* Viewport mapping */ +	 out->data[0][0] = out->data[0][0] * w * scale[0] + trans[0]; +	 out->data[0][1] = out->data[0][1] * w * scale[1] + trans[1]; +	 out->data[0][2] = out->data[0][2] * w * scale[2] + trans[2]; +	 out->data[0][3] = w; +#if 0 +         debug_printf("post viewport: %f %f %f %f\n", +                      out->data[0][0], +                      out->data[0][1], +                      out->data[0][2], +                      out->data[0][3]); +#endif +      } + +      out = (struct vertex_header *)( (char *)out + stride ); +   } + +   return clipped != 0; +} + + + +/* If bypass_clipping is set, skip cliptest and rhw divide. + */ +static boolean post_vs_viewport( struct pt_post_vs *pvs, +			      struct vertex_header *vertices, +			      unsigned count, +			      unsigned stride ) +{ +   struct vertex_header *out = vertices; +   const float *scale = pvs->draw->viewport.scale; +   const float *trans = pvs->draw->viewport.translate; +   unsigned j; + +   if (0) debug_printf("%s\n", __FUNCTION__); +   for (j = 0; j < count; j++) { +      /* Viewport mapping only, no cliptest/rhw divide +       */ +      out->data[0][0] = out->data[0][0] * scale[0] + trans[0]; +      out->data[0][1] = out->data[0][1] * scale[1] + trans[1]; +      out->data[0][2] = out->data[0][2] * scale[2] + trans[2]; + +      out = (struct vertex_header *)((char *)out + stride); +   } +    +   return FALSE; +} + + +/* If bypass_clipping is set and we have an identity viewport, nothing + * to do. + */ +static boolean post_vs_none( struct pt_post_vs *pvs, +			     struct vertex_header *vertices, +			     unsigned count, +			     unsigned stride ) +{ +   if (0) debug_printf("%s\n", __FUNCTION__); +   return FALSE; +} + +boolean draw_pt_post_vs_run( struct pt_post_vs *pvs, +			     struct vertex_header *pipeline_verts, +			     unsigned count, +			     unsigned stride ) +{ +   return pvs->run( pvs, pipeline_verts, count, stride ); +} + + +void draw_pt_post_vs_prepare( struct pt_post_vs *pvs, +			      boolean bypass_clipping, +			      boolean identity_viewport, +			      boolean opengl ) +{ +   if (bypass_clipping) { +      if (identity_viewport) +	 pvs->run = post_vs_none; +      else +	 pvs->run = post_vs_viewport; +   } +   else { +      //if (opengl)  +      pvs->run = post_vs_cliptest_viewport_gl; +   } +} + + +struct pt_post_vs *draw_pt_post_vs_create( struct draw_context *draw ) +{ +   struct pt_post_vs *pvs = CALLOC_STRUCT( pt_post_vs ); +   if (!pvs) +      return NULL; + +   pvs->draw = draw; +    +   return pvs; +} + +void draw_pt_post_vs_destroy( struct pt_post_vs *pvs ) +{ +   FREE(pvs); +} diff --git a/src/gallium/auxiliary/draw/draw_pt_varray.c b/src/gallium/auxiliary/draw/draw_pt_varray.c new file mode 100644 index 0000000000..355093f945 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pt_varray.c @@ -0,0 +1,249 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +#include "pipe/p_util.h" +#include "draw/draw_context.h" +#include "draw/draw_private.h" +#include "draw/draw_pt.h" + +#define FETCH_MAX 256 +#define DRAW_MAX (16*FETCH_MAX) + +struct varray_frontend { +   struct draw_pt_front_end base; +   struct draw_context *draw; + +   ushort draw_elts[DRAW_MAX]; +   unsigned fetch_elts[FETCH_MAX]; + +   unsigned draw_count; +   unsigned fetch_count; + +   struct draw_pt_middle_end *middle; + +   unsigned input_prim; +   unsigned output_prim; +}; + +static void varray_flush(struct varray_frontend *varray) +{ +   if (varray->draw_count) { +#if 0 +      debug_printf("FLUSH fc = %d, dc = %d\n", +                   varray->fetch_count, +                   varray->draw_count); +#endif +      varray->middle->run(varray->middle, +                          varray->fetch_elts, +                          varray->fetch_count, +                          varray->draw_elts, +                          varray->draw_count); +   } + +   varray->fetch_count = 0; +   varray->draw_count = 0; +} + +#if 0 +static void varray_check_flush(struct varray_frontend *varray) +{ +   if (varray->draw_count + 6 >= DRAW_MAX/* || +       varray->fetch_count + 4 >= FETCH_MAX*/) { +      varray_flush(varray); +   } +} +#endif + +static INLINE void add_draw_el(struct varray_frontend *varray, +                               int idx, ushort flags) +{ +   varray->draw_elts[varray->draw_count++] = idx | flags; +} + + +static INLINE void varray_triangle( struct varray_frontend *varray, +                                    unsigned i0, +                                    unsigned i1, +                                    unsigned i2 ) +{ +   add_draw_el(varray, i0, 0); +   add_draw_el(varray, i1, 0); +   add_draw_el(varray, i2, 0); +} + +static INLINE void varray_triangle_flags( struct varray_frontend *varray, +                                          ushort flags, +                                          unsigned i0, +                                          unsigned i1, +                                          unsigned i2 ) +{ +   add_draw_el(varray, i0, flags); +   add_draw_el(varray, i1, 0); +   add_draw_el(varray, i2, 0); +} + +static INLINE void varray_line( struct varray_frontend *varray, +                                unsigned i0, +                                unsigned i1 ) +{ +   add_draw_el(varray, i0, 0); +   add_draw_el(varray, i1, 0); +} + + +static INLINE void varray_line_flags( struct varray_frontend *varray, +                                      ushort flags, +                                      unsigned i0, +                                      unsigned i1 ) +{ +   add_draw_el(varray, i0, flags); +   add_draw_el(varray, i1, 0); +} + + +static INLINE void varray_point( struct varray_frontend *varray, +                                 unsigned i0 ) +{ +   add_draw_el(varray, i0, 0); +} + +static INLINE void varray_quad( struct varray_frontend *varray, +                                unsigned i0, +                                unsigned i1, +                                unsigned i2, +                                unsigned i3 ) +{ +   varray_triangle( varray, i0, i1, i3 ); +   varray_triangle( varray, i1, i2, i3 ); +} + +static INLINE void varray_ef_quad( struct varray_frontend *varray, +                                   unsigned i0, +                                   unsigned i1, +                                   unsigned i2, +                                   unsigned i3 ) +{ +   const unsigned omitEdge1 = DRAW_PIPE_EDGE_FLAG_0 | DRAW_PIPE_EDGE_FLAG_2; +   const unsigned omitEdge2 = DRAW_PIPE_EDGE_FLAG_0 | DRAW_PIPE_EDGE_FLAG_1; + +   varray_triangle_flags( varray, +                          DRAW_PIPE_RESET_STIPPLE | omitEdge1, +                          i0, i1, i3 ); + +   varray_triangle_flags( varray, +                          omitEdge2, +                          i1, i2, i3 ); +} + +/* At least for now, we're back to using a template include file for + * this.  The two paths aren't too different though - it may be + * possible to reunify them. + */ +#define TRIANGLE(vc,flags,i0,i1,i2) varray_triangle_flags(vc,flags,i0,i1,i2) +#define QUAD(vc,i0,i1,i2,i3)        varray_ef_quad(vc,i0,i1,i2,i3) +#define LINE(vc,flags,i0,i1)        varray_line_flags(vc,flags,i0,i1) +#define POINT(vc,i0)                varray_point(vc,i0) +#define FUNC varray_run_extras +#include "draw_pt_varray_tmp.h" + +#define TRIANGLE(vc,flags,i0,i1,i2) varray_triangle(vc,i0,i1,i2) +#define QUAD(vc,i0,i1,i2,i3)        varray_quad(vc,i0,i1,i2,i3) +#define LINE(vc,flags,i0,i1)        varray_line(vc,i0,i1) +#define POINT(vc,i0)                varray_point(vc,i0) +#define FUNC varray_run +#include "draw_pt_varray_tmp.h" + + + +static unsigned reduced_prim[PIPE_PRIM_POLYGON + 1] = { +   PIPE_PRIM_POINTS, +   PIPE_PRIM_LINES, +   PIPE_PRIM_LINES, +   PIPE_PRIM_LINES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES +}; + + + +static void varray_prepare(struct draw_pt_front_end *frontend, +                           unsigned prim, +                           struct draw_pt_middle_end *middle, +                           unsigned opt) +{ +   struct varray_frontend *varray = (struct varray_frontend *)frontend; + +   if (opt & PT_PIPELINE) +   { +      varray->base.run = varray_run_extras; +   }  +   else  +   { +      varray->base.run = varray_run; +   } + +   varray->input_prim = prim; +   varray->output_prim = reduced_prim[prim]; + +   varray->middle = middle; +   middle->prepare(middle, varray->output_prim, opt); +} + + + + +static void varray_finish(struct draw_pt_front_end *frontend) +{ +   struct varray_frontend *varray = (struct varray_frontend *)frontend; +   varray->middle->finish(varray->middle); +   varray->middle = NULL; +} + +static void varray_destroy(struct draw_pt_front_end *frontend) +{ +   FREE(frontend); +} + + +struct draw_pt_front_end *draw_pt_varray(struct draw_context *draw) +{ +   struct varray_frontend *varray = CALLOC_STRUCT(varray_frontend); +   if (varray == NULL) +      return NULL; + +   varray->base.prepare = varray_prepare; +   varray->base.run     = NULL; +   varray->base.finish  = varray_finish; +   varray->base.destroy = varray_destroy; +   varray->draw = draw; + +   return &varray->base; +} diff --git a/src/gallium/auxiliary/draw/draw_pt_varray_tmp.h b/src/gallium/auxiliary/draw/draw_pt_varray_tmp.h new file mode 100644 index 0000000000..b9a319b253 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pt_varray_tmp.h @@ -0,0 +1,144 @@ + +static void FUNC(struct draw_pt_front_end *frontend, +                 pt_elt_func get_elt, +                 const void *elts, +                 unsigned count) +{ +   struct varray_frontend *varray = (struct varray_frontend *)frontend; +   struct draw_context *draw = varray->draw; +   unsigned start = (unsigned)elts; + +   boolean flatfirst = (draw->rasterizer->flatshade && +                        draw->rasterizer->flatshade_first); +   unsigned i, flags; + +#if 0 +   debug_printf("%s (%d) %d/%d\n", __FUNCTION__, draw->prim, start, count); +#endif +#if 0 +   debug_printf("INPUT PRIM = %d (start = %d, count = %d)\n", varray->input_prim, +                start, count); +#endif + +   for (i = 0; i < count; ++i) { +      varray->fetch_elts[i] = start + i; +   } +   varray->fetch_count = count; + +   switch (varray->input_prim) { +   case PIPE_PRIM_POINTS: +      for (i = 0; i < count; i ++) { +         POINT(varray, i + 0); +      } +      break; + +   case PIPE_PRIM_LINES: +      for (i = 0; i+1 < count; i += 2) { +         LINE(varray, DRAW_PIPE_RESET_STIPPLE, +              i + 0, i + 1); +      } +      break; + +   case PIPE_PRIM_LINE_LOOP: +      if (count >= 2) { +         flags = DRAW_PIPE_RESET_STIPPLE; + +         for (i = 1; i < count; i++, flags = 0) { +            LINE(varray, flags, i - 1, i); +         } +         LINE(varray, flags, i - 1, 0); +      } +      break; + +   case PIPE_PRIM_LINE_STRIP: +      flags = DRAW_PIPE_RESET_STIPPLE; +      for (i = 1; i < count; i++, flags = 0) { +         LINE(varray, flags, i - 1, i); +      } +      break; + +   case PIPE_PRIM_TRIANGLES: +      for (i = 0; i+2 < count; i += 3) { +         TRIANGLE(varray, DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, +                  i + 0, i + 1, i + 2); +      } +      break; + +   case PIPE_PRIM_TRIANGLE_STRIP: +      if (flatfirst) { +         for (i = 0; i+2 < count; i++) { +            TRIANGLE(varray, DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, +                     i + 0, i + 1 + (i&1), i + 2 - (i&1)); +         } +      } +      else { +         for (i = 0; i+2 < count; i++) { +            TRIANGLE(varray, DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL, +                     i + 0 + (i&1), i + 1 - (i&1), i + 2); +         } +      } +      break; + +   case PIPE_PRIM_TRIANGLE_FAN: +      if (count >= 3) { +         if (flatfirst) { +            flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL; +            for (i = 0; i+2 < count; i++) { +               TRIANGLE(varray, flags, i + 1, i + 2, 0); +            } +         } +         else { +            flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL; +            for (i = 0; i+2 < count; i++) { +               TRIANGLE(varray, flags, 0, i + 1, i + 2); +            } +         } +      } +      break; + +   case PIPE_PRIM_QUADS: +      for (i = 0; i+3 < count; i += 4) { +         QUAD(varray, i + 0, i + 1, i + 2, i + 3); +      } +      break; + +   case PIPE_PRIM_QUAD_STRIP: +      for (i = 0; i+3 < count; i += 2) { +         QUAD(varray, i + 2, i + 0, i + 1, i + 3); +      } +      break; + +   case PIPE_PRIM_POLYGON: +   { +         /* These bitflags look a little odd because we submit the +          * vertices as (1,2,0) to satisfy flatshade requirements. +          */ +         const unsigned edge_first  = DRAW_PIPE_EDGE_FLAG_2; +         const unsigned edge_middle = DRAW_PIPE_EDGE_FLAG_0; +         const unsigned edge_last   = DRAW_PIPE_EDGE_FLAG_1; + +         flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle; + +	 for (i = 0; i+2 < count; i++, flags = edge_middle) { + +            if (i + 3 == count) +               flags |= edge_last; + +	    TRIANGLE(varray, flags, i + 1, i + 2, 0); +	 } +      } +      break; + +   default: +      assert(0); +      break; +   } + +   varray_flush(varray); +} + +#undef TRIANGLE +#undef QUAD +#undef POINT +#undef LINE +#undef FUNC diff --git a/src/gallium/auxiliary/draw/draw_pt_vcache.c b/src/gallium/auxiliary/draw/draw_pt_vcache.c index 107dcfc269..6b3fb1406b 100644 --- a/src/gallium/auxiliary/draw/draw_pt_vcache.c +++ b/src/gallium/auxiliary/draw/draw_pt_vcache.c @@ -33,8 +33,6 @@  #include "pipe/p_util.h"  #include "draw/draw_context.h"  #include "draw/draw_private.h" -//#include "draw/draw_vbuf.h" -//#include "draw/draw_vertex.h"  #include "draw/draw_pt.h" @@ -86,8 +84,9 @@ static void vcache_check_flush( struct vcache_frontend *vcache )  } -static void vcache_elt( struct vcache_frontend *vcache, -                        unsigned felt ) +static INLINE void vcache_elt( struct vcache_frontend *vcache, +                               unsigned felt, +                               ushort flags )  {     unsigned idx = felt % CACHE_MAX; @@ -99,28 +98,9 @@ static void vcache_elt( struct vcache_frontend *vcache,        vcache->fetch_elts[vcache->fetch_count++] = felt;     } -   vcache->draw_elts[vcache->draw_count++] = vcache->out[idx]; +   vcache->draw_elts[vcache->draw_count++] = vcache->out[idx] | flags;  } -static unsigned add_edgeflag( struct vcache_frontend *vcache, -                              unsigned idx,  -                              unsigned mask ) -{ -   if (mask && draw_get_edgeflag(vcache->draw, idx))  -      return idx | DRAW_PT_EDGEFLAG; -   else -      return idx; -} - - -static unsigned add_reset_stipple( unsigned idx, -                                   unsigned reset ) -{ -   if (reset) -      return idx | DRAW_PT_RESET_STIPPLE; -   else -      return idx; -}  static void vcache_triangle( struct vcache_frontend *vcache, @@ -128,48 +108,42 @@ static void vcache_triangle( struct vcache_frontend *vcache,                               unsigned i1,                               unsigned i2 )  { -   vcache_elt(vcache, i0 | DRAW_PT_EDGEFLAG | DRAW_PT_RESET_STIPPLE); -   vcache_elt(vcache, i1 | DRAW_PT_EDGEFLAG); -   vcache_elt(vcache, i2 | DRAW_PT_EDGEFLAG); +   vcache_elt(vcache, i0, 0); +   vcache_elt(vcache, i1, 0); +   vcache_elt(vcache, i2, 0);     vcache_check_flush(vcache);  } -static void vcache_ef_triangle( struct vcache_frontend *vcache, -                                boolean reset_stipple, -                                unsigned ef_mask, -                                unsigned i0, -                                unsigned i1, -                                unsigned i2 ) +static void vcache_triangle_flags( struct vcache_frontend *vcache, +                                   ushort flags, +                                   unsigned i0, +                                   unsigned i1, +                                   unsigned i2 )  { -   i0 = add_edgeflag( vcache, i0, (ef_mask >> 0) & 1 ); -   i1 = add_edgeflag( vcache, i1, (ef_mask >> 1) & 1 ); -   i2 = add_edgeflag( vcache, i2, (ef_mask >> 2) & 1 ); - -   i0 = add_reset_stipple( i0, reset_stipple ); - -   vcache_elt(vcache, i0); -   vcache_elt(vcache, i1); -   vcache_elt(vcache, i2); +   vcache_elt(vcache, i0, flags); +   vcache_elt(vcache, i1, 0); +   vcache_elt(vcache, i2, 0);     vcache_check_flush(vcache); - -   if (0) debug_printf("emit tri ef: %d %d %d\n",  -                       !!(i0 & DRAW_PT_EDGEFLAG), -                       !!(i1 & DRAW_PT_EDGEFLAG), -                       !!(i2 & DRAW_PT_EDGEFLAG)); -     } -  static void vcache_line( struct vcache_frontend *vcache, -                         boolean reset_stipple,                           unsigned i0,                           unsigned i1 )  { -   i0 = add_reset_stipple( i0, reset_stipple ); +   vcache_elt(vcache, i0, 0); +   vcache_elt(vcache, i1, 0); +   vcache_check_flush(vcache); +} + -   vcache_elt(vcache, i0); -   vcache_elt(vcache, i1); +static void vcache_line_flags( struct vcache_frontend *vcache, +                               ushort flags, +                               unsigned i0, +                               unsigned i1 ) +{ +   vcache_elt(vcache, i0, flags); +   vcache_elt(vcache, i1, 0);     vcache_check_flush(vcache);  } @@ -177,7 +151,7 @@ static void vcache_line( struct vcache_frontend *vcache,  static void vcache_point( struct vcache_frontend *vcache,                            unsigned i0 )  { -   vcache_elt(vcache, i0); +   vcache_elt(vcache, i0, 0);     vcache_check_flush(vcache);  } @@ -197,237 +171,36 @@ static void vcache_ef_quad( struct vcache_frontend *vcache,                              unsigned i2,                              unsigned i3 )  { -   const unsigned omitEdge2 = ~(1 << 1); -   const unsigned omitEdge3 = ~(1 << 2); -   vcache_ef_triangle( vcache, 1, omitEdge2, i0, i1, i3 ); -   vcache_ef_triangle( vcache, 0, omitEdge3, i1, i2, i3 ); -} - - - - -static void vcache_run( struct draw_pt_front_end *frontend,  -                        pt_elt_func get_elt, -                        const void *elts, -                        unsigned count ) -{ -   struct vcache_frontend *vcache = (struct vcache_frontend *)frontend; -   struct draw_context *draw = vcache->draw; - -   boolean unfilled = (draw->rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL || -		       draw->rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL); +   const unsigned omitEdge1 = DRAW_PIPE_EDGE_FLAG_0 | DRAW_PIPE_EDGE_FLAG_2; +   const unsigned omitEdge2 = DRAW_PIPE_EDGE_FLAG_0 | DRAW_PIPE_EDGE_FLAG_1; -   boolean flatfirst = (draw->rasterizer->flatshade &&  -                        draw->rasterizer->flatshade_first); -   unsigned i; +   vcache_triangle_flags( vcache,  +                          DRAW_PIPE_RESET_STIPPLE | omitEdge1,  +                          i0, i1, i3 ); -//   debug_printf("%s (%d) %d/%d\n", __FUNCTION__, draw->prim, start, count ); - -   switch (vcache->input_prim) { -   case PIPE_PRIM_POINTS: -      for (i = 0; i < count; i ++) { -	 vcache_point( vcache, -                       get_elt(elts, i + 0) ); -      } -      break; - -   case PIPE_PRIM_LINES: -      for (i = 0; i+1 < count; i += 2) { -         vcache_line( vcache,  -                      TRUE, -                      get_elt(elts, i + 0), -                      get_elt(elts, i + 1)); -      } -      break; - -   case PIPE_PRIM_LINE_LOOP:   -      if (count >= 2) { -	 for (i = 1; i < count; i++) { -	    vcache_line( vcache,  -                         i == 1, 	/* XXX: only if vb not split */ -                         get_elt(elts, i - 1), -                         get_elt(elts, i )); -	 } - -	 vcache_line( vcache,  -                      0, -                      get_elt(elts, count - 1), -                      get_elt(elts, 0 )); -      } -      break; - -   case PIPE_PRIM_LINE_STRIP: -      for (i = 1; i < count; i++) { -         vcache_line( vcache, -                      i == 1, -                      get_elt(elts, i - 1), -                      get_elt(elts, i )); -      } -      break; - -   case PIPE_PRIM_TRIANGLES: -      if (unfilled) { -         for (i = 0; i+2 < count; i += 3) { -            vcache_ef_triangle( vcache, -                                1,  -                                ~0, -                                get_elt(elts, i + 0), -                                get_elt(elts, i + 1), -                                get_elt(elts, i + 2 )); -         } -      }  -      else { -         for (i = 0; i+2 < count; i += 3) { -            vcache_triangle( vcache, -                             get_elt(elts, i + 0), -                             get_elt(elts, i + 1), -                             get_elt(elts, i + 2 )); -         } -      } -      break; - -   case PIPE_PRIM_TRIANGLE_STRIP: -      if (flatfirst) { -         for (i = 0; i+2 < count; i++) { -            if (i & 1) { -               vcache_triangle( vcache, -                                get_elt(elts, i + 0), -                                get_elt(elts, i + 2), -                                get_elt(elts, i + 1 )); -            } -            else { -               vcache_triangle( vcache, -                                get_elt(elts, i + 0), -                                get_elt(elts, i + 1), -                                get_elt(elts, i + 2 )); -            } -         } -      } -      else { -         for (i = 0; i+2 < count; i++) { -            if (i & 1) { -               vcache_triangle( vcache, -                                get_elt(elts, i + 1), -                                get_elt(elts, i + 0), -                                get_elt(elts, i + 2 )); -            } -            else { -               vcache_triangle( vcache, -                                get_elt(elts, i + 0), -                                get_elt(elts, i + 1), -                                get_elt(elts, i + 2 )); -            } -         } -      } -      break; - -   case PIPE_PRIM_TRIANGLE_FAN: -      if (count >= 3) { -         if (flatfirst) { -            for (i = 0; i+2 < count; i++) { -               vcache_triangle( vcache, -                                get_elt(elts, i + 1), -                                get_elt(elts, i + 2), -                                get_elt(elts, 0 )); -            } -         } -         else { -            for (i = 0; i+2 < count; i++) { -               vcache_triangle( vcache, -                                get_elt(elts, 0), -                                get_elt(elts, i + 1), -                                get_elt(elts, i + 2 )); -            } -         } -      } -      break; - - -   case PIPE_PRIM_QUADS: -      if (unfilled) { -	 for (i = 0; i+3 < count; i += 4) { -	    vcache_ef_quad( vcache, -                            get_elt(elts, i + 0), -                            get_elt(elts, i + 1), -                            get_elt(elts, i + 2), -                            get_elt(elts, i + 3)); -	 } -      } -      else { -	 for (i = 0; i+3 < count; i += 4) { -	    vcache_quad( vcache, -                         get_elt(elts, i + 0), -                         get_elt(elts, i + 1), -                         get_elt(elts, i + 2), -                         get_elt(elts, i + 3)); -	 } -      } -      break; - -   case PIPE_PRIM_QUAD_STRIP: -      if (unfilled) { -	 for (i = 0; i+3 < count; i += 2) { -	    vcache_ef_quad( vcache, -                            get_elt(elts, i + 2), -                            get_elt(elts, i + 0), -                            get_elt(elts, i + 1), -                            get_elt(elts, i + 3)); -	 } -      } -      else { -	 for (i = 0; i+3 < count; i += 2) { -	    vcache_quad( vcache, -                         get_elt(elts, i + 2), -                         get_elt(elts, i + 0), -                         get_elt(elts, i + 1), -                         get_elt(elts, i + 3)); -	 } -      } -      break; - -   case PIPE_PRIM_POLYGON: -      if (unfilled) { -         /* These bitflags look a little odd because we submit the -          * vertices as (1,2,0) to satisfy flatshade requirements.   -          */ -         const unsigned edge_first  = (1<<2); -         const unsigned edge_middle = (1<<0); -         const unsigned edge_last   = (1<<1); - -	 for (i = 0; i+2 < count; i++) { -            unsigned ef_mask = edge_middle; +   vcache_triangle_flags( vcache,  +                          omitEdge2,  +                          i1, i2, i3 ); +} -            if (i == 0) -               ef_mask |= edge_first; +/* At least for now, we're back to using a template include file for + * this.  The two paths aren't too different though - it may be + * possible to reunify them. + */ +#define TRIANGLE(vc,flags,i0,i1,i2) vcache_triangle_flags(vc,flags,i0,i1,i2) +#define QUAD(vc,i0,i1,i2,i3)        vcache_ef_quad(vc,i0,i1,i2,i3) +#define LINE(vc,flags,i0,i1)        vcache_line_flags(vc,flags,i0,i1) +#define POINT(vc,i0)                vcache_point(vc,i0) +#define FUNC vcache_run_extras +#include "draw_pt_vcache_tmp.h" -            if (i + 3 == count) -	       ef_mask |= edge_last; +#define TRIANGLE(vc,flags,i0,i1,i2) vcache_triangle(vc,i0,i1,i2) +#define QUAD(vc,i0,i1,i2,i3)        vcache_quad(vc,i0,i1,i2,i3) +#define LINE(vc,flags,i0,i1)        vcache_line(vc,i0,i1) +#define POINT(vc,i0)                vcache_point(vc,i0) +#define FUNC vcache_run +#include "draw_pt_vcache_tmp.h" -	    vcache_ef_triangle( vcache, -                                i == 0, -                                ef_mask, -                                get_elt(elts, i + 1), -                                get_elt(elts, i + 2), -                                get_elt(elts, 0)); -	 } -      } -      else { -	 for (i = 0; i+2 < count; i++) { -	    vcache_triangle( vcache, -                             get_elt(elts, i + 1), -                             get_elt(elts, i + 2), -                             get_elt(elts, 0)); -	 } -      } -      break; - -   default: -      assert(0); -      break; -   } -    -   vcache_flush( vcache ); -} @@ -448,23 +221,25 @@ static unsigned reduced_prim[PIPE_PRIM_POLYGON + 1] = {  static void vcache_prepare( struct draw_pt_front_end *frontend,                              unsigned prim, -                            struct draw_pt_middle_end *middle ) +                            struct draw_pt_middle_end *middle, +			    unsigned opt )  {     struct vcache_frontend *vcache = (struct vcache_frontend *)frontend; -/* -   if (vcache->draw->rasterizer->flatshade_first) -      vcache->base.run = vcache_run_pv0; -   else -      vcache->base.run = vcache_run_pv2; -*/  +   if (opt & PT_PIPELINE) +   { +      vcache->base.run = vcache_run_extras; +   } +   else  +   { +      vcache->base.run = vcache_run; +   } -   vcache->base.run = vcache_run;     vcache->input_prim = prim;     vcache->output_prim = reduced_prim[prim];     vcache->middle = middle; -   middle->prepare( middle, vcache->output_prim ); +   middle->prepare( middle, vcache->output_prim, opt );  } @@ -486,6 +261,8 @@ static void vcache_destroy( struct draw_pt_front_end *frontend )  struct draw_pt_front_end *draw_pt_vcache( struct draw_context *draw )  {     struct vcache_frontend *vcache = CALLOC_STRUCT( vcache_frontend ); +   if (vcache == NULL) +      return NULL;     vcache->base.prepare = vcache_prepare;     vcache->base.run     = NULL; diff --git a/src/gallium/auxiliary/draw/draw_pt_vcache_tmp.h b/src/gallium/auxiliary/draw/draw_pt_vcache_tmp.h new file mode 100644 index 0000000000..cf9f394aa3 --- /dev/null +++ b/src/gallium/auxiliary/draw/draw_pt_vcache_tmp.h @@ -0,0 +1,174 @@ + + +static void FUNC( struct draw_pt_front_end *frontend,  +                  pt_elt_func get_elt, +                  const void *elts, +                  unsigned count ) +{ +   struct vcache_frontend *vcache = (struct vcache_frontend *)frontend; +   struct draw_context *draw = vcache->draw; + +   boolean flatfirst = (draw->rasterizer->flatshade &&  +                        draw->rasterizer->flatshade_first); +   unsigned i, flags; + + +   switch (vcache->input_prim) { +   case PIPE_PRIM_POINTS: +      for (i = 0; i < count; i ++) { +	 POINT( vcache, +                get_elt(elts, i + 0) ); +      } +      break; + +   case PIPE_PRIM_LINES: +      for (i = 0; i+1 < count; i += 2) { +         LINE( vcache,  +               DRAW_PIPE_RESET_STIPPLE, +               get_elt(elts, i + 0), +               get_elt(elts, i + 1)); +      } +      break; + +   case PIPE_PRIM_LINE_LOOP:   +      if (count >= 2) { +         flags = DRAW_PIPE_RESET_STIPPLE; + +         for (i = 1; i < count; i++, flags = 0) { +            LINE( vcache,  +                  flags, +                  get_elt(elts, i - 1), +                  get_elt(elts, i )); +         } + +	 LINE( vcache,  +               flags, +               get_elt(elts, i - 1), +               get_elt(elts, 0 )); +      } +      break; + +   case PIPE_PRIM_LINE_STRIP: +      flags = DRAW_PIPE_RESET_STIPPLE; +      for (i = 1; i < count; i++, flags = 0) { +         LINE( vcache,  +               flags, +               get_elt(elts, i - 1), +               get_elt(elts, i )); +      } +      break; + +   case PIPE_PRIM_TRIANGLES: +      for (i = 0; i+2 < count; i += 3) { +         TRIANGLE( vcache, +                   DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,  +                   get_elt(elts, i + 0), +                   get_elt(elts, i + 1), +                   get_elt(elts, i + 2 )); +      } +      break; + +   case PIPE_PRIM_TRIANGLE_STRIP: +      if (flatfirst) { +         for (i = 0; i+2 < count; i++) { +            TRIANGLE( vcache, +                      DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,  +                      get_elt(elts, i + 0), +                      get_elt(elts, i + 1 + (i&1)), +                      get_elt(elts, i + 2 - (i&1))); +         } +      } +      else { +         for (i = 0; i+2 < count; i++) { +            TRIANGLE( vcache, +                      DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,  +                      get_elt(elts, i + 0 + (i&1)), +                      get_elt(elts, i + 1 - (i&1)), +                      get_elt(elts, i + 2 )); +         } +      } +      break; + +   case PIPE_PRIM_TRIANGLE_FAN: +      if (count >= 3) { +         if (flatfirst) { +            for (i = 0; i+2 < count; i++) { +               TRIANGLE( vcache, +                         DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,  +                         get_elt(elts, i + 1), +                         get_elt(elts, i + 2), +                         get_elt(elts, 0 )); +            } +         } +         else { +            for (i = 0; i+2 < count; i++) { +               TRIANGLE( vcache, +                         DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,  +                         get_elt(elts, 0), +                         get_elt(elts, i + 1), +                         get_elt(elts, i + 2 )); +            } +         } +      } +      break; + + +   case PIPE_PRIM_QUADS: +      for (i = 0; i+3 < count; i += 4) { +         QUAD( vcache, +               get_elt(elts, i + 0), +               get_elt(elts, i + 1), +               get_elt(elts, i + 2), +               get_elt(elts, i + 3)); +      } +      break; + +   case PIPE_PRIM_QUAD_STRIP: +      for (i = 0; i+3 < count; i += 2) { +         QUAD( vcache, +               get_elt(elts, i + 2), +               get_elt(elts, i + 0), +               get_elt(elts, i + 1), +               get_elt(elts, i + 3)); +      } +      break; + +   case PIPE_PRIM_POLYGON: +      { +         /* These bitflags look a little odd because we submit the +          * vertices as (1,2,0) to satisfy flatshade requirements.   +          */ +         const unsigned edge_first  = DRAW_PIPE_EDGE_FLAG_2; +         const unsigned edge_middle = DRAW_PIPE_EDGE_FLAG_0; +         const unsigned edge_last   = DRAW_PIPE_EDGE_FLAG_1; + +         flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle; + +	 for (i = 0; i+2 < count; i++, flags = edge_middle) { + +            if (i + 3 == count) +               flags |= edge_last; + +	    TRIANGLE( vcache, +                      flags, +                      get_elt(elts, i + 1), +                      get_elt(elts, i + 2), +                      get_elt(elts, 0)); +	 } +      } +      break; + +   default: +      assert(0); +      break; +   } +    +   vcache_flush( vcache ); +} + + +#undef TRIANGLE +#undef QUAD +#undef POINT +#undef LINE +#undef FUNC diff --git a/src/gallium/auxiliary/draw/draw_vertex.c b/src/gallium/auxiliary/draw/draw_vertex.c index 970adc95e7..1446f785c5 100644 --- a/src/gallium/auxiliary/draw/draw_vertex.c +++ b/src/gallium/auxiliary/draw/draw_vertex.c @@ -52,9 +52,6 @@ draw_compute_vertex_size(struct vertex_info *vinfo)        switch (vinfo->emit[i]) {        case EMIT_OMIT:           break; -      case EMIT_HEADER: -         vinfo->size += sizeof(struct vertex_header) / 4; -         break;        case EMIT_4UB:           /* fall-through */        case EMIT_1F_PSIZE: @@ -71,12 +68,62 @@ draw_compute_vertex_size(struct vertex_info *vinfo)        case EMIT_4F:           vinfo->size += 4;           break; -      case EMIT_ALL: -         /* fall-through */        default:           assert(0);        }     } +} + + +void +draw_dump_emitted_vertex(const struct vertex_info *vinfo, const uint8_t *data) +{ +   unsigned i, j; -   assert(vinfo->size * 4 <= MAX_VERTEX_SIZE); +   for (i = 0; i < vinfo->num_attribs; i++) { +      j = vinfo->src_index[i]; +      switch (vinfo->emit[i]) { +      case EMIT_OMIT: +         debug_printf("EMIT_OMIT:"); +         break; +      case EMIT_1F: +         debug_printf("EMIT_1F:\t"); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         break; +      case EMIT_1F_PSIZE: +         debug_printf("EMIT_1F_PSIZE:\t"); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         break; +      case EMIT_2F: +         debug_printf("EMIT_2F:\t"); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         break; +      case EMIT_3F: +         debug_printf("EMIT_3F:\t"); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         data += sizeof(float); +         break; +      case EMIT_4F: +         debug_printf("EMIT_4F:\t"); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         debug_printf("%f ", *(float *)data); data += sizeof(float); +         break; +      case EMIT_4UB: +         debug_printf("EMIT_4UB:\t"); +         debug_printf("%u ", *data++); +         debug_printf("%u ", *data++); +         debug_printf("%u ", *data++); +         debug_printf("%u ", *data++); +         break; +      default: +         assert(0); +      } +      debug_printf("\n"); +   } +   debug_printf("\n");  } diff --git a/src/gallium/auxiliary/draw/draw_vertex.h b/src/gallium/auxiliary/draw/draw_vertex.h index abd2017ed3..6d8bac5138 100644 --- a/src/gallium/auxiliary/draw/draw_vertex.h +++ b/src/gallium/auxiliary/draw/draw_vertex.h @@ -47,8 +47,6 @@   */  enum attrib_emit {     EMIT_OMIT,      /**< don't emit the attribute */ -   EMIT_ALL,       /**< emit whole post-xform vertex, w/ header */ -   EMIT_HEADER,    /**< emit vertex_header struct (XXX temp?) */     EMIT_1F,     EMIT_1F_PSIZE,  /**< insert constant point size */     EMIT_2F, @@ -108,5 +106,7 @@ draw_emit_vertex_attr(struct vertex_info *vinfo,  extern void draw_compute_vertex_size(struct vertex_info *vinfo); +void draw_dump_emitted_vertex(const struct vertex_info *vinfo,  +                              const uint8_t *data);  #endif /* DRAW_VERTEX_H */ diff --git a/src/gallium/auxiliary/draw/draw_vertex_cache.c b/src/gallium/auxiliary/draw/draw_vertex_cache.c deleted file mode 100644 index c0248979e2..0000000000 --- a/src/gallium/auxiliary/draw/draw_vertex_cache.c +++ /dev/null @@ -1,208 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: -  *   Keith Whitwell <keith@tungstengraphics.com> -  */ - -#include "pipe/p_util.h" -#include "draw_private.h" -#include "draw_context.h" - - -void draw_vertex_cache_invalidate( struct draw_context *draw ) -{ -   assert(draw->pq.queue_nr == 0); -   assert(draw->vs.queue_nr == 0); -   assert(draw->vcache.referenced == 0); - -   /* There's an error somewhere in the vcache code that requires this -    * memset.  The bug is exposed in q3demo demo001, but probably -    * elsewhere as well.  Will track it down later. -    */ -   memset(draw->vcache.idx, ~0, sizeof(draw->vcache.idx)); -} - - -/** - * Check if vertex is in cache, otherwise add it.  It won't go through - * VS yet, not until there is a flush operation or the VS queue fills up.   - * - * Note that cache entries are basically just two pointers: the first - * an index into the user's vertex arrays, the second a location in - * the vertex shader cache for the post-transformed vertex. - * - * \return pointer to location of (post-transformed) vertex header in the cache - */ -static struct vertex_header *get_vertex( struct draw_context *draw, -					 unsigned i ) -{ -   unsigned slot = (i + (i>>5)) % VCACHE_SIZE; -    -   assert(slot < 32); /* so we don't exceed the bitfield size below */ - -   if (draw->vcache.referenced & (1<<slot)) -   { -      /* Cache hit? -       */ -      if (draw->vcache.idx[slot].in == i) { -//	 _mesa_printf("HIT %d %d\n", slot, i); -	 assert(draw->vcache.idx[slot].out < draw->vs.queue_nr); -	 return draw->vs.queue[draw->vcache.idx[slot].out].vertex; -      } - -      /* Otherwise a collision -       */ -      slot = VCACHE_SIZE + draw->vcache.overflow++; -//      _mesa_printf("XXX %d --> %d\n", i, slot); -   } - -   /* Deal with the cache miss:  -    */ -   { -      unsigned out; -       -      assert(slot < Elements(draw->vcache.idx)); - -//      _mesa_printf("NEW %d %d\n", slot, i); -      draw->vcache.idx[slot].in = i; -      draw->vcache.idx[slot].out = out = draw->vs.queue_nr++; -      draw->vcache.referenced |= (1 << slot); - - -      /* Add to vertex shader queue: -       */ -      assert(draw->vs.queue_nr < VS_QUEUE_LENGTH); - -      draw->vs.queue[out].elt = i; -      draw->vs.queue[out].vertex->clipmask = 0; -      draw->vs.queue[out].vertex->edgeflag = draw_get_edgeflag(draw, i); -      draw->vs.queue[out].vertex->pad = 0; -      draw->vs.queue[out].vertex->vertex_id = UNDEFINED_VERTEX_ID; - -      /* Need to set the vertex's edge flag here.  If we're being called -       * by do_ef_triangle(), that function needs edge flag info! -       */ - -      return draw->vs.queue[draw->vcache.idx[slot].out].vertex; -   } -} - - -static struct vertex_header *get_uint_elt_vertex( struct draw_context *draw, -                                                  unsigned i ) -{ -   const unsigned *elts = (const unsigned *) draw->user.elts; -   return get_vertex( draw, elts[i] ); -} - - -static struct vertex_header *get_ushort_elt_vertex( struct draw_context *draw, -						    unsigned i ) -{ -   const ushort *elts = (const ushort *) draw->user.elts; -   return get_vertex( draw, elts[i] ); -} - - -static struct vertex_header *get_ubyte_elt_vertex( struct draw_context *draw, -                                                   unsigned i ) -{ -   const ubyte *elts = (const ubyte *) draw->user.elts; -   return get_vertex( draw, elts[i] ); -} - - -void draw_vertex_cache_reset_vertex_ids( struct draw_context *draw ) -{ -   unsigned i; - -   for (i = 0; i < draw->vs.post_nr; i++) -      draw->vs.queue[i].vertex->vertex_id = UNDEFINED_VERTEX_ID; -} - - -void draw_vertex_cache_unreference( struct draw_context *draw ) -{ -   draw->vcache.referenced = 0; -   draw->vcache.overflow = 0; -} - - -int draw_vertex_cache_check_space( struct draw_context *draw, -				   unsigned nr_verts ) -{ -   if (draw->vcache.overflow + nr_verts < VCACHE_OVERFLOW) { -      /* The vs queue is sized so that this can never happen: -       */ -      assert(draw->vs.queue_nr + nr_verts < VS_QUEUE_LENGTH); -      return TRUE; -   } -   else -      return FALSE; -} - - - -/** - * Tell the drawing context about the index/element buffer to use - * (ala glDrawElements) - * If no element buffer is to be used (i.e. glDrawArrays) then this - * should be called with eltSize=0 and elements=NULL. - * - * \param draw  the drawing context - * \param eltSize  size of each element (1, 2 or 4 bytes) - * \param elements  the element buffer ptr - */ -void -draw_set_mapped_element_buffer( struct draw_context *draw, -                                unsigned eltSize, void *elements ) -{ -//   draw_statechange( draw ); - -   /* choose the get_vertex() function to use */ -   switch (eltSize) { -   case 0: -      draw->vcache.get_vertex = get_vertex; -      break; -   case 1: -      draw->vcache.get_vertex = get_ubyte_elt_vertex; -      break; -   case 2: -      draw->vcache.get_vertex = get_ushort_elt_vertex; -      break; -   case 4: -      draw->vcache.get_vertex = get_uint_elt_vertex; -      break; -   default: -      assert(0); -   } -   draw->user.elts = elements; -   draw->user.eltSize = eltSize; -} - diff --git a/src/gallium/auxiliary/draw/draw_vertex_fetch.c b/src/gallium/auxiliary/draw/draw_vertex_fetch.c deleted file mode 100644 index 9041041006..0000000000 --- a/src/gallium/auxiliary/draw/draw_vertex_fetch.c +++ /dev/null @@ -1,528 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: -  *   Keith Whitwell <keith@tungstengraphics.com> -  */ - -#include "pipe/p_util.h" -#include "pipe/p_shader_tokens.h" -#include "draw_private.h" -#include "draw_context.h" - - -#define DRAW_DBG 0 - - -/** - * Fetch a float[4] vertex attribute from memory, doing format/type - * conversion as needed. - * - * This is probably needed/dupliocated elsewhere, eg format - * conversion, texture sampling etc. - */ -#define FETCH_ATTRIB( NAME, SZ, CVT )			\ -static void						\ -fetch_##NAME(const void *ptr, float *attrib)		\ -{							\ -   static const float defaults[4] = { 0,0,0,1 };	\ -   int i;						\ -							\ -   for (i = 0; i < SZ; i++) {				\ -      attrib[i] = CVT(i);                              \ -   }							\ -							\ -   for (; i < 4; i++) {					\ -      attrib[i] = defaults[i];				\ -   }							\ -} - -#define CVT_64_FLOAT(i)   (float) ((double *) ptr)[i] -#define CVT_32_FLOAT(i)   ((float *) ptr)[i] - -#define CVT_8_USCALED(i)  (float) ((unsigned char *) ptr)[i] -#define CVT_16_USCALED(i) (float) ((unsigned short *) ptr)[i] -#define CVT_32_USCALED(i) (float) ((unsigned int *) ptr)[i] - -#define CVT_8_SSCALED(i)  (float) ((char *) ptr)[i] -#define CVT_16_SSCALED(i) (float) ((short *) ptr)[i] -#define CVT_32_SSCALED(i) (float) ((int *) ptr)[i] - -#define CVT_8_UNORM(i)    (float) ((unsigned char *) ptr)[i] / 255.0f -#define CVT_16_UNORM(i)   (float) ((unsigned short *) ptr)[i] / 65535.0f -#define CVT_32_UNORM(i)   (float) ((unsigned int *) ptr)[i] / 4294967295.0f - -#define CVT_8_SNORM(i)    (float) ((char *) ptr)[i] / 127.0f -#define CVT_16_SNORM(i)   (float) ((short *) ptr)[i] / 32767.0f -#define CVT_32_SNORM(i)   (float) ((int *) ptr)[i] / 2147483647.0f - -FETCH_ATTRIB( R64G64B64A64_FLOAT,   4, CVT_64_FLOAT ) -FETCH_ATTRIB( R64G64B64_FLOAT,      3, CVT_64_FLOAT ) -FETCH_ATTRIB( R64G64_FLOAT,         2, CVT_64_FLOAT ) -FETCH_ATTRIB( R64_FLOAT,            1, CVT_64_FLOAT ) - -FETCH_ATTRIB( R32G32B32A32_FLOAT,   4, CVT_32_FLOAT ) -FETCH_ATTRIB( R32G32B32_FLOAT,      3, CVT_32_FLOAT ) -FETCH_ATTRIB( R32G32_FLOAT,         2, CVT_32_FLOAT ) -FETCH_ATTRIB( R32_FLOAT,            1, CVT_32_FLOAT ) - -FETCH_ATTRIB( R32G32B32A32_USCALED, 4, CVT_32_USCALED ) -FETCH_ATTRIB( R32G32B32_USCALED,    3, CVT_32_USCALED ) -FETCH_ATTRIB( R32G32_USCALED,       2, CVT_32_USCALED ) -FETCH_ATTRIB( R32_USCALED,          1, CVT_32_USCALED ) - -FETCH_ATTRIB( R32G32B32A32_SSCALED, 4, CVT_32_SSCALED ) -FETCH_ATTRIB( R32G32B32_SSCALED,    3, CVT_32_SSCALED ) -FETCH_ATTRIB( R32G32_SSCALED,       2, CVT_32_SSCALED ) -FETCH_ATTRIB( R32_SSCALED,          1, CVT_32_SSCALED ) - -FETCH_ATTRIB( R32G32B32A32_UNORM, 4, CVT_32_UNORM ) -FETCH_ATTRIB( R32G32B32_UNORM,    3, CVT_32_UNORM ) -FETCH_ATTRIB( R32G32_UNORM,       2, CVT_32_UNORM ) -FETCH_ATTRIB( R32_UNORM,          1, CVT_32_UNORM ) - -FETCH_ATTRIB( R32G32B32A32_SNORM, 4, CVT_32_SNORM ) -FETCH_ATTRIB( R32G32B32_SNORM,    3, CVT_32_SNORM ) -FETCH_ATTRIB( R32G32_SNORM,       2, CVT_32_SNORM ) -FETCH_ATTRIB( R32_SNORM,          1, CVT_32_SNORM ) - -FETCH_ATTRIB( R16G16B16A16_USCALED, 4, CVT_16_USCALED ) -FETCH_ATTRIB( R16G16B16_USCALED,    3, CVT_16_USCALED ) -FETCH_ATTRIB( R16G16_USCALED,       2, CVT_16_USCALED ) -FETCH_ATTRIB( R16_USCALED,          1, CVT_16_USCALED ) - -FETCH_ATTRIB( R16G16B16A16_SSCALED, 4, CVT_16_SSCALED ) -FETCH_ATTRIB( R16G16B16_SSCALED,    3, CVT_16_SSCALED ) -FETCH_ATTRIB( R16G16_SSCALED,       2, CVT_16_SSCALED ) -FETCH_ATTRIB( R16_SSCALED,          1, CVT_16_SSCALED ) - -FETCH_ATTRIB( R16G16B16A16_UNORM, 4, CVT_16_UNORM ) -FETCH_ATTRIB( R16G16B16_UNORM,    3, CVT_16_UNORM ) -FETCH_ATTRIB( R16G16_UNORM,       2, CVT_16_UNORM ) -FETCH_ATTRIB( R16_UNORM,          1, CVT_16_UNORM ) - -FETCH_ATTRIB( R16G16B16A16_SNORM, 4, CVT_16_SNORM ) -FETCH_ATTRIB( R16G16B16_SNORM,    3, CVT_16_SNORM ) -FETCH_ATTRIB( R16G16_SNORM,       2, CVT_16_SNORM ) -FETCH_ATTRIB( R16_SNORM,          1, CVT_16_SNORM ) - -FETCH_ATTRIB( R8G8B8A8_USCALED,   4, CVT_8_USCALED ) -FETCH_ATTRIB( R8G8B8_USCALED,     3, CVT_8_USCALED ) -FETCH_ATTRIB( R8G8_USCALED,       2, CVT_8_USCALED ) -FETCH_ATTRIB( R8_USCALED,         1, CVT_8_USCALED ) - -FETCH_ATTRIB( R8G8B8A8_SSCALED,  4, CVT_8_SSCALED ) -FETCH_ATTRIB( R8G8B8_SSCALED,    3, CVT_8_SSCALED ) -FETCH_ATTRIB( R8G8_SSCALED,      2, CVT_8_SSCALED ) -FETCH_ATTRIB( R8_SSCALED,        1, CVT_8_SSCALED ) - -FETCH_ATTRIB( R8G8B8A8_UNORM,  4, CVT_8_UNORM ) -FETCH_ATTRIB( R8G8B8_UNORM,    3, CVT_8_UNORM ) -FETCH_ATTRIB( R8G8_UNORM,      2, CVT_8_UNORM ) -FETCH_ATTRIB( R8_UNORM,        1, CVT_8_UNORM ) - -FETCH_ATTRIB( R8G8B8A8_SNORM,  4, CVT_8_SNORM ) -FETCH_ATTRIB( R8G8B8_SNORM,    3, CVT_8_SNORM ) -FETCH_ATTRIB( R8G8_SNORM,      2, CVT_8_SNORM ) -FETCH_ATTRIB( R8_SNORM,        1, CVT_8_SNORM ) - -FETCH_ATTRIB( A8R8G8B8_UNORM,       4, CVT_8_UNORM ) -//FETCH_ATTRIB( R8G8B8A8_UNORM,       4, CVT_8_UNORM ) - - - -static void -fetch_B8G8R8A8_UNORM(const void *ptr, float *attrib) -{ -   attrib[2] = CVT_8_UNORM(0); -   attrib[1] = CVT_8_UNORM(1); -   attrib[0] = CVT_8_UNORM(2); -   attrib[3] = CVT_8_UNORM(3); -} - - -fetch_func draw_get_fetch_func( enum pipe_format format ) -{ -#if 0 -   { -      char tmp[80]; -      pf_sprint_name(tmp, format); -      debug_printf("%s: %s\n", __FUNCTION__, tmp); -   } -#endif - -   switch (format) { -   case PIPE_FORMAT_R64_FLOAT: -      return fetch_R64_FLOAT; -   case PIPE_FORMAT_R64G64_FLOAT: -      return fetch_R64G64_FLOAT; -   case PIPE_FORMAT_R64G64B64_FLOAT: -      return fetch_R64G64B64_FLOAT; -   case PIPE_FORMAT_R64G64B64A64_FLOAT: -      return fetch_R64G64B64A64_FLOAT; - -   case PIPE_FORMAT_R32_FLOAT: -      return fetch_R32_FLOAT; -   case PIPE_FORMAT_R32G32_FLOAT: -      return fetch_R32G32_FLOAT; -   case PIPE_FORMAT_R32G32B32_FLOAT: -      return fetch_R32G32B32_FLOAT; -   case PIPE_FORMAT_R32G32B32A32_FLOAT: -      return fetch_R32G32B32A32_FLOAT; - -   case PIPE_FORMAT_R32_UNORM: -      return fetch_R32_UNORM; -   case PIPE_FORMAT_R32G32_UNORM: -      return fetch_R32G32_UNORM; -   case PIPE_FORMAT_R32G32B32_UNORM: -      return fetch_R32G32B32_UNORM; -   case PIPE_FORMAT_R32G32B32A32_UNORM: -      return fetch_R32G32B32A32_UNORM; - -   case PIPE_FORMAT_R32_USCALED: -      return fetch_R32_USCALED; -   case PIPE_FORMAT_R32G32_USCALED: -      return fetch_R32G32_USCALED; -   case PIPE_FORMAT_R32G32B32_USCALED: -      return fetch_R32G32B32_USCALED; -   case PIPE_FORMAT_R32G32B32A32_USCALED: -      return fetch_R32G32B32A32_USCALED; - -   case PIPE_FORMAT_R32_SNORM: -      return fetch_R32_SNORM; -   case PIPE_FORMAT_R32G32_SNORM: -      return fetch_R32G32_SNORM; -   case PIPE_FORMAT_R32G32B32_SNORM: -      return fetch_R32G32B32_SNORM; -   case PIPE_FORMAT_R32G32B32A32_SNORM: -      return fetch_R32G32B32A32_SNORM; - -   case PIPE_FORMAT_R32_SSCALED: -      return fetch_R32_SSCALED; -   case PIPE_FORMAT_R32G32_SSCALED: -      return fetch_R32G32_SSCALED; -   case PIPE_FORMAT_R32G32B32_SSCALED: -      return fetch_R32G32B32_SSCALED; -   case PIPE_FORMAT_R32G32B32A32_SSCALED: -      return fetch_R32G32B32A32_SSCALED; - -   case PIPE_FORMAT_R16_UNORM: -      return fetch_R16_UNORM; -   case PIPE_FORMAT_R16G16_UNORM: -      return fetch_R16G16_UNORM; -   case PIPE_FORMAT_R16G16B16_UNORM: -      return fetch_R16G16B16_UNORM; -   case PIPE_FORMAT_R16G16B16A16_UNORM: -      return fetch_R16G16B16A16_UNORM; - -   case PIPE_FORMAT_R16_USCALED: -      return fetch_R16_USCALED; -   case PIPE_FORMAT_R16G16_USCALED: -      return fetch_R16G16_USCALED; -   case PIPE_FORMAT_R16G16B16_USCALED: -      return fetch_R16G16B16_USCALED; -   case PIPE_FORMAT_R16G16B16A16_USCALED: -      return fetch_R16G16B16A16_USCALED; - -   case PIPE_FORMAT_R16_SNORM: -      return fetch_R16_SNORM; -   case PIPE_FORMAT_R16G16_SNORM: -      return fetch_R16G16_SNORM; -   case PIPE_FORMAT_R16G16B16_SNORM: -      return fetch_R16G16B16_SNORM; -   case PIPE_FORMAT_R16G16B16A16_SNORM: -      return fetch_R16G16B16A16_SNORM; - -   case PIPE_FORMAT_R16_SSCALED: -      return fetch_R16_SSCALED; -   case PIPE_FORMAT_R16G16_SSCALED: -      return fetch_R16G16_SSCALED; -   case PIPE_FORMAT_R16G16B16_SSCALED: -      return fetch_R16G16B16_SSCALED; -   case PIPE_FORMAT_R16G16B16A16_SSCALED: -      return fetch_R16G16B16A16_SSCALED; - -   case PIPE_FORMAT_R8_UNORM: -      return fetch_R8_UNORM; -   case PIPE_FORMAT_R8G8_UNORM: -      return fetch_R8G8_UNORM; -   case PIPE_FORMAT_R8G8B8_UNORM: -      return fetch_R8G8B8_UNORM; -   case PIPE_FORMAT_R8G8B8A8_UNORM: -      return fetch_R8G8B8A8_UNORM; - -   case PIPE_FORMAT_R8_USCALED: -      return fetch_R8_USCALED; -   case PIPE_FORMAT_R8G8_USCALED: -      return fetch_R8G8_USCALED; -   case PIPE_FORMAT_R8G8B8_USCALED: -      return fetch_R8G8B8_USCALED; -   case PIPE_FORMAT_R8G8B8A8_USCALED: -      return fetch_R8G8B8A8_USCALED; - -   case PIPE_FORMAT_R8_SNORM: -      return fetch_R8_SNORM; -   case PIPE_FORMAT_R8G8_SNORM: -      return fetch_R8G8_SNORM; -   case PIPE_FORMAT_R8G8B8_SNORM: -      return fetch_R8G8B8_SNORM; -   case PIPE_FORMAT_R8G8B8A8_SNORM: -      return fetch_R8G8B8A8_SNORM; - -   case PIPE_FORMAT_R8_SSCALED: -      return fetch_R8_SSCALED; -   case PIPE_FORMAT_R8G8_SSCALED: -      return fetch_R8G8_SSCALED; -   case PIPE_FORMAT_R8G8B8_SSCALED: -      return fetch_R8G8B8_SSCALED; -   case PIPE_FORMAT_R8G8B8A8_SSCALED: -      return fetch_R8G8B8A8_SSCALED; - -   case PIPE_FORMAT_A8R8G8B8_UNORM: -      return fetch_A8R8G8B8_UNORM; - - -   case PIPE_FORMAT_B8G8R8A8_UNORM: -      return fetch_B8G8R8A8_UNORM; - -   case 0: -      return NULL;		/* not sure why this is needed */ - -   default: -      /* This can get hit because draw-state-validation is too eager, -         and can jump in here validating stuff before the state tracker has set -         up everything. -      */ -      /* assert(0); */ -      return NULL; -   } -} - - -static void  -transpose_4x4( float *out, const float *in ) -{ -   /* This can be achieved in 12 sse instructions, plus the final -    * stores I guess.  This is probably a bit more than that - maybe -    * 32 or so? -    */ -   out[0] = in[0];  out[1] = in[4];  out[2] = in[8];   out[3] = in[12]; -   out[4] = in[1];  out[5] = in[5];  out[6] = in[9];   out[7] = in[13]; -   out[8] = in[2];  out[9] = in[6];  out[10] = in[10]; out[11] = in[14]; -   out[12] = in[3]; out[13] = in[7]; out[14] = in[11]; out[15] = in[15]; -} - - - -static void fetch_xyz_rgb( struct draw_context *draw, -			   struct tgsi_exec_machine *machine, -			   const unsigned *elts, -			   unsigned count ) -{ -   const unsigned *pitch   = draw->vertex_fetch.pitch; -   const ubyte **src       = draw->vertex_fetch.src_ptr; -   int i; - -   assert(count <= 4); - -//   debug_printf("%s\n", __FUNCTION__); - -   /* loop over vertex attributes (vertex shader inputs) -    */ - -   for (i = 0; i < 4; i++) { -      { -	 const float *in = (const float *)(src[0] + elts[i] * pitch[0]); -	 float *out = &machine->Inputs[0].xyzw[0].f[i]; -	 out[0] = in[0]; -	 out[4] = in[1]; -	 out[8] = in[2]; - 	 out[12] = 1.0f; -      } - -      { -	 const float *in = (const float *)(src[1] + elts[i] * pitch[1]); -	 float *out = &machine->Inputs[1].xyzw[0].f[i]; -	 out[0] = in[0]; -	 out[4] = in[1]; -	 out[8] = in[2]; - 	 out[12] = 1.0f; -      } -   } -} - - - - -static void fetch_xyz_rgb_st( struct draw_context *draw, -			      struct tgsi_exec_machine *machine, -			      const unsigned *elts, -			      unsigned count ) -{ -   const unsigned *pitch   = draw->vertex_fetch.pitch; -   const ubyte **src       = draw->vertex_fetch.src_ptr; -   int i; - -   assert(count <= 4); - -   /* loop over vertex attributes (vertex shader inputs) -    */ - -   for (i = 0; i < 4; i++) { -      { -	 const float *in = (const float *)(src[0] + elts[i] * pitch[0]); -	 float *out = &machine->Inputs[0].xyzw[0].f[i]; -	 out[0] = in[0]; -	 out[4] = in[1]; -	 out[8] = in[2]; - 	 out[12] = 1.0f; -      } - -      { -	 const float *in = (const float *)(src[1] + elts[i] * pitch[1]); -	 float *out = &machine->Inputs[1].xyzw[0].f[i]; -	 out[0] = in[0]; -	 out[4] = in[1]; -	 out[8] = in[2]; - 	 out[12] = 1.0f; -      } - -      { -	 const float *in = (const float *)(src[2] + elts[i] * pitch[2]); -	 float *out = &machine->Inputs[2].xyzw[0].f[i]; -	 out[0] = in[0]; -	 out[4] = in[1]; -	 out[8] = 0.0f; - 	 out[12] = 1.0f; -      } -   } -} - - - - -/** - * Fetch vertex attributes for 'count' vertices. - */ -static void generic_vertex_fetch( struct draw_context *draw, -				  struct tgsi_exec_machine *machine, -				  const unsigned *elts, -				  unsigned count ) -{ -   unsigned nr_attrs = draw->vertex_fetch.nr_attrs; -   unsigned attr; - -   assert(count <= 4); - -//   debug_printf("%s %d\n", __FUNCTION__, count); - -   /* loop over vertex attributes (vertex shader inputs) -    */ -   for (attr = 0; attr < nr_attrs; attr++) { - -      const unsigned pitch   = draw->vertex_fetch.pitch[attr]; -      const ubyte *src = draw->vertex_fetch.src_ptr[attr]; -      const fetch_func fetch = draw->vertex_fetch.fetch[attr]; -      unsigned i; -      float p[4][4]; - - -      /* Fetch four attributes for four vertices.   -       *  -       * Could fetch directly into AOS format, but this is meant to be -       * a prototype for an sse implementation, which would have -       * difficulties doing that. -       */ -      for (i = 0; i < count; i++)  -	 fetch( src + elts[i] * pitch, p[i] ); - -      /* Be nice and zero out any missing vertices:  -       */ -      for ( ; i < 4; i++)  -	 p[i][0] = p[i][1] = p[i][2] = p[i][3] = 0; -       -      /* Transpose/swizzle into sse-friendly format.  Currently -       * assuming that all vertex shader inputs are float[4], but this -       * isn't true -- if the vertex shader only wants tex0.xy, we -       * could optimize for that. -       * -       * To do so fully without codegen would probably require an -       * excessive number of fetch functions, but we could at least -       * minimize the transpose step: -       */ -      transpose_4x4( (float *)&machine->Inputs[attr].xyzw[0].f[0], (float *)p ); -   } -} - - -			        -void draw_update_vertex_fetch( struct draw_context *draw ) -{ -   unsigned nr_attrs, i; - -//   debug_printf("%s\n", __FUNCTION__); -    -   /* this may happend during context init */ -   if (!draw->vertex_shader) -      return; - -   nr_attrs = draw->vertex_shader->info.num_inputs; - -   for (i = 0; i < nr_attrs; i++) { -      unsigned buf = draw->vertex_element[i].vertex_buffer_index; -      enum pipe_format format  = draw->vertex_element[i].src_format; - -      draw->vertex_fetch.src_ptr[i] = (const ubyte *) draw->user.vbuffer[buf] +  -						       draw->vertex_buffer[buf].buffer_offset +  -						       draw->vertex_element[i].src_offset; - -      draw->vertex_fetch.pitch[i] = draw->vertex_buffer[buf].pitch; -      draw->vertex_fetch.fetch[i] = draw_get_fetch_func( format ); -   } - -   draw->vertex_fetch.nr_attrs = nr_attrs; - -   draw->vertex_fetch.fetch_func = generic_vertex_fetch; - -   switch (nr_attrs) { -   case 2: -      if (draw->vertex_element[0].src_format == PIPE_FORMAT_R32G32B32_FLOAT && -	  draw->vertex_element[1].src_format == PIPE_FORMAT_R32G32B32_FLOAT) -	 draw->vertex_fetch.fetch_func = fetch_xyz_rgb; -      break; -   case 3: -      if (draw->vertex_element[0].src_format == PIPE_FORMAT_R32G32B32_FLOAT && -	  draw->vertex_element[1].src_format == PIPE_FORMAT_R32G32B32_FLOAT && -	  draw->vertex_element[2].src_format == PIPE_FORMAT_R32G32_FLOAT) -	 draw->vertex_fetch.fetch_func = fetch_xyz_rgb_st; -      break; -   default: -      break; -   } - -} diff --git a/src/gallium/auxiliary/draw/draw_vf.c b/src/gallium/auxiliary/draw/draw_vf.c deleted file mode 100644 index 7bb34ace7a..0000000000 --- a/src/gallium/auxiliary/draw/draw_vf.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright 2003 Tungsten Graphics, 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 - * on the rights to use, copy, modify, merge, publish, distribute, sub - * license, and/or sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL - * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: - *    Keith Whitwell <keithw@tungstengraphics.com> - */ - - -#include <stddef.h> - -#include "pipe/p_compiler.h" -#include "pipe/p_util.h" -#include "rtasm/rtasm_execmem.h" - -#include "draw_vf.h" - - -#define DRAW_VF_DBG 0 - - -static boolean match_fastpath( struct draw_vertex_fetch *vf, -				 const struct draw_vf_fastpath *fp) -{ -   unsigned j; - -   if (vf->attr_count != fp->attr_count)  -      return FALSE; - -   for (j = 0; j < vf->attr_count; j++)  -      if (vf->attr[j].format != fp->attr[j].format || -	  vf->attr[j].inputsize != fp->attr[j].size || -	  vf->attr[j].vertoffset != fp->attr[j].offset)  -	 return FALSE; -       -   if (fp->match_strides) { -      if (vf->vertex_stride != fp->vertex_stride) -	 return FALSE; - -      for (j = 0; j < vf->attr_count; j++)  -	 if (vf->attr[j].inputstride != fp->attr[j].stride)  -	    return FALSE; -   } -    -   return TRUE; -} - -static boolean search_fastpath_emit( struct draw_vertex_fetch *vf ) -{ -   struct draw_vf_fastpath *fp = vf->fastpath; - -   for ( ; fp ; fp = fp->next) { -      if (match_fastpath(vf, fp)) { -         vf->emit = fp->func; -	 return TRUE; -      } -   } - -   return FALSE; -} - -void draw_vf_register_fastpath( struct draw_vertex_fetch *vf, -			     boolean match_strides ) -{ -   struct draw_vf_fastpath *fastpath = CALLOC_STRUCT(draw_vf_fastpath); -   unsigned i; - -   fastpath->vertex_stride = vf->vertex_stride; -   fastpath->attr_count = vf->attr_count; -   fastpath->match_strides = match_strides; -   fastpath->func = vf->emit; -   fastpath->attr = (struct draw_vf_attr_type *) -      MALLOC(vf->attr_count * sizeof(fastpath->attr[0])); - -   for (i = 0; i < vf->attr_count; i++) { -      fastpath->attr[i].format = vf->attr[i].format; -      fastpath->attr[i].stride = vf->attr[i].inputstride; -      fastpath->attr[i].size = vf->attr[i].inputsize; -      fastpath->attr[i].offset = vf->attr[i].vertoffset; -   } - -   fastpath->next = vf->fastpath; -   vf->fastpath = fastpath; -} - - - - -/*********************************************************************** - * Build codegen functions or return generic ones: - */ -static void choose_emit_func( struct draw_vertex_fetch *vf,  -			      unsigned count,  -			      uint8_t *dest) -{ -   vf->emit = NULL; -    -   /* Does this match an existing (hardwired, codegen or known-bad) -    * fastpath? -    */ -   if (search_fastpath_emit(vf)) { -      /* Use this result.  If it is null, then it is already known -       * that the current state will fail for codegen and there is no -       * point trying again. -       */ -   } -   else if (vf->codegen_emit) { -      vf->codegen_emit( vf ); -   } - -   if (!vf->emit) { -      draw_vf_generate_hardwired_emit(vf); -   } - -   /* Otherwise use the generic version: -    */ -   if (!vf->emit) -      vf->emit = draw_vf_generic_emit; - -   vf->emit( vf, count, dest ); -} - - - - - -/*********************************************************************** - * Public entrypoints, mostly dispatch to the above: - */ - - - -static unsigned  -draw_vf_set_vertex_attributes( struct draw_vertex_fetch *vf,  -                               const struct draw_vf_attr_map *map, -                               unsigned nr,  -                               unsigned vertex_stride ) -{ -   unsigned offset = 0; -   unsigned i, j; - -   assert(nr < PIPE_MAX_ATTRIBS); - -   for (j = 0, i = 0; i < nr; i++) { -      const unsigned format = map[i].format; -      if (format == DRAW_EMIT_PAD) { -#if (DRAW_VF_DBG) -	    debug_printf("%d: pad %d, offset %d\n", i,   -			 map[i].offset, offset);   -#endif - -	 offset += map[i].offset; - -      } -      else { -	 vf->attr[j].attrib = map[i].attrib; -	 vf->attr[j].format = format; -	 vf->attr[j].insert = draw_vf_format_info[format].insert; -	 vf->attr[j].vertattrsize = draw_vf_format_info[format].attrsize; -	 vf->attr[j].vertoffset = offset; -	 vf->attr[j].isconst = draw_vf_format_info[format].isconst; -	 if(vf->attr[j].isconst) -	    memcpy(vf->attr[j].data, &map[i].data, vf->attr[j].vertattrsize); -	  -#if (DRAW_VF_DBG) -	    debug_printf("%d: %s, offset %d\n", i,   -			 draw_vf_format_info[format].name, -			 vf->attr[j].vertoffset);    -#endif - -	 offset += draw_vf_format_info[format].attrsize; -	 j++; -      } -   } - -   vf->attr_count = j; -   vf->vertex_stride = vertex_stride ? vertex_stride : offset; -   vf->emit = choose_emit_func; - -   assert(vf->vertex_stride >= offset); -   return vf->vertex_stride; -} - - -void draw_vf_set_vertex_info( struct draw_vertex_fetch *vf,  -                              const struct vertex_info *vinfo, -                              float point_size ) -{ -   unsigned i, j, k; -   struct draw_vf_attr *a = vf->attr; -   struct draw_vf_attr_map attrs[PIPE_MAX_SHADER_INPUTS]; -   unsigned count = 0;  /* for debug/sanity */ -   unsigned nr_attrs = 0; -    -   for (i = 0; i < vinfo->num_attribs; i++) { -      j = vinfo->src_index[i]; -      switch (vinfo->emit[i]) { -      case EMIT_OMIT: -         /* no-op */ -         break; -      case EMIT_ALL: { -         /* just copy the whole vertex as-is to the vbuf */ -	 unsigned s = vinfo->size; -         assert(i == 0); -         assert(j == 0); -         /* copy the vertex header */ -         /* XXX: we actually don't copy the header, just pad it */ -	 attrs[nr_attrs].attrib = 0; -	 attrs[nr_attrs].format = DRAW_EMIT_PAD; -	 attrs[nr_attrs].offset = offsetof(struct vertex_header, data); -	 s -= offsetof(struct vertex_header, data)/4; -         count += offsetof(struct vertex_header, data)/4; -	 nr_attrs++; -	 /* copy the vertex data */ -         for(k = 0; k < (s & ~0x3); k += 4) { -      	    attrs[nr_attrs].attrib = k/4; -      	    attrs[nr_attrs].format = DRAW_EMIT_4F; -      	    attrs[nr_attrs].offset = 0; -      	    nr_attrs++; -            count += 4; -         } -         /* tail */ -         /* XXX: actually, this shouldn't be needed */ - 	 attrs[nr_attrs].attrib = k/4; -  	 attrs[nr_attrs].offset = 0; -         switch(s & 0x3) { -         case 0: -            break; -         case 1: -      	    attrs[nr_attrs].format = DRAW_EMIT_1F; -      	    nr_attrs++; -            count += 1; -            break; -         case 2: -      	    attrs[nr_attrs].format = DRAW_EMIT_2F; -      	    nr_attrs++; -            count += 2; -            break; -         case 3: -      	    attrs[nr_attrs].format = DRAW_EMIT_3F; -      	    nr_attrs++; -            count += 3; -            break; -         } -         break; -      } -      case EMIT_HEADER: -         /* XXX emit new DRAW_EMIT_HEADER attribute??? */ -	 attrs[nr_attrs].attrib = 0; -	 attrs[nr_attrs].format = DRAW_EMIT_PAD; -	 attrs[nr_attrs].offset = offsetof(struct vertex_header, data); -         count += offsetof(struct vertex_header, data)/4; -	 nr_attrs++; -         break; -      case EMIT_1F: -	 attrs[nr_attrs].attrib = j; -	 attrs[nr_attrs].format = DRAW_EMIT_1F; -	 attrs[nr_attrs].offset = 0; -	 nr_attrs++; -         count++; -         break; -      case EMIT_1F_PSIZE: -	 attrs[nr_attrs].attrib = j; -	 attrs[nr_attrs].format = DRAW_EMIT_1F_CONST; -	 attrs[nr_attrs].offset = 0; -	 attrs[nr_attrs].data.f[0] = point_size; -	 nr_attrs++; -         count++; -         break; -      case EMIT_2F: -	 attrs[nr_attrs].attrib = j; -	 attrs[nr_attrs].format = DRAW_EMIT_2F; -	 attrs[nr_attrs].offset = 0; -	 nr_attrs++; -         count += 2; -         break; -      case EMIT_3F: -	 attrs[nr_attrs].attrib = j; -	 attrs[nr_attrs].format = DRAW_EMIT_3F; -	 attrs[nr_attrs].offset = 0; -	 nr_attrs++; -         count += 3; -         break; -      case EMIT_4F: -	 attrs[nr_attrs].attrib = j; -	 attrs[nr_attrs].format = DRAW_EMIT_4F; -	 attrs[nr_attrs].offset = 0; -	 nr_attrs++; -         count += 4; -         break; -      case EMIT_4UB: -	 attrs[nr_attrs].attrib = j; -	 attrs[nr_attrs].format = DRAW_EMIT_4UB_4F_BGRA; -	 attrs[nr_attrs].offset = 0; -	 nr_attrs++; -         count += 1; -         break; -      default: -         assert(0); -      } -   } -    -   assert(count == vinfo->size);   -    -   draw_vf_set_vertex_attributes(vf,  -                                 attrs,  -                                 nr_attrs,  -                                 vinfo->size * sizeof(float) ); - -   for (j = 0; j < vf->attr_count; j++) { -      a[j].inputsize = 4; -      a[j].do_insert = a[j].insert[4 - 1]; -      if(a[j].isconst) { -	 a[j].inputptr = a[j].data; -	 a[j].inputstride = 0; -      } -   } -} - - -#if 0 -/* Set attribute pointers, adjusted for start position: - */ -void draw_vf_set_sources( struct draw_vertex_fetch *vf, -		     GLvector4f * const sources[], -		     unsigned start ) -{ -   struct draw_vf_attr *a = vf->attr; -   unsigned j; -    -   for (j = 0; j < vf->attr_count; j++) { -      const GLvector4f *vptr = sources[a[j].attrib]; -       -      if ((a[j].inputstride != vptr->stride) || -	  (a[j].inputsize != vptr->size)) -	 vf->emit = choose_emit_func; -       -      a[j].inputstride = vptr->stride; -      a[j].inputsize = vptr->size; -      a[j].do_insert = a[j].insert[vptr->size - 1];  -      a[j].inputptr = ((uint8_t *)vptr->data) + start * vptr->stride; -   } -} -#endif - - -/** - * Emit a vertex to dest.   - */ -void draw_vf_emit_vertex( struct draw_vertex_fetch *vf, -                          struct vertex_header *vertex, -                          void *dest ) -{ -   struct draw_vf_attr *a = vf->attr; -   unsigned j; -    -   for (j = 0; j < vf->attr_count; j++) { -      if (!a[j].isconst) { -	 a[j].inputptr = (uint8_t *)&vertex->data[a[j].attrib][0]; -	 a[j].inputstride = 0; /* XXX: one-vertex-max ATM */ -      } -   } -    -   vf->emit( vf, 1, (uint8_t*) dest ); -} - - - -struct draw_vertex_fetch *draw_vf_create( void ) -{ -   struct draw_vertex_fetch *vf = CALLOC_STRUCT(draw_vertex_fetch); -   unsigned i; - -   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) -      vf->attr[i].vf = vf; - -   vf->identity[0] = 0.0; -   vf->identity[1] = 0.0; -   vf->identity[2] = 0.0; -   vf->identity[3] = 1.0; - -   vf->codegen_emit = NULL; - -#ifdef USE_SSE_ASM -   if (!GETENV("GALLIUM_NO_CODEGEN")) -      vf->codegen_emit = draw_vf_generate_sse_emit; -#endif - -   return vf; -} - - -void draw_vf_destroy( struct draw_vertex_fetch *vf ) -{ -   struct draw_vf_fastpath *fp, *tmp; - -   for (fp = vf->fastpath ; fp ; fp = tmp) { -      tmp = fp->next; -      FREE(fp->attr); - -      /* KW: At the moment, fp->func is constrained to be allocated by -       * rtasm_exec_alloc(), as the hardwired fastpaths in -       * t_vertex_generic.c are handled specially.  It would be nice -       * to unify them, but this probably won't change until this -       * module gets another overhaul. -       */ -      //rtasm_exec_free((void *) fp->func); -      FREE(fp); -   } -    -   vf->fastpath = NULL; -   FREE(vf); -} diff --git a/src/gallium/auxiliary/draw/draw_vf.h b/src/gallium/auxiliary/draw/draw_vf.h deleted file mode 100644 index 7555d1bd58..0000000000 --- a/src/gallium/auxiliary/draw/draw_vf.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2008 Tungsten Graphics, 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 - * on the rights to use, copy, modify, merge, publish, distribute, sub - * license, and/or sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL - * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -/** - * Vertex fetch/store/convert code.  This functionality is used in two places: - * 1. Vertex fetch/convert - to grab vertex data from incoming vertex - *    arrays and convert to format needed by vertex shaders. - * 2. Vertex store/emit - to convert simple float[][4] vertex attributes - *    (which is the organization used throughout the draw/prim pipeline) to - *    hardware-specific formats and emit into hardware vertex buffers. - * - * - * Authors: - *    Keith Whitwell <keithw@tungstengraphics.com> - */ - -#ifndef DRAW_VF_H -#define DRAW_VF_H - - -#include "pipe/p_compiler.h" -#include "pipe/p_state.h" - -#include "draw_vertex.h" -#include "draw_private.h" /* for vertex_header */ - - -enum draw_vf_attr_format { -   DRAW_EMIT_1F, -   DRAW_EMIT_2F, -   DRAW_EMIT_3F, -   DRAW_EMIT_4F, -   DRAW_EMIT_3F_XYW,			/**< for projective texture */ -   DRAW_EMIT_1UB_1F,			/**< for fog coordinate */ -   DRAW_EMIT_3UB_3F_RGB,		/**< for specular color */ -   DRAW_EMIT_3UB_3F_BGR,		/**< for specular color */ -   DRAW_EMIT_4UB_4F_RGBA,		/**< for color */ -   DRAW_EMIT_4UB_4F_BGRA,		/**< for color */ -   DRAW_EMIT_4UB_4F_ARGB,		/**< for color */ -   DRAW_EMIT_4UB_4F_ABGR,		/**< for color */ -   DRAW_EMIT_1F_CONST, -   DRAW_EMIT_2F_CONST, -   DRAW_EMIT_3F_CONST, -   DRAW_EMIT_4F_CONST, -   DRAW_EMIT_PAD,			/**< leave a hole of 'offset' bytes */ -   DRAW_EMIT_MAX -}; - -struct draw_vf_attr_map  -{ -   /** Input attribute number */ -   unsigned attrib; -    -   enum draw_vf_attr_format format; -    -   unsigned offset; -    -   /**  -    * Constant data for DRAW_EMIT_*_CONST  -    */ -   union { -      uint8_t ub[4]; -      float f[4]; -   } data; -}; - -struct draw_vertex_fetch; - - - -#if 0 -unsigned  -draw_vf_set_vertex_attributes( struct draw_vertex_fetch *vf, -                               const struct draw_vf_attr_map *map, -                               unsigned nr,  -                               unsigned vertex_stride ); -#endif - -void draw_vf_set_vertex_info( struct draw_vertex_fetch *vf,  -                              const struct vertex_info *vinfo, -                              float point_size ); - -#if 0 -void  -draw_vf_set_sources( struct draw_vertex_fetch *vf, -		     GLvector4f * const attrib[], -		     unsigned start ); -#endif - -void  -draw_vf_emit_vertex( struct draw_vertex_fetch *vf, -                     struct vertex_header *vertex, -                     void *dest ); - -struct draw_vertex_fetch * -draw_vf_create( void ); - -void  -draw_vf_destroy( struct draw_vertex_fetch *vf ); - - - -/*********************************************************************** - * Internal functions and structs: - */ - -struct draw_vf_attr; - -typedef void (*draw_vf_extract_func)( const struct draw_vf_attr *a,  -				      float *out,  -				      const uint8_t *v ); - -typedef void (*draw_vf_insert_func)( const struct draw_vf_attr *a,  -				     uint8_t *v,  -				     const float *in ); - -typedef void (*draw_vf_emit_func)( struct draw_vertex_fetch *vf, -      				   unsigned count,  -      				   uint8_t *dest ); - - - -/** - * Describes how to convert/move a vertex attribute from a vertex - * array to a vertex structure. - */ -struct draw_vf_attr -{ -   struct draw_vertex_fetch *vf; - -   unsigned format; -   unsigned inputsize; -   unsigned inputstride; -   unsigned vertoffset;      /**< position of the attrib in the vertex struct */ -    -   boolean isconst;              /**< read from const data below */ -   uint8_t data[16]; - -   unsigned attrib;          /**< which vertex attrib (0=position, etc) */ -   unsigned vertattrsize;    /**< size of the attribute in bytes */ - -   uint8_t *inputptr; -   const draw_vf_insert_func *insert; -   draw_vf_insert_func do_insert; -   draw_vf_extract_func extract; -}; - -struct draw_vertex_fetch -{ -   struct draw_vf_attr attr[PIPE_MAX_ATTRIBS]; -   unsigned attr_count; -   unsigned vertex_stride; - -   draw_vf_emit_func emit; - -   /* Parameters and constants for codegen: -    */ -   float identity[4]; - -   struct draw_vf_fastpath *fastpath; -    -   void (*codegen_emit)( struct draw_vertex_fetch *vf ); -}; - - -struct draw_vf_attr_type { -   unsigned format; -   unsigned size; -   unsigned stride; -   unsigned offset; -}; - -/** XXX this could be moved into draw_vf.c */ -struct draw_vf_fastpath { -   unsigned vertex_stride; -   unsigned attr_count; -   boolean match_strides; - -   struct draw_vf_attr_type *attr; - -   draw_vf_emit_func func; -   struct draw_vf_fastpath *next; -}; - - -void  -draw_vf_register_fastpath( struct draw_vertex_fetch *vtx, -                           boolean match_strides ); - -void  -draw_vf_generic_emit( struct draw_vertex_fetch *vf, -                      unsigned count, -                      uint8_t *v ); - -void  -draw_vf_generate_hardwired_emit( struct draw_vertex_fetch *vf ); - -void  -draw_vf_generate_sse_emit( struct draw_vertex_fetch *vf ); - - -/** XXX this type and function could probably be moved into draw_vf.c */ -struct draw_vf_format_info { -   const char *name; -   draw_vf_insert_func insert[4]; -   const unsigned attrsize; -   const boolean isconst; -}; - -extern const struct draw_vf_format_info  -draw_vf_format_info[DRAW_EMIT_MAX]; - - -#endif diff --git a/src/gallium/auxiliary/draw/draw_vf_generic.c b/src/gallium/auxiliary/draw/draw_vf_generic.c deleted file mode 100644 index 7a60a9db9c..0000000000 --- a/src/gallium/auxiliary/draw/draw_vf_generic.c +++ /dev/null @@ -1,585 +0,0 @@ - -/* - * Copyright 2003 Tungsten Graphics, 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 - * on the rights to use, copy, modify, merge, publish, distribute, sub - * license, and/or sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL - * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: - *    Keith Whitwell <keithw@tungstengraphics.com> - */ - - -#include "pipe/p_compiler.h" -#include "pipe/p_debug.h" -#include "pipe/p_util.h" - -#include "draw_vf.h" - - - -static INLINE void insert_4f_4( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = in[1]; -   out[2] = in[2]; -   out[3] = in[3]; -} - -static INLINE void insert_4f_3( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = in[1]; -   out[2] = in[2]; -   out[3] = 1; -} - -static INLINE void insert_4f_2( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = in[1]; -   out[2] = 0; -   out[3] = 1; -} - -static INLINE void insert_4f_1( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = 0; -   out[2] = 0; -   out[3] = 1; -} - -static INLINE void insert_3f_xyw_4( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = in[1]; -   out[2] = in[3]; -} - -static INLINE void insert_3f_xyw_err( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   (void) a; (void) v; (void) in; -   assert(0); -} - -static INLINE void insert_3f_3( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = in[1]; -   out[2] = in[2]; -} - -static INLINE void insert_3f_2( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = in[1]; -   out[2] = 0; -} - -static INLINE void insert_3f_1( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = 0; -   out[2] = 0; -} - - -static INLINE void insert_2f_2( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = in[1]; -} - -static INLINE void insert_2f_1( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; -    -   out[0] = in[0]; -   out[1] = 0; -} - -static INLINE void insert_1f_1( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   float *out = (float *)(v); -   (void) a; - -   out[0] = in[0]; -} - -static INLINE void insert_null( const struct draw_vf_attr *a, uint8_t *v, const float *in ) -{ -   (void) a; (void) v; (void) in; -} - -static INLINE void insert_4ub_4f_rgba_4( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]); -} - -static INLINE void insert_4ub_4f_rgba_3( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]); -   v[3] = 0xff; -} - -static INLINE void insert_4ub_4f_rgba_2( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   v[2] = 0; -   v[3] = 0xff; -} - -static INLINE void insert_4ub_4f_rgba_1( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   v[1] = 0; -   v[2] = 0; -   v[3] = 0xff; -} - -static INLINE void insert_4ub_4f_bgra_4( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[3]); -} - -static INLINE void insert_4ub_4f_bgra_3( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]); -   v[3] = 0xff; -} - -static INLINE void insert_4ub_4f_bgra_2( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   v[0] = 0; -   v[3] = 0xff; -} - -static INLINE void insert_4ub_4f_bgra_1( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   v[1] = 0; -   v[0] = 0; -   v[3] = 0xff; -} - -static INLINE void insert_4ub_4f_argb_4( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[2]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[3]); -} - -static INLINE void insert_4ub_4f_argb_3( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[2]); -   v[0] = 0xff; -} - -static INLINE void insert_4ub_4f_argb_2( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[1]); -   v[3] = 0x00; -   v[0] = 0xff; -} - -static INLINE void insert_4ub_4f_argb_1( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[0]); -   v[2] = 0x00; -   v[3] = 0x00; -   v[0] = 0xff; -} - -static INLINE void insert_4ub_4f_abgr_4( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[2]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[3]); -} - -static INLINE void insert_4ub_4f_abgr_3( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[2]); -   v[0] = 0xff; -} - -static INLINE void insert_4ub_4f_abgr_2( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[1]); -   v[1] = 0x00; -   v[0] = 0xff; -} - -static INLINE void insert_4ub_4f_abgr_1( const struct draw_vf_attr *a, uint8_t *v,  -					 const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[3], in[0]); -   v[2] = 0x00; -   v[1] = 0x00; -   v[0] = 0xff; -} - -static INLINE void insert_3ub_3f_rgb_3( const struct draw_vf_attr *a, uint8_t *v,  -					const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[2]); -} - -static INLINE void insert_3ub_3f_rgb_2( const struct draw_vf_attr *a, uint8_t *v,  -					const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   v[2] = 0; -} - -static INLINE void insert_3ub_3f_rgb_1( const struct draw_vf_attr *a, uint8_t *v,  -					const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -   v[1] = 0; -   v[2] = 0; -} - -static INLINE void insert_3ub_3f_bgr_3( const struct draw_vf_attr *a, uint8_t *v,  -					const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[2]); -} - -static INLINE void insert_3ub_3f_bgr_2( const struct draw_vf_attr *a, uint8_t *v,  -					const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   UNCLAMPED_FLOAT_TO_UBYTE(v[1], in[1]); -   v[0] = 0; -} - -static INLINE void insert_3ub_3f_bgr_1( const struct draw_vf_attr *a, uint8_t *v,  -					const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[2], in[0]); -   v[1] = 0; -   v[0] = 0; -} - - -static INLINE void insert_1ub_1f_1( const struct draw_vf_attr *a, uint8_t *v,  -				    const float *in ) -{ -   (void) a; -   UNCLAMPED_FLOAT_TO_UBYTE(v[0], in[0]); -} - - -const struct draw_vf_format_info draw_vf_format_info[DRAW_EMIT_MAX] =  -{ -   { "1f", -     { insert_1f_1, insert_1f_1, insert_1f_1, insert_1f_1 }, -     sizeof(float), FALSE }, - -   { "2f", -     { insert_2f_1, insert_2f_2, insert_2f_2, insert_2f_2 }, -     2 * sizeof(float), FALSE }, - -   { "3f", -     { insert_3f_1, insert_3f_2, insert_3f_3, insert_3f_3 }, -     3 * sizeof(float), FALSE }, - -   { "4f", -     { insert_4f_1, insert_4f_2, insert_4f_3, insert_4f_4 }, -     4 * sizeof(float), FALSE }, - -   { "3f_xyw", -     { insert_3f_xyw_err, insert_3f_xyw_err, insert_3f_xyw_err,  -       insert_3f_xyw_4 }, -     3 * sizeof(float), FALSE }, - -   { "1ub_1f", -     { insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1 }, -     sizeof(uint8_t), FALSE }, - -   { "3ub_3f_rgb", -     { insert_3ub_3f_rgb_1, insert_3ub_3f_rgb_2, insert_3ub_3f_rgb_3, -       insert_3ub_3f_rgb_3 }, -     3 * sizeof(uint8_t), FALSE }, - -   { "3ub_3f_bgr", -     { insert_3ub_3f_bgr_1, insert_3ub_3f_bgr_2, insert_3ub_3f_bgr_3, -       insert_3ub_3f_bgr_3 }, -     3 * sizeof(uint8_t), FALSE }, - -   { "4ub_4f_rgba", -     { insert_4ub_4f_rgba_1, insert_4ub_4f_rgba_2, insert_4ub_4f_rgba_3,  -       insert_4ub_4f_rgba_4 }, -     4 * sizeof(uint8_t), FALSE }, - -   { "4ub_4f_bgra", -     { insert_4ub_4f_bgra_1, insert_4ub_4f_bgra_2, insert_4ub_4f_bgra_3, -       insert_4ub_4f_bgra_4 }, -     4 * sizeof(uint8_t), FALSE }, - -   { "4ub_4f_argb", -     { insert_4ub_4f_argb_1, insert_4ub_4f_argb_2, insert_4ub_4f_argb_3, -       insert_4ub_4f_argb_4 }, -     4 * sizeof(uint8_t), FALSE }, - -   { "4ub_4f_abgr", -     { insert_4ub_4f_abgr_1, insert_4ub_4f_abgr_2, insert_4ub_4f_abgr_3, -       insert_4ub_4f_abgr_4 }, -     4 * sizeof(uint8_t), FALSE }, - -   { "1f_const", -     { insert_1f_1, insert_1f_1, insert_1f_1, insert_1f_1 }, -     sizeof(float), TRUE }, -    -   { "2f_const", -     { insert_2f_1, insert_2f_2, insert_2f_2, insert_2f_2 }, -     2 * sizeof(float), TRUE }, -    -   { "3f_const", -     { insert_3f_1, insert_3f_2, insert_3f_3, insert_3f_3 }, -     3 * sizeof(float), TRUE }, -    -   { "4f_const", -     { insert_4f_1, insert_4f_2, insert_4f_3, insert_4f_4 }, -     4 * sizeof(float), TRUE }, - -   { "pad", -     { NULL, NULL, NULL, NULL }, -     0, FALSE }, - -}; - - - -     -/*********************************************************************** - * Hardwired fastpaths for emitting whole vertices or groups of - * vertices - */ -#define EMIT5(NR, F0, F1, F2, F3, F4, NAME)				\ -static void NAME( struct draw_vertex_fetch *vf,				\ -		  unsigned count,						\ -		  uint8_t *v )						\ -{									\ -   struct draw_vf_attr *a = vf->attr;				\ -   unsigned i;								\ -									\ -   for (i = 0 ; i < count ; i++, v += vf->vertex_stride) {		\ -      if (NR > 0) {							\ -	 F0( &a[0], v + a[0].vertoffset, (float *)a[0].inputptr );	\ -	 a[0].inputptr += a[0].inputstride;				\ -      }									\ -      									\ -      if (NR > 1) {							\ -	 F1( &a[1], v + a[1].vertoffset, (float *)a[1].inputptr );	\ -	 a[1].inputptr += a[1].inputstride;				\ -      }									\ -      									\ -      if (NR > 2) {							\ -	 F2( &a[2], v + a[2].vertoffset, (float *)a[2].inputptr );	\ -	 a[2].inputptr += a[2].inputstride;				\ -      }									\ -      									\ -      if (NR > 3) {							\ -	 F3( &a[3], v + a[3].vertoffset, (float *)a[3].inputptr );	\ -	 a[3].inputptr += a[3].inputstride;				\ -      }									\ -									\ -      if (NR > 4) {							\ -	 F4( &a[4], v + a[4].vertoffset, (float *)a[4].inputptr );	\ -	 a[4].inputptr += a[4].inputstride;				\ -      }									\ -   }									\ -} - -    -#define EMIT2(F0, F1, NAME) EMIT5(2, F0, F1, insert_null, \ -				  insert_null, insert_null, NAME) - -#define EMIT3(F0, F1, F2, NAME) EMIT5(3, F0, F1, F2, insert_null, \ -				      insert_null, NAME) -    -#define EMIT4(F0, F1, F2, F3, NAME) EMIT5(4, F0, F1, F2, F3, \ -				          insert_null, NAME) -    - -EMIT2(insert_3f_3, insert_4ub_4f_rgba_4, emit_xyz3_rgba4) - -EMIT3(insert_4f_4, insert_4ub_4f_rgba_4, insert_2f_2, emit_xyzw4_rgba4_st2) - -EMIT4(insert_4f_4, insert_4ub_4f_rgba_4, insert_2f_2, insert_2f_2, emit_xyzw4_rgba4_st2_st2) - - -/* Use the codegen paths to select one of a number of hardwired - * fastpaths. - */ -void draw_vf_generate_hardwired_emit( struct draw_vertex_fetch *vf ) -{ -   draw_vf_emit_func func = NULL; - -   /* Does it fit a hardwired fastpath?  Help! this is growing out of -    * control! -    */ -   switch (vf->attr_count) { -   case 2: -      if (vf->attr[0].do_insert == insert_3f_3 && -	  vf->attr[1].do_insert == insert_4ub_4f_rgba_4) { - 	 func = emit_xyz3_rgba4;  -      } -      break; -   case 3: -      if (vf->attr[2].do_insert == insert_2f_2) { -	 if (vf->attr[1].do_insert == insert_4ub_4f_rgba_4) { -	    if (vf->attr[0].do_insert == insert_4f_4)  -	       func = emit_xyzw4_rgba4_st2; -	 } -      } -      break; -   case 4: -      if (vf->attr[2].do_insert == insert_2f_2 && -	  vf->attr[3].do_insert == insert_2f_2) { -	 if (vf->attr[1].do_insert == insert_4ub_4f_rgba_4) { -	    if (vf->attr[0].do_insert == insert_4f_4)  -	       func = emit_xyzw4_rgba4_st2_st2; -	 } -      } -      break; -   } - -   vf->emit = func; -} - -/*********************************************************************** - * Generic (non-codegen) functions for whole vertices or groups of - * vertices - */ - -void draw_vf_generic_emit( struct draw_vertex_fetch *vf, -		      unsigned count, -		      uint8_t *v ) -{ -   struct draw_vf_attr *a = vf->attr; -   const unsigned attr_count = vf->attr_count; -   const unsigned stride = vf->vertex_stride; -   unsigned i, j; - -   for (i = 0 ; i < count ; i++, v += stride) { -      for (j = 0; j < attr_count; j++) { -	 float *in = (float *)a[j].inputptr; -	 a[j].inputptr += a[j].inputstride; -	 a[j].do_insert( &a[j], v + a[j].vertoffset, in ); -      } -   } -} - - diff --git a/src/gallium/auxiliary/draw/draw_vf_sse.c b/src/gallium/auxiliary/draw/draw_vf_sse.c deleted file mode 100644 index aff4ffd985..0000000000 --- a/src/gallium/auxiliary/draw/draw_vf_sse.c +++ /dev/null @@ -1,613 +0,0 @@ -/* - * Copyright 2003 Tungsten Graphics, 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 - * on the rights to use, copy, modify, merge, publish, distribute, sub - * license, and/or sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL - * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: - *    Keith Whitwell <keithw@tungstengraphics.com> - */ - - -#include "pipe/p_compiler.h" -#include "util/u_simple_list.h" - -#include "draw_vf.h" - - -#if defined(USE_SSE_ASM) - -#include "rtasm/rtasm_cpu.h" -#include "rtasm/rtasm_x86sse.h" - - -#define X    0 -#define Y    1 -#define Z    2 -#define W    3 - - -struct x86_program { -   struct x86_function func; - -   struct draw_vertex_fetch *vf; -   boolean inputs_safe; -   boolean outputs_safe; -   boolean have_sse2; -    -   struct x86_reg identity; -   struct x86_reg chan0; -}; - - -static struct x86_reg get_identity( struct x86_program *p ) -{ -   return p->identity; -} - -static void emit_load4f_4( struct x86_program *p, 			    -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   sse_movups(&p->func, dest, arg0); -} - -static void emit_load4f_3( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   /* Have to jump through some hoops: -    * -    * c 0 0 0 -    * c 0 0 1 -    * 0 0 c 1 -    * a b c 1 -    */ -   sse_movss(&p->func, dest, x86_make_disp(arg0, 8)); -   sse_shufps(&p->func, dest, get_identity(p), SHUF(X,Y,Z,W) ); -   sse_shufps(&p->func, dest, dest, SHUF(Y,Z,X,W) ); -   sse_movlps(&p->func, dest, arg0); -} - -static void emit_load4f_2( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   /* Initialize from identity, then pull in low two words: -    */ -   sse_movups(&p->func, dest, get_identity(p)); -   sse_movlps(&p->func, dest, arg0); -} - -static void emit_load4f_1( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   /* Pull in low word, then swizzle in identity */ -   sse_movss(&p->func, dest, arg0); -   sse_shufps(&p->func, dest, get_identity(p), SHUF(X,Y,Z,W) ); -} - - - -static void emit_load3f_3( struct x86_program *p, 			    -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   /* Over-reads by 1 dword - potential SEGV if input is a vertex -    * array. -    */ -   if (p->inputs_safe) { -      sse_movups(&p->func, dest, arg0); -   }  -   else { -      /* c 0 0 0 -       * c c c c -       * a b c c  -       */ -      sse_movss(&p->func, dest, x86_make_disp(arg0, 8)); -      sse_shufps(&p->func, dest, dest, SHUF(X,X,X,X)); -      sse_movlps(&p->func, dest, arg0); -   } -} - -static void emit_load3f_2( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   emit_load4f_2(p, dest, arg0); -} - -static void emit_load3f_1( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   emit_load4f_1(p, dest, arg0); -} - -static void emit_load2f_2( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   sse_movlps(&p->func, dest, arg0); -} - -static void emit_load2f_1( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   emit_load4f_1(p, dest, arg0); -} - -static void emit_load1f_1( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   sse_movss(&p->func, dest, arg0); -} - -static void (*load[4][4])( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) = { -   { emit_load1f_1,  -     emit_load1f_1,  -     emit_load1f_1,  -     emit_load1f_1 }, - -   { emit_load2f_1,  -     emit_load2f_2,  -     emit_load2f_2,  -     emit_load2f_2 }, - -   { emit_load3f_1,  -     emit_load3f_2,  -     emit_load3f_3,  -     emit_load3f_3 }, - -   { emit_load4f_1,  -     emit_load4f_2,  -     emit_load4f_3,  -     emit_load4f_4 }  -}; - -static void emit_load( struct x86_program *p, -		       struct x86_reg dest, -		       unsigned sz, -		       struct x86_reg src, -		       unsigned src_sz) -{ -   load[sz-1][src_sz-1](p, dest, src); -} - -static void emit_store4f( struct x86_program *p, 			    -			  struct x86_reg dest, -			  struct x86_reg arg0 ) -{ -   sse_movups(&p->func, dest, arg0); -} - -static void emit_store3f( struct x86_program *p,  -			  struct x86_reg dest, -			  struct x86_reg arg0 ) -{ -   if (p->outputs_safe) { -      /* Emit the extra dword anyway.  This may hurt writecombining, -       * may cause other problems. -       */ -      sse_movups(&p->func, dest, arg0); -   } -   else { -      /* Alternate strategy - emit two, shuffle, emit one. -       */ -      sse_movlps(&p->func, dest, arg0); -      sse_shufps(&p->func, arg0, arg0, SHUF(Z,Z,Z,Z) ); /* NOTE! destructive */ -      sse_movss(&p->func, x86_make_disp(dest,8), arg0); -   } -} - -static void emit_store2f( struct x86_program *p,  -			   struct x86_reg dest, -			   struct x86_reg arg0 ) -{ -   sse_movlps(&p->func, dest, arg0); -} - -static void emit_store1f( struct x86_program *p,  -			  struct x86_reg dest, -			  struct x86_reg arg0 ) -{ -   sse_movss(&p->func, dest, arg0); -} - - -static void (*store[4])( struct x86_program *p,  -			 struct x86_reg dest, -			 struct x86_reg arg0 ) =  -{ -   emit_store1f,  -   emit_store2f,  -   emit_store3f,  -   emit_store4f  -}; - -static void emit_store( struct x86_program *p, -			struct x86_reg dest, -			unsigned sz, -			struct x86_reg temp ) - -{ -   store[sz-1](p, dest, temp); -} - -static void emit_pack_store_4ub( struct x86_program *p, -				 struct x86_reg dest, -				 struct x86_reg temp ) -{ -   /* Scale by 255.0 -    */ -   sse_mulps(&p->func, temp, p->chan0); - -   if (p->have_sse2) { -      sse2_cvtps2dq(&p->func, temp, temp); -      sse2_packssdw(&p->func, temp, temp); -      sse2_packuswb(&p->func, temp, temp); -      sse_movss(&p->func, dest, temp); -   } -   else { -      struct x86_reg mmx0 = x86_make_reg(file_MMX, 0); -      struct x86_reg mmx1 = x86_make_reg(file_MMX, 1); -      sse_cvtps2pi(&p->func, mmx0, temp); -      sse_movhlps(&p->func, temp, temp); -      sse_cvtps2pi(&p->func, mmx1, temp); -      mmx_packssdw(&p->func, mmx0, mmx1); -      mmx_packuswb(&p->func, mmx0, mmx0); -      mmx_movd(&p->func, dest, mmx0); -   } -} - -static int get_offset( const void *a, const void *b ) -{ -   return (const char *)b - (const char *)a; -} - -/* Not much happens here.  Eventually use this function to try and - * avoid saving/reloading the source pointers each vertex (if some of - * them can fit in registers). - */ -static void get_src_ptr( struct x86_program *p, -			 struct x86_reg srcREG, -			 struct x86_reg vfREG, -			 struct draw_vf_attr *a ) -{ -   struct draw_vertex_fetch *vf = p->vf; -   struct x86_reg ptr_to_src = x86_make_disp(vfREG, get_offset(vf, &a->inputptr)); - -   /* Load current a[j].inputptr -    */ -   x86_mov(&p->func, srcREG, ptr_to_src); -} - -static void update_src_ptr( struct x86_program *p, -			 struct x86_reg srcREG, -			 struct x86_reg vfREG, -			 struct draw_vf_attr *a ) -{ -   if (a->inputstride) { -      struct draw_vertex_fetch *vf = p->vf; -      struct x86_reg ptr_to_src = x86_make_disp(vfREG, get_offset(vf, &a->inputptr)); - -      /* add a[j].inputstride (hardcoded value - could just as easily -       * pull the stride value from memory each time). -       */ -      x86_lea(&p->func, srcREG, x86_make_disp(srcREG, a->inputstride)); -       -      /* save new value of a[j].inputptr  -       */ -      x86_mov(&p->func, ptr_to_src, srcREG); -   } -} - - -/* Lots of hardcoding - * - * EAX -- pointer to current output vertex - * ECX -- pointer to current attribute  - *  - */ -static boolean build_vertex_emit( struct x86_program *p ) -{ -   struct draw_vertex_fetch *vf = p->vf; -   unsigned j = 0; - -   struct x86_reg vertexEAX = x86_make_reg(file_REG32, reg_AX); -   struct x86_reg srcECX = x86_make_reg(file_REG32, reg_CX); -   struct x86_reg countEBP = x86_make_reg(file_REG32, reg_BP); -   struct x86_reg vfESI = x86_make_reg(file_REG32, reg_SI); -   struct x86_reg temp = x86_make_reg(file_XMM, 0); -   uint8_t *fixup, *label; - -   /* Push a few regs? -    */ -   x86_push(&p->func, countEBP); -   x86_push(&p->func, vfESI); - - -   /* Get vertex count, compare to zero -    */ -   x86_xor(&p->func, srcECX, srcECX); -   x86_mov(&p->func, countEBP, x86_fn_arg(&p->func, 2)); -   x86_cmp(&p->func, countEBP, srcECX); -   fixup = x86_jcc_forward(&p->func, cc_E); - -   /* Initialize destination register.  -    */ -   x86_mov(&p->func, vertexEAX, x86_fn_arg(&p->func, 3)); - -   /* Move argument 1 (vf) into a reg: -    */ -   x86_mov(&p->func, vfESI, x86_fn_arg(&p->func, 1)); - -    -   /* always load, needed or not: -    */ -   sse_movups(&p->func, p->identity, x86_make_disp(vfESI, get_offset(vf, &vf->identity[0]))); - -   /* Note address for loop jump */ -   label = x86_get_label(&p->func); - -   /* Emit code for each of the attributes.  Currently routes -    * everything through SSE registers, even when it might be more -    * efficient to stick with regular old x86.  No optimization or -    * other tricks - enough new ground to cover here just getting -    * things working. -    */ -   while (j < vf->attr_count) { -      struct draw_vf_attr *a = &vf->attr[j]; -      struct x86_reg dest = x86_make_disp(vertexEAX, a->vertoffset); - -      /* Now, load an XMM reg from src, perhaps transform, then save. -       * Could be shortcircuited in specific cases: -       */ -      switch (a->format) { -      case DRAW_EMIT_1F: -      case DRAW_EMIT_1F_CONST: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 1, x86_deref(srcECX), a->inputsize); -	 emit_store(p, dest, 1, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; -      case DRAW_EMIT_2F: -      case DRAW_EMIT_2F_CONST: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 2, x86_deref(srcECX), a->inputsize); -	 emit_store(p, dest, 2, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; -      case DRAW_EMIT_3F: -      case DRAW_EMIT_3F_CONST: -	 /* Potentially the worst case - hardcode 2+1 copying: -	  */ -	 if (0) { -	    get_src_ptr(p, srcECX, vfESI, a); -	    emit_load(p, temp, 3, x86_deref(srcECX), a->inputsize); -	    emit_store(p, dest, 3, temp); -	    update_src_ptr(p, srcECX, vfESI, a); -	 } -	 else { -	    get_src_ptr(p, srcECX, vfESI, a); -	    emit_load(p, temp, 2, x86_deref(srcECX), a->inputsize); -	    emit_store(p, dest, 2, temp); -	    if (a->inputsize > 2) { -	       emit_load(p, temp, 1, x86_make_disp(srcECX, 8), 1); -	       emit_store(p, x86_make_disp(dest,8), 1, temp); -	    } -	    else { -	       sse_movss(&p->func, x86_make_disp(dest,8), get_identity(p)); -	    } -	    update_src_ptr(p, srcECX, vfESI, a); -	 } -	 break; -      case DRAW_EMIT_4F: -      case DRAW_EMIT_4F_CONST: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize); -	 emit_store(p, dest, 4, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; -      case DRAW_EMIT_3F_XYW: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize); -	 sse_shufps(&p->func, temp, temp, SHUF(X,Y,W,Z)); -	 emit_store(p, dest, 3, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; - -      case DRAW_EMIT_1UB_1F:	  -	 /* Test for PAD3 + 1UB: -	  */ -	 if (j > 0 && -	     a[-1].vertoffset + a[-1].vertattrsize <= a->vertoffset - 3) -	 { -	    get_src_ptr(p, srcECX, vfESI, a); -	    emit_load(p, temp, 1, x86_deref(srcECX), a->inputsize); -	    sse_shufps(&p->func, temp, temp, SHUF(X,X,X,X)); -	    emit_pack_store_4ub(p, x86_make_disp(dest, -3), temp); /* overkill! */ -	    update_src_ptr(p, srcECX, vfESI, a); -	 } -	 else { -	    debug_printf("Can't emit 1ub %x %x %d\n",  -	            a->vertoffset, a[-1].vertoffset, a[-1].vertattrsize ); -	    return FALSE; -	 } -	 break; -      case DRAW_EMIT_3UB_3F_RGB: -      case DRAW_EMIT_3UB_3F_BGR: -	 /* Test for 3UB + PAD1: -	  */ -	 if (j == vf->attr_count - 1 || -	     a[1].vertoffset >= a->vertoffset + 4) { -	    get_src_ptr(p, srcECX, vfESI, a); -	    emit_load(p, temp, 3, x86_deref(srcECX), a->inputsize); -	    if (a->format == DRAW_EMIT_3UB_3F_BGR) -	       sse_shufps(&p->func, temp, temp, SHUF(Z,Y,X,W)); -	    emit_pack_store_4ub(p, dest, temp); -	    update_src_ptr(p, srcECX, vfESI, a); -	 } -	 /* Test for 3UB + 1UB: -	  */ -	 else if (j < vf->attr_count - 1 && -		  a[1].format == DRAW_EMIT_1UB_1F && -		  a[1].vertoffset == a->vertoffset + 3) { -	    get_src_ptr(p, srcECX, vfESI, a); -	    emit_load(p, temp, 3, x86_deref(srcECX), a->inputsize); -	    update_src_ptr(p, srcECX, vfESI, a); - -	    /* Make room for incoming value: -	     */ -	    sse_shufps(&p->func, temp, temp, SHUF(W,X,Y,Z)); - -	    get_src_ptr(p, srcECX, vfESI, &a[1]); -	    emit_load(p, temp, 1, x86_deref(srcECX), a[1].inputsize); -	    update_src_ptr(p, srcECX, vfESI, &a[1]); - -	    /* Rearrange and possibly do BGR conversion: -	     */ -	    if (a->format == DRAW_EMIT_3UB_3F_BGR) -	       sse_shufps(&p->func, temp, temp, SHUF(W,Z,Y,X)); -	    else -	       sse_shufps(&p->func, temp, temp, SHUF(Y,Z,W,X)); - -	    emit_pack_store_4ub(p, dest, temp); -	    j++;		/* NOTE: two attrs consumed */ -	 } -	 else { -	    debug_printf("Can't emit 3ub\n"); -	 } -	 return FALSE;	/* add this later */ -	 break; - -      case DRAW_EMIT_4UB_4F_RGBA: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize); -	 emit_pack_store_4ub(p, dest, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; -      case DRAW_EMIT_4UB_4F_BGRA: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize); -	 sse_shufps(&p->func, temp, temp, SHUF(Z,Y,X,W)); -	 emit_pack_store_4ub(p, dest, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; -      case DRAW_EMIT_4UB_4F_ARGB: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize); -	 sse_shufps(&p->func, temp, temp, SHUF(W,X,Y,Z)); -	 emit_pack_store_4ub(p, dest, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; -      case DRAW_EMIT_4UB_4F_ABGR: -	 get_src_ptr(p, srcECX, vfESI, a); -	 emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize); -	 sse_shufps(&p->func, temp, temp, SHUF(W,Z,Y,X)); -	 emit_pack_store_4ub(p, dest, temp); -	 update_src_ptr(p, srcECX, vfESI, a); -	 break; -      default: -	 debug_printf("unknown a[%d].format %d\n", j, a->format); -	 return FALSE;	/* catch any new opcodes */ -      } -       -      /* Increment j by at least 1 - may have been incremented above also: -       */ -      j++; -   } - -   /* Next vertex: -    */ -   x86_lea(&p->func, vertexEAX, x86_make_disp(vertexEAX, vf->vertex_stride)); - -   /* decr count, loop if not zero -    */ -   x86_dec(&p->func, countEBP); -   x86_test(&p->func, countEBP, countEBP);  -   x86_jcc(&p->func, cc_NZ, label); - -   /* Exit mmx state? -    */ -   if (p->func.need_emms) -      mmx_emms(&p->func); - -   /* Land forward jump here: -    */ -   x86_fixup_fwd_jump(&p->func, fixup); - -   /* Pop regs and return -    */ -   x86_pop(&p->func, x86_get_base_reg(vfESI)); -   x86_pop(&p->func, countEBP); -   x86_ret(&p->func); - -   vf->emit = (draw_vf_emit_func)x86_get_func(&p->func); -   return TRUE; -} - - - -void draw_vf_generate_sse_emit( struct draw_vertex_fetch *vf ) -{ -   struct x86_program p;    - -   if (!rtasm_cpu_has_sse()) { -      vf->codegen_emit = NULL; -      return; -   } - -   memset(&p, 0, sizeof(p)); - -   p.vf = vf; -   p.inputs_safe = 0;		/* for now */ -   p.outputs_safe = 1;		/* for now */ -   p.have_sse2 = rtasm_cpu_has_sse2(); -   p.identity = x86_make_reg(file_XMM, 6); -   p.chan0 = x86_make_reg(file_XMM, 7); - -   x86_init_func(&p.func); - -   if (build_vertex_emit(&p)) { -      draw_vf_register_fastpath( vf, TRUE ); -   } -   else { -      /* Note the failure so that we don't keep trying to codegen an -       * impossible state: -       */ -      draw_vf_register_fastpath( vf, FALSE ); -      x86_release_func(&p.func); -   } -} - -#else - -void draw_vf_generate_sse_emit( struct draw_vertex_fetch *vf ) -{ -   /* Dummy version for when USE_SSE_ASM not defined */ -} - -#endif diff --git a/src/gallium/auxiliary/draw/draw_vertex_shader.c b/src/gallium/auxiliary/draw/draw_vs.c index 133418baca..03fe00a951 100644 --- a/src/gallium/auxiliary/draw/draw_vertex_shader.c +++ b/src/gallium/auxiliary/draw/draw_vs.c @@ -39,51 +39,6 @@ -/** - * Run the vertex shader on all vertices in the vertex queue. - * Called by the draw module when the vertx cache needs to be flushed. - */ -void -draw_vertex_shader_queue_flush(struct draw_context *draw) -{ -   struct draw_vertex_shader *shader = draw->vertex_shader; -   unsigned i; - -   assert(draw->vs.queue_nr != 0); - -   /* XXX: do this on statechange:  -    */ -   shader->prepare( shader, draw ); - -//   fprintf(stderr, "%s %d\n", __FUNCTION__, draw->vs.queue_nr ); - -   /* run vertex shader on vertex cache entries, four per invokation */ -   for (i = 0; i < draw->vs.queue_nr; i += 4) { -      struct vertex_header *dests[4]; -      unsigned elts[4]; -      int j, n = MIN2(4, draw->vs.queue_nr - i); - -      for (j = 0; j < n; j++) { -         elts[j] = draw->vs.queue[i + j].elt; -         dests[j] = draw->vs.queue[i + j].vertex; -      } - -      for ( ; j < 4; j++) { -	 elts[j] = elts[0]; -         dests[j] = draw->vs.queue[i + j].vertex; -      } - -      assert(n > 0); -      assert(n <= 4); - -      shader->run(shader, draw, elts, n, dests); -   } - -   draw->vs.post_nr = draw->vs.queue_nr; -   draw->vs.queue_nr = 0; -} - -  struct draw_vertex_shader *  draw_create_vertex_shader(struct draw_context *draw,                            const struct pipe_shader_state *shader) @@ -97,10 +52,8 @@ draw_create_vertex_shader(struct draw_context *draw,           vs = draw_create_vs_exec( draw, shader );        }     } -   assert(vs); - -   tgsi_scan_shader(shader->tokens, &vs->info); +   assert(vs);     return vs;  } @@ -115,9 +68,6 @@ draw_bind_vertex_shader(struct draw_context *draw,     {        draw->vertex_shader = dvs;        draw->num_vs_outputs = dvs->info.num_outputs; - -      tgsi_exec_machine_init(&draw->machine); -        dvs->prepare( dvs, draw );     }     else { diff --git a/src/gallium/auxiliary/draw/draw_vs.h b/src/gallium/auxiliary/draw/draw_vs.h index 4ee7e705e9..f9772b83b8 100644 --- a/src/gallium/auxiliary/draw/draw_vs.h +++ b/src/gallium/auxiliary/draw/draw_vs.h @@ -31,10 +31,43 @@  #ifndef DRAW_VS_H  #define DRAW_VS_H -struct draw_vertex_shader; +#include "draw_context.h" +#include "draw_private.h" + +  struct draw_context;  struct pipe_shader_state; +/** + * Private version of the compiled vertex_shader + */ +struct draw_vertex_shader { + +   /* This member will disappear shortly: +    */ +   struct pipe_shader_state   state; + +   struct tgsi_shader_info info; + +   void (*prepare)( struct draw_vertex_shader *shader, +		    struct draw_context *draw ); + +   /* Run the shader - this interface will get cleaned up in the +    * future: +    */ +   void (*run_linear)( struct draw_vertex_shader *shader, +		       const float (*input)[4], +		       float (*output)[4], +		       const float (*constants)[4], +		       unsigned count, +		       unsigned input_stride, +		       unsigned output_stride ); + + +   void (*delete)( struct draw_vertex_shader * ); +}; + +  struct draw_vertex_shader *  draw_create_vs_exec(struct draw_context *draw,  		    const struct pipe_shader_state *templ); @@ -47,4 +80,8 @@ struct draw_vertex_shader *  draw_create_vs_llvm(struct draw_context *draw,  		    const struct pipe_shader_state *templ); + +#define MAX_TGSI_VERTICES 4 +    +  #endif diff --git a/src/gallium/auxiliary/draw/draw_vs_exec.c b/src/gallium/auxiliary/draw/draw_vs_exec.c index c6e503686a..7a02f6334b 100644 --- a/src/gallium/auxiliary/draw/draw_vs_exec.c +++ b/src/gallium/auxiliary/draw/draw_vs_exec.c @@ -39,163 +39,120 @@  #include "draw_vs.h"  #include "tgsi/util/tgsi_parse.h" +#include "tgsi/util/tgsi_scan.h" -static INLINE unsigned -compute_clipmask(const float *clip, /*const*/ float plane[][4], unsigned nr) -{ -   unsigned mask = 0; -   unsigned i; - -   /* Do the hardwired planes first: -    */ -   if (-clip[0] + clip[3] < 0) mask |= CLIP_RIGHT_BIT; -   if ( clip[0] + clip[3] < 0) mask |= CLIP_LEFT_BIT; -   if (-clip[1] + clip[3] < 0) mask |= CLIP_TOP_BIT; -   if ( clip[1] + clip[3] < 0) mask |= CLIP_BOTTOM_BIT; -   if (-clip[2] + clip[3] < 0) mask |= CLIP_FAR_BIT; -   if ( clip[2] + clip[3] < 0) mask |= CLIP_NEAR_BIT; - -   /* Followed by any remaining ones: -    */ -   for (i = 6; i < nr; i++) { -      if (dot4(clip, plane[i]) < 0)  -         mask |= (1<<i); -   } +struct exec_vertex_shader { +   struct draw_vertex_shader base; +   struct tgsi_exec_machine *machine; +}; -   return mask; +static struct exec_vertex_shader *exec_vertex_shader( struct draw_vertex_shader *vs ) +{ +   return (struct exec_vertex_shader *)vs;  } +/* Not required for run_linear. + */  static void  vs_exec_prepare( struct draw_vertex_shader *shader,  		 struct draw_context *draw )  { +   struct exec_vertex_shader *evs = exec_vertex_shader(shader); +     /* specify the vertex program to interpret/execute */ -   tgsi_exec_machine_bind_shader(&draw->machine, +   tgsi_exec_machine_bind_shader(evs->machine,  				 shader->state.tokens,  				 PIPE_MAX_SAMPLERS,  				 NULL /*samplers*/ ); -   draw_update_vertex_fetch( draw );  } -/** - * Transform vertices with the current vertex program/shader - * Up to four vertices can be shaded at a time. - * \param vbuffer  the input vertex data - * \param elts  indexes of four input vertices - * \param count  number of vertices to shade [1..4] - * \param vOut  array of pointers to four output vertices + + +/* Simplified vertex shader interface for the pt paths.  Given the + * complexity of code-generating all the above operations together, + * it's time to try doing all the other stuff separately.   */  static void -vs_exec_run( struct draw_vertex_shader *shader, -	     struct draw_context *draw, -	     const unsigned *elts,  -	     unsigned count, -	     struct vertex_header *vOut[] ) +vs_exec_run_linear( struct draw_vertex_shader *shader, +		    const float (*input)[4], +		    float (*output)[4], +		    const float (*constants)[4], +		    unsigned count, +		    unsigned input_stride, +		    unsigned output_stride )  { -   struct tgsi_exec_machine *machine = &draw->machine; -   unsigned int j; +   struct exec_vertex_shader *evs = exec_vertex_shader(shader); +   struct tgsi_exec_machine *machine = evs->machine; +   unsigned int i, j; +   unsigned slot; -   ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS); -   ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS); -   const float *scale = draw->viewport.scale; -   const float *trans = draw->viewport.translate; +   machine->Consts = constants; -   assert(count <= 4); -   assert(draw->vertex_shader->info.output_semantic_name[0] -          == TGSI_SEMANTIC_POSITION); +   for (i = 0; i < count; i += MAX_TGSI_VERTICES) { +      unsigned int max_vertices = MIN2(MAX_TGSI_VERTICES, count - i); -   machine->Consts = (float (*)[4]) draw->user.constants; -   machine->Inputs = ALIGN16_ASSIGN(inputs); -   if (draw->rasterizer->bypass_vs) { -      /* outputs are just the inputs */ -      machine->Outputs = machine->Inputs; -   } -   else { -      machine->Outputs = ALIGN16_ASSIGN(outputs); -   } +      /* Swizzle inputs.   +       */ +      for (j = 0; j < max_vertices; j++) { +#if 0 +         debug_printf("%d) Input vert:\n", i + j); +         for (slot = 0; slot < shader->info.num_inputs; slot++) { +            debug_printf("\t%d: %f %f %f %f\n", slot, +			 input[slot][0], +			 input[slot][1], +			 input[slot][2], +			 input[slot][3]); +         } +#endif + +         for (slot = 0; slot < shader->info.num_inputs; slot++) { +            machine->Inputs[slot].xyzw[0].f[j] = input[slot][0]; +            machine->Inputs[slot].xyzw[1].f[j] = input[slot][1]; +            machine->Inputs[slot].xyzw[2].f[j] = input[slot][2]; +            machine->Inputs[slot].xyzw[3].f[j] = input[slot][3]; +         } -   draw->vertex_fetch.fetch_func( draw, machine, elts, count ); +	 input = (const float (*)[4])((const char *)input + input_stride); +      }  -   if (!draw->rasterizer->bypass_vs) {        /* run interpreter */        tgsi_exec_machine_run( machine ); -   } - -   /* store machine results */ -   for (j = 0; j < count; j++) { -      unsigned slot; -      float x, y, z, w; -      /* Handle attr[0] (position) specially: -       * -       * XXX: Computing the clipmask should be done in the vertex -       * program as a set of DP4 instructions appended to the -       * user-provided code. +      /* Unswizzle all output results.           */ -      x = vOut[j]->clip[0] = machine->Outputs[0].xyzw[0].f[j]; -      y = vOut[j]->clip[1] = machine->Outputs[0].xyzw[1].f[j]; -      z = vOut[j]->clip[2] = machine->Outputs[0].xyzw[2].f[j]; -      w = vOut[j]->clip[3] = machine->Outputs[0].xyzw[3].f[j]; - -      if (!draw->rasterizer->bypass_clipping) { -         vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane, draw->nr_planes); +      for (j = 0; j < max_vertices; j++) { +         for (slot = 0; slot < shader->info.num_outputs; slot++) { +            output[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; +            output[slot][1] = machine->Outputs[slot].xyzw[1].f[j]; +            output[slot][2] = machine->Outputs[slot].xyzw[2].f[j]; +            output[slot][3] = machine->Outputs[slot].xyzw[3].f[j]; -         /* divide by w */ -         w = 1.0f / w; -         x *= w; -         y *= w; -         z *= w;          -      } -      else { -         vOut[j]->clipmask = 0; -      } -      vOut[j]->edgeflag = 1; - -      if (!draw->identity_viewport) { -         /* Viewport mapping */ -         vOut[j]->data[0][0] = x * scale[0] + trans[0]; -         vOut[j]->data[0][1] = y * scale[1] + trans[1]; -         vOut[j]->data[0][2] = z * scale[2] + trans[2]; -         vOut[j]->data[0][3] = w; -      } -      else { -         vOut[j]->data[0][0] = x; -         vOut[j]->data[0][1] = y; -         vOut[j]->data[0][2] = z; -         vOut[j]->data[0][3] = w; -      } - -      /* Remaining attributes are packed into sequential post-transform -       * vertex attrib slots. -       */ -      for (slot = 1; slot < draw->num_vs_outputs; slot++) { -         vOut[j]->data[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; -         vOut[j]->data[slot][1] = machine->Outputs[slot].xyzw[1].f[j]; -         vOut[j]->data[slot][2] = machine->Outputs[slot].xyzw[2].f[j]; -         vOut[j]->data[slot][3] = machine->Outputs[slot].xyzw[3].f[j]; -      } +         } -#if 0 /*DEBUG*/ -      printf("Post xform vert:\n"); -      for (slot = 0; slot < draw->num_vs_outputs; slot++) { -         printf("%d: %f %f %f %f\n", slot, -                vOut[j]->data[slot][0], -                vOut[j]->data[slot][1], -                vOut[j]->data[slot][2], -                vOut[j]->data[slot][3]); -      } -#endif       +#if 0 +	 debug_printf("%d) Post xform vert:\n", i + j); +	 for (slot = 0; slot < shader->info.num_outputs; slot++) { +	    debug_printf("\t%d: %f %f %f %f\n", slot, +			 output[slot][0], +			 output[slot][1], +			 output[slot][2], +			 output[slot][3]); +         } +#endif +	 output = (float (*)[4])((char *)output + output_stride); +      }  -   } /* loop over vertices */ +   }  } +  static void  vs_exec_delete( struct draw_vertex_shader *dvs )  { @@ -208,17 +165,24 @@ struct draw_vertex_shader *  draw_create_vs_exec(struct draw_context *draw,  		    const struct pipe_shader_state *state)  { -   struct draw_vertex_shader *vs = CALLOC_STRUCT( draw_vertex_shader ); -   uint nt = tgsi_num_tokens(state->tokens); +   struct exec_vertex_shader *vs = CALLOC_STRUCT( exec_vertex_shader );     if (vs == NULL)         return NULL;     /* we make a private copy of the tokens */ -   vs->state.tokens = mem_dup(state->tokens, nt * sizeof(state->tokens[0])); -   vs->prepare = vs_exec_prepare; -   vs->run = vs_exec_run; -   vs->delete = vs_exec_delete; +   vs->base.state.tokens = tgsi_dup_tokens(state->tokens); +   if (!vs->base.state.tokens) { +      FREE(vs); +      return NULL; +   } + +   tgsi_scan_shader(state->tokens, &vs->base.info); + +   vs->base.prepare = vs_exec_prepare; +   vs->base.run_linear = vs_exec_run_linear; +   vs->base.delete = vs_exec_delete; +   vs->machine = &draw->machine; -   return vs; +   return &vs->base;  } diff --git a/src/gallium/auxiliary/draw/draw_vs_llvm.c b/src/gallium/auxiliary/draw/draw_vs_llvm.c index c8268317ef..171da51dd5 100644 --- a/src/gallium/auxiliary/draw/draw_vs_llvm.c +++ b/src/gallium/auxiliary/draw/draw_vs_llvm.c @@ -1,8 +1,8 @@  /************************************************************************** - *  + *   * Copyright 2007 Tungsten Graphics, 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 @@ -10,11 +10,11 @@   * 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. @@ -22,7 +22,7 @@   * 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. - *  + *   **************************************************************************/   /* @@ -47,154 +47,42 @@  struct draw_llvm_vertex_shader {     struct draw_vertex_shader base;     struct gallivm_prog *llvm_prog; +   struct tgsi_exec_machine *machine;  }; -static INLINE unsigned -compute_clipmask(const float *clip, /*const*/ float plane[][4], unsigned nr) -{ -   unsigned mask = 0; -   unsigned i; - -   /* Do the hardwired planes first: -    */ -   if (-clip[0] + clip[3] < 0) mask |= CLIP_RIGHT_BIT; -   if ( clip[0] + clip[3] < 0) mask |= CLIP_LEFT_BIT; -   if (-clip[1] + clip[3] < 0) mask |= CLIP_TOP_BIT; -   if ( clip[1] + clip[3] < 0) mask |= CLIP_BOTTOM_BIT; -   if (-clip[2] + clip[3] < 0) mask |= CLIP_FAR_BIT; -   if ( clip[2] + clip[3] < 0) mask |= CLIP_NEAR_BIT; - -   /* Followed by any remaining ones: -    */ -   for (i = 6; i < nr; i++) { -      if (dot4(clip, plane[i]) < 0)  -         mask |= (1<<i); -   } - -   return mask; -} - - -  static void  vs_llvm_prepare( struct draw_vertex_shader *base,  		 struct draw_context *draw )  { -   draw_update_vertex_fetch( draw );  } -/** - * Transform vertices with the current vertex program/shader - * Up to four vertices can be shaded at a time. - * \param vbuffer  the input vertex data - * \param elts  indexes of four input vertices - * \param count  number of vertices to shade [1..4] - * \param vOut  array of pointers to four output vertices - */ +  static void -vs_llvm_run( struct draw_vertex_shader *base, -	     struct draw_context *draw,  -	     const unsigned *elts,  -	     unsigned count, -	     struct vertex_header *vOut[] ) +vs_llvm_run_linear( struct draw_vertex_shader *base, +		   const float (*input)[4], +		   float (*output)[4], +		   const float (*constants)[4], +		   unsigned count, +		   unsigned input_stride, +		   unsigned output_stride )  { -   struct draw_llvm_vertex_shader *shader =  +   struct draw_llvm_vertex_shader *shader =        (struct draw_llvm_vertex_shader *)base; -   struct tgsi_exec_machine *machine = &draw->machine; -   unsigned int j; - -   ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS); -   ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS); -   const float *scale = draw->viewport.scale; -   const float *trans = draw->viewport.translate; - - -   assert(count <= 4); -   assert(draw->vertex_shader->state->output_semantic_name[0] -          == TGSI_SEMANTIC_POSITION); - -   /* Consts does not require 16 byte alignment. */ -   machine->Consts = (float (*)[4]) draw->user.constants; - -   machine->Inputs = ALIGN16_ASSIGN(inputs); -   if (draw->rasterizer->bypass_vs) { -      /* outputs are just the inputs */ -      machine->Outputs = machine->Inputs; -   } -   else { -      machine->Outputs = ALIGN16_ASSIGN(outputs); -   } - - -   draw->vertex_fetch.fetch_func( draw, machine, elts, count ); - -   if (!draw->rasterizer->bypass_vs) { -      /* run shader */ -      gallivm_cpu_vs_exec(shader->llvm_prog, -                          machine->Inputs, -                          machine->Outputs, -                          machine->Consts, -                          machine->Temps); -   } - -   /* store machine results */ -   for (j = 0; j < count; j++) { -      unsigned slot; -      float x, y, z, w; - -      x = vOut[j]->clip[0] = machine->Outputs[0].xyzw[0].f[j]; -      y = vOut[j]->clip[1] = machine->Outputs[0].xyzw[1].f[j]; -      z = vOut[j]->clip[2] = machine->Outputs[0].xyzw[2].f[j]; -      w = vOut[j]->clip[3] = machine->Outputs[0].xyzw[3].f[j]; - -      if (!draw->rasterizer->bypass_clipping) { -         vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane, draw->nr_planes); +   gallivm_cpu_vs_exec(shader->llvm_prog, shader->machine, +                       input, base->info.num_inputs, output, base->info.num_outputs, +                       constants, count, input_stride, output_stride); +} -         /* divide by w */ -         w = 1.0f / w; -         x *= w; -         y *= w; -         z *= w;          -      } -      else { -         vOut[j]->clipmask = 0; -      } -      vOut[j]->edgeflag = 1; -          -      if (!draw->identity_viewport) { -         /* Viewport mapping */ -         vOut[j]->data[0][0] = x * scale[0] + trans[0]; -         vOut[j]->data[0][1] = y * scale[1] + trans[1]; -         vOut[j]->data[0][2] = z * scale[2] + trans[2]; -         vOut[j]->data[0][3] = w; -      } -      else { -         vOut[j]->data[0][0] = x; -         vOut[j]->data[0][1] = y; -         vOut[j]->data[0][2] = z; -         vOut[j]->data[0][3] = w; -      } -      /* Remaining attributes are packed into sequential post-transform -       * vertex attrib slots. -       */ -      for (slot = 1; slot < draw->num_vs_outputs; slot++) { -         vOut[j]->data[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; -         vOut[j]->data[slot][1] = machine->Outputs[slot].xyzw[1].f[j]; -         vOut[j]->data[slot][2] = machine->Outputs[slot].xyzw[2].f[j]; -         vOut[j]->data[slot][3] = machine->Outputs[slot].xyzw[3].f[j]; -      } -   } /* loop over vertices */ -}  static void  vs_llvm_delete( struct draw_vertex_shader *base )  { -   struct draw_llvm_vertex_shader *shader =  +   struct draw_llvm_vertex_shader *shader =        (struct draw_llvm_vertex_shader *)base;     /* Do something to free compiled shader: @@ -212,23 +100,30 @@ draw_create_vs_llvm(struct draw_context *draw,  		    const struct pipe_shader_state *templ)  {     struct draw_llvm_vertex_shader *vs; -   uint nt = tgsi_num_tokens(templ->tokens);     vs = CALLOC_STRUCT( draw_llvm_vertex_shader ); -   if (vs == NULL)  +   if (vs == NULL)        return NULL;     /* we make a private copy of the tokens */ -   vs->base.state.tokens = mem_dup(templ->tokens, nt * sizeof(templ->tokens[0])); +   vs->base.state.tokens = tgsi_dup_tokens(templ->tokens); +   if (!vs->base.state.tokens) { +      FREE(vs); +      return NULL; +   } + +   tgsi_scan_shader(vs->base.state.tokens, &vs->base.info); +     vs->base.prepare = vs_llvm_prepare; -   vs->base.run = vs_llvm_run; +   vs->base.run_linear = vs_llvm_run_linear;     vs->base.delete = vs_llvm_delete; +   vs->machine = &draw->machine;     {        struct gallivm_ir *ir = gallivm_ir_new(GALLIVM_VS);        gallivm_ir_set_layout(ir, GALLIVM_SOA);        gallivm_ir_set_components(ir, 4); -      gallivm_ir_fill_from_tgsi(ir, vs->base.state->tokens); +      gallivm_ir_fill_from_tgsi(ir, vs->base.state.tokens);        vs->llvm_prog = gallivm_ir_compile(ir);        gallivm_ir_delete(ir);     } diff --git a/src/gallium/auxiliary/draw/draw_vs_sse.c b/src/gallium/auxiliary/draw/draw_vs_sse.c index f40d65df08..e3f4e67472 100644 --- a/src/gallium/auxiliary/draw/draw_vs_sse.c +++ b/src/gallium/auxiliary/draw/draw_vs_sse.c @@ -41,173 +41,136 @@  #include "draw_private.h"  #include "draw_context.h" +#include "rtasm/rtasm_cpu.h"  #include "rtasm/rtasm_x86sse.h"  #include "tgsi/exec/tgsi_sse2.h"  #include "tgsi/util/tgsi_parse.h" +#define SSE_MAX_VERTICES 4 +#define SSE_SWIZZLES 1 +#if SSE_SWIZZLES +typedef void (XSTDCALL *codegen_function) ( +   const struct tgsi_exec_vector *input, /* 1 */ +   struct tgsi_exec_vector *output, /* 2 */ +   float (*constant)[4],        /* 3 */ +   struct tgsi_exec_vector *temporary, /* 4 */ +   float (*immediates)[4],      /* 5 */ +   const float (*aos_input)[4], /* 6 */ +   uint num_inputs,             /* 7 */ +   uint input_stride,           /* 8 */ +   float (*aos_output)[4],      /* 9 */ +   uint num_outputs,            /* 10 */ +   uint output_stride );        /* 11 */ +#else  typedef void (XSTDCALL *codegen_function) (     const struct tgsi_exec_vector *input,     struct tgsi_exec_vector *output,     float (*constant)[4], -   struct tgsi_exec_vector *temporary ); - +   struct tgsi_exec_vector *temporary, +   float (*immediates)[4] ); +#endif  struct draw_sse_vertex_shader {     struct draw_vertex_shader base;     struct x86_function sse2_program; -   codegen_function func; -}; +   codegen_function func; +    +   struct tgsi_exec_machine *machine; -/* Should be part of the generated shader: - */ -static INLINE unsigned -compute_clipmask(const float *clip, /*const*/ float plane[][4], unsigned nr) -{ -   unsigned mask = 0; -   unsigned i; - -   /* Do the hardwired planes first: -    */ -   if (-clip[0] + clip[3] < 0) mask |= CLIP_RIGHT_BIT; -   if ( clip[0] + clip[3] < 0) mask |= CLIP_LEFT_BIT; -   if (-clip[1] + clip[3] < 0) mask |= CLIP_TOP_BIT; -   if ( clip[1] + clip[3] < 0) mask |= CLIP_BOTTOM_BIT; -   if (-clip[2] + clip[3] < 0) mask |= CLIP_FAR_BIT; -   if ( clip[2] + clip[3] < 0) mask |= CLIP_NEAR_BIT; - -   /* Followed by any remaining ones: -    */ -   for (i = 6; i < nr; i++) { -      if (dot4(clip, plane[i]) < 0)  -         mask |= (1<<i); -   } - -   return mask; -} +   float immediates[TGSI_EXEC_NUM_IMMEDIATES][4]; +};  static void  vs_sse_prepare( struct draw_vertex_shader *base,  		struct draw_context *draw )  { -   draw_update_vertex_fetch( draw );  } -/** - * Transform vertices with the current vertex program/shader - * Up to four vertices can be shaded at a time. - * \param vbuffer  the input vertex data - * \param elts  indexes of four input vertices - * \param count  number of vertices to shade [1..4] - * \param vOut  array of pointers to four output vertices + + +/* Simplified vertex shader interface for the pt paths.  Given the + * complexity of code-generating all the above operations together, + * it's time to try doing all the other stuff separately.   */  static void -vs_sse_run( struct draw_vertex_shader *base, -	    struct draw_context *draw,  -	    const unsigned *elts,  -	    unsigned count, -	    struct vertex_header *vOut[] ) +vs_sse_run_linear( struct draw_vertex_shader *base, +		   const float (*input)[4], +		   float (*output)[4], +		   const float (*constants)[4], +		   unsigned count, +		   unsigned input_stride, +		   unsigned output_stride )  {     struct draw_sse_vertex_shader *shader = (struct draw_sse_vertex_shader *)base; -   struct tgsi_exec_machine *machine = &draw->machine; -   unsigned int j; - -   ALIGN16_DECL(struct tgsi_exec_vector, inputs, PIPE_MAX_ATTRIBS); -   ALIGN16_DECL(struct tgsi_exec_vector, outputs, PIPE_MAX_ATTRIBS); -   const float *scale = draw->viewport.scale; -   const float *trans = draw->viewport.translate; - -   assert(count <= 4); -   assert(draw->vertex_shader->info.output_semantic_name[0] -          == TGSI_SEMANTIC_POSITION); - -   /* Consts does not require 16 byte alignment. */ -   machine->Consts = (float (*)[4]) draw->user.constants; -   machine->Inputs = ALIGN16_ASSIGN(inputs); -   if (draw->rasterizer->bypass_vs) { -      /* outputs are just the inputs */ -      machine->Outputs = machine->Inputs; -   } -   else { -      machine->Outputs = ALIGN16_ASSIGN(outputs); -   } +   struct tgsi_exec_machine *machine = shader->machine; +   unsigned int i; +   for (i = 0; i < count; i += MAX_TGSI_VERTICES) { +      unsigned int max_vertices = MIN2(MAX_TGSI_VERTICES, count - i); -   /* Fetch vertices.  This may at some point be integrated into the -    * compiled shader -- that would require a reorganization where -    * multiple versions of the compiled shader might exist, -    * specialized for each fetch state. -    */ -   draw->vertex_fetch.fetch_func( draw, machine, elts, count ); - - -   if (!draw->rasterizer->bypass_vs) { +#if SSE_SWIZZLES        /* run compiled shader -       */    +       */        shader->func(machine->Inputs, -                   machine->Outputs, -                   machine->Consts, -                   machine->Temps ); -   } - - -   /* XXX: Computing the clipmask and emitting results should be done -    *      in the vertex program as a set of instructions appended to -    *      the user-provided code. -    */ -   for (j = 0; j < count; j++) { -      unsigned slot; -      float x, y, z, w; +		   machine->Outputs, +		   (float (*)[4])constants, +		   machine->Temps, +		   shader->immediates, +                   input, +                   base->info.num_inputs, +                   input_stride, +                   output, +                   base->info.num_outputs, +                   output_stride ); -      x = vOut[j]->clip[0] = machine->Outputs[0].xyzw[0].f[j]; -      y = vOut[j]->clip[1] = machine->Outputs[0].xyzw[1].f[j]; -      z = vOut[j]->clip[2] = machine->Outputs[0].xyzw[2].f[j]; -      w = vOut[j]->clip[3] = machine->Outputs[0].xyzw[3].f[j]; +      input = (const float (*)[4])((const char *)input + input_stride * max_vertices); +      output = (float (*)[4])((char *)output + output_stride * max_vertices); +#else +      unsigned int j, slot; -      if (!draw->rasterizer->bypass_clipping) { -         vOut[j]->clipmask = compute_clipmask(vOut[j]->clip, draw->plane, draw->nr_planes); +      /* Swizzle inputs.   +       */ +      for (j = 0; j < max_vertices; j++) { +         for (slot = 0; slot < base->info.num_inputs; slot++) { +            machine->Inputs[slot].xyzw[0].f[j] = input[slot][0]; +            machine->Inputs[slot].xyzw[1].f[j] = input[slot][1]; +            machine->Inputs[slot].xyzw[2].f[j] = input[slot][2]; +            machine->Inputs[slot].xyzw[3].f[j] = input[slot][3]; +         }  -         /* divide by w */ -         w = 1.0f / w; -         x *= w; -         y *= w; -         z *= w; -      } -      else { -         vOut[j]->clipmask = 0; +	 input = (const float (*)[4])((const char *)input + input_stride);        } -      vOut[j]->edgeflag = 1; -      if (!draw->identity_viewport) { -         /* Viewport mapping */ -         vOut[j]->data[0][0] = x * scale[0] + trans[0]; -         vOut[j]->data[0][1] = y * scale[1] + trans[1]; -         vOut[j]->data[0][2] = z * scale[2] + trans[2]; -         vOut[j]->data[0][3] = w; -      } -      else { -         vOut[j]->data[0][0] = x; -         vOut[j]->data[0][1] = y; -         vOut[j]->data[0][2] = z; -         vOut[j]->data[0][3] = w; -      } +      /* run compiled shader +       */ +      shader->func(machine->Inputs, +		   machine->Outputs, +		   (float (*)[4])constants, +		   machine->Temps, +		   shader->immediates); -      /* Remaining attributes are packed into sequential post-transform -       * vertex attrib slots. +      /* Unswizzle all output results.           */ -      for (slot = 1; slot < draw->num_vs_outputs; slot++) { -         vOut[j]->data[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; -         vOut[j]->data[slot][1] = machine->Outputs[slot].xyzw[1].f[j]; -         vOut[j]->data[slot][2] = machine->Outputs[slot].xyzw[2].f[j]; -         vOut[j]->data[slot][3] = machine->Outputs[slot].xyzw[3].f[j]; +      for (j = 0; j < max_vertices; j++) { +         for (slot = 0; slot < base->info.num_outputs; slot++) { +            output[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; +            output[slot][1] = machine->Outputs[slot].xyzw[1].f[j]; +            output[slot][2] = machine->Outputs[slot].xyzw[2].f[j]; +            output[slot][3] = machine->Outputs[slot].xyzw[3].f[j]; +         }  + +	 output = (float (*)[4])((char *)output + output_stride);        } -   }  +#endif +   }  } +  static void  vs_sse_delete( struct draw_vertex_shader *base )  { @@ -225,9 +188,8 @@ draw_create_vs_sse(struct draw_context *draw,                            const struct pipe_shader_state *templ)  {     struct draw_sse_vertex_shader *vs; -   uint nt = tgsi_num_tokens(templ->tokens); -   if (!draw->use_sse)  +   if (!rtasm_cpu_has_sse2())        return NULL;     vs = CALLOC_STRUCT( draw_sse_vertex_shader ); @@ -235,18 +197,27 @@ draw_create_vs_sse(struct draw_context *draw,        return NULL;     /* we make a private copy of the tokens */ -   vs->base.state.tokens = mem_dup(templ->tokens, nt * sizeof(templ->tokens[0])); +   vs->base.state.tokens = tgsi_dup_tokens(templ->tokens); +   if (!vs->base.state.tokens) +      goto fail; + +   tgsi_scan_shader(templ->tokens, &vs->base.info); +     vs->base.prepare = vs_sse_prepare; -   vs->base.run = vs_sse_run; +   vs->base.run_linear = vs_sse_run_linear;     vs->base.delete = vs_sse_delete; +   vs->machine = &draw->machine;     x86_init_func( &vs->sse2_program );     if (!tgsi_emit_sse2( (struct tgsi_token *) vs->base.state.tokens, -			&vs->sse2_program ))  +			&vs->sse2_program, vs->immediates, SSE_SWIZZLES ))         goto fail;     vs->func = (codegen_function) x86_get_func( &vs->sse2_program ); +   if (!vs->func) { +      goto fail; +   }     return &vs->base; diff --git a/src/gallium/auxiliary/draw/draw_wide_prims.c b/src/gallium/auxiliary/draw/draw_wide_prims.c deleted file mode 100644 index d6bff110b4..0000000000 --- a/src/gallium/auxiliary/draw/draw_wide_prims.c +++ /dev/null @@ -1,366 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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:  Keith Whitwell <keith@tungstengraphics.com> - */ - -#include "pipe/p_util.h" -#include "pipe/p_defines.h" -#include "pipe/p_shader_tokens.h" -#include "draw_private.h" - - -struct wide_stage { -   struct draw_stage stage; - -   float half_line_width; -   float half_point_size; - -   uint texcoord_slot[PIPE_MAX_SHADER_OUTPUTS]; -   uint texcoord_mode[PIPE_MAX_SHADER_OUTPUTS]; -   uint num_texcoords; - -   int psize_slot; -}; - - - -static INLINE struct wide_stage *wide_stage( struct draw_stage *stage ) -{ -   return (struct wide_stage *)stage; -} - - -static void passthrough_point( struct draw_stage *stage, -                               struct prim_header *header ) -{ -   stage->next->point( stage->next, header ); -} - -static void passthrough_line( struct draw_stage *stage, -                              struct prim_header *header ) -{ -   stage->next->line(stage->next, header); -} - -static void passthrough_tri( struct draw_stage *stage, -                             struct prim_header *header ) -{ -   stage->next->tri(stage->next, header); -} - - -/** - * Draw a wide line by drawing a quad (two triangles). - * XXX need to disable polygon stipple. - */ -static void wide_line( struct draw_stage *stage, -		       struct prim_header *header ) -{ -   const struct wide_stage *wide = wide_stage(stage); -   const float half_width = wide->half_line_width; - -   struct prim_header tri; - -   struct vertex_header *v0 = dup_vert(stage, header->v[0], 0); -   struct vertex_header *v1 = dup_vert(stage, header->v[0], 1); -   struct vertex_header *v2 = dup_vert(stage, header->v[1], 2); -   struct vertex_header *v3 = dup_vert(stage, header->v[1], 3); - -   float *pos0 = v0->data[0]; -   float *pos1 = v1->data[0]; -   float *pos2 = v2->data[0]; -   float *pos3 = v3->data[0]; - -   const float dx = FABSF(pos0[0] - pos2[0]); -   const float dy = FABSF(pos0[1] - pos2[1]); -    -   /* -    * Draw wide line as a quad (two tris) by "stretching" the line along -    * X or Y. -    * We need to tweak coords in several ways to be conformant here. -    */ - -   if (dx > dy) { -      /* x-major line */ -      pos0[1] = pos0[1] - half_width - 0.25f; -      pos1[1] = pos1[1] + half_width - 0.25f; -      pos2[1] = pos2[1] - half_width - 0.25f; -      pos3[1] = pos3[1] + half_width - 0.25f; -      if (pos0[0] < pos2[0]) { -         /* left to right line */ -         pos0[0] -= 0.5f; -         pos1[0] -= 0.5f; -         pos2[0] -= 0.5f; -         pos3[0] -= 0.5f; -      } -      else { -         /* right to left line */ -         pos0[0] += 0.5f; -         pos1[0] += 0.5f; -         pos2[0] += 0.5f; -         pos3[0] += 0.5f; -      } -   } -   else { -      /* y-major line */ -      pos0[0] = pos0[0] - half_width + 0.25f; -      pos1[0] = pos1[0] + half_width + 0.25f; -      pos2[0] = pos2[0] - half_width + 0.25f; -      pos3[0] = pos3[0] + half_width + 0.25f; -      if (pos0[1] < pos2[1]) { -         /* top to bottom line */ -         pos0[1] -= 0.5f; -         pos1[1] -= 0.5f; -         pos2[1] -= 0.5f; -         pos3[1] -= 0.5f; -      } -      else { -         /* bottom to top line */ -         pos0[1] += 0.5f; -         pos1[1] += 0.5f; -         pos2[1] += 0.5f; -         pos3[1] += 0.5f; -      } -   } - -   tri.det = header->det;  /* only the sign matters */ -   tri.v[0] = v0; -   tri.v[1] = v2; -   tri.v[2] = v3; -   stage->next->tri( stage->next, &tri ); - -   tri.v[0] = v0; -   tri.v[1] = v3; -   tri.v[2] = v1; -   stage->next->tri( stage->next, &tri ); -} - - -/** - * Set the vertex texcoords for sprite mode. - * Coords may be left untouched or set to a right-side-up or upside-down - * orientation. - */ -static void set_texcoords(const struct wide_stage *wide, -                          struct vertex_header *v, const float tc[4]) -{ -   uint i; -   for (i = 0; i < wide->num_texcoords; i++) { -      if (wide->texcoord_mode[i] != PIPE_SPRITE_COORD_NONE) { -         uint j = wide->texcoord_slot[i]; -         v->data[j][0] = tc[0]; -         if (wide->texcoord_mode[i] == PIPE_SPRITE_COORD_LOWER_LEFT) -            v->data[j][1] = 1.0f - tc[1]; -         else -            v->data[j][1] = tc[1]; -         v->data[j][2] = tc[2]; -         v->data[j][3] = tc[3]; -      } -   } -} - - -/* If there are lots of sprite points (and why wouldn't there be?) it - * would probably be more sensible to change hardware setup to - * optimize this rather than doing the whole thing in software like - * this. - */ -static void wide_point( struct draw_stage *stage, -			struct prim_header *header ) -{ -   const struct wide_stage *wide = wide_stage(stage); -   const boolean sprite = (boolean) stage->draw->rasterizer->point_sprite; -   float half_size; -   float left_adj, right_adj; - -   struct prim_header tri; - -   /* four dups of original vertex */ -   struct vertex_header *v0 = dup_vert(stage, header->v[0], 0); -   struct vertex_header *v1 = dup_vert(stage, header->v[0], 1); -   struct vertex_header *v2 = dup_vert(stage, header->v[0], 2); -   struct vertex_header *v3 = dup_vert(stage, header->v[0], 3); - -   float *pos0 = v0->data[0]; -   float *pos1 = v1->data[0]; -   float *pos2 = v2->data[0]; -   float *pos3 = v3->data[0]; - -   /* point size is either per-vertex or fixed size */ -   if (wide->psize_slot >= 0) { -      half_size = 0.5f * header->v[0]->data[wide->psize_slot][0]; -   } -   else { -      half_size = wide->half_point_size; -   } - -   left_adj = -half_size; /* + 0.25f;*/ -   right_adj = half_size; /* + 0.25f;*/ - -   pos0[0] += left_adj; -   pos0[1] -= half_size; - -   pos1[0] += left_adj; -   pos1[1] += half_size; - -   pos2[0] += right_adj; -   pos2[1] -= half_size; - -   pos3[0] += right_adj; -   pos3[1] += half_size; - -   if (sprite) { -      static const float tex00[4] = { 0, 0, 0, 1 }; -      static const float tex01[4] = { 0, 1, 0, 1 }; -      static const float tex11[4] = { 1, 1, 0, 1 }; -      static const float tex10[4] = { 1, 0, 0, 1 }; -      set_texcoords( wide, v0, tex00 ); -      set_texcoords( wide, v1, tex01 ); -      set_texcoords( wide, v2, tex10 ); -      set_texcoords( wide, v3, tex11 ); -   } - -   tri.det = header->det;  /* only the sign matters */ -   tri.v[0] = v0; -   tri.v[1] = v2; -   tri.v[2] = v3; -   stage->next->tri( stage->next, &tri ); - -   tri.v[0] = v0; -   tri.v[1] = v3; -   tri.v[2] = v1; -   stage->next->tri( stage->next, &tri ); -} - - -static void wide_first_point( struct draw_stage *stage,  -			      struct prim_header *header ) -{ -   struct wide_stage *wide = wide_stage(stage); -   struct draw_context *draw = stage->draw; - -   wide->half_point_size = 0.5f * draw->rasterizer->point_size; - -   /* XXX we won't know the real size if it's computed by the vertex shader! */ -   if (draw->rasterizer->point_size > draw->wide_point_threshold) { -      stage->point = wide_point; -   } -   else { -      stage->point = passthrough_point; -   } - -   if (draw->rasterizer->point_sprite) { -      /* find vertex shader texcoord outputs */ -      const struct draw_vertex_shader *vs = draw->vertex_shader; -      uint i, j = 0; -      for (i = 0; i < vs->info.num_outputs; i++) { -         if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_GENERIC) { -            wide->texcoord_slot[j] = i; -            wide->texcoord_mode[j] = draw->rasterizer->sprite_coord_mode[j]; -            j++; -         } -      } -      wide->num_texcoords = j; -   } - -   wide->psize_slot = -1; - -   if (draw->rasterizer->point_size_per_vertex) { -      /* find PSIZ vertex output */ -      const struct draw_vertex_shader *vs = draw->vertex_shader; -      uint i; -      for (i = 0; i < vs->info.num_outputs; i++) { -         if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_PSIZE) { -            wide->psize_slot = i; -            break; -         } -      } -   } -    -   stage->point( stage, header ); -} - - - -static void wide_first_line( struct draw_stage *stage, -			     struct prim_header *header ) -{ -   struct wide_stage *wide = wide_stage(stage); -   struct draw_context *draw = stage->draw; - -   wide->half_line_width = 0.5f * draw->rasterizer->line_width; - -   if (draw->rasterizer->line_width != 1.0) { -      wide->stage.line = wide_line; -   } -   else { -      wide->stage.line = passthrough_line; -   } -    -   stage->line( stage, header ); -} - - -static void wide_flush( struct draw_stage *stage, unsigned flags ) -{ -   stage->line = wide_first_line; -   stage->point = wide_first_point; -   stage->next->flush( stage->next, flags ); -} - - -static void wide_reset_stipple_counter( struct draw_stage *stage ) -{ -   stage->next->reset_stipple_counter( stage->next ); -} - - -static void wide_destroy( struct draw_stage *stage ) -{ -   draw_free_temp_verts( stage ); -   FREE( stage ); -} - - -struct draw_stage *draw_wide_stage( struct draw_context *draw ) -{ -   struct wide_stage *wide = CALLOC_STRUCT(wide_stage); - -   draw_alloc_temp_verts( &wide->stage, 4 ); - -   wide->stage.draw = draw; -   wide->stage.next = NULL; -   wide->stage.point = wide_first_point; -   wide->stage.line = wide_first_line; -   wide->stage.tri = passthrough_tri; -   wide->stage.flush = wide_flush; -   wide->stage.reset_stipple_counter = wide_reset_stipple_counter; -   wide->stage.destroy = wide_destroy; - -   return &wide->stage; -} diff --git a/src/gallium/auxiliary/gallivm/Makefile b/src/gallium/auxiliary/gallivm/Makefile index c24e19e062..c3f7bfba93 100644 --- a/src/gallium/auxiliary/gallivm/Makefile +++ b/src/gallium/auxiliary/gallivm/Makefile @@ -65,10 +65,14 @@ depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(INC_SOURCES)  gallivm_builtins.cpp: llvm_builtins.c -	clang --emit-llvm < $< |llvm-as|opt -std-compile-opts|llvm2cpp -gen-contents -o=$@ -f -for=shader -funcname=createGallivmBuiltins +	clang --emit-llvm < $< |llvm-as|opt -std-compile-opts > temp1.bin +	(echo "static const unsigned char llvm_builtins_data[] = {"; od -txC temp1.bin | sed -e "s/^[0-9]*//" -e s"/ \([0-9a-f][0-9a-f]\)/0x\1,/g" -e"\$$d" | sed -e"\$$s/,$$/};/") >$@ +	rm temp1.bin  gallivmsoabuiltins.cpp: soabuiltins.c -	clang --emit-llvm < $< |llvm-as|opt -std-compile-opts|llvm2cpp -gen-module -o=$@ -f -for=shader -funcname=createSoaBuiltins +	clang --emit-llvm < $< |llvm-as|opt -std-compile-opts > temp2.bin +	(echo "static const unsigned char soabuiltins_data[] = {"; od -txC temp2.bin | sed -e "s/^[0-9]*//" -e s"/ \([0-9a-f][0-9a-f]\)/0x\1,/g" -e"\$$d" | sed -e"\$$s/,$$/};/") >$@ +	rm temp2.bin  # Emacs tags  tags: diff --git a/src/gallium/auxiliary/gallivm/gallivm.cpp b/src/gallium/auxiliary/gallivm/gallivm.cpp index b6f641a3f8..77900e342b 100644 --- a/src/gallium/auxiliary/gallivm/gallivm.cpp +++ b/src/gallium/auxiliary/gallivm/gallivm.cpp @@ -288,10 +288,7 @@ void gallivm_ir_fill_from_tgsi(struct gallivm_ir *ir,     std::cout << "Creating llvm from: " <<std::endl;     tgsi_dump(tokens, 0); -     llvm::Module *mod = tgsi_to_llvmir(ir, tokens); - -   //llvm::Module *mod = tgsi_to_llvm(ir, tokens);     ir->module = mod;     gallivm_ir_dump(ir, 0);  } @@ -306,11 +303,11 @@ struct gallivm_prog * gallivm_ir_compile(struct gallivm_ir *ir)  {     struct gallivm_prog *prog =        (struct gallivm_prog *)calloc(1, sizeof(struct gallivm_prog)); -    +     std::cout << "Before optimizations:"<<std::endl;     ir->module->dump();     std::cout<<"-------------------------------"<<std::endl; -    +     PassManager veri;     veri.add(createVerifierPass());     veri.run(*ir->module); @@ -318,7 +315,7 @@ struct gallivm_prog * gallivm_ir_compile(struct gallivm_ir *ir)     prog->num_consts = ir->num_consts;     memcpy(prog->interpolators, ir->interpolators, sizeof(prog->interpolators));     prog->num_interp = ir->num_interp; -    +     /* Run optimization passes over it */     PassManager passes;     passes.add(new TargetData(mod)); diff --git a/src/gallium/auxiliary/gallivm/gallivm.h b/src/gallium/auxiliary/gallivm/gallivm.h index b4d6555d2f..36a64a7747 100644 --- a/src/gallium/auxiliary/gallivm/gallivm.h +++ b/src/gallium/auxiliary/gallivm/gallivm.h @@ -90,10 +90,15 @@ void gallivm_prog_dump(struct gallivm_prog *prog, const char *file_prefix);  struct gallivm_cpu_engine *gallivm_cpu_engine_create(struct gallivm_prog *prog);  struct gallivm_cpu_engine *gallivm_global_cpu_engine();  int gallivm_cpu_vs_exec(struct gallivm_prog *prog, -                        struct tgsi_exec_vector       *inputs, -                        struct tgsi_exec_vector       *dests, -                        float (*consts)[4], -                        struct tgsi_exec_vector       *temps); +                        struct tgsi_exec_machine *machine, +                        const float (*input)[4], +                        unsigned num_inputs, +                        float (*output)[4], +                        unsigned num_outputs, +                        const float (*constants)[4], +                        unsigned count, +                        unsigned input_stride, +                        unsigned output_stride);  int gallivm_cpu_fs_exec(struct gallivm_prog *prog,                          float x, float y,                          float (*dests)[PIPE_MAX_SHADER_INPUTS][4], diff --git a/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp b/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp index 1796f0a177..0fc5c4ec5c 100644 --- a/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp +++ b/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp @@ -1,567 +1,140 @@ -// Generated by llvm2cpp - DO NOT MODIFY! - - -Module* createGallivmBuiltins(Module *mod) { - -mod->setModuleIdentifier("shader"); - -// Type Definitions -ArrayType* ArrayTy_0 = ArrayType::get(IntegerType::get(8), 25); - -PointerType* PointerTy_1 = PointerType::get(ArrayTy_0, 0); - -std::vector<const Type*>FuncTy_2_args; -FuncTy_2_args.push_back(Type::FloatTy); -FuncTy_2_args.push_back(Type::FloatTy); -FunctionType* FuncTy_2 = FunctionType::get( -  /*Result=*/Type::FloatTy, -  /*Params=*/FuncTy_2_args, -  /*isVarArg=*/false); - -PointerType* PointerTy_3 = PointerType::get(FuncTy_2, 0); - -VectorType* VectorTy_4 = VectorType::get(Type::FloatTy, 4); - -std::vector<const Type*>FuncTy_5_args; -FuncTy_5_args.push_back(VectorTy_4); -FunctionType* FuncTy_5 = FunctionType::get( -  /*Result=*/VectorTy_4, -  /*Params=*/FuncTy_5_args, -  /*isVarArg=*/false); - -std::vector<const Type*>FuncTy_6_args; -FuncTy_6_args.push_back(VectorTy_4); -FuncTy_6_args.push_back(VectorTy_4); -FuncTy_6_args.push_back(VectorTy_4); -FunctionType* FuncTy_6 = FunctionType::get( -  /*Result=*/VectorTy_4, -  /*Params=*/FuncTy_6_args, -  /*isVarArg=*/false); - -VectorType* VectorTy_7 = VectorType::get(IntegerType::get(32), 4); - -std::vector<const Type*>FuncTy_9_args; -FunctionType* FuncTy_9 = FunctionType::get( -  /*Result=*/IntegerType::get(32), -  /*Params=*/FuncTy_9_args, -  /*isVarArg=*/true); - -PointerType* PointerTy_8 = PointerType::get(FuncTy_9, 0); - -PointerType* PointerTy_10 = PointerType::get(IntegerType::get(8), 0); - -std::vector<const Type*>FuncTy_12_args; -FuncTy_12_args.push_back(Type::FloatTy); -FunctionType* FuncTy_12 = FunctionType::get( -  /*Result=*/Type::FloatTy, -  /*Params=*/FuncTy_12_args, -  /*isVarArg=*/false); - -PointerType* PointerTy_11 = PointerType::get(FuncTy_12, 0); - -std::vector<const Type*>FuncTy_13_args; -FuncTy_13_args.push_back(VectorTy_4); -FunctionType* FuncTy_13 = FunctionType::get( -  /*Result=*/IntegerType::get(32), -  /*Params=*/FuncTy_13_args, -  /*isVarArg=*/false); - - -// Function Declarations - -Function* func_approx = new Function( -  /*Type=*/FuncTy_2, -  /*Linkage=*/GlobalValue::WeakLinkage, -  /*Name=*/"approx", mod);  -func_approx->setCallingConv(CallingConv::C); -const ParamAttrsList *func_approx_PAL = 0; -func_approx->setParamAttrs(func_approx_PAL); - -Function* func_powf = new Function( -  /*Type=*/FuncTy_2, -  /*Linkage=*/GlobalValue::ExternalLinkage, -  /*Name=*/"powf", mod); // (external, no body) -func_powf->setCallingConv(CallingConv::C); -const ParamAttrsList *func_powf_PAL = 0; -func_powf->setParamAttrs(func_powf_PAL); - -Function* func_lit = new Function( -  /*Type=*/FuncTy_5, -  /*Linkage=*/GlobalValue::WeakLinkage, -  /*Name=*/"lit", mod);  -func_lit->setCallingConv(CallingConv::C); -const ParamAttrsList *func_lit_PAL = 0; -func_lit->setParamAttrs(func_lit_PAL); - -Function* func_cmp = new Function( -  /*Type=*/FuncTy_6, -  /*Linkage=*/GlobalValue::WeakLinkage, -  /*Name=*/"cmp", mod);  -func_cmp->setCallingConv(CallingConv::C); -const ParamAttrsList *func_cmp_PAL = 0; -{ -  ParamAttrsVector Attrs; -  ParamAttrsWithIndex PAWI; -  PAWI.index = 0; PAWI.attrs = 0  | ParamAttr::NoUnwind; -  Attrs.push_back(PAWI); -  func_cmp_PAL = ParamAttrsList::get(Attrs); -   -} -func_cmp->setParamAttrs(func_cmp_PAL); - -Function* func_vcos = new Function( -  /*Type=*/FuncTy_5, -  /*Linkage=*/GlobalValue::WeakLinkage, -  /*Name=*/"vcos", mod);  -func_vcos->setCallingConv(CallingConv::C); -const ParamAttrsList *func_vcos_PAL = 0; -func_vcos->setParamAttrs(func_vcos_PAL); - -Function* func_printf = new Function( -  /*Type=*/FuncTy_9, -  /*Linkage=*/GlobalValue::ExternalLinkage, -  /*Name=*/"printf", mod); // (external, no body) -func_printf->setCallingConv(CallingConv::C); -const ParamAttrsList *func_printf_PAL = 0; -func_printf->setParamAttrs(func_printf_PAL); - -Function* func_cosf = new Function( -  /*Type=*/FuncTy_12, -  /*Linkage=*/GlobalValue::ExternalLinkage, -  /*Name=*/"cosf", mod); // (external, no body) -func_cosf->setCallingConv(CallingConv::C); -const ParamAttrsList *func_cosf_PAL = 0; -func_cosf->setParamAttrs(func_cosf_PAL); - -Function* func_scs = new Function( -  /*Type=*/FuncTy_5, -  /*Linkage=*/GlobalValue::WeakLinkage, -  /*Name=*/"scs", mod);  -func_scs->setCallingConv(CallingConv::C); -const ParamAttrsList *func_scs_PAL = 0; -func_scs->setParamAttrs(func_scs_PAL); - -Function* func_sinf = new Function( -  /*Type=*/FuncTy_12, -  /*Linkage=*/GlobalValue::ExternalLinkage, -  /*Name=*/"sinf", mod); // (external, no body) -func_sinf->setCallingConv(CallingConv::C); -const ParamAttrsList *func_sinf_PAL = 0; -func_sinf->setParamAttrs(func_sinf_PAL); - -Function* func_vsin = new Function( -  /*Type=*/FuncTy_5, -  /*Linkage=*/GlobalValue::WeakLinkage, -  /*Name=*/"vsin", mod);  -func_vsin->setCallingConv(CallingConv::C); -const ParamAttrsList *func_vsin_PAL = 0; -func_vsin->setParamAttrs(func_vsin_PAL); - -Function* func_kilp = new Function( -  /*Type=*/FuncTy_13, -  /*Linkage=*/GlobalValue::WeakLinkage, -  /*Name=*/"kilp", mod);  -func_kilp->setCallingConv(CallingConv::C); -const ParamAttrsList *func_kilp_PAL = 0; -{ -  ParamAttrsVector Attrs; -  ParamAttrsWithIndex PAWI; -  PAWI.index = 0; PAWI.attrs = 0  | ParamAttr::NoUnwind; -  Attrs.push_back(PAWI); -  func_kilp_PAL = ParamAttrsList::get(Attrs); -   -} -func_kilp->setParamAttrs(func_kilp_PAL); - -// Global Variable Declarations - - -GlobalVariable* gvar_array__str = new GlobalVariable( -/*Type=*/ArrayTy_0, -/*isConstant=*/true, -/*Linkage=*/GlobalValue::InternalLinkage, -/*Initializer=*/0, // has initializer, specified below -/*Name=*/".str", -mod); - -GlobalVariable* gvar_array__str1 = new GlobalVariable( -/*Type=*/ArrayTy_0, -/*isConstant=*/true, -/*Linkage=*/GlobalValue::InternalLinkage, -/*Initializer=*/0, // has initializer, specified below -/*Name=*/".str1", -mod); - -// Constant Definitions -Constant* const_array_14 = ConstantArray::get("VEC IN   is %f %f %f %f\x0A", true); -Constant* const_array_15 = ConstantArray::get("VEC OUT  is %f %f %f %f\x0A", true); -ConstantFP* const_float_16 = ConstantFP::get(Type::FloatTy, APFloat(-1.280000e+02f)); -ConstantFP* const_float_17 = ConstantFP::get(Type::FloatTy, APFloat(1.280000e+02f)); -Constant* const_float_18 = Constant::getNullValue(Type::FloatTy); -Constant* const_int32_19 = Constant::getNullValue(IntegerType::get(32)); -std::vector<Constant*> const_packed_20_elems; -ConstantFP* const_float_21 = ConstantFP::get(Type::FloatTy, APFloat(1.000000e+00f)); -const_packed_20_elems.push_back(const_float_21); -UndefValue* const_float_22 = UndefValue::get(Type::FloatTy); -const_packed_20_elems.push_back(const_float_22); -const_packed_20_elems.push_back(const_float_22); -const_packed_20_elems.push_back(const_float_21); -Constant* const_packed_20 = ConstantVector::get(VectorTy_4, const_packed_20_elems); -ConstantInt* const_int32_23 = ConstantInt::get(APInt(32,  "1", 10)); -ConstantInt* const_int32_24 = ConstantInt::get(APInt(32,  "3", 10)); -ConstantInt* const_int32_25 = ConstantInt::get(APInt(32,  "2", 10)); -std::vector<Constant*> const_packed_26_elems; -const_packed_26_elems.push_back(const_float_21); -const_packed_26_elems.push_back(const_float_18); -const_packed_26_elems.push_back(const_float_18); -const_packed_26_elems.push_back(const_float_21); -Constant* const_packed_26 = ConstantVector::get(VectorTy_4, const_packed_26_elems); -Constant* const_double_27 = Constant::getNullValue(Type::DoubleTy); -std::vector<Constant*> const_packed_28_elems; -const_packed_28_elems.push_back(const_int32_19); -ConstantInt* const_int32_29 = ConstantInt::get(APInt(32,  "5", 10)); -const_packed_28_elems.push_back(const_int32_29); -const_packed_28_elems.push_back(const_int32_25); -const_packed_28_elems.push_back(const_int32_24); -Constant* const_packed_28 = ConstantVector::get(VectorTy_7, const_packed_28_elems); -std::vector<Constant*> const_packed_30_elems; -const_packed_30_elems.push_back(const_int32_19); -const_packed_30_elems.push_back(const_int32_23); -ConstantInt* const_int32_31 = ConstantInt::get(APInt(32,  "6", 10)); -const_packed_30_elems.push_back(const_int32_31); -const_packed_30_elems.push_back(const_int32_24); -Constant* const_packed_30 = ConstantVector::get(VectorTy_7, const_packed_30_elems); -std::vector<Constant*> const_packed_32_elems; -const_packed_32_elems.push_back(const_int32_19); -const_packed_32_elems.push_back(const_int32_23); -const_packed_32_elems.push_back(const_int32_25); -ConstantInt* const_int32_33 = ConstantInt::get(APInt(32,  "7", 10)); -const_packed_32_elems.push_back(const_int32_33); -Constant* const_packed_32 = ConstantVector::get(VectorTy_7, const_packed_32_elems); -std::vector<Constant*> const_ptr_34_indices; -const_ptr_34_indices.push_back(const_int32_19); -const_ptr_34_indices.push_back(const_int32_19); -Constant* const_ptr_34 = ConstantExpr::getGetElementPtr(gvar_array__str, &const_ptr_34_indices[0], const_ptr_34_indices.size() ); -UndefValue* const_packed_35 = UndefValue::get(VectorTy_4); -std::vector<Constant*> const_ptr_36_indices; -const_ptr_36_indices.push_back(const_int32_19); -const_ptr_36_indices.push_back(const_int32_19); -Constant* const_ptr_36 = ConstantExpr::getGetElementPtr(gvar_array__str1, &const_ptr_36_indices[0], const_ptr_36_indices.size() ); - -// Global Variable Definitions -gvar_array__str->setInitializer(const_array_14); -gvar_array__str1->setInitializer(const_array_15); - -// Function Definitions - -// Function: approx (func_approx) -{ -  Function::arg_iterator args = func_approx->arg_begin(); -  Value* float_a = args++; -  float_a->setName("a"); -  Value* float_b = args++; -  float_b->setName("b"); -   -  BasicBlock* label_entry = new BasicBlock("entry",func_approx,0); -   -  // Block entry (label_entry) -  FCmpInst* int1_cmp = new FCmpInst(FCmpInst::FCMP_OLT, float_b, const_float_16, "cmp", label_entry); -  SelectInst* float_b_addr_0 = new SelectInst(int1_cmp, const_float_16, float_b, "b.addr.0", label_entry); -  FCmpInst* int1_cmp3 = new FCmpInst(FCmpInst::FCMP_OGT, float_b_addr_0, const_float_17, "cmp3", label_entry); -  SelectInst* float_b_addr_1 = new SelectInst(int1_cmp3, const_float_17, float_b_addr_0, "b.addr.1", label_entry); -  FCmpInst* int1_cmp7 = new FCmpInst(FCmpInst::FCMP_OLT, float_a, const_float_18, "cmp7", label_entry); -  SelectInst* float_a_addr_0 = new SelectInst(int1_cmp7, const_float_18, float_a, "a.addr.0", label_entry); -  std::vector<Value*> float_call_params; -  float_call_params.push_back(float_a_addr_0); -  float_call_params.push_back(float_b_addr_1); -  CallInst* float_call = new CallInst(func_powf, float_call_params.begin(), float_call_params.end(), "call", label_entry); -  float_call->setCallingConv(CallingConv::C); -  float_call->setTailCall(true);const ParamAttrsList *float_call_PAL = 0; -  float_call->setParamAttrs(float_call_PAL); -   -  new ReturnInst(float_call, label_entry); -   -} - -// Function: lit (func_lit) -{ -  Function::arg_iterator args = func_lit->arg_begin(); -  Value* packed_tmp = args++; -  packed_tmp->setName("tmp"); -   -  BasicBlock* label_entry_38 = new BasicBlock("entry",func_lit,0); -  BasicBlock* label_ifthen = new BasicBlock("ifthen",func_lit,0); -  BasicBlock* label_UnifiedReturnBlock = new BasicBlock("UnifiedReturnBlock",func_lit,0); -   -  // Block entry (label_entry_38) -  ExtractElementInst* float_tmp6 = new ExtractElementInst(packed_tmp, const_int32_19, "tmp6", label_entry_38); -  FCmpInst* int1_cmp_39 = new FCmpInst(FCmpInst::FCMP_OGT, float_tmp6, const_float_18, "cmp", label_entry_38); -  new BranchInst(label_ifthen, label_UnifiedReturnBlock, int1_cmp_39, label_entry_38); -   -  // Block ifthen (label_ifthen) -  InsertElementInst* packed_tmp10 = new InsertElementInst(const_packed_20, float_tmp6, const_int32_23, "tmp10", label_ifthen); -  ExtractElementInst* float_tmp12 = new ExtractElementInst(packed_tmp, const_int32_23, "tmp12", label_ifthen); -  ExtractElementInst* float_tmp14 = new ExtractElementInst(packed_tmp, const_int32_24, "tmp14", label_ifthen); -  std::vector<Value*> float_call_41_params; -  float_call_41_params.push_back(float_tmp12); -  float_call_41_params.push_back(float_tmp14); -  CallInst* float_call_41 = new CallInst(func_approx, float_call_41_params.begin(), float_call_41_params.end(), "call", label_ifthen); -  float_call_41->setCallingConv(CallingConv::C); -  float_call_41->setTailCall(true);const ParamAttrsList *float_call_41_PAL = 0; -  float_call_41->setParamAttrs(float_call_41_PAL); -   -  InsertElementInst* packed_tmp16 = new InsertElementInst(packed_tmp10, float_call_41, const_int32_25, "tmp16", label_ifthen); -  new ReturnInst(packed_tmp16, label_ifthen); -   -  // Block UnifiedReturnBlock (label_UnifiedReturnBlock) -  new ReturnInst(const_packed_26, label_UnifiedReturnBlock); -   -} - -// Function: cmp (func_cmp) -{ -  Function::arg_iterator args = func_cmp->arg_begin(); -  Value* packed_tmp0 = args++; -  packed_tmp0->setName("tmp0"); -  Value* packed_tmp1 = args++; -  packed_tmp1->setName("tmp1"); -  Value* packed_tmp2 = args++; -  packed_tmp2->setName("tmp2"); -   -  BasicBlock* label_entry_44 = new BasicBlock("entry",func_cmp,0); -  BasicBlock* label_cond__14 = new BasicBlock("cond.?14",func_cmp,0); -  BasicBlock* label_cond_cont20 = new BasicBlock("cond.cont20",func_cmp,0); -  BasicBlock* label_cond__28 = new BasicBlock("cond.?28",func_cmp,0); -  BasicBlock* label_cond_cont34 = new BasicBlock("cond.cont34",func_cmp,0); -  BasicBlock* label_cond__42 = new BasicBlock("cond.?42",func_cmp,0); -  BasicBlock* label_cond_cont48 = new BasicBlock("cond.cont48",func_cmp,0); -   -  // Block entry (label_entry_44) -  ExtractElementInst* float_tmp3 = new ExtractElementInst(packed_tmp0, const_int32_19, "tmp3", label_entry_44); -  CastInst* double_conv = new FPExtInst(float_tmp3, Type::DoubleTy, "conv", label_entry_44); -  FCmpInst* int1_cmp_45 = new FCmpInst(FCmpInst::FCMP_OLT, double_conv, const_double_27, "cmp", label_entry_44); -  ExtractElementInst* float_tmp11 = new ExtractElementInst(packed_tmp0, const_int32_23, "tmp11", label_entry_44); -  CastInst* double_conv12 = new FPExtInst(float_tmp11, Type::DoubleTy, "conv12", label_entry_44); -  FCmpInst* int1_cmp13 = new FCmpInst(FCmpInst::FCMP_OLT, double_conv12, const_double_27, "cmp13", label_entry_44); -  SelectInst* packed_tmp1_tmp2 = new SelectInst(int1_cmp_45, packed_tmp1, packed_tmp2, "tmp1.tmp2", label_entry_44); -  new BranchInst(label_cond__14, label_cond_cont20, int1_cmp13, label_entry_44); -   -  // Block cond.?14 (label_cond__14) -  ShuffleVectorInst* packed_tmp233 = new ShuffleVectorInst(packed_tmp1_tmp2, packed_tmp1, const_packed_28, "tmp233", label_cond__14); -  ExtractElementInst* float_tmp254 = new ExtractElementInst(packed_tmp0, const_int32_25, "tmp254", label_cond__14); -  CastInst* double_conv265 = new FPExtInst(float_tmp254, Type::DoubleTy, "conv265", label_cond__14); -  FCmpInst* int1_cmp276 = new FCmpInst(FCmpInst::FCMP_OLT, double_conv265, const_double_27, "cmp276", label_cond__14); -  new BranchInst(label_cond__28, label_cond_cont34, int1_cmp276, label_cond__14); -   -  // Block cond.cont20 (label_cond_cont20) -  ShuffleVectorInst* packed_tmp23 = new ShuffleVectorInst(packed_tmp1_tmp2, packed_tmp2, const_packed_28, "tmp23", label_cond_cont20); -  ExtractElementInst* float_tmp25 = new ExtractElementInst(packed_tmp0, const_int32_25, "tmp25", label_cond_cont20); -  CastInst* double_conv26 = new FPExtInst(float_tmp25, Type::DoubleTy, "conv26", label_cond_cont20); -  FCmpInst* int1_cmp27 = new FCmpInst(FCmpInst::FCMP_OLT, double_conv26, const_double_27, "cmp27", label_cond_cont20); -  new BranchInst(label_cond__28, label_cond_cont34, int1_cmp27, label_cond_cont20); -   -  // Block cond.?28 (label_cond__28) -  PHINode* packed_tmp23_reg2mem_0 = new PHINode(VectorTy_4, "tmp23.reg2mem.0", label_cond__28); -  packed_tmp23_reg2mem_0->reserveOperandSpace(2); -  packed_tmp23_reg2mem_0->addIncoming(packed_tmp233, label_cond__14); -  packed_tmp23_reg2mem_0->addIncoming(packed_tmp23, label_cond_cont20); -   -  ShuffleVectorInst* packed_tmp378 = new ShuffleVectorInst(packed_tmp23_reg2mem_0, packed_tmp1, const_packed_30, "tmp378", label_cond__28); -  ExtractElementInst* float_tmp399 = new ExtractElementInst(packed_tmp0, const_int32_24, "tmp399", label_cond__28); -  CastInst* double_conv4010 = new FPExtInst(float_tmp399, Type::DoubleTy, "conv4010", label_cond__28); -  FCmpInst* int1_cmp4111 = new FCmpInst(FCmpInst::FCMP_OLT, double_conv4010, const_double_27, "cmp4111", label_cond__28); -  new BranchInst(label_cond__42, label_cond_cont48, int1_cmp4111, label_cond__28); -   -  // Block cond.cont34 (label_cond_cont34) -  PHINode* packed_tmp23_reg2mem_1 = new PHINode(VectorTy_4, "tmp23.reg2mem.1", label_cond_cont34); -  packed_tmp23_reg2mem_1->reserveOperandSpace(2); -  packed_tmp23_reg2mem_1->addIncoming(packed_tmp233, label_cond__14); -  packed_tmp23_reg2mem_1->addIncoming(packed_tmp23, label_cond_cont20); -   -  ShuffleVectorInst* packed_tmp37 = new ShuffleVectorInst(packed_tmp23_reg2mem_1, packed_tmp2, const_packed_30, "tmp37", label_cond_cont34); -  ExtractElementInst* float_tmp39 = new ExtractElementInst(packed_tmp0, const_int32_24, "tmp39", label_cond_cont34); -  CastInst* double_conv40 = new FPExtInst(float_tmp39, Type::DoubleTy, "conv40", label_cond_cont34); -  FCmpInst* int1_cmp41 = new FCmpInst(FCmpInst::FCMP_OLT, double_conv40, const_double_27, "cmp41", label_cond_cont34); -  new BranchInst(label_cond__42, label_cond_cont48, int1_cmp41, label_cond_cont34); -   -  // Block cond.?42 (label_cond__42) -  PHINode* packed_tmp37_reg2mem_0 = new PHINode(VectorTy_4, "tmp37.reg2mem.0", label_cond__42); -  packed_tmp37_reg2mem_0->reserveOperandSpace(2); -  packed_tmp37_reg2mem_0->addIncoming(packed_tmp378, label_cond__28); -  packed_tmp37_reg2mem_0->addIncoming(packed_tmp37, label_cond_cont34); -   -  ShuffleVectorInst* packed_tmp5113 = new ShuffleVectorInst(packed_tmp37_reg2mem_0, packed_tmp1, const_packed_32, "tmp5113", label_cond__42); -  new ReturnInst(packed_tmp5113, label_cond__42); -   -  // Block cond.cont48 (label_cond_cont48) -  PHINode* packed_tmp37_reg2mem_1 = new PHINode(VectorTy_4, "tmp37.reg2mem.1", label_cond_cont48); -  packed_tmp37_reg2mem_1->reserveOperandSpace(2); -  packed_tmp37_reg2mem_1->addIncoming(packed_tmp378, label_cond__28); -  packed_tmp37_reg2mem_1->addIncoming(packed_tmp37, label_cond_cont34); -   -  ShuffleVectorInst* packed_tmp51 = new ShuffleVectorInst(packed_tmp37_reg2mem_1, packed_tmp2, const_packed_32, "tmp51", label_cond_cont48); -  new ReturnInst(packed_tmp51, label_cond_cont48); -   -} - -// Function: vcos (func_vcos) -{ -  Function::arg_iterator args = func_vcos->arg_begin(); -  Value* packed_val = args++; -  packed_val->setName("val"); -   -  BasicBlock* label_entry_53 = new BasicBlock("entry",func_vcos,0); -   -  // Block entry (label_entry_53) -  ExtractElementInst* float_tmp1 = new ExtractElementInst(packed_val, const_int32_19, "tmp1", label_entry_53); -  CastInst* double_conv_54 = new FPExtInst(float_tmp1, Type::DoubleTy, "conv", label_entry_53); -  ExtractElementInst* float_tmp3_55 = new ExtractElementInst(packed_val, const_int32_23, "tmp3", label_entry_53); -  CastInst* double_conv4 = new FPExtInst(float_tmp3_55, Type::DoubleTy, "conv4", label_entry_53); -  ExtractElementInst* float_tmp6_56 = new ExtractElementInst(packed_val, const_int32_25, "tmp6", label_entry_53); -  CastInst* double_conv7 = new FPExtInst(float_tmp6_56, Type::DoubleTy, "conv7", label_entry_53); -  ExtractElementInst* float_tmp9 = new ExtractElementInst(packed_val, const_int32_24, "tmp9", label_entry_53); -  CastInst* double_conv10 = new FPExtInst(float_tmp9, Type::DoubleTy, "conv10", label_entry_53); -  std::vector<Value*> int32_call_params; -  int32_call_params.push_back(const_ptr_34); -  int32_call_params.push_back(double_conv_54); -  int32_call_params.push_back(double_conv4); -  int32_call_params.push_back(double_conv7); -  int32_call_params.push_back(double_conv10); -  CallInst* int32_call = new CallInst(func_printf, int32_call_params.begin(), int32_call_params.end(), "call", label_entry_53); -  int32_call->setCallingConv(CallingConv::C); -  int32_call->setTailCall(true);const ParamAttrsList *int32_call_PAL = 0; -  int32_call->setParamAttrs(int32_call_PAL); -   -  CallInst* float_call13 = new CallInst(func_cosf, float_tmp1, "call13", label_entry_53); -  float_call13->setCallingConv(CallingConv::C); -  float_call13->setTailCall(true);const ParamAttrsList *float_call13_PAL = 0; -  float_call13->setParamAttrs(float_call13_PAL); -   -  InsertElementInst* packed_tmp15 = new InsertElementInst(const_packed_35, float_call13, const_int32_19, "tmp15", label_entry_53); -  CallInst* float_call18 = new CallInst(func_cosf, float_tmp1, "call18", label_entry_53); -  float_call18->setCallingConv(CallingConv::C); -  float_call18->setTailCall(true);const ParamAttrsList *float_call18_PAL = 0; -  float_call18->setParamAttrs(float_call18_PAL); -   -  InsertElementInst* packed_tmp20 = new InsertElementInst(packed_tmp15, float_call18, const_int32_23, "tmp20", label_entry_53); -  CallInst* float_call23 = new CallInst(func_cosf, float_tmp1, "call23", label_entry_53); -  float_call23->setCallingConv(CallingConv::C); -  float_call23->setTailCall(true);const ParamAttrsList *float_call23_PAL = 0; -  float_call23->setParamAttrs(float_call23_PAL); -   -  InsertElementInst* packed_tmp25 = new InsertElementInst(packed_tmp20, float_call23, const_int32_25, "tmp25", label_entry_53); -  CallInst* float_call28 = new CallInst(func_cosf, float_tmp1, "call28", label_entry_53); -  float_call28->setCallingConv(CallingConv::C); -  float_call28->setTailCall(true);const ParamAttrsList *float_call28_PAL = 0; -  float_call28->setParamAttrs(float_call28_PAL); -   -  InsertElementInst* packed_tmp30 = new InsertElementInst(packed_tmp25, float_call28, const_int32_24, "tmp30", label_entry_53); -  CastInst* double_conv33 = new FPExtInst(float_call13, Type::DoubleTy, "conv33", label_entry_53); -  CastInst* double_conv36 = new FPExtInst(float_call18, Type::DoubleTy, "conv36", label_entry_53); -  CastInst* double_conv39 = new FPExtInst(float_call23, Type::DoubleTy, "conv39", label_entry_53); -  CastInst* double_conv42 = new FPExtInst(float_call28, Type::DoubleTy, "conv42", label_entry_53); -  std::vector<Value*> int32_call43_params; -  int32_call43_params.push_back(const_ptr_36); -  int32_call43_params.push_back(double_conv33); -  int32_call43_params.push_back(double_conv36); -  int32_call43_params.push_back(double_conv39); -  int32_call43_params.push_back(double_conv42); -  CallInst* int32_call43 = new CallInst(func_printf, int32_call43_params.begin(), int32_call43_params.end(), "call43", label_entry_53); -  int32_call43->setCallingConv(CallingConv::C); -  int32_call43->setTailCall(true);const ParamAttrsList *int32_call43_PAL = 0; -  int32_call43->setParamAttrs(int32_call43_PAL); -   -  new ReturnInst(packed_tmp30, label_entry_53); -   -} - -// Function: scs (func_scs) -{ -  Function::arg_iterator args = func_scs->arg_begin(); -  Value* packed_val_58 = args++; -  packed_val_58->setName("val"); -   -  BasicBlock* label_entry_59 = new BasicBlock("entry",func_scs,0); -   -  // Block entry (label_entry_59) -  ExtractElementInst* float_tmp2 = new ExtractElementInst(packed_val_58, const_int32_19, "tmp2", label_entry_59); -  CallInst* float_call_60 = new CallInst(func_cosf, float_tmp2, "call", label_entry_59); -  float_call_60->setCallingConv(CallingConv::C); -  float_call_60->setTailCall(true);const ParamAttrsList *float_call_60_PAL = 0; -  float_call_60->setParamAttrs(float_call_60_PAL); -   -  InsertElementInst* packed_tmp5 = new InsertElementInst(const_packed_35, float_call_60, const_int32_19, "tmp5", label_entry_59); -  CallInst* float_call7 = new CallInst(func_sinf, float_tmp2, "call7", label_entry_59); -  float_call7->setCallingConv(CallingConv::C); -  float_call7->setTailCall(true);const ParamAttrsList *float_call7_PAL = 0; -  float_call7->setParamAttrs(float_call7_PAL); -   -  InsertElementInst* packed_tmp9 = new InsertElementInst(packed_tmp5, float_call7, const_int32_23, "tmp9", label_entry_59); -  new ReturnInst(packed_tmp9, label_entry_59); -   -} - -// Function: vsin (func_vsin) -{ -  Function::arg_iterator args = func_vsin->arg_begin(); -  Value* packed_val_62 = args++; -  packed_val_62->setName("val"); -   -  BasicBlock* label_entry_63 = new BasicBlock("entry",func_vsin,0); -   -  // Block entry (label_entry_63) -  ExtractElementInst* float_tmp2_64 = new ExtractElementInst(packed_val_62, const_int32_19, "tmp2", label_entry_63); -  CallInst* float_call_65 = new CallInst(func_sinf, float_tmp2_64, "call", label_entry_63); -  float_call_65->setCallingConv(CallingConv::C); -  float_call_65->setTailCall(true);const ParamAttrsList *float_call_65_PAL = 0; -  float_call_65->setParamAttrs(float_call_65_PAL); -   -  InsertElementInst* packed_tmp6 = new InsertElementInst(const_packed_35, float_call_65, const_int32_19, "tmp6", label_entry_63); -  InsertElementInst* packed_tmp9_66 = new InsertElementInst(packed_tmp6, float_call_65, const_int32_23, "tmp9", label_entry_63); -  InsertElementInst* packed_tmp12 = new InsertElementInst(packed_tmp9_66, float_call_65, const_int32_25, "tmp12", label_entry_63); -  InsertElementInst* packed_tmp15_67 = new InsertElementInst(packed_tmp12, float_call_65, const_int32_24, "tmp15", label_entry_63); -  new ReturnInst(packed_tmp15_67, label_entry_63); -   -} - -// Function: kilp (func_kilp) -{ -  Function::arg_iterator args = func_kilp->arg_begin(); -  Value* packed_val_69 = args++; -  packed_val_69->setName("val"); -   -  BasicBlock* label_entry_70 = new BasicBlock("entry",func_kilp,0); -  BasicBlock* label_lor_rhs = new BasicBlock("lor_rhs",func_kilp,0); -  BasicBlock* label_lor_rhs5 = new BasicBlock("lor_rhs5",func_kilp,0); -  BasicBlock* label_lor_rhs11 = new BasicBlock("lor_rhs11",func_kilp,0); -  BasicBlock* label_UnifiedReturnBlock_71 = new BasicBlock("UnifiedReturnBlock",func_kilp,0); -   -  // Block entry (label_entry_70) -  ExtractElementInst* float_tmp1_72 = new ExtractElementInst(packed_val_69, const_int32_19, "tmp1", label_entry_70); -  FCmpInst* int1_cmp_73 = new FCmpInst(FCmpInst::FCMP_OLT, float_tmp1_72, const_float_18, "cmp", label_entry_70); -  new BranchInst(label_UnifiedReturnBlock_71, label_lor_rhs, int1_cmp_73, label_entry_70); -   -  // Block lor_rhs (label_lor_rhs) -  ExtractElementInst* float_tmp3_75 = new ExtractElementInst(packed_val_69, const_int32_23, "tmp3", label_lor_rhs); -  FCmpInst* int1_cmp4 = new FCmpInst(FCmpInst::FCMP_OLT, float_tmp3_75, const_float_18, "cmp4", label_lor_rhs); -  new BranchInst(label_UnifiedReturnBlock_71, label_lor_rhs5, int1_cmp4, label_lor_rhs); -   -  // Block lor_rhs5 (label_lor_rhs5) -  ExtractElementInst* float_tmp7 = new ExtractElementInst(packed_val_69, const_int32_25, "tmp7", label_lor_rhs5); -  FCmpInst* int1_cmp8 = new FCmpInst(FCmpInst::FCMP_OLT, float_tmp7, const_float_18, "cmp8", label_lor_rhs5); -  new BranchInst(label_UnifiedReturnBlock_71, label_lor_rhs11, int1_cmp8, label_lor_rhs5); -   -  // Block lor_rhs11 (label_lor_rhs11) -  ExtractElementInst* float_tmp13 = new ExtractElementInst(packed_val_69, const_int32_24, "tmp13", label_lor_rhs11); -  FCmpInst* int1_cmp14 = new FCmpInst(FCmpInst::FCMP_OLT, float_tmp13, const_float_18, "cmp14", label_lor_rhs11); -  CastInst* int32_retval = new ZExtInst(int1_cmp14, IntegerType::get(32), "retval", label_lor_rhs11); -  new ReturnInst(int32_retval, label_lor_rhs11); -   -  // Block UnifiedReturnBlock (label_UnifiedReturnBlock_71) -  new ReturnInst(const_int32_23, label_UnifiedReturnBlock_71); -   -} - -return mod; - -} +static const unsigned char llvm_builtins_data[] = { +0x42,0x43,0xc0,0xde,0x21,0x0c,0x00,0x00,0x29,0x02,0x00,0x00,0x01,0x10,0x00,0x00, +0x10,0x00,0x00,0x00,0x07,0x81,0x23,0x91,0x41,0xc8,0x04,0x49,0x06,0x10,0x32,0x39, +0x92,0x01,0x84,0x0c,0x25,0x05,0x08,0x19,0x1e,0x04,0x8b,0x62,0x80,0x14,0x45,0x02, +0x42,0x92,0x0b,0x42,0xa4,0x10,0x32,0x14,0x38,0x08,0x18,0x49,0x0a,0x32,0x44,0x24, +0x48,0x0a,0x90,0x21,0x23,0x44,0x72,0x80,0x8c,0x14,0x21,0x86,0x0a,0x8a,0x0a,0x64, +0x0c,0x1f,0x00,0x00,0x49,0x18,0x00,0x00,0x02,0x00,0x00,0x00,0x0b,0x04,0x00,0x0c, +0x00,0x00,0x00,0x00,0x51,0x20,0x00,0x00,0x12,0x00,0x00,0x00,0x32,0x22,0x48,0x09, +0x20,0x65,0x82,0x84,0x00,0x26,0x45,0x48,0x05,0x09,0x26,0x45,0xc6,0x05,0x42,0x52, +0x26,0x08,0xae,0x19,0x80,0x61,0x04,0x02,0x98,0x23,0x00,0x83,0x29,0x80,0x21,0x00, +0xb2,0x73,0x04,0x01,0x51,0x8a,0xf4,0x08,0x92,0xa4,0x39,0x47,0x80,0x50,0x2b,0x03, +0x00,0xa0,0x08,0x21,0x5c,0x46,0x2b,0x44,0x08,0x21,0xd4,0x40,0x14,0x01,0x80,0x11, +0x80,0x22,0x88,0x00,0x13,0xa2,0x74,0xb0,0x03,0x3c,0xb0,0x83,0x36,0x80,0x87,0x71, +0x68,0x03,0x76,0x48,0x07,0x77,0xa8,0x07,0x7c,0x68,0x83,0x73,0x70,0x87,0x7a,0xd8, +0x70,0x0f,0xe5,0xd0,0x06,0xf0,0xa0,0x07,0x73,0x20,0x07,0x7a,0x30,0x07,0x72,0xa0, +0x07,0x73,0x20,0x07,0x6d,0x90,0x0e,0x71,0xa0,0x07,0x78,0xa0,0x07,0x78,0xd0,0x06, +0xe9,0x80,0x07,0x7a,0x80,0x07,0x7a,0x80,0x07,0x6d,0x90,0x0e,0x71,0x60,0x07,0x7a, +0x10,0x07,0x76,0xa0,0x07,0x71,0x60,0x07,0x6d,0x90,0x0e,0x73,0x20,0x07,0x7a,0x30, +0x07,0x72,0xa0,0x07,0x73,0x20,0x07,0x6d,0x90,0x0e,0x76,0x40,0x07,0x7a,0x30,0x07, +0x72,0xa0,0x07,0x76,0x40,0x07,0x6d,0x60,0x0e,0x73,0x20,0x07,0x7a,0x30,0x07,0x72, +0xa0,0x07,0x73,0x20,0x07,0x6d,0x60,0x0e,0x76,0x40,0x07,0x7a,0x30,0x07,0x72,0xa0, +0x07,0x76,0x40,0x07,0x6d,0x60,0x0f,0x76,0x40,0x07,0x7a,0x60,0x07,0x74,0xa0,0x07, +0x76,0x40,0x07,0x6d,0x60,0x0f,0x71,0x20,0x07,0x78,0xa0,0x07,0x71,0x20,0x07,0x78, +0xa0,0x07,0x71,0x20,0x07,0x78,0xd0,0x06,0xe1,0x00,0x07,0x7a,0x00,0x07,0x7a,0x60, +0x07,0x74,0xd0,0x06,0xe6,0x80,0x07,0x70,0xa0,0x07,0x71,0x20,0x07,0x78,0xa0,0x07, +0x71,0x20,0x07,0x78,0xa0,0xf3,0x40,0x88,0x04,0x32,0x32,0x02,0x04,0x20,0x76,0x46, +0xfc,0x6c,0x48,0x92,0x00,0x40,0x00,0x00,0x00,0x00,0x0c,0x49,0x12,0x20,0x00,0x00, +0x00,0x00,0x80,0x21,0x89,0x02,0x00,0x01,0x00,0x00,0x00,0x30,0x24,0x59,0x00,0x20, +0x08,0x00,0x00,0x00,0x86,0x24,0x0a,0x00,0x04,0x00,0x00,0x00,0xc0,0x90,0x84,0x01, +0x02,0x00,0x00,0x00,0x00,0x18,0x92,0x1c,0x40,0x00,0x00,0x00,0x00,0x00,0x43,0x12, +0x05,0x00,0x02,0x00,0x00,0x00,0x60,0x48,0x72,0x00,0x01,0x00,0x00,0x00,0x00,0x0c, +0x49,0x14,0x00,0x08,0x00,0x00,0x00,0x80,0x21,0x49,0x01,0x00,0x41,0x00,0x00,0x00, +0x90,0x05,0x02,0x00,0x10,0x00,0x00,0x00,0x32,0x1e,0x98,0x10,0x19,0x11,0x4c,0x90, +0x8c,0x09,0x26,0x47,0xc6,0x04,0x43,0x8a,0x8a,0x59,0x8b,0x43,0x50,0xd2,0x09,0x02, +0x81,0xd2,0x73,0x50,0xc9,0x0c,0x2a,0x99,0x41,0x25,0x33,0xa8,0x64,0x56,0x28,0x66, +0x2d,0x0e,0x41,0xcf,0x2a,0x15,0x04,0x4a,0xcf,0x41,0x25,0x33,0xa8,0x64,0x06,0x95, +0xcc,0xa0,0x92,0x59,0x01,0x00,0x00,0x00,0x53,0x82,0x26,0x0c,0x04,0x00,0x00,0x00, +0x22,0x00,0x00,0x00,0x13,0x04,0x41,0x2c,0x10,0x00,0x00,0x00,0x05,0x00,0x00,0x00, +0x04,0xc6,0x08,0x40,0x10,0x04,0xe1,0x70,0x18,0x23,0x00,0x41,0x10,0x84,0xc3,0x60, +0x04,0x00,0x00,0x00,0x93,0x0c,0xce,0x43,0x4c,0x31,0x3c,0x8e,0x34,0xc9,0x30,0x41, +0xc2,0x14,0x03,0x34,0x51,0x93,0x0c,0x4d,0x44,0x4c,0x31,0x44,0x8d,0x35,0x56,0x01, +0x04,0xc3,0x55,0x21,0x16,0x0e,0x04,0x00,0x0f,0x00,0x00,0x00,0x46,0x41,0x08,0xcc, +0x73,0x9b,0x05,0x21,0x30,0xcf,0x6e,0x18,0x84,0x00,0x2c,0x8b,0x35,0x04,0x80,0x39, +0x04,0x81,0x5d,0x20,0x80,0x0f,0x0c,0x43,0xe4,0xd3,0x36,0x81,0x04,0x3e,0x30,0x0c, +0x91,0x4f,0x5b,0x05,0x12,0xf8,0xc0,0x30,0x44,0x7e,0x7d,0x00,0x05,0xd1,0x4c,0x11, +0x66,0x12,0x83,0xc0,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00, +0x2a,0x00,0x00,0x00,0x13,0x04,0x43,0x2c,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00, +0x24,0x8a,0xa0,0x0c,0x46,0x00,0x4a,0x80,0xc2,0x1c,0x84,0x55,0x55,0xd6,0x1c,0x84, +0x45,0x51,0x16,0x81,0x19,0x80,0x11,0x80,0x31,0x02,0x10,0x04,0x41,0xfc,0x03,0x00, +0x63,0x08,0x0d,0x34,0xc9,0x70,0x55,0xc2,0x2c,0x43,0x20,0x60,0x73,0x0c,0xd3,0x15, +0x8d,0x21,0x34,0xd1,0x18,0x42,0xf3,0x8c,0x55,0x00,0x81,0xa0,0x6d,0x73,0x0c,0x19, +0xe7,0x60,0x87,0x52,0x38,0x10,0x00,0x00,0x13,0x00,0x00,0x00,0x17,0x60,0x20,0xc5, +0x74,0x10,0x8d,0x65,0x14,0x13,0xf3,0xd4,0xb4,0x6d,0x14,0x13,0xf3,0xd4,0xb8,0x69, +0x14,0x13,0xf3,0xd4,0xb6,0x75,0x14,0x13,0xf3,0xd4,0xba,0x35,0x0c,0x13,0xf3,0x9c, +0x80,0xe4,0x36,0x48,0x81,0x10,0xc3,0x4a,0x4c,0x54,0xd4,0x6c,0x8b,0x23,0x28,0x76, +0x41,0x4c,0xcc,0xa3,0x1b,0x07,0x21,0x00,0xcb,0x72,0x00,0x05,0xd1,0x4c,0x11,0x66, +0x18,0x83,0xc0,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00, +0x81,0x00,0x00,0x00,0x13,0x04,0x4d,0x2c,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00, +0x24,0xca,0x60,0x04,0xa0,0x04,0x8a,0x80,0xc2,0x0c,0x00,0x91,0x11,0x00,0x00,0x00, +0x63,0x08,0x4d,0x64,0x16,0xc1,0x49,0x86,0xab,0x22,0x66,0x19,0x02,0x01,0x1b,0x43, +0x70,0xa2,0x59,0x82,0x61,0x0c,0xe1,0x89,0x66,0x09,0x86,0x81,0x0a,0x20,0x0b,0x34, +0x61,0x8e,0x81,0xda,0xa2,0x31,0x84,0x46,0xb2,0x8e,0xe0,0x24,0x83,0x57,0x11,0xb3, +0x0c,0x44,0xf1,0x8d,0x21,0x38,0xd2,0x2c,0x81,0x31,0x86,0xf0,0x48,0xb3,0x04,0xc6, +0x40,0x05,0x00,0x06,0x44,0x18,0x14,0x73,0x0c,0x9c,0x18,0x48,0x63,0x08,0xcd,0x64, +0x64,0x40,0x70,0x92,0xa1,0x0c,0x2a,0x62,0x96,0xe1,0x40,0xcc,0x60,0x0c,0xc1,0x99, +0x66,0x09,0x92,0x31,0x84,0x67,0x9a,0x25,0x48,0x06,0x2a,0x80,0x33,0x38,0xd0,0x00, +0x99,0x63,0x18,0x83,0x34,0x98,0xc6,0x10,0x1a,0xc8,0xd6,0x80,0xe0,0x24,0x03,0x1b, +0x54,0xc4,0x2c,0x83,0xb2,0xb4,0xc1,0x18,0x82,0x03,0xcd,0x12,0x30,0x63,0x08,0x0f, +0x34,0x4b,0xc0,0x0c,0x54,0x00,0x6e,0xa0,0xbc,0xc1,0x32,0xc7,0xa0,0x06,0x70,0x00, +0x61,0x1c,0x84,0x03,0x01,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x76,0x52,0x4c,0xcc, +0x73,0xd3,0x24,0x05,0x64,0xec,0xcd,0x8d,0xcc,0xe5,0x87,0x46,0xc6,0x50,0x8a,0x89, +0x79,0xee,0xdb,0x54,0x8a,0x89,0x79,0xee,0xdd,0x1a,0x88,0x89,0x79,0x68,0x73,0x20, +0x26,0xe6,0xa9,0xed,0x81,0x98,0x98,0xc7,0x36,0x0b,0x62,0x62,0x9e,0xdb,0x32,0x88, +0x89,0x79,0x72,0xd3,0x20,0x26,0xe6,0xd9,0x8d,0x83,0x98,0x98,0xa7,0xb7,0x95,0x62, +0x62,0x9e,0xbb,0x27,0x2d,0x20,0x63,0x6f,0x6e,0x64,0x2e,0x3a,0x34,0x35,0x56,0x62, +0x08,0x4e,0x53,0xd9,0xba,0xb5,0x14,0x02,0xf3,0xe0,0xf5,0x25,0x2c,0x82,0xd3,0x0c, +0xbe,0xe0,0x34,0xd3,0x8d,0x9b,0x88,0x21,0x38,0xcd,0x60,0xd7,0x24,0x01,0x63,0xec, +0xcd,0x8d,0xcc,0x45,0x87,0x44,0x80,0x8c,0xbd,0xb9,0x91,0xb9,0xfc,0xc4,0xd0,0x90, +0x02,0x8c,0xb1,0x37,0x37,0x32,0x97,0x1f,0x73,0x29,0x26,0xe6,0xc1,0x71,0x7b,0x29, +0x26,0xe6,0xc1,0x77,0xfb,0x28,0x04,0xe6,0xa9,0x6f,0x52,0x01,0x32,0xf6,0xe6,0x46, +0xe6,0xa2,0x13,0x73,0x63,0x18,0x83,0xc0,0x3c,0xb6,0x41,0x08,0x4e,0x33,0x58,0x47, +0x31,0x31,0x4f,0x5d,0x1f,0xc3,0x22,0x38,0xcd,0xe0,0x0b,0x4e,0x33,0xe1,0xbc,0xa5, +0x18,0x82,0xd3,0x0c,0x77,0x6e,0x20,0xc5,0xc4,0x3c,0xb5,0x4e,0x3a,0x40,0xc6,0xde, +0xdc,0xc8,0x5c,0x7e,0x64,0x70,0x2c,0xa4,0x98,0x98,0xa7,0xee,0xed,0x82,0x10,0x9c, +0xa6,0xba,0x81,0x44,0x70,0x9a,0xc1,0x17,0x9c,0x66,0x32,0x93,0x42,0x60,0x1e,0x7b, +0xb7,0x98,0x62,0x62,0x9e,0xbc,0x36,0x16,0x43,0x70,0x9a,0x0a,0xa7,0x6d,0xa4,0x98, +0x98,0xc7,0xbe,0x8d,0xa4,0x98,0x98,0xc7,0xce,0x0d,0xc6,0x10,0x9c,0x66,0xc0,0x7b, +0x12,0x02,0x32,0xf6,0xe6,0x46,0xe6,0xa2,0x33,0x13,0x73,0x06,0x8b,0xe0,0x34,0x83, +0x2f,0x38,0xcd,0x64,0xd3,0xe6,0x61,0x08,0x4e,0x53,0xd5,0xf6,0x01,0x14,0x44,0x33, +0x45,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00,0x4a,0x00,0x00,0x00, +0x13,0x04,0x41,0x2c,0x10,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x24,0xca,0x60,0x04, +0xa0,0x04,0x8a,0x80,0xc2,0x0c,0x00,0xb9,0x61,0x0c,0x04,0x10,0x1e,0xe1,0x19,0xc6, +0x40,0x02,0xe1,0x11,0x1e,0x00,0x00,0x00,0x63,0x08,0xcd,0x63,0x15,0xc1,0x31,0x84, +0x06,0xb2,0x8b,0xe0,0x18,0x42,0x13,0x59,0x46,0x70,0x0c,0xa1,0x71,0x6c,0x23,0x38, +0x16,0x02,0x04,0xc7,0x64,0x61,0x1a,0x37,0x16,0x01,0x04,0x48,0x35,0xc7,0x20,0x79, +0xcf,0x58,0x04,0x10,0x20,0xd5,0x1c,0xc3,0x07,0x06,0xd0,0x58,0x04,0x10,0x20,0xd5, +0x1c,0x43,0x18,0x88,0x41,0x34,0x16,0x01,0x04,0x48,0x35,0xc7,0x30,0x06,0x64,0xe0, +0x98,0x47,0xd0,0xc0,0x80,0xa0,0x89,0x01,0x41,0x23,0x03,0x82,0x63,0x21,0x40,0x70, +0x50,0x66,0x70,0x06,0x68,0x90,0x06,0x58,0x06,0xe1,0x40,0x00,0x25,0x00,0x00,0x00, +0x56,0x52,0x4c,0xcc,0x73,0xd3,0x56,0x41,0x4c,0xcc,0x53,0xdb,0x05,0x31,0x31,0xcf, +0x6d,0x19,0xc4,0xc4,0x3c,0xba,0x6d,0x10,0x13,0xf3,0xf4,0xd6,0x41,0x08,0xc0,0xb2, +0x18,0x46,0x21,0x38,0x4d,0x85,0x9b,0x46,0x21,0x38,0x4d,0xb5,0x9b,0x8a,0x21,0x00, +0xcb,0x82,0xdf,0x66,0x62,0x08,0x4e,0x53,0xdd,0xb7,0x9d,0x18,0x82,0xd3,0x54,0xb7, +0x6e,0x28,0x86,0xe0,0x34,0xd5,0xdd,0xdb,0x47,0x31,0x31,0x4f,0x9d,0x9b,0x87,0x21, +0x00,0xcb,0x52,0xdf,0x06,0x62,0x08,0xc0,0xb2,0xd4,0xbc,0x59,0x10,0x82,0xd3,0x54, +0x96,0x62,0x08,0x4e,0x53,0xe1,0xb6,0x85,0x14,0x13,0xf3,0xd8,0xb4,0x8d,0x14,0x13, +0xf3,0xd8,0xb9,0x89,0x18,0x02,0xb0,0x2c,0xf6,0x6d,0x24,0x86,0x00,0x2c,0x8b,0xcd, +0x1b,0x87,0x21,0x38,0x4d,0x55,0xd3,0xd6,0x30,0x54,0xc0,0x72,0x00,0x05,0xd1,0x4c, +0x11,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00,0x19,0x00,0x00,0x00, +0x13,0x04,0x41,0x2c,0x10,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x24,0x4a,0x60,0x04, +0x80,0xc2,0x0c,0x00,0x00,0x00,0x00,0x00,0x63,0x08,0xcd,0x33,0x16,0x01,0x04,0x48, +0x34,0xc7,0x00,0x49,0xcf,0x58,0x04,0x10,0x28,0xd1,0x1c,0xc3,0x44,0x39,0x58,0x85, +0x03,0x01,0x00,0x00,0x0a,0x00,0x00,0x00,0x16,0x41,0x4c,0xcc,0x63,0xdb,0x04,0x31, +0x31,0x4f,0x6e,0x0d,0x43,0x05,0x2c,0x07,0x50,0x10,0xcd,0x14,0x61,0x56,0x41,0x4c, +0xcc,0xd3,0x1b,0x45,0x21,0x00,0xcb,0xb2,0x9b,0x04,0x21,0x00,0xcb,0x02,0x00,0x00, +0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00,0x1b,0x00,0x00,0x00,0x13,0x04,0x41,0x2c, +0x10,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x24,0xca,0x60,0x04,0xa0,0x04,0x8a,0x80, +0xc2,0x0c,0x00,0x00,0x63,0x08,0xcd,0x33,0x16,0x01,0x04,0xca,0x34,0xc7,0x20,0x51, +0xcf,0x1c,0x43,0x45,0x41,0x73,0x0c,0x16,0x15,0xcd,0x31,0x5c,0x94,0x83,0x58,0x38, +0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x86,0x51,0x4c,0xcc,0x53,0xe7,0x76,0x51, +0x4c,0xcc,0x53,0xdb,0x36,0x41,0x4c,0xcc,0x63,0x5b,0x05,0x31,0x31,0x8f,0x6e,0x0d, +0x43,0x05,0x2c,0x66,0x41,0x4c,0xcc,0xd3,0x1f,0x40,0x41,0x34,0x53,0x84,0x19,0x05, +0x21,0x00,0xcb,0x02,0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00,0x2f,0x00,0x00,0x00, +0x13,0x04,0x45,0x2c,0x10,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x24,0xca,0xa0,0x04, +0x46,0x00,0x8a,0x80,0xc0,0x08,0x00,0x00,0x63,0x08,0x0d,0x34,0xc9,0x30,0x49,0xc4, +0x2c,0x03,0x11,0x50,0x63,0x08,0xcd,0x33,0xc9,0x50,0x49,0xc4,0x2c,0x03,0x21,0x58, +0x63,0x08,0x4d,0x34,0xc9,0x70,0x49,0xc4,0x2c,0x03,0x31,0x60,0x63,0x08,0x8d,0x33, +0xc9,0x90,0x49,0x84,0x69,0x22,0x70,0xc3,0x27,0x1c,0x08,0x00,0x1a,0x00,0x00,0x00, +0x96,0x51,0x4c,0xcc,0x53,0xdf,0x66,0x41,0x08,0xcc,0x83,0xdb,0x04,0x31,0x31,0x4f, +0x6d,0x15,0xc4,0xc4,0x3c,0xb7,0x61,0x10,0x02,0xf3,0xf0,0x47,0x20,0xb9,0x0d,0x52, +0x20,0xc4,0xb0,0x12,0x13,0x15,0x35,0xdb,0xe2,0x08,0x8a,0x5d,0x10,0x13,0xf3,0xec, +0x37,0x90,0x2c,0x4e,0xf4,0x47,0x87,0x54,0xd7,0x17,0x70,0x2c,0x4e,0xf4,0x47,0x87, +0x74,0x02,0xc8,0xe2,0x44,0x7f,0x74,0x48,0xb9,0x69,0x14,0x02,0xf3,0xd4,0xb8,0x6d, +0x18,0x11,0x31,0x55,0xc0,0x62,0x0d,0x43,0x05,0x2c,0x07,0x50,0x10,0xcd,0x14,0x61, +0x46,0x31,0x08,0xcc,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x20,0x00,0x00, +0x12,0x00,0x00,0x00,0x66,0x40,0x54,0x82,0x23,0x59,0xc2,0x20,0x09,0x92,0x1d,0x18, +0x4f,0x84,0x34,0x53,0x61,0x03,0xc4,0xe3,0x58,0x85,0x05,0x14,0xbe,0x34,0x45,0xb5, +0x21,0x10,0x82,0x23,0x15,0x46,0x30,0x2c,0xc8,0x64,0x02,0x06,0xf0,0x3c,0x91,0x73, +0x19,0x00,0xe1,0x4b,0x53,0x64,0x0a,0x84,0x84,0x34,0x85,0x31,0x10,0x0a,0xb2,0x3c, +0x56,0x30,0x08,0xcc,0x63,0x0b,0x44,0x25,0x21,0x0d,0x00,0x00,0x00,0x00,0x00,0x00}; diff --git a/src/gallium/auxiliary/gallivm/gallivm_cpu.cpp b/src/gallium/auxiliary/gallivm/gallivm_cpu.cpp index 8f9830d0b1..857c190f7b 100644 --- a/src/gallium/auxiliary/gallivm/gallivm_cpu.cpp +++ b/src/gallium/auxiliary/gallivm/gallivm_cpu.cpp @@ -41,6 +41,7 @@  #include "pipe/p_context.h"  #include "pipe/p_shader_tokens.h" +#include "pipe/p_util.h"  #include "tgsi/exec/tgsi_exec.h"  #include "tgsi/util/tgsi_dump.h" @@ -179,22 +180,63 @@ typedef void (*vertex_shader_runner)(void *ainputs,                                       float (*aconsts)[4],                                       void *temps); - +#define MAX_TGSI_VERTICES 4  /*!    This function is used to execute the gallivm_prog in software. Before calling    this function the gallivm_prog has to be JIT compiled with the gallivm_cpu_jit_compile    function.   */  int gallivm_cpu_vs_exec(struct gallivm_prog *prog, -                        struct tgsi_exec_vector       *inputs, -                        struct tgsi_exec_vector       *dests, -                        float (*consts)[4], -                        struct tgsi_exec_vector       *temps) +                        struct tgsi_exec_machine *machine, +                        const float (*input)[4], +                        unsigned num_inputs, +                        float (*output)[4], +                        unsigned num_outputs, +                        const float (*constants)[4], +                        unsigned count, +                        unsigned input_stride, +                        unsigned output_stride )  { +   unsigned int i, j; +   unsigned slot;     vertex_shader_runner runner = reinterpret_cast<vertex_shader_runner>(prog->function); +     assert(runner); -   /*FIXME*/ -   runner(inputs, dests, consts, temps); + +   for (i = 0; i < count; i += MAX_TGSI_VERTICES) { +      unsigned int max_vertices = MIN2(MAX_TGSI_VERTICES, count - i); + +      /* Swizzle inputs. +       */ +      for (j = 0; j < max_vertices; j++) { +	 for (slot = 0; slot < num_inputs; slot++) { +	    machine->Inputs[slot].xyzw[0].f[j] = input[slot][0]; +	    machine->Inputs[slot].xyzw[1].f[j] = input[slot][1]; +	    machine->Inputs[slot].xyzw[2].f[j] = input[slot][2]; +	    machine->Inputs[slot].xyzw[3].f[j] = input[slot][3]; +	 } + +	 input = (const float (*)[4])((const char *)input + input_stride); +      } + +      /* run shader */ +      runner(machine->Inputs, +             machine->Outputs, +             (float (*)[4]) constants, +             machine->Temps); + +      /* Unswizzle all output results +       */ +      for (j = 0; j < max_vertices; j++) { +         for (slot = 0; slot < num_outputs; slot++) { +            output[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; +            output[slot][1] = machine->Outputs[slot].xyzw[1].f[j]; +            output[slot][2] = machine->Outputs[slot].xyzw[2].f[j]; +            output[slot][3] = machine->Outputs[slot].xyzw[3].f[j]; +         } +         output = (float (*)[4])((char *)output + output_stride); +      } +   }     return 0;  } diff --git a/src/gallium/auxiliary/gallivm/instructions.cpp b/src/gallium/auxiliary/gallivm/instructions.cpp index 8919491792..1a98491b82 100644 --- a/src/gallium/auxiliary/gallivm/instructions.cpp +++ b/src/gallium/auxiliary/gallivm/instructions.cpp @@ -35,6 +35,8 @@  #include "storage.h" +#include "pipe/p_util.h" +  #include <llvm/CallingConv.h>  #include <llvm/Constants.h>  #include <llvm/DerivedTypes.h> @@ -42,7 +44,8 @@  #include <llvm/InstrTypes.h>  #include <llvm/Instructions.h>  #include <llvm/ParameterAttributes.h> -#include <llvm/ParamAttrsList.h> +#include <llvm/Support/MemoryBuffer.h> +#include <llvm/Bitcode/ReaderWriter.h>  #include <sstream>  #include <fstream> @@ -53,7 +56,6 @@ using namespace llvm;  #include "gallivm_builtins.cpp"  #if 0 -  llvm::Value *arrayFromChannels(std::vector<llvm::Value*> &vals)  {     VectorType *vectorType = VectorType::get(Type::FloatTy, 4); @@ -84,7 +86,10 @@ Instructions::Instructions(llvm::Module *mod, llvm::Function *func, llvm::BasicB     m_llvmLit  = 0;     m_fmtPtr = 0; -   createGallivmBuiltins(m_mod); +   MemoryBuffer *buffer = MemoryBuffer::getMemBuffer( +      (const char*)&llvm_builtins_data[0], +      (const char*)&llvm_builtins_data[Elements(llvm_builtins_data)-1]); +   m_mod = ParseBitcodeFile(buffer);  }  llvm::Value * Instructions::add(llvm::Value *in1, llvm::Value *in2) @@ -134,12 +139,12 @@ llvm::Value *Instructions::callFSqrt(llvm::Value *val)        // predeclare the intrinsic        std::vector<const Type*> fsqrtArgs;        fsqrtArgs.push_back(Type::FloatTy); -      ParamAttrsList *fsqrtPal = 0; +      PAListPtr fsqrtPal;        FunctionType* fsqrtType = FunctionType::get(           /*Result=*/Type::FloatTy,           /*Params=*/fsqrtArgs,           /*isVarArg=*/false); -      m_llvmFSqrt = new Function( +      m_llvmFSqrt = Function::Create(           /*Type=*/fsqrtType,           /*Linkage=*/GlobalValue::ExternalLinkage,           /*Name=*/"llvm.sqrt.f32", m_mod); @@ -161,10 +166,9 @@ llvm::Value * Instructions::rsq(llvm::Value *in1)     Value *abs  = callFAbs(x);     Value *sqrt = callFSqrt(abs); -   Value *rsqrt = m_builder.CreateFDiv(ConstantFP::get(Type::FloatTy, -                                                                APFloat(1.f)), -                                                sqrt, -                                                name("rsqrt")); +   Value *rsqrt = m_builder.CreateFDiv(ConstantFP::get(APFloat(1.f)), +                                       sqrt, +                                       name("rsqrt"));     return vectorFromVals(rsqrt, rsqrt, rsqrt, rsqrt);  } @@ -191,12 +195,12 @@ llvm::Value *Instructions::callFAbs(llvm::Value *val)        // predeclare the intrinsic        std::vector<const Type*> fabsArgs;        fabsArgs.push_back(Type::FloatTy); -      ParamAttrsList *fabsPal = 0; +      PAListPtr fabsPal;        FunctionType* fabsType = FunctionType::get(           /*Result=*/Type::FloatTy,           /*Params=*/fabsArgs,           /*isVarArg=*/false); -      m_llvmFAbs = new Function( +      m_llvmFAbs = Function::Create(           /*Type=*/fabsType,           /*Linkage=*/GlobalValue::ExternalLinkage,           /*Name=*/"fabs", m_mod); @@ -234,12 +238,12 @@ llvm::Value * Instructions::callPow(llvm::Value *val1, llvm::Value *val2)        std::vector<const Type*> powArgs;        powArgs.push_back(Type::FloatTy);        powArgs.push_back(Type::FloatTy); -      ParamAttrsList *powPal = 0; +      PAListPtr powPal;        FunctionType* powType = FunctionType::get(           /*Result=*/Type::FloatTy,           /*Params=*/powArgs,           /*isVarArg=*/false); -      m_llvmPow = new Function( +      m_llvmPow = Function::Create(           /*Type=*/powType,           /*Linkage=*/GlobalValue::ExternalLinkage,           /*Name=*/"llvm.pow.f32", m_mod); @@ -273,9 +277,8 @@ llvm::Value * Instructions::rcp(llvm::Value *in1)     Value *x1 = m_builder.CreateExtractElement(in1,                                                m_storage->constantInt(0),                                                name("x1")); -   Value *res = m_builder.CreateFDiv(ConstantFP::get(Type::FloatTy, -                                                              APFloat(1.f)), -                                              x1, name("rcp")); +   Value *res = m_builder.CreateFDiv(ConstantFP::get(APFloat(1.f)), +                                     x1, name("rcp"));     return vectorFromVals(res, res, res, res);  } @@ -314,13 +317,13 @@ llvm::Value * Instructions::dst(llvm::Value *in1, llvm::Value *in2)                                               m_storage->constantInt(3),                                               name("w"));     Value *ry = m_builder.CreateMul(y1, y2, name("tyuy")); -   return vectorFromVals(ConstantFP::get(Type::FloatTy, APFloat(1.f)), +   return vectorFromVals(ConstantFP::get(APFloat(1.f)),                           ry, z, w);  }  llvm::Value * Instructions::ex2(llvm::Value *in)  { -   llvm::Value *val = callPow(ConstantFP::get(Type::FloatTy, APFloat(2.f)), +   llvm::Value *val = callPow(ConstantFP::get(APFloat(2.f)),                                m_builder.CreateExtractElement(                                   in, m_storage->constantInt(0),                                   name("x1"))); @@ -333,12 +336,12 @@ llvm::Value * Instructions::callFloor(llvm::Value *val)        // predeclare the intrinsic        std::vector<const Type*> floorArgs;        floorArgs.push_back(Type::FloatTy); -      ParamAttrsList *floorPal = 0; +      PAListPtr floorPal;        FunctionType* floorType = FunctionType::get(           /*Result=*/Type::FloatTy,           /*Params=*/floorArgs,           /*isVarArg=*/false); -      m_llvmFloor = new Function( +      m_llvmFloor = Function::Create(           /*Type=*/floorType,           /*Linkage=*/GlobalValue::ExternalLinkage,           /*Name=*/"floorf", m_mod); @@ -376,12 +379,12 @@ llvm::Value * Instructions::callFLog(llvm::Value *val)        // predeclare the intrinsic        std::vector<const Type*> flogArgs;        flogArgs.push_back(Type::FloatTy); -      ParamAttrsList *flogPal = 0; +      PAListPtr flogPal;        FunctionType* flogType = FunctionType::get(           /*Result=*/Type::FloatTy,           /*Params=*/flogArgs,           /*isVarArg=*/false); -      m_llvmFlog = new Function( +      m_llvmFlog = Function::Create(           /*Type=*/flogType,           /*Linkage=*/GlobalValue::ExternalLinkage,           /*Name=*/"logf", m_mod); @@ -504,12 +507,12 @@ void Instructions::printVector(llvm::Value *val)  llvm::Function * Instructions::declarePrintf()  {     std::vector<const Type*> args; -   ParamAttrsList *params = 0; +   PAListPtr params;     FunctionType* funcTy = FunctionType::get(        /*Result=*/IntegerType::get(32),        /*Params=*/args,        /*isVarArg=*/true); -   Function* func_printf = new Function( +   Function* func_printf = Function::Create(        /*Type=*/funcTy,        /*Linkage=*/GlobalValue::ExternalLinkage,        /*Name=*/"printf", m_mod); @@ -521,7 +524,7 @@ llvm::Function * Instructions::declarePrintf()  llvm::Value * Instructions::sgt(llvm::Value *in1, llvm::Value *in2)  { -   Constant *const1f = ConstantFP::get(Type::FloatTy, APFloat(1.000000e+00f)); +   Constant *const1f = ConstantFP::get(APFloat(1.000000e+00f));     Constant *const0f = Constant::getNullValue(Type::FloatTy);     std::vector<llvm::Value*> vec1 = extractVector(in1); @@ -542,7 +545,7 @@ llvm::Value * Instructions::sgt(llvm::Value *in1, llvm::Value *in2)  }  llvm::Value * Instructions::sge(llvm::Value *in1, llvm::Value *in2)  { -   Constant *const1f = ConstantFP::get(Type::FloatTy, APFloat(1.000000e+00f)); +   Constant *const1f = ConstantFP::get(APFloat(1.000000e+00f));     Constant *const0f = Constant::getNullValue(Type::FloatTy);     std::vector<llvm::Value*> vec1 = extractVector(in1); @@ -566,7 +569,7 @@ llvm::Value * Instructions::sge(llvm::Value *in1, llvm::Value *in2)  llvm::Value * Instructions::slt(llvm::Value *in1, llvm::Value *in2)  { -   Constant *const1f = ConstantFP::get(Type::FloatTy, APFloat(1.000000e+00f)); +   Constant *const1f = ConstantFP::get(APFloat(1.000000e+00f));     Constant *const0f = Constant::getNullValue(Type::FloatTy);     std::vector<llvm::Value*> vec1 = extractVector(in1); @@ -633,8 +636,8 @@ llvm::Value * Instructions::abs(llvm::Value *in)  void Instructions::ifop(llvm::Value *in)  { -   BasicBlock *ifthen = new BasicBlock(name("ifthen"), m_func,0); -   BasicBlock *ifend = new BasicBlock(name("ifthenend"), m_func,0); +   BasicBlock *ifthen = BasicBlock::Create(name("ifthen"), m_func,0); +   BasicBlock *ifend = BasicBlock::Create(name("ifthenend"), m_func,0);     //BasicBlock *yblock = new BasicBlock(name("yblock"), m_func,0);     //BasicBlock *zblock = new BasicBlock(name("zblock"), m_func,0); @@ -660,7 +663,7 @@ llvm::BasicBlock * Instructions::currentBlock() const  void Instructions::elseop()  {     assert(!m_ifStack.empty()); -   BasicBlock *ifend = new BasicBlock(name("ifend"), m_func,0); +   BasicBlock *ifend = BasicBlock::Create(name("ifend"), m_func,0);     m_builder.CreateBr(ifend);     m_builder.SetInsertPoint(m_ifStack.top());     currentBlock()->setName(name("ifelse")); @@ -687,8 +690,8 @@ llvm::Value * Instructions::lerp(llvm::Value *in1, llvm::Value *in2,  void Instructions::beginLoop()  { -   BasicBlock *begin = new BasicBlock(name("loop"), m_func,0); -   BasicBlock *end = new BasicBlock(name("endloop"), m_func,0); +   BasicBlock *begin = BasicBlock::Create(name("loop"), m_func,0); +   BasicBlock *end = BasicBlock::Create(name("endloop"), m_func,0);     m_builder.CreateBr(begin);     Loop loop; @@ -711,7 +714,7 @@ void Instructions::endLoop()  void Instructions::brk()  {     assert(!m_loopStack.empty()); -   BasicBlock *unr = new BasicBlock(name("unreachable"), m_func,0); +   BasicBlock *unr = BasicBlock::Create(name("unreachable"), m_func,0);     m_builder.CreateBr(m_loopStack.top().end);     m_builder.SetInsertPoint(unr);  } @@ -760,13 +763,13 @@ llvm::Function * Instructions::declareFunc(int label)     args.push_back(vecPtr);     args.push_back(vecPtr);     args.push_back(vecPtr); -   ParamAttrsList *params = 0; +   PAListPtr params;     FunctionType *funcType = FunctionType::get(        /*Result=*/Type::VoidTy,        /*Params=*/args,        /*isVarArg=*/false);     std::string name = createFuncName(label); -   Function *func = new Function( +   Function *func = Function::Create(        /*Type=*/funcType,        /*Linkage=*/GlobalValue::ExternalLinkage,        /*Name=*/name.c_str(), m_mod); @@ -784,7 +787,7 @@ void Instructions::bgnSub(unsigned label)     ptr_INPUT->setName("INPUT");     m_storage->pushArguments(ptr_INPUT); -   llvm::BasicBlock *entry = new BasicBlock("entry", func, 0); +   llvm::BasicBlock *entry = BasicBlock::Create("entry", func, 0);     m_func = func;     m_builder.SetInsertPoint(entry); @@ -809,10 +812,10 @@ llvm::Function * Instructions::findFunction(int label)  llvm::Value * Instructions::constVector(float x, float y, float z, float w)  {     std::vector<Constant*> vec(4); -   vec[0] = ConstantFP::get(Type::FloatTy, APFloat(x)); -   vec[1] = ConstantFP::get(Type::FloatTy, APFloat(y)); -   vec[2] = ConstantFP::get(Type::FloatTy, APFloat(z)); -   vec[3] = ConstantFP::get(Type::FloatTy, APFloat(w)); +   vec[0] = ConstantFP::get(APFloat(x)); +   vec[1] = ConstantFP::get(APFloat(y)); +   vec[2] = ConstantFP::get(APFloat(z)); +   vec[3] = ConstantFP::get(APFloat(w));     return ConstantVector::get(m_floatVecType, vec);  } diff --git a/src/gallium/auxiliary/gallivm/instructions.h b/src/gallium/auxiliary/gallivm/instructions.h index 9ebc17dd8e..19ca84ddc6 100644 --- a/src/gallium/auxiliary/gallivm/instructions.h +++ b/src/gallium/auxiliary/gallivm/instructions.h @@ -36,7 +36,7 @@  #include <llvm/BasicBlock.h>  #include <llvm/Module.h>  #include <llvm/Value.h> -#include <llvm/Support/LLVMBuilder.h> +#include <llvm/Support/IRBuilder.h>  #include <map>  #include <stack> @@ -125,7 +125,7 @@ private:     llvm::Module             *m_mod;     llvm::Function           *m_func;     char                      m_name[32]; -   llvm::LLVMFoldingBuilder  m_builder; +   llvm::IRBuilder           m_builder;     int                       m_idx;     llvm::VectorType *m_floatVecType; diff --git a/src/gallium/auxiliary/gallivm/instructionssoa.cpp b/src/gallium/auxiliary/gallivm/instructionssoa.cpp index 6f83b56a72..76049ade7c 100644 --- a/src/gallium/auxiliary/gallivm/instructionssoa.cpp +++ b/src/gallium/auxiliary/gallivm/instructionssoa.cpp @@ -1,8 +1,35 @@ +/************************************************************************** + * + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/  #include "instructionssoa.h"  #include "storagesoa.h"  #include "pipe/p_shader_tokens.h" +#include "pipe/p_util.h"  #include <llvm/CallingConv.h>  #include <llvm/Constants.h> @@ -10,7 +37,10 @@  #include <llvm/Function.h>  #include <llvm/Instructions.h>  #include <llvm/Transforms/Utils/Cloning.h> -#include <llvm/ParamAttrsList.h> +#include <llvm/ParameterAttributes.h> +#include <llvm/Support/MemoryBuffer.h> +#include <llvm/Bitcode/ReaderWriter.h> +  #include <iostream> @@ -143,16 +173,56 @@ std::vector<llvm::Value*> InstructionsSoa::extractVector(llvm::Value *vector)  void InstructionsSoa::createFunctionMap()  { +   m_functionsMap[TGSI_OPCODE_ABS]   = "abs";     m_functionsMap[TGSI_OPCODE_DP3]   = "dp3";     m_functionsMap[TGSI_OPCODE_DP4]   = "dp4"; +   m_functionsMap[TGSI_OPCODE_MIN]   = "min"; +   m_functionsMap[TGSI_OPCODE_MAX]   = "max";     m_functionsMap[TGSI_OPCODE_POWER] = "pow"; +   m_functionsMap[TGSI_OPCODE_LIT]   = "lit"; +   m_functionsMap[TGSI_OPCODE_RSQ]   = "rsq";  }  void InstructionsSoa::createDependencies()  { -   std::vector<std::string> powDeps(1); -   powDeps[0] = "powf"; -   m_builtinDependencies["pow"] = powDeps; +   { +      std::vector<std::string> powDeps(2); +      powDeps[0] = "powf"; +      powDeps[1] = "powvec"; +      m_builtinDependencies["pow"] = powDeps; +   } +   { +      std::vector<std::string> absDeps(2); +      absDeps[0] = "fabsf"; +      absDeps[1] = "absvec"; +      m_builtinDependencies["abs"] = absDeps; +   } +   { +      std::vector<std::string> maxDeps(1); +      maxDeps[0] = "maxvec"; +      m_builtinDependencies["max"] = maxDeps; +   } +   { +      std::vector<std::string> minDeps(1); +      minDeps[0] = "minvec"; +      m_builtinDependencies["min"] = minDeps; +   } +   { +      std::vector<std::string> litDeps(4); +      litDeps[0] = "minvec"; +      litDeps[1] = "maxvec"; +      litDeps[2] = "powf"; +      litDeps[3] = "powvec"; +      m_builtinDependencies["lit"] = litDeps; +   } +   { +      std::vector<std::string> rsqDeps(4); +      rsqDeps[0] = "sqrtf"; +      rsqDeps[1] = "sqrtvec"; +      rsqDeps[2] = "fabsf"; +      rsqDeps[3] = "absvec"; +      m_builtinDependencies["rsq"] = rsqDeps; +   }  }  llvm::Function * InstructionsSoa::function(int op) @@ -162,9 +232,13 @@ llvm::Function * InstructionsSoa::function(int op)      std::string name = m_functionsMap[op]; +    std::cout <<"For op = "<<op<<", func is '"<<name<<"'"<<std::endl; +      std::vector<std::string> deps = m_builtinDependencies[name];      for (unsigned int i = 0; i < deps.size(); ++i) { -       injectFunction(m_builtins->getFunction(deps[i])); +       llvm::Function *func = m_builtins->getFunction(deps[i]); +       std::cout <<"\tinjecting dep = '"<<func->getName()<<"'"<<std::endl; +       injectFunction(func);      }      llvm::Function *originalFunc = m_builtins->getFunction(name); @@ -183,10 +257,22 @@ llvm::Module * InstructionsSoa::currentModule() const  void InstructionsSoa::createBuiltins()  { -   m_builtins = createSoaBuiltins(); +   MemoryBuffer *buffer = MemoryBuffer::getMemBuffer( +      (const char*)&soabuiltins_data[0], +      (const char*)&soabuiltins_data[Elements(soabuiltins_data)]); +   m_builtins = ParseBitcodeFile(buffer); +   std::cout<<"Builtins created at "<<m_builtins<<std::endl; +   assert(m_builtins);     createDependencies();  } + +std::vector<llvm::Value*> InstructionsSoa::abs(const std::vector<llvm::Value*> in1) +{ +   llvm::Function *func = function(TGSI_OPCODE_ABS); +   return callBuiltin(func, in1); +} +  std::vector<llvm::Value*> InstructionsSoa::dp3(const std::vector<llvm::Value*> in1,                                                 const std::vector<llvm::Value*> in2)  { @@ -204,32 +290,32 @@ llvm::Value * InstructionsSoa::allocaTemp()     std::vector<Value*> indices;     indices.push_back(m_storage->constantInt(0));     indices.push_back(m_storage->constantInt(0)); -   GetElementPtrInst *getElem = new GetElementPtrInst(alloca, -                                                      indices.begin(), -                                                      indices.end(), -                                                      name("allocaPtr"), -                                                      m_builder.GetInsertBlock()); +   GetElementPtrInst *getElem = GetElementPtrInst::Create(alloca, +                                                          indices.begin(), +                                                          indices.end(), +                                                          name("allocaPtr"), +                                                          m_builder.GetInsertBlock());     return getElem;  }  std::vector<llvm::Value*> InstructionsSoa::allocaToResult(llvm::Value *allocaPtr)  { -   GetElementPtrInst *xElemPtr =  new GetElementPtrInst(allocaPtr, -                                                        m_storage->constantInt(0), -                                                        name("xPtr"), -                                                        m_builder.GetInsertBlock()); -   GetElementPtrInst *yElemPtr =  new GetElementPtrInst(allocaPtr, -                                                        m_storage->constantInt(1), -                                                        name("yPtr"), -                                                        m_builder.GetInsertBlock()); -   GetElementPtrInst *zElemPtr =  new GetElementPtrInst(allocaPtr, -                                                        m_storage->constantInt(2), -                                                        name("zPtr"), -                                                        m_builder.GetInsertBlock()); -   GetElementPtrInst *wElemPtr =  new GetElementPtrInst(allocaPtr, -                                                        m_storage->constantInt(3), -                                                        name("wPtr"), -                                                        m_builder.GetInsertBlock()); +   GetElementPtrInst *xElemPtr =  GetElementPtrInst::Create(allocaPtr, +                                                            m_storage->constantInt(0), +                                                            name("xPtr"), +                                                            m_builder.GetInsertBlock()); +   GetElementPtrInst *yElemPtr =  GetElementPtrInst::Create(allocaPtr, +                                                            m_storage->constantInt(1), +                                                            name("yPtr"), +                                                            m_builder.GetInsertBlock()); +   GetElementPtrInst *zElemPtr =  GetElementPtrInst::Create(allocaPtr, +                                                            m_storage->constantInt(2), +                                                            name("zPtr"), +                                                            m_builder.GetInsertBlock()); +   GetElementPtrInst *wElemPtr =  GetElementPtrInst::Create(allocaPtr, +                                                            m_storage->constantInt(3), +                                                            name("wPtr"), +                                                            m_builder.GetInsertBlock());     std::vector<llvm::Value*> res(4);     res[0] = new LoadInst(xElemPtr, name("xRes"), false, m_builder.GetInsertBlock()); @@ -320,6 +406,21 @@ std::vector<llvm::Value*> InstructionsSoa::pow(const std::vector<llvm::Value*> i     return callBuiltin(func, in1, in2);  } +std::vector<llvm::Value*> InstructionsSoa::min(const std::vector<llvm::Value*> in1, +                                               const std::vector<llvm::Value*> in2) +{ +   llvm::Function *func = function(TGSI_OPCODE_MIN); +   return callBuiltin(func, in1, in2); +} + + +std::vector<llvm::Value*> InstructionsSoa::max(const std::vector<llvm::Value*> in1, +                                               const std::vector<llvm::Value*> in2) +{ +   llvm::Function *func = function(TGSI_OPCODE_MAX); +   return callBuiltin(func, in1, in2); +} +  void checkFunction(Function *func)  {     for (Function::const_iterator BI = func->begin(), BE = func->end(); @@ -354,29 +455,56 @@ void InstructionsSoa::injectFunction(llvm::Function *originalFunc, int op)     }     llvm::Function *func = 0;     if (originalFunc->isDeclaration()) { -      std::cout << "function decleration" <<std::endl; -      func = new Function(originalFunc->getFunctionType(), GlobalValue::ExternalLinkage, -                          originalFunc->getName(), currentModule()); +      func = Function::Create(originalFunc->getFunctionType(), GlobalValue::ExternalLinkage, +                              originalFunc->getName(), currentModule());        func->setCallingConv(CallingConv::C); -      const ParamAttrsList *pal = 0; +      const PAListPtr pal;        func->setParamAttrs(pal);        currentModule()->dump();     } else {        DenseMap<const Value*, Value *> val; +      val[m_builtins->getFunction("fabsf")] = currentModule()->getFunction("fabsf");        val[m_builtins->getFunction("powf")] = currentModule()->getFunction("powf"); +      val[m_builtins->getFunction("sqrtf")] = currentModule()->getFunction("sqrtf"); +      func = CloneFunction(originalFunc, val); +#if 0        std::cout <<" replacing "<<m_builtins->getFunction("powf")                  <<", with " <<currentModule()->getFunction("powf")<<std::endl; -      func = CloneFunction(originalFunc, val);        std::cout<<"1111-------------------------------"<<std::endl;        checkFunction(originalFunc);        std::cout<<"2222-------------------------------"<<std::endl;        checkFunction(func);        std::cout <<"XXXX = " <<val[m_builtins->getFunction("powf")]<<std::endl; +#endif        currentModule()->getFunctionList().push_back(func); -      std::cout << "Func parent is "<<func->getParent() -                <<", cur is "<<currentModule() <<std::endl;     }     if (op != TGSI_OPCODE_LAST) {        m_functions[op] = func;     }  } + +std::vector<llvm::Value*> InstructionsSoa::sub(const std::vector<llvm::Value*> in1, +                                               const std::vector<llvm::Value*> in2) +{ +   std::vector<llvm::Value*> res(4); + +   res[0] = m_builder.CreateSub(in1[0], in2[0], name("subx")); +   res[1] = m_builder.CreateSub(in1[1], in2[1], name("suby")); +   res[2] = m_builder.CreateSub(in1[2], in2[2], name("subz")); +   res[3] = m_builder.CreateSub(in1[3], in2[3], name("subw")); + +   return res; +} + +std::vector<llvm::Value*> InstructionsSoa::lit(const std::vector<llvm::Value*> in) +{ +   llvm::Function *func = function(TGSI_OPCODE_LIT); +   return callBuiltin(func, in); +} + +std::vector<llvm::Value*> InstructionsSoa::rsq(const std::vector<llvm::Value*> in) +{ +   llvm::Function *func = function(TGSI_OPCODE_RSQ); +   return callBuiltin(func, in); +} + diff --git a/src/gallium/auxiliary/gallivm/instructionssoa.h b/src/gallium/auxiliary/gallivm/instructionssoa.h index b9104ea286..3e20b652dd 100644 --- a/src/gallium/auxiliary/gallivm/instructionssoa.h +++ b/src/gallium/auxiliary/gallivm/instructionssoa.h @@ -29,7 +29,7 @@  #define INSTRUCTIONSSOA_H  #include <pipe/p_shader_tokens.h> -#include <llvm/Support/LLVMBuilder.h> +#include <llvm/Support/IRBuilder.h>  #include <map>  #include <vector> @@ -48,6 +48,7 @@ public:     InstructionsSoa(llvm::Module *mod, llvm::Function *func,                     llvm::BasicBlock *block, StorageSoa *storage); +   std::vector<llvm::Value*> abs(const std::vector<llvm::Value*> in1);     std::vector<llvm::Value*> arl(const std::vector<llvm::Value*> in);     std::vector<llvm::Value*> add(const std::vector<llvm::Value*> in1,                                   const std::vector<llvm::Value*> in2); @@ -55,13 +56,21 @@ public:                                   const std::vector<llvm::Value*> in2);     std::vector<llvm::Value*> dp4(const std::vector<llvm::Value*> in1,                                   const std::vector<llvm::Value*> in2); +   std::vector<llvm::Value*> lit(const std::vector<llvm::Value*> in);     std::vector<llvm::Value*> madd(const std::vector<llvm::Value*> in1,                                    const std::vector<llvm::Value*> in2,                                    const std::vector<llvm::Value*> in3); +   std::vector<llvm::Value*> max(const std::vector<llvm::Value*> in1, +                                 const std::vector<llvm::Value*> in2); +   std::vector<llvm::Value*> min(const std::vector<llvm::Value*> in1, +                                 const std::vector<llvm::Value*> in2);     std::vector<llvm::Value*> mul(const std::vector<llvm::Value*> in1,                                   const std::vector<llvm::Value*> in2);     std::vector<llvm::Value*> pow(const std::vector<llvm::Value*> in1,                                   const std::vector<llvm::Value*> in2); +   std::vector<llvm::Value*> rsq(const std::vector<llvm::Value*> in1); +   std::vector<llvm::Value*> sub(const std::vector<llvm::Value*> in1, +                                 const std::vector<llvm::Value*> in2);     void         end();     std::vector<llvm::Value*> extractVector(llvm::Value *vector); @@ -87,7 +96,7 @@ private:                                           const std::vector<llvm::Value*> in3);     void injectFunction(llvm::Function *originalFunc, int op = TGSI_OPCODE_LAST);  private: -   llvm::LLVMFoldingBuilder  m_builder; +   llvm::IRBuilder  m_builder;     StorageSoa *m_storage;     std::map<int, std::string> m_functionsMap; diff --git a/src/gallium/auxiliary/gallivm/llvm_builtins.c b/src/gallium/auxiliary/gallivm/llvm_builtins.c index 4f98d754ba..6b9d626ed4 100644 --- a/src/gallium/auxiliary/gallivm/llvm_builtins.c +++ b/src/gallium/auxiliary/gallivm/llvm_builtins.c @@ -1,4 +1,3 @@ -/*clang --emit-llvm llvm_builtins.c |llvm-as|opt -std-compile-opts|llvm2cpp -gen-contents -o=gallivm_builtins.cpp -f -for=shader -funcname=createGallivmBuiltins*/  /**************************************************************************   *   * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. @@ -30,7 +29,7 @@    * Authors:    *   Zack Rusin zack@tungstengraphics.com    */ -typedef __attribute__(( ocu_vector_type(4) )) float float4; +typedef __attribute__(( ext_vector_type(4) )) float float4;  extern float powf(float a, float b); diff --git a/src/gallium/auxiliary/gallivm/soabuiltins.c b/src/gallium/auxiliary/gallivm/soabuiltins.c index 4d658be520..78f84510e2 100644 --- a/src/gallium/auxiliary/gallivm/soabuiltins.c +++ b/src/gallium/auxiliary/gallivm/soabuiltins.c @@ -31,7 +31,30 @@    * Authors:    *   Zack Rusin zack@tungstengraphics.com    */ -typedef __attribute__(( ocu_vector_type(4) )) float float4; +typedef __attribute__(( ext_vector_type(4) )) float float4; + + +extern float fabsf(float val); + +float4 absvec(float4 vec) +{ +   float4 res; +   res.x = fabsf(vec.x); +   res.y = fabsf(vec.y); +   res.z = fabsf(vec.z); +   res.w = fabsf(vec.w); + +   return res; +} + +void abs(float4 *res, +         float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w) +{ +   res[0] = absvec(tmp0x); +   res[1] = absvec(tmp0y); +   res[2] = absvec(tmp0z); +   res[3] = absvec(tmp0w); +}  void dp3(float4 *res,           float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w, @@ -61,30 +84,104 @@ void dp4(float4 *res,  }  extern float powf(float num, float p); +extern float sqrtf(float x); + +float4 powvec(float4 vec, float4 q) +{ +   float4 p; +   p.x = powf(vec.x, q.x); +   p.y = powf(vec.y, q.y); +   p.z = powf(vec.z, q.z); +   p.w = powf(vec.w, q.w); +   return p; +}  void pow(float4 *res,           float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w,           float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w)  { -   float4 p; -   p.x = powf(tmp0x.x, tmp1x.x); -   p.y = powf(tmp0x.y, tmp1x.y); -   p.z = powf(tmp0x.z, tmp1x.z); -   p.w = powf(tmp0x.w, tmp1x.w); +   res[0] = powvec(tmp0x, tmp1x); +   res[1] = res[0]; +   res[2] = res[0]; +   res[3] = res[0]; +} -   res[0] = p; -   res[1] = p; -   res[2] = p; -   res[3] = p; +float4 minvec(float4 a, float4 b) +{ +   return (float4){(a.x < b.x) ? a.x : b.x, +         (a.y < b.y) ? a.y : b.y, +         (a.z < b.z) ? a.z : b.z, +         (a.w < b.w) ? a.w : b.w};  } -#if 0 -void yo(float4 *out, float4 *in) +void min(float4 *res, +         float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w, +         float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w)  { -   float4 res[4]; +   res[0] = minvec(tmp0x, tmp1x); +   res[1] = minvec(tmp0y, tmp1y); +   res[2] = minvec(tmp0z, tmp1z); +   res[3] = minvec(tmp0w, tmp1w); +} + -   dp3(res, in[0], in[1], in[2], in[3], -       in[4], in[5], in[6], in[7]); -   out[1] = res[1]; +float4 maxvec(float4 a, float4 b) +{ +   return (float4){(a.x > b.x) ? a.x : b.x, +         (a.y > b.y) ? a.y : b.y, +         (a.z > b.z) ? a.z : b.z, +         (a.w > b.w) ? a.w : b.w}; +} + +void max(float4 *res, +         float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w, +         float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w) +{ +   res[0] = maxvec(tmp0x, tmp1x); +   res[1] = maxvec(tmp0y, tmp1y); +   res[2] = maxvec(tmp0z, tmp1z); +   res[3] = maxvec(tmp0w, tmp1w); +} + + +void lit(float4 *res, +         float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w) +{ +   const float4 zerovec = (float4) {0.0, 0.0, 0.0, 0.0}; +   const float4 min128 = (float4) {-128.f, -128.f, -128.f, -128.f}; +   const float4 plus128 = (float4) {128.f,  128.f,  128.f,  128.f}; + +   res[0] = (float4){1.0, 1.0, 1.0, 1.0}; +   if (tmp0x.x > 0) { +      float4 tmpy = maxvec(tmp0y, zerovec); +      float4 tmpw = minvec(tmp0w, plus128); +      tmpw = maxvec(tmpw, min128); +      res[1] = tmp0x; +      res[2] = powvec(tmpy, tmpw); +   } else { +      res[1] = zerovec; +      res[2] = zerovec; +   } +   res[3] = (float4){1.0, 1.0, 1.0, 1.0}; +} + + +float4 sqrtvec(float4 vec) +{ +   float4 p; +   p.x = sqrtf(vec.x); +   p.y = sqrtf(vec.y); +   p.z = sqrtf(vec.z); +   p.w = sqrtf(vec.w); +   return p; +} + +void rsq(float4 *res, +         float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w) +{ +   const float4 onevec = (float4) {1., 1., 1., 1.}; +   res[0] = onevec/sqrtvec(absvec(tmp0x)); +   res[1] = onevec/sqrtvec(absvec(tmp0y)); +   res[2] = onevec/sqrtvec(absvec(tmp0z)); +   res[3] = onevec/sqrtvec(absvec(tmp0w));  } -#endif diff --git a/src/gallium/auxiliary/gallivm/storage.cpp b/src/gallium/auxiliary/gallivm/storage.cpp index c4326de8c5..6f373f6dd5 100644 --- a/src/gallium/auxiliary/gallivm/storage.cpp +++ b/src/gallium/auxiliary/gallivm/storage.cpp @@ -69,10 +69,10 @@ llvm::Constant *Storage::shuffleMask(int vec)  {     if (!m_extSwizzleVec) {        std::vector<Constant*> elems; -      elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(0.f))); -      elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(1.f))); -      elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(0.f))); -      elems.push_back(ConstantFP::get(Type::FloatTy, APFloat(1.f))); +      elems.push_back(ConstantFP::get(APFloat(0.f))); +      elems.push_back(ConstantFP::get(APFloat(1.f))); +      elems.push_back(ConstantFP::get(APFloat(0.f))); +      elems.push_back(ConstantFP::get(APFloat(1.f)));        m_extSwizzleVec = ConstantVector::get(m_floatVecType, elems);     } @@ -186,26 +186,26 @@ llvm::Value *Storage::maskWrite(llvm::Value *src, int mask, llvm::Value *templ)     if ((mask & TGSI_WRITEMASK_X)) {        llvm::Value *x = new ExtractElementInst(src, unsigned(0),                                                name("x"), m_block); -      dst = new InsertElementInst(dst, x, unsigned(0), -                                  name("dstx"), m_block); +      dst = InsertElementInst::Create(dst, x, unsigned(0), +                                      name("dstx"), m_block);     }     if ((mask & TGSI_WRITEMASK_Y)) {        llvm::Value *y = new ExtractElementInst(src, unsigned(1),                                                name("y"), m_block); -      dst = new InsertElementInst(dst, y, unsigned(1), -                                  name("dsty"), m_block); +      dst = InsertElementInst::Create(dst, y, unsigned(1), +                                      name("dsty"), m_block);     }     if ((mask & TGSI_WRITEMASK_Z)) {        llvm::Value *z = new ExtractElementInst(src, unsigned(2),                                                name("z"), m_block); -      dst = new InsertElementInst(dst, z, unsigned(2), -                                  name("dstz"), m_block); +      dst = InsertElementInst::Create(dst, z, unsigned(2), +                                      name("dstz"), m_block);     }     if ((mask & TGSI_WRITEMASK_W)) {        llvm::Value *w = new ExtractElementInst(src, unsigned(3),                                                name("w"), m_block); -      dst = new InsertElementInst(dst, w, unsigned(3), -                                  name("dstw"), m_block); +      dst = InsertElementInst::Create(dst, w, unsigned(3), +                                      name("dstw"), m_block);     }     return dst;  } @@ -295,10 +295,10 @@ llvm::Value * Storage::immediateElement(int idx)  void Storage::addImmediate(float *val)  {     std::vector<Constant*> vec(4); -   vec[0] = ConstantFP::get(Type::FloatTy, APFloat(val[0])); -   vec[1] = ConstantFP::get(Type::FloatTy, APFloat(val[1])); -   vec[2] = ConstantFP::get(Type::FloatTy, APFloat(val[2])); -   vec[3] = ConstantFP::get(Type::FloatTy, APFloat(val[3])); +   vec[0] = ConstantFP::get(APFloat(val[0])); +   vec[1] = ConstantFP::get(APFloat(val[1])); +   vec[2] = ConstantFP::get(APFloat(val[2])); +   vec[3] = ConstantFP::get(APFloat(val[3]));     m_immediates.push_back(ConstantVector::get(m_floatVecType, vec));  } @@ -308,11 +308,11 @@ llvm::Value * Storage::elemPtr(Args arg)     std::vector<Value*> indices;     indices.push_back(constantInt(0));     indices.push_back(constantInt(static_cast<int>(arg))); -   GetElementPtrInst *getElem = new GetElementPtrInst(m_INPUT, -                                                      indices.begin(), -                                                      indices.end(), -                                                      name("input_ptr"), -                                                      m_block); +   GetElementPtrInst *getElem = GetElementPtrInst::Create(m_INPUT, +                                                          indices.begin(), +                                                          indices.end(), +                                                          name("input_ptr"), +                                                          m_block);     return new LoadInst(getElem, name("input_field"), false, m_block);  } @@ -322,7 +322,7 @@ llvm::Value * Storage::elemIdx(llvm::Value *ptr, int idx,     GetElementPtrInst *getElem = 0;     if (indIdx) { -      getElem = new GetElementPtrInst(ptr, +      getElem = GetElementPtrInst::Create(ptr,                                        BinaryOperator::create(Instruction::Add,                                                               indIdx,                                                               constantInt(idx), @@ -331,7 +331,7 @@ llvm::Value * Storage::elemIdx(llvm::Value *ptr, int idx,                                        name("field"),                                        m_block);     } else { -      getElem = new GetElementPtrInst(ptr, +      getElem = GetElementPtrInst::Create(ptr,                                        constantInt(idx),                                        name("field"),                                        m_block); @@ -350,7 +350,7 @@ void Storage::setKilElement(llvm::Value *val)     std::vector<Value*> indices;     indices.push_back(constantInt(0));     indices.push_back(constantInt(static_cast<int>(KilArg))); -   GetElementPtrInst *elem = new GetElementPtrInst(m_INPUT, +   GetElementPtrInst *elem = GetElementPtrInst::Create(m_INPUT,                                                     indices.begin(),                                                     indices.end(),                                                     name("kil_ptr"), diff --git a/src/gallium/auxiliary/gallivm/storagesoa.cpp b/src/gallium/auxiliary/gallivm/storagesoa.cpp index bb6fe3d7e1..78d754371f 100644 --- a/src/gallium/auxiliary/gallivm/storagesoa.cpp +++ b/src/gallium/auxiliary/gallivm/storagesoa.cpp @@ -207,11 +207,11 @@ llvm::Value * StorageSoa::elementPointer(llvm::Value *ptr, llvm::Value *index,     indices.push_back(index);     indices.push_back(constantInt(channel)); -   GetElementPtrInst *getElem = new GetElementPtrInst(ptr, -                                                      indices.begin(), -                                                      indices.end(), -                                                      name("ptr"), -                                                      m_block); +   GetElementPtrInst *getElem = GetElementPtrInst::Create(ptr, +                                                          indices.begin(), +                                                          indices.end(), +                                                          name("ptr"), +                                                          m_block);     return getElem;  } @@ -264,10 +264,10 @@ llvm::Constant * StorageSoa::createConstGlobalVector(const std::vector<float> &v  {     VectorType *vectorType = VectorType::get(Type::FloatTy, 4);     std::vector<Constant*> immValues; -   ConstantFP *constx = ConstantFP::get(Type::FloatTy, APFloat(vec[0])); -   ConstantFP *consty = ConstantFP::get(Type::FloatTy, APFloat(vec[1])); -   ConstantFP *constz = ConstantFP::get(Type::FloatTy, APFloat(vec[2])); -   ConstantFP *constw = ConstantFP::get(Type::FloatTy, APFloat(vec[3])); +   ConstantFP *constx = ConstantFP::get(APFloat(vec[0])); +   ConstantFP *consty = ConstantFP::get(APFloat(vec[1])); +   ConstantFP *constz = ConstantFP::get(APFloat(vec[2])); +   ConstantFP *constw = ConstantFP::get(APFloat(vec[3]));     immValues.push_back(constx);     immValues.push_back(consty);     immValues.push_back(constz); diff --git a/src/gallium/auxiliary/gallivm/tgsitollvm.cpp b/src/gallium/auxiliary/gallivm/tgsitollvm.cpp index ab9e7a06fb..9695358ab8 100644 --- a/src/gallium/auxiliary/gallivm/tgsitollvm.cpp +++ b/src/gallium/auxiliary/gallivm/tgsitollvm.cpp @@ -692,12 +692,14 @@ translate_instructionir(llvm::Module *module,     }        break;     case TGSI_OPCODE_LIT: { +      out = instr->lit(inputs[0]);     }        break;     case TGSI_OPCODE_RCP: {     }        break;     case TGSI_OPCODE_RSQ: { +      out = instr->rsq(inputs[0]);     }        break;     case TGSI_OPCODE_EXP: @@ -724,9 +726,11 @@ translate_instructionir(llvm::Module *module,     }        break;     case TGSI_OPCODE_MIN: { +      out = instr->min(inputs[0], inputs[1]);     }        break;     case TGSI_OPCODE_MAX: { +      out = instr->max(inputs[0], inputs[1]);     }        break;     case TGSI_OPCODE_SLT: { @@ -740,6 +744,7 @@ translate_instructionir(llvm::Module *module,     }        break;     case TGSI_OPCODE_SUB: { +      out = instr->sub(inputs[0], inputs[1]);     }        break;     case TGSI_OPCODE_LERP: { @@ -781,6 +786,7 @@ translate_instructionir(llvm::Module *module,     case TGSI_OPCODE_MULTIPLYMATRIX:        break;     case TGSI_OPCODE_ABS: { +      out = instr->abs(inputs[0]);     }        break;     case TGSI_OPCODE_RCC: @@ -1014,7 +1020,7 @@ tgsi_to_llvm(struct gallivm_ir *ir, const struct tgsi_token *tokens)     Value *ptr_INPUT = args++;     ptr_INPUT->setName("input"); -   BasicBlock *label_entry = new BasicBlock("entry", shader, 0); +   BasicBlock *label_entry = BasicBlock::Create("entry", shader, 0);     tgsi_parse_init(&parse, tokens); @@ -1085,7 +1091,7 @@ llvm::Module * tgsi_to_llvmir(struct gallivm_ir *ir,     Value *temps = args++;     temps->setName("temps"); -   BasicBlock *label_entry = new BasicBlock("entry", shader, 0); +   BasicBlock *label_entry = BasicBlock::Create("entry", shader, 0);     tgsi_parse_init(&parse, tokens); diff --git a/src/gallium/auxiliary/pipebuffer/Makefile b/src/gallium/auxiliary/pipebuffer/Makefile index a9fa518c67..d654dbcc91 100644 --- a/src/gallium/auxiliary/pipebuffer/Makefile +++ b/src/gallium/auxiliary/pipebuffer/Makefile @@ -6,9 +6,11 @@ LIBNAME = pipebuffer  C_SOURCES = \  	pb_buffer_fenced.c \  	pb_buffer_malloc.c \ +	pb_bufmgr_cache.c \  	pb_bufmgr_fenced.c \  	pb_bufmgr_mm.c \  	pb_bufmgr_pool.c \ +	pb_bufmgr_slab.c \  	pb_winsys.c  include ../../Makefile.template diff --git a/src/gallium/auxiliary/pipebuffer/SConscript b/src/gallium/auxiliary/pipebuffer/SConscript index 3d41fd84a6..604a217982 100644 --- a/src/gallium/auxiliary/pipebuffer/SConscript +++ b/src/gallium/auxiliary/pipebuffer/SConscript @@ -5,9 +5,11 @@ pipebuffer = env.ConvenienceLibrary(  	source = [  		'pb_buffer_fenced.c',  		'pb_buffer_malloc.c', +		'pb_bufmgr_cache.c',  		'pb_bufmgr_fenced.c',  		'pb_bufmgr_mm.c',  		'pb_bufmgr_pool.c', +		'pb_bufmgr_slab.c',  		'pb_winsys.c',  	]) diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer.h b/src/gallium/auxiliary/pipebuffer/pb_buffer.h index 4b09c80b2a..49705cb862 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_buffer.h +++ b/src/gallium/auxiliary/pipebuffer/pb_buffer.h @@ -193,6 +193,17 @@ pb_reference(struct pb_buffer **dst,  /** + * Utility function to check whether a requested alignment is consistent with + * the provided alignment or not. + */ +static INLINE int +pb_check_alignment(size_t requested, size_t provided) +{ +   return requested <= provided && (provided % requested) == 0; +} + + +/**   * Malloc-based buffer to store data that can't be used by the graphics    * hardware.   */ diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c index 24ba61a0b7..2fa0842971 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c +++ b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c @@ -34,7 +34,14 @@   */ +#include "pipe/p_config.h" + +#if defined(PIPE_OS_LINUX) +#include <unistd.h> +#endif +  #include "pipe/p_compiler.h" +#include "pipe/p_error.h"  #include "pipe/p_debug.h"  #include "pipe/p_winsys.h"  #include "pipe/p_thread.h" @@ -44,9 +51,6 @@  #include "pb_buffer.h"  #include "pb_buffer_fenced.h" -#ifndef WIN32 -#include <unistd.h> -#endif  /** @@ -54,6 +58,13 @@   */  #define SUPER(__derived) (&(__derived)->base) +#define PIPE_BUFFER_USAGE_CPU_READ_WRITE \ +   ( PIPE_BUFFER_USAGE_CPU_READ | PIPE_BUFFER_USAGE_CPU_WRITE ) +#define PIPE_BUFFER_USAGE_GPU_READ_WRITE \ +   ( PIPE_BUFFER_USAGE_GPU_READ | PIPE_BUFFER_USAGE_GPU_WRITE ) +#define PIPE_BUFFER_USAGE_WRITE \ +   ( PIPE_BUFFER_USAGE_CPU_WRITE | PIPE_BUFFER_USAGE_GPU_WRITE ) +  struct fenced_buffer_list  { @@ -76,6 +87,15 @@ struct fenced_buffer     struct pb_buffer *buffer; +   /* FIXME: protect access with mutex */ + +   /** +    * A bitmask of PIPE_BUFFER_USAGE_CPU/GPU_READ/WRITE describing the current +    * buffer usage. +    */ +   unsigned flags; + +   unsigned mapcount;     struct pipe_fence_handle *fence;     struct list_head head; @@ -97,7 +117,10 @@ _fenced_buffer_add(struct fenced_buffer *fenced_buf)  {     struct fenced_buffer_list *fenced_list = fenced_buf->list; +   assert(fenced_buf->base.base.refcount); +   assert(fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE);     assert(fenced_buf->fence); +     assert(!fenced_buf->head.prev);     assert(!fenced_buf->head.next);     LIST_ADDTAIL(&fenced_buf->head, &fenced_list->delayed); @@ -111,8 +134,6 @@ _fenced_buffer_add(struct fenced_buffer *fenced_buf)  static INLINE void  _fenced_buffer_destroy(struct fenced_buffer *fenced_buf)  { -   struct fenced_buffer_list *fenced_list = fenced_buf->list; -     assert(!fenced_buf->base.base.refcount);     assert(!fenced_buf->fence);     pb_reference(&fenced_buf->buffer, NULL); @@ -128,8 +149,8 @@ _fenced_buffer_remove(struct fenced_buffer *fenced_buf)     assert(fenced_buf->fence); -   assert(winsys->fence_signalled(winsys, fenced_buf->fence, 0) == 0);     winsys->fence_reference(winsys, &fenced_buf->fence, NULL); +   fenced_buf->flags &= ~PIPE_BUFFER_USAGE_GPU_READ_WRITE;     assert(fenced_buf->head.prev);     assert(fenced_buf->head.next); @@ -174,6 +195,9 @@ _fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list,  	    break;  	 prev_fence = fenced_buf->fence;        } +      else { +	 assert(winsys->fence_signalled(winsys, fenced_buf->fence, 0) == 0); +      }        _fenced_buffer_remove(fenced_buf); @@ -183,6 +207,40 @@ _fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list,  } +/** + * Serialize writes, but allow concurrent reads. + */ +static INLINE enum pipe_error +fenced_buffer_serialize(struct fenced_buffer *fenced_buf, unsigned flags) +{ +   struct fenced_buffer_list *fenced_list = fenced_buf->list; +   struct pipe_winsys *winsys = fenced_list->winsys; + +   /* Allow concurrent reads */ +   if(((fenced_buf->flags | flags) & PIPE_BUFFER_USAGE_WRITE) == 0) +      return PIPE_OK; + +   /* Wait for the CPU to finish */ +   if(fenced_buf->mapcount) { +      /* FIXME: Use thread conditions variables to signal when mapcount  +       * reaches zero */ +      debug_warning("attemp to write concurrently to buffer"); +      /* XXX: we must not fail here in order to support texture mipmap generation +      return PIPE_ERROR_RETRY; +       */ +   } + +   /* Wait for the GPU to finish */ +   if(fenced_buf->fence) { +      if(winsys->fence_finish(winsys, fenced_buf->fence, 0) != 0) +	 return PIPE_ERROR_RETRY;  +      _fenced_buffer_remove(fenced_buf); +   } + +   return PIPE_OK; +} + +  static void  fenced_buffer_destroy(struct pb_buffer *buf)  { @@ -199,6 +257,7 @@ fenced_buffer_destroy(struct pb_buffer *buf)  	 prev = curr->prev;  	 do {  	    fenced_buf = LIST_ENTRY(struct fenced_buffer, curr, head); +	    assert(winsys->fence_signalled(winsys, fenced_buf->fence, 0) == 0);  	    _fenced_buffer_remove(fenced_buf);  	    curr = prev;  	    prev = curr->prev; @@ -219,16 +278,30 @@ static void *  fenced_buffer_map(struct pb_buffer *buf,                     unsigned flags)  { -   struct fenced_buffer *fenced_buf = fenced_buffer(buf);    -   return pb_map(fenced_buf->buffer, flags); +   struct fenced_buffer *fenced_buf = fenced_buffer(buf); +   void *map; +   assert((flags & ~PIPE_BUFFER_USAGE_CPU_READ_WRITE) == 0); +    +   if(fenced_buffer_serialize(fenced_buf, flags) != PIPE_OK) +      return NULL; +    +   map = pb_map(fenced_buf->buffer, flags); +   if(map) +      ++fenced_buf->mapcount; +   fenced_buf->flags |= flags & PIPE_BUFFER_USAGE_CPU_READ_WRITE; +   return map;  }  static void  fenced_buffer_unmap(struct pb_buffer *buf)  { -   struct fenced_buffer *fenced_buf = fenced_buffer(buf);    +   struct fenced_buffer *fenced_buf = fenced_buffer(buf); +   assert(fenced_buf->mapcount);     pb_unmap(fenced_buf->buffer); +   --fenced_buf->mapcount; +   if(!fenced_buf->mapcount) +      fenced_buf->flags &= ~PIPE_BUFFER_USAGE_CPU_READ_WRITE;  } @@ -281,16 +354,49 @@ void  buffer_fence(struct pb_buffer *buf,               struct pipe_fence_handle *fence)  { -   struct fenced_buffer *fenced_buf = fenced_buffer(buf); -   struct fenced_buffer_list *fenced_list = fenced_buf->list; -   struct pipe_winsys *winsys = fenced_list->winsys; +   struct fenced_buffer *fenced_buf; +   struct fenced_buffer_list *fenced_list; +   struct pipe_winsys *winsys; +   /* FIXME: receive this as a parameter */ +   unsigned flags = fence ? PIPE_BUFFER_USAGE_GPU_READ_WRITE : 0; + +   /* This is a public function, so be extra cautious with the buffer passed,  +    * as happens frequently to receive null buffers, or pointer to buffers  +    * other than fenced buffers. */ +   assert(buf); +   if(!buf) +      return; +   assert(buf->vtbl == &fenced_buffer_vtbl); +   if(buf->vtbl != &fenced_buffer_vtbl) +      return; +    +   fenced_buf = fenced_buffer(buf); +   fenced_list = fenced_buf->list; +   winsys = fenced_list->winsys; +    +   if(fence == fenced_buf->fence) { +      /* Handle the same fence case specially, not only because it is a fast  +       * path, but mostly to avoid serializing two writes with the same fence,  +       * as that would bring the hardware down to synchronous operation without +       * any benefit. +       */ +      fenced_buf->flags |= flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE; +      return; +   } +    +   if(fenced_buffer_serialize(fenced_buf, flags) != PIPE_OK) { +      /* FIXME: propagate error */ +      (void)0; +   }     _glthread_LOCK_MUTEX(fenced_list->mutex);     if (fenced_buf->fence)        _fenced_buffer_remove(fenced_buf); -   winsys->fence_reference(winsys, &fenced_buf->fence, fence); -   if (fenced_buf->fence) +   if (fence) { +      winsys->fence_reference(winsys, &fenced_buf->fence, fence); +      fenced_buf->flags |= flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE;        _fenced_buffer_add(fenced_buf); +   }     _glthread_UNLOCK_MUTEX(fenced_list->mutex);  } @@ -334,7 +440,7 @@ fenced_buffer_list_destroy(struct fenced_buffer_list *fenced_list)     /* Wait on outstanding fences */     while (fenced_list->numDelayed) {        _glthread_UNLOCK_MUTEX(fenced_list->mutex); -#ifndef WIN32 +#if defined(PIPE_OS_LINUX)        sched_yield();  #endif        _fenced_buffer_list_check_free(fenced_list, 1); diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h b/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h index 0cf8e92e37..8de286e3f9 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h @@ -80,7 +80,7 @@ struct pb_manager  /**  - * Static buffer pool manager. + * Static buffer pool sub-allocator.   *    * Manages the allocation of equally sized buffers. It does so by allocating   * a single big buffer and divide it equally sized buffers.  @@ -94,7 +94,7 @@ pool_bufmgr_create(struct pb_manager *provider,  /**  - * Wraper around the old memory manager. + * Static sub-allocator based the old memory manager.   *    * It managers buffers of different sizes. It does so by allocating a buffer   * with the size of the heap, and then using the old mm memory manager to manage @@ -114,6 +114,40 @@ mm_bufmgr_create_from_buffer(struct pb_buffer *buffer,                               size_t size, size_t align2); +/** + * Slab sub-allocator. + */ +struct pb_manager * +pb_slab_manager_create(struct pb_manager *provider, +                       size_t bufSize, +                       size_t slabSize, +                       const struct pb_desc *desc); + +/** + * Allow a range of buffer size, by aggregating multiple slabs sub-allocators  + * with different bucket sizes. + */ +struct pb_manager * +pb_slab_range_manager_create(struct pb_manager *provider, +                             size_t minBufSize, +                             size_t maxBufSize, +                             size_t slabSize, +                             const struct pb_desc *desc); + + +/**  + * Time-based buffer cache. + * + * This manager keeps a cache of destroyed buffers during a time interval.  + */ +struct pb_manager * +pb_cache_manager_create(struct pb_manager *provider,  +                     	unsigned usecs);  + +void +pb_cache_flush(struct pb_manager *mgr); + +  /**    * Fenced buffer manager.   * diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c new file mode 100644 index 0000000000..4bd3f94a6c --- /dev/null +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c @@ -0,0 +1,344 @@ +/************************************************************************** + * + * Copyright 2007-2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +/** + * \file + * Buffer cache. + *  + * \author José Fonseca <jrfonseca-at-tungstengraphics-dot-com> + * \author Thomas Hellström <thomas-at-tungstengraphics-dot-com> + */ + + +#include "pipe/p_compiler.h" +#include "pipe/p_debug.h" +#include "pipe/p_winsys.h" +#include "pipe/p_thread.h" +#include "pipe/p_util.h" +#include "util/u_double_list.h" +#include "util/u_time.h" + +#include "pb_buffer.h" +#include "pb_bufmgr.h" + + +/** + * Convenience macro (type safe). + */ +#define SUPER(__derived) (&(__derived)->base) + + +struct pb_cache_manager; + + +/** + * Wrapper around a pipe buffer which adds delayed destruction. + */ +struct pb_cache_buffer +{ +   struct pb_buffer base; +    +   struct pb_buffer *buffer; +   struct pb_cache_manager *mgr; + +   /** Caching time interval */ +   struct util_time start, end; + +   struct list_head head; +}; + + +struct pb_cache_manager +{ +   struct pb_manager base; + +   struct pb_manager *provider; +   unsigned usecs; +    +   _glthread_Mutex mutex; +    +   struct list_head delayed; +   size_t numDelayed; +}; + + +static INLINE struct pb_cache_buffer * +pb_cache_buffer(struct pb_buffer *buf) +{ +   assert(buf); +   return (struct pb_cache_buffer *)buf; +} + + +static INLINE struct pb_cache_manager * +pb_cache_manager(struct pb_manager *mgr) +{ +   assert(mgr); +   return (struct pb_cache_manager *)mgr; +} + + +/** + * Actually destroy the buffer. + */ +static INLINE void +_pb_cache_buffer_destroy(struct pb_cache_buffer *buf) +{ +   struct pb_cache_manager *mgr = buf->mgr; + +   LIST_DEL(&buf->head); +   assert(mgr->numDelayed); +   --mgr->numDelayed; +   assert(!buf->base.base.refcount); +   pb_reference(&buf->buffer, NULL); +   FREE(buf); +} + + +/** + * Free as many cache buffers from the list head as possible.  + */ +static void +_pb_cache_buffer_list_check_free(struct pb_cache_manager *mgr) +{ +   struct list_head *curr, *next; +   struct pb_cache_buffer *buf; +   struct util_time now; +    +   util_time_get(&now); +    +   curr = mgr->delayed.next; +   next = curr->next; +   while(curr != &mgr->delayed) { +      buf = LIST_ENTRY(struct pb_cache_buffer, curr, head); + +      if(!util_time_timeout(&buf->start, &buf->end, &now)) +	 break; +	  +      _pb_cache_buffer_destroy(buf); + +      curr = next;  +      next = curr->next; +   } +} + + +static void +pb_cache_buffer_destroy(struct pb_buffer *_buf) +{ +   struct pb_cache_buffer *buf = pb_cache_buffer(_buf);    +   struct pb_cache_manager *mgr = buf->mgr; + +   _glthread_LOCK_MUTEX(mgr->mutex); +   assert(buf->base.base.refcount == 0); +    +   _pb_cache_buffer_list_check_free(mgr); +    +   util_time_get(&buf->start); +   util_time_add(&buf->start, mgr->usecs, &buf->end); +   LIST_ADDTAIL(&buf->head, &mgr->delayed); +   ++mgr->numDelayed; +   _glthread_UNLOCK_MUTEX(mgr->mutex); +} + + +static void * +pb_cache_buffer_map(struct pb_buffer *_buf,  +                  unsigned flags) +{ +   struct pb_cache_buffer *buf = pb_cache_buffer(_buf);    +   return pb_map(buf->buffer, flags); +} + + +static void +pb_cache_buffer_unmap(struct pb_buffer *_buf) +{ +   struct pb_cache_buffer *buf = pb_cache_buffer(_buf);    +   pb_unmap(buf->buffer); +} + + +static void +pb_cache_buffer_get_base_buffer(struct pb_buffer *_buf, +                              struct pb_buffer **base_buf, +                              unsigned *offset) +{ +   struct pb_cache_buffer *buf = pb_cache_buffer(_buf); +   pb_get_base_buffer(buf->buffer, base_buf, offset); +} + + +const struct pb_vtbl  +pb_cache_buffer_vtbl = { +      pb_cache_buffer_destroy, +      pb_cache_buffer_map, +      pb_cache_buffer_unmap, +      pb_cache_buffer_get_base_buffer +}; + + +static INLINE boolean +pb_cache_is_buffer_compat(struct pb_cache_buffer *buf,   +                          size_t size, +                          const struct pb_desc *desc) +{ +   /* TODO: be more lenient with size */ +   if(buf->base.base.size != size) +      return FALSE; +    +   if(!pb_check_alignment(desc->alignment, buf->base.base.alignment)) +      return FALSE; +    +   /* XXX: check usage too? */ +    +   return TRUE; +} + + +static struct pb_buffer * +pb_cache_manager_create_buffer(struct pb_manager *_mgr,  +                               size_t size, +                               const struct pb_desc *desc) +{ +   struct pb_cache_manager *mgr = pb_cache_manager(_mgr); +   struct pb_cache_buffer *buf; +   struct pb_cache_buffer *curr_buf; +   struct list_head *curr, *next; +   struct util_time now; +    +   _glthread_LOCK_MUTEX(mgr->mutex); + +   buf = NULL; +   curr = mgr->delayed.next; +   next = curr->next; +    +   /* search in the expired buffers, freeing them in the process */ +   util_time_get(&now); +   while(curr != &mgr->delayed) { +      curr_buf = LIST_ENTRY(struct pb_cache_buffer, curr, head); +      if(!buf && pb_cache_is_buffer_compat(curr_buf, size, desc)) +	 buf = curr_buf; +      else if(util_time_timeout(&curr_buf->start, &curr_buf->end, &now)) +	 _pb_cache_buffer_destroy(curr_buf); +      curr = next;  +      next = curr->next; +   } + +   /* keep searching in the hot buffers */ +   while(!buf && curr != &mgr->delayed) { +      curr_buf = LIST_ENTRY(struct pb_cache_buffer, curr, head); +      if(pb_cache_is_buffer_compat(curr_buf, size, desc)) +	 buf = curr_buf; +      curr = next;  +      next = curr->next; +   } +    +   if(buf) { +      LIST_DEL(&buf->head); +      _glthread_UNLOCK_MUTEX(mgr->mutex); +      ++buf->base.base.refcount; +      return &buf->base; +   } +    +   _glthread_UNLOCK_MUTEX(mgr->mutex); + +   buf = CALLOC_STRUCT(pb_cache_buffer); +   if(!buf) +      return NULL; +    +   buf->buffer = mgr->provider->create_buffer(mgr->provider, size, desc); +   if(!buf->buffer) { +      FREE(buf); +      return NULL; +   } +    +   assert(buf->buffer->base.refcount >= 1); +   assert(pb_check_alignment(desc->alignment, buf->buffer->base.alignment)); +   assert((buf->buffer->base.usage & desc->usage) == desc->usage); +   assert(buf->buffer->base.size >= size); +    +   buf->base.base.refcount = 1; +   buf->base.base.alignment = buf->buffer->base.alignment; +   buf->base.base.usage = buf->buffer->base.usage; +   buf->base.base.size = buf->buffer->base.size; +    +   buf->base.vtbl = &pb_cache_buffer_vtbl; +   buf->mgr = mgr; +    +   return &buf->base; +} + + +void +pb_cache_flush(struct pb_manager *_mgr) +{ +   struct pb_cache_manager *mgr = pb_cache_manager(_mgr); +   struct list_head *curr, *next; +   struct pb_cache_buffer *buf; + +   _glthread_LOCK_MUTEX(mgr->mutex); +   curr = mgr->delayed.next; +   next = curr->next; +   while(curr != &mgr->delayed) { +      buf = LIST_ENTRY(struct pb_cache_buffer, curr, head); +      _pb_cache_buffer_destroy(buf); +      curr = next;  +      next = curr->next; +   } +   _glthread_UNLOCK_MUTEX(mgr->mutex); +} + + +static void +pb_cache_manager_destroy(struct pb_manager *mgr) +{ +   pb_cache_flush(mgr); +   FREE(mgr); +} + + +struct pb_manager * +pb_cache_manager_create(struct pb_manager *provider,  +                     	unsigned usecs)  +{ +   struct pb_cache_manager *mgr; + +   mgr = (struct pb_cache_manager *)CALLOC(1, sizeof(*mgr)); +   if (!mgr) +      return NULL; + +   mgr->base.destroy = pb_cache_manager_destroy; +   mgr->base.create_buffer = pb_cache_manager_create_buffer; +   mgr->provider = provider; +   mgr->usecs = usecs; +   LIST_INITHEAD(&mgr->delayed); +   mgr->numDelayed = 0; +   _glthread_INIT_MUTEX(mgr->mutex); +       +   return &mgr->base; +} diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c index bffca5b244..9d809e2f9b 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_fenced.c @@ -30,7 +30,7 @@   * \file   * A buffer manager that wraps buffers in fenced buffers.   *  - * \author José Fonseca <jrfonseca@tungstengraphics.dot.com> + * \author José Fonseca <jrfonseca@tungstengraphics.dot.com>   */ @@ -101,7 +101,8 @@ fenced_bufmgr_destroy(struct pb_manager *mgr)     fenced_buffer_list_destroy(fenced_mgr->fenced_list); -   fenced_mgr->provider->destroy(fenced_mgr->provider); +   if(fenced_mgr->provider) +      fenced_mgr->provider->destroy(fenced_mgr->provider);     FREE(fenced_mgr);  } @@ -113,6 +114,9 @@ fenced_bufmgr_create(struct pb_manager *provider,  {     struct fenced_pb_manager *fenced_mgr; +   if(!provider) +      return NULL; +        fenced_mgr = (struct fenced_pb_manager *)CALLOC(1, sizeof(*fenced_mgr));     if (!fenced_mgr)        return NULL; diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c new file mode 100644 index 0000000000..b931455056 --- /dev/null +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_slab.c @@ -0,0 +1,495 @@ +/************************************************************************** + * + * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA + * 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 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 + * THE COPYRIGHT HOLDERS, AUTHORS 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. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * + **************************************************************************/ + +/** + * @file + * S-lab pool implementation. + *  + * @author Thomas Hellstrom <thomas-at-tungstengraphics-dot-com> + * @author Jose Fonseca <jrfonseca@tungstengraphics.com> + */ + +#include "pipe/p_compiler.h" +#include "pipe/p_error.h" +#include "pipe/p_debug.h" +#include "pipe/p_thread.h" +#include "pipe/p_defines.h" +#include "pipe/p_util.h" +#include "util/u_double_list.h" +#include "util/u_time.h" + +#include "pb_buffer.h" +#include "pb_bufmgr.h" + + +#define DRI_SLABPOOL_ALLOC_RETRIES 100 + + +struct pb_slab; + +struct pb_slab_buffer +{ +   struct pb_buffer base; +    +   struct pb_slab *slab; +   struct list_head head; +   unsigned mapCount; +   size_t start; +   _glthread_Cond event; +}; + +struct pb_slab +{ +   struct list_head head; +   struct list_head freeBuffers; +   size_t numBuffers; +   size_t numFree; +   struct pb_slab_buffer *buffers; +   struct pb_slab_manager *mgr; +    +   struct pb_buffer *bo; +   void *virtual;    +}; + +struct pb_slab_manager  +{ +   struct pb_manager base; +    +   struct pb_manager *provider; +   size_t bufSize; +   size_t slabSize; +   struct pb_desc desc; + +   struct list_head slabs; +   struct list_head freeSlabs; +    +   _glthread_Mutex mutex; +}; + +/** + * The data of this structure remains constant after + * initialization and thus needs no mutex protection. + */ +struct pb_slab_range_manager  +{ +   struct pb_manager base; + +   struct pb_manager *provider; +   size_t minBufSize; +   size_t maxBufSize; +   struct pb_desc desc; +    +   unsigned numBuckets; +   size_t *bucketSizes; +   struct pb_manager **buckets; +}; + + +static INLINE struct pb_slab_buffer * +pb_slab_buffer(struct pb_buffer *buf) +{ +   assert(buf); +   return (struct pb_slab_buffer *)buf; +} + + +static INLINE struct pb_slab_manager * +pb_slab_manager(struct pb_manager *mgr) +{ +   assert(mgr); +   return (struct pb_slab_manager *)mgr; +} + + +static INLINE struct pb_slab_range_manager * +pb_slab_range_manager(struct pb_manager *mgr) +{ +   assert(mgr); +   return (struct pb_slab_range_manager *)mgr; +} + + +/** + * Delete a buffer from the slab delayed list and put + * it on the slab FREE list. + */ +static void +pb_slab_buffer_destroy(struct pb_buffer *_buf) +{ +   struct pb_slab_buffer *buf = pb_slab_buffer(_buf); +   struct pb_slab *slab = buf->slab; +   struct pb_slab_manager *mgr = slab->mgr; +   struct list_head *list = &buf->head; + +   _glthread_LOCK_MUTEX(mgr->mutex); +    +   assert(buf->base.base.refcount == 0); +    +   buf->mapCount = 0; + +   LIST_DEL(list); +   LIST_ADDTAIL(list, &slab->freeBuffers); +   slab->numFree++; + +   if (slab->head.next == &slab->head) +      LIST_ADDTAIL(&slab->head, &mgr->slabs); + +   if (slab->numFree == slab->numBuffers) { +      list = &slab->head; +      LIST_DEL(list); +      LIST_ADDTAIL(list, &mgr->freeSlabs); +   } + +   if (mgr->slabs.next == &mgr->slabs || slab->numFree +	 != slab->numBuffers) { + +      struct list_head *next; + +      for (list = mgr->freeSlabs.next, next = list->next; list +	    != &mgr->freeSlabs; list = next, next = list->next) { + +	 slab = LIST_ENTRY(struct pb_slab, list, head); + +	 LIST_DELINIT(list); +	 pb_reference(&slab->bo, NULL); +	 FREE(slab->buffers); +	 FREE(slab); +      } +   } +    +   _glthread_UNLOCK_MUTEX(mgr->mutex); +} + + +static void * +pb_slab_buffer_map(struct pb_buffer *_buf,  +                   unsigned flags) +{ +   struct pb_slab_buffer *buf = pb_slab_buffer(_buf); + +   ++buf->mapCount; +   return (void *) ((uint8_t *) buf->slab->virtual + buf->start); +} + + +static void +pb_slab_buffer_unmap(struct pb_buffer *_buf) +{ +   struct pb_slab_buffer *buf = pb_slab_buffer(_buf); + +   --buf->mapCount; +   if (buf->mapCount == 0)  +       _glthread_COND_BROADCAST(buf->event); +} + + +static void +pb_slab_buffer_get_base_buffer(struct pb_buffer *_buf, +                               struct pb_buffer **base_buf, +                               unsigned *offset) +{ +   struct pb_slab_buffer *buf = pb_slab_buffer(_buf); +   pb_get_base_buffer(buf->slab->bo, base_buf, offset); +   *offset += buf->start; +} + + +static const struct pb_vtbl  +pb_slab_buffer_vtbl = { +      pb_slab_buffer_destroy, +      pb_slab_buffer_map, +      pb_slab_buffer_unmap, +      pb_slab_buffer_get_base_buffer +}; + + +static enum pipe_error +pb_slab_create(struct pb_slab_manager *mgr) +{ +   struct pb_slab *slab; +   struct pb_slab_buffer *buf; +   unsigned numBuffers; +   unsigned i; +   enum pipe_error ret; + +   slab = CALLOC_STRUCT(pb_slab); +   if (!slab) +      return PIPE_ERROR_OUT_OF_MEMORY; + +   /* +    * FIXME: We should perhaps allow some variation in slabsize in order +    * to efficiently reuse slabs. +    */ + +   slab->bo = mgr->provider->create_buffer(mgr->provider, mgr->slabSize, &mgr->desc); +   if(!slab->bo) { +      ret = PIPE_ERROR_OUT_OF_MEMORY; +      goto out_err0; +   } + +   slab->virtual = pb_map(slab->bo,  +                          PIPE_BUFFER_USAGE_CPU_READ | +                          PIPE_BUFFER_USAGE_CPU_WRITE); +   if(!slab->virtual) { +      ret = PIPE_ERROR_OUT_OF_MEMORY; +      goto out_err1; +   } + +   pb_unmap(slab->bo); + +   numBuffers = slab->bo->base.size / mgr->bufSize; + +   slab->buffers = CALLOC(numBuffers, sizeof(*slab->buffers)); +   if (!slab->buffers) { +      ret = PIPE_ERROR_OUT_OF_MEMORY; +      goto out_err1; +   } + +   LIST_INITHEAD(&slab->head); +   LIST_INITHEAD(&slab->freeBuffers); +   slab->numBuffers = numBuffers; +   slab->numFree = 0; +   slab->mgr = mgr; + +   buf = slab->buffers; +   for (i=0; i < numBuffers; ++i) { +      buf->base.base.refcount = 0; +      buf->base.base.size = mgr->bufSize; +      buf->base.base.alignment = 0; +      buf->base.base.usage = 0; +      buf->base.vtbl = &pb_slab_buffer_vtbl; +      buf->slab = slab; +      buf->start = i* mgr->bufSize; +      buf->mapCount = 0; +      _glthread_INIT_COND(buf->event); +      LIST_ADDTAIL(&buf->head, &slab->freeBuffers); +      slab->numFree++; +      buf++; +   } + +   LIST_ADDTAIL(&slab->head, &mgr->slabs); + +   return PIPE_OK; + +out_err1:  +   pb_reference(&slab->bo, NULL); +out_err0:  +   FREE(slab); +   return ret; +} + + +static struct pb_buffer * +pb_slab_manager_create_buffer(struct pb_manager *_mgr, +                              size_t size, +                              const struct pb_desc *desc) +{ +   struct pb_slab_manager *mgr = pb_slab_manager(_mgr); +   static struct pb_slab_buffer *buf; +   struct pb_slab *slab; +   struct list_head *list; +   int count = DRI_SLABPOOL_ALLOC_RETRIES; + +   /* check size */ +   assert(size == mgr->bufSize); +   if(size != mgr->bufSize) +      return NULL; +    +   /* check if we can provide the requested alignment */ +   assert(pb_check_alignment(desc->alignment, mgr->desc.alignment)); +   if(!pb_check_alignment(desc->alignment, mgr->desc.alignment)) +      return NULL; +   assert(pb_check_alignment(desc->alignment, mgr->bufSize)); +   if(!pb_check_alignment(desc->alignment, mgr->bufSize)) +      return NULL; + +   /* XXX: check for compatible buffer usage too? */ +    +   _glthread_LOCK_MUTEX(mgr->mutex); +   while (mgr->slabs.next == &mgr->slabs && count > 0) { +      if (mgr->slabs.next != &mgr->slabs) +	 break; + +      _glthread_UNLOCK_MUTEX(mgr->mutex); +      if (count != DRI_SLABPOOL_ALLOC_RETRIES) +	 util_time_sleep(1); +      _glthread_LOCK_MUTEX(mgr->mutex); +      (void) pb_slab_create(mgr); +      count--; +   } + +   list = mgr->slabs.next; +   if (list == &mgr->slabs) { +      _glthread_UNLOCK_MUTEX(mgr->mutex); +      return NULL; +   } +   slab = LIST_ENTRY(struct pb_slab, list, head); +   if (--slab->numFree == 0) +      LIST_DELINIT(list); + +   list = slab->freeBuffers.next; +   LIST_DELINIT(list); + +   _glthread_UNLOCK_MUTEX(mgr->mutex); +   buf = LIST_ENTRY(struct pb_slab_buffer, list, head); +    +   ++buf->base.base.refcount; +   buf->base.base.alignment = desc->alignment; +   buf->base.base.usage = desc->usage; +    +   return &buf->base; +} + + +static void +pb_slab_manager_destroy(struct pb_manager *_mgr) +{ +   struct pb_slab_manager *mgr = pb_slab_manager(_mgr); + +   /* TODO: cleanup all allocated buffers */ +   FREE(mgr); +} + + +struct pb_manager * +pb_slab_manager_create(struct pb_manager *provider, +                       size_t bufSize, +                       size_t slabSize, +                       const struct pb_desc *desc) +{ +   struct pb_slab_manager *mgr; + +   mgr = CALLOC_STRUCT(pb_slab_manager); +   if (!mgr) +      return NULL; + +   mgr->base.destroy = pb_slab_manager_destroy; +   mgr->base.create_buffer = pb_slab_manager_create_buffer; + +   mgr->provider = provider; +   mgr->bufSize = bufSize; +   mgr->slabSize = slabSize; +   mgr->desc = *desc; + +   LIST_INITHEAD(&mgr->slabs); +   LIST_INITHEAD(&mgr->freeSlabs); +    +   _glthread_INIT_MUTEX(mgr->mutex); + +   return &mgr->base; +} + + +static struct pb_buffer * +pb_slab_range_manager_create_buffer(struct pb_manager *_mgr, +                                    size_t size, +                                    const struct pb_desc *desc) +{ +   struct pb_slab_range_manager *mgr = pb_slab_range_manager(_mgr); +   size_t bufSize; +   unsigned i; + +   bufSize = mgr->minBufSize; +   for (i = 0; i < mgr->numBuckets; ++i) { +      if(bufSize >= size) +	 return mgr->buckets[i]->create_buffer(mgr->buckets[i], size, desc); +      bufSize *= 2; +   } + +   /* Fall back to allocate a buffer object directly from the provider. */ +   return mgr->provider->create_buffer(mgr->provider, size, desc); +} + + +static void +pb_slab_range_manager_destroy(struct pb_manager *_mgr) +{ +   struct pb_slab_range_manager *mgr = pb_slab_range_manager(_mgr); +   unsigned i; +    +   for (i = 0; i < mgr->numBuckets; ++i) +      mgr->buckets[i]->destroy(mgr->buckets[i]); +   FREE(mgr->buckets); +   FREE(mgr->bucketSizes); +   FREE(mgr); +} + + +struct pb_manager * +pb_slab_range_manager_create(struct pb_manager *provider, +                             size_t minBufSize, +                             size_t maxBufSize, +                             size_t slabSize, +                             const struct pb_desc *desc) +{ +   struct pb_slab_range_manager *mgr; +   size_t bufSize; +   unsigned i; + +   mgr = CALLOC_STRUCT(pb_slab_range_manager); +   if (!mgr) +      goto out_err0; + +   mgr->base.destroy = pb_slab_range_manager_destroy; +   mgr->base.create_buffer = pb_slab_range_manager_create_buffer; + +   mgr->provider = provider; +   mgr->minBufSize = minBufSize; +   mgr->maxBufSize = maxBufSize; + +   mgr->numBuckets = 1; +   bufSize = minBufSize; +   while(bufSize < maxBufSize) { +      bufSize *= 2; +      ++mgr->numBuckets; +   } +    +   mgr->buckets = CALLOC(mgr->numBuckets, sizeof(*mgr->buckets)); +   if (!mgr->buckets) +      goto out_err1; + +   bufSize = minBufSize; +   for (i = 0; i < mgr->numBuckets; ++i) { +      mgr->buckets[i] = pb_slab_manager_create(provider, bufSize, slabSize, desc); +      if(!mgr->buckets[i]) +	 goto out_err2; +      bufSize *= 2; +   } + +   return &mgr->base; + +out_err2:  +   for (i = 0; i < mgr->numBuckets; ++i) +      if(mgr->buckets[i]) +	    mgr->buckets[i]->destroy(mgr->buckets[i]); +   FREE(mgr->buckets); +out_err1:  +   FREE(mgr); +out_err0: +   return NULL; +} diff --git a/src/gallium/auxiliary/rtasm/rtasm_cpu.c b/src/gallium/auxiliary/rtasm/rtasm_cpu.c index eb3359750b..f01e12faa0 100644 --- a/src/gallium/auxiliary/rtasm/rtasm_cpu.c +++ b/src/gallium/auxiliary/rtasm/rtasm_cpu.c @@ -26,14 +26,29 @@   **************************************************************************/ +#include "pipe/p_debug.h"  #include "rtasm_cpu.h" +static boolean rtasm_sse_enabled(void) +{ +   static boolean firsttime = 1; +   static boolean enabled; +    +   /* This gets called quite often at the moment: +    */ +   if (firsttime) { +      enabled =  !debug_get_bool_option("GALLIUM_NOSSE", FALSE); +      firsttime = FALSE; +   } +   return enabled; +} +  int rtasm_cpu_has_sse(void)  {     /* FIXME: actually detect this at run-time */ -#if defined(__i386__) || defined(__386__) -   return 1; +#if defined(__i386__) || defined(__386__) || defined(i386) +   return rtasm_sse_enabled();  #else     return 0;  #endif @@ -42,8 +57,8 @@ int rtasm_cpu_has_sse(void)  int rtasm_cpu_has_sse2(void)   {     /* FIXME: actually detect this at run-time */ -#if defined(__i386__) || defined(__386__) -   return 1; +#if defined(__i386__) || defined(__386__) || defined(i386) +   return rtasm_sse_enabled();  #else     return 0;  #endif diff --git a/src/gallium/auxiliary/rtasm/rtasm_x86sse.c b/src/gallium/auxiliary/rtasm/rtasm_x86sse.c index 4d33950e99..4e036d9032 100644 --- a/src/gallium/auxiliary/rtasm/rtasm_x86sse.c +++ b/src/gallium/auxiliary/rtasm/rtasm_x86sse.c @@ -33,15 +33,114 @@  #define DISASSEM 0  #define X86_TWOB 0x0f -static unsigned char *cptr( void (*label)() ) + +#define DUMP_SSE  0 + +#if DUMP_SSE + +static void +_print_reg( +   struct x86_reg reg )  { -   return (unsigned char *) label; +   if (reg.mod != mod_REG)  +      debug_printf( "[" ); +       +   switch( reg.file ) { +   case file_REG32: +      switch( reg.idx ) { +      case reg_AX: debug_printf( "EAX" ); break; +      case reg_CX: debug_printf( "ECX" ); break; +      case reg_DX: debug_printf( "EDX" ); break; +      case reg_BX: debug_printf( "EBX" ); break; +      case reg_SP: debug_printf( "ESP" ); break; +      case reg_BP: debug_printf( "EBP" ); break; +      case reg_SI: debug_printf( "ESI" ); break; +      case reg_DI: debug_printf( "EDI" ); break; +      } +      break; +   case file_MMX: +      debug_printf( "MMX%u", reg.idx ); +      break; +   case file_XMM: +      debug_printf( "XMM%u", reg.idx ); +      break; +   case file_x87: +      debug_printf( "fp%u", reg.idx ); +      break; +   } + +   if (reg.mod == mod_DISP8 || +       reg.mod == mod_DISP32) +      debug_printf("+%d", reg.disp); + +   if (reg.mod != mod_REG)  +      debug_printf( "]" );  } +#define DUMP_START() debug_printf( "\n" ) +#define DUMP_END() debug_printf( "\n" ) + +#define DUMP() do {                             \ +   const char *foo = __FUNCTION__;              \ +   while (*foo && *foo != '_')                  \ +      foo++;                                    \ +   if  (*foo)                                   \ +      foo++;                                    \ +   debug_printf( "\n% 15s ", foo );             \ +} while (0) + +#define DUMP_I( I ) do {                        \ +   DUMP();                                      \ +   debug_printf( "%u", I );                     \ +} while( 0 ) + +#define DUMP_R( R0 ) do {                       \ +   DUMP();                                      \ +   _print_reg( R0 );                            \ +} while( 0 ) + +#define DUMP_RR( R0, R1 ) do {                  \ +   DUMP();                                      \ +   _print_reg( R0 );                            \ +   debug_printf( ", " );                        \ +   _print_reg( R1 );                            \ +} while( 0 ) + +#define DUMP_RI( R0, I ) do {                   \ +   DUMP();                                      \ +   _print_reg( R0 );                            \ +   debug_printf( ", %u", I );                   \ +} while( 0 ) + +#define DUMP_RRI( R0, R1, I ) do {              \ +   DUMP();                                      \ +   _print_reg( R0 );                            \ +   debug_printf( ", " );                        \ +   _print_reg( R1 );                            \ +   debug_printf( ", %u", I );                   \ +} while( 0 ) + +#else + +#define DUMP_START() +#define DUMP_END() +#define DUMP( ) +#define DUMP_I( I ) +#define DUMP_R( R0 ) +#define DUMP_RR( R0, R1 ) +#define DUMP_RI( R0, I ) +#define DUMP_RRI( R0, R1, I ) + +#endif + +  static void do_realloc( struct x86_function *p )  { -   if (p->size == 0) { +   if (p->store == p->error_overflow) { +      p->csr = p->store; +   } +   else if (p->size == 0) {        p->size = 1024;        p->store = rtasm_exec_malloc(p->size);        p->csr = p->store; @@ -51,10 +150,22 @@ static void do_realloc( struct x86_function *p )        unsigned char *tmp = p->store;        p->size *= 2;        p->store = rtasm_exec_malloc(p->size); -      memcpy(p->store, tmp, used); -      p->csr = p->store + used; + +      if (p->store) { +         memcpy(p->store, tmp, used); +         p->csr = p->store + used; +      } +      else { +         p->csr = p->store; +      } +        rtasm_exec_free(tmp);     } + +   if (p->store == NULL) { +      p->store = p->csr = p->error_overflow; +      p->size = sizeof(p->error_overflow); +   }  }  /* Emit bytes to the instruction stream: @@ -236,9 +347,9 @@ struct x86_reg x86_get_base_reg( struct x86_reg reg )     return x86_make_reg( reg.file, reg.idx );  } -unsigned char *x86_get_label( struct x86_function *p ) +int x86_get_label( struct x86_function *p )  { -   return p->csr; +   return p->csr - p->store;  } @@ -250,16 +361,22 @@ unsigned char *x86_get_label( struct x86_function *p )  void x86_jcc( struct x86_function *p,  	      enum x86_cc cc, -	      unsigned char *label ) +	      int label )  { -   intptr_t offset = pointer_to_intptr( label ) - (pointer_to_intptr( x86_get_label(p) ) + 2); +   int offset = label - (x86_get_label(p) + 2); +   DUMP_I(cc); +   if (offset < 0) { +      int amt = p->csr - p->store; +      assert(amt > -offset); +   } +     if (offset <= 127 && offset >= -128) {        emit_1ub(p, 0x70 + cc);        emit_1b(p, (char) offset);     }     else { -      offset = pointer_to_intptr( label ) - (pointer_to_intptr( x86_get_label(p) ) + 6); +      offset = label - (x86_get_label(p) + 6);        emit_2ub(p, 0x0f, 0x80 + cc);        emit_1i(p, offset);     } @@ -267,23 +384,27 @@ void x86_jcc( struct x86_function *p,  /* Always use a 32bit offset for forward jumps:   */ -unsigned char *x86_jcc_forward( struct x86_function *p, -			  enum x86_cc cc ) +int x86_jcc_forward( struct x86_function *p, +                     enum x86_cc cc )  { +   DUMP_I(cc);     emit_2ub(p, 0x0f, 0x80 + cc);     emit_1i(p, 0);     return x86_get_label(p);  } -unsigned char *x86_jmp_forward( struct x86_function *p) +int x86_jmp_forward( struct x86_function *p)  { +   DUMP();     emit_1ub(p, 0xe9);     emit_1i(p, 0);     return x86_get_label(p);  } -unsigned char *x86_call_forward( struct x86_function *p) +int x86_call_forward( struct x86_function *p)  { +   DUMP(); +     emit_1ub(p, 0xe8);     emit_1i(p, 0);     return x86_get_label(p); @@ -292,34 +413,24 @@ unsigned char *x86_call_forward( struct x86_function *p)  /* Fixup offset from forward jump:   */  void x86_fixup_fwd_jump( struct x86_function *p, -			 unsigned char *fixup ) +			 int fixup )  { -   *(int *)(fixup - 4) = pointer_to_intptr( x86_get_label(p) ) - pointer_to_intptr( fixup ); +   *(int *)(p->store + fixup - 4) = x86_get_label(p) - fixup;  } -void x86_jmp( struct x86_function *p, unsigned char *label) +void x86_jmp( struct x86_function *p, int label)  { +   DUMP_I( label );     emit_1ub(p, 0xe9); -   emit_1i(p, pointer_to_intptr( label ) - pointer_to_intptr( x86_get_label(p) ) - 4); +   emit_1i(p, label - x86_get_label(p) - 4);  } -#if 0 -/* This doesn't work once we start reallocating & copying the - * generated code on buffer fills, because the call is relative to the - * current pc. - */ -void x86_call( struct x86_function *p, void (*label)()) -{ -   emit_1ub(p, 0xe8); -   emit_1i(p, cptr(label) - x86_get_label(p) - 4); -} -#else  void x86_call( struct x86_function *p, struct x86_reg reg)  { +   DUMP_R( reg );     emit_1ub(p, 0xff); -   emit_modrm(p, reg, reg); +   emit_modrm_noreg(p, 2, reg);  } -#endif  /* michal: @@ -328,6 +439,7 @@ void x86_call( struct x86_function *p, struct x86_reg reg)   */  void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm )  { +   DUMP_RI( dst, imm );     assert(dst.mod == mod_REG);     emit_1ub(p, 0xb8 + dst.idx);     emit_1i(p, imm); @@ -336,14 +448,23 @@ void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm )  void x86_push( struct x86_function *p,  	       struct x86_reg reg )  { -   assert(reg.mod == mod_REG); -   emit_1ub(p, 0x50 + reg.idx); +   DUMP_R( reg ); +   if (reg.mod == mod_REG) +      emit_1ub(p, 0x50 + reg.idx); +   else  +   { +      emit_1ub(p, 0xff); +      emit_modrm_noreg(p, 6, reg); +   } + +     p->stack_offset += 4;  }  void x86_pop( struct x86_function *p,  	      struct x86_reg reg )  { +   DUMP_R( reg );     assert(reg.mod == mod_REG);     emit_1ub(p, 0x58 + reg.idx);     p->stack_offset -= 4; @@ -352,6 +473,7 @@ void x86_pop( struct x86_function *p,  void x86_inc( struct x86_function *p,  	      struct x86_reg reg )  { +   DUMP_R( reg );     assert(reg.mod == mod_REG);     emit_1ub(p, 0x40 + reg.idx);  } @@ -359,17 +481,27 @@ void x86_inc( struct x86_function *p,  void x86_dec( struct x86_function *p,  	      struct x86_reg reg )  { +   DUMP_R( reg );     assert(reg.mod == mod_REG);     emit_1ub(p, 0x48 + reg.idx);  }  void x86_ret( struct x86_function *p )  { +   DUMP(); +   assert(p->stack_offset == 0);     emit_1ub(p, 0xc3);  } +void x86_retw( struct x86_function *p, unsigned short imm ) +{ +   DUMP(); +   emit_3ub(p, 0xc2, imm & 0xff, (imm >> 8) & 0xff); +} +  void x86_sahf( struct x86_function *p )  { +   DUMP();     emit_1ub(p, 0x9e);  } @@ -377,6 +509,7 @@ void x86_mov( struct x86_function *p,  	      struct x86_reg dst,  	      struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_op_modrm( p, 0x8b, 0x89, dst, src );  } @@ -384,6 +517,7 @@ void x86_xor( struct x86_function *p,  	      struct x86_reg dst,  	      struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_op_modrm( p, 0x33, 0x31, dst, src );  } @@ -391,6 +525,7 @@ void x86_cmp( struct x86_function *p,  	      struct x86_reg dst,  	      struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_op_modrm( p, 0x3b, 0x39, dst, src );  } @@ -398,6 +533,7 @@ void x86_lea( struct x86_function *p,  	      struct x86_reg dst,  	      struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_1ub(p, 0x8d);     emit_modrm( p, dst, src );  } @@ -406,6 +542,7 @@ void x86_test( struct x86_function *p,  	       struct x86_reg dst,  	       struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_1ub(p, 0x85);     emit_modrm( p, dst, src );  } @@ -414,20 +551,36 @@ void x86_add( struct x86_function *p,  	       struct x86_reg dst,  	       struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_op_modrm(p, 0x03, 0x01, dst, src );  } +/* Calculate EAX * src, results in EDX:EAX. + */  void x86_mul( struct x86_function *p,  	       struct x86_reg src )  { -   assert (src.file == file_REG32 && src.mod == mod_REG); -   emit_op_modrm(p, 0xf7, 0, x86_make_reg (file_REG32, reg_SP), src ); +   DUMP_R(  src ); +   emit_1ub(p, 0xf7); +   emit_modrm_noreg(p, 4, src );  } + +void x86_imul( struct x86_function *p, +	       struct x86_reg dst, +	       struct x86_reg src ) +{ +   DUMP_RR( dst, src ); +   emit_2ub(p, X86_TWOB, 0xAF); +   emit_modrm(p, dst, src); +} + +  void x86_sub( struct x86_function *p,  	       struct x86_reg dst,  	       struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_op_modrm(p, 0x2b, 0x29, dst, src );  } @@ -435,6 +588,7 @@ void x86_or( struct x86_function *p,               struct x86_reg dst,               struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_op_modrm( p, 0x0b, 0x09, dst, src );  } @@ -442,6 +596,7 @@ void x86_and( struct x86_function *p,                struct x86_reg dst,                struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_op_modrm( p, 0x23, 0x21, dst, src );  } @@ -456,6 +611,7 @@ void sse_movss( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, 0xF3, X86_TWOB);     emit_op_modrm( p, 0x10, 0x11, dst, src );  } @@ -464,6 +620,7 @@ void sse_movaps( struct x86_function *p,  		 struct x86_reg dst,  		 struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_1ub(p, X86_TWOB);     emit_op_modrm( p, 0x28, 0x29, dst, src );  } @@ -472,6 +629,7 @@ void sse_movups( struct x86_function *p,  		 struct x86_reg dst,  		 struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_1ub(p, X86_TWOB);     emit_op_modrm( p, 0x10, 0x11, dst, src );  } @@ -480,6 +638,7 @@ void sse_movhps( struct x86_function *p,  		 struct x86_reg dst,  		 struct x86_reg src )  { +   DUMP_RR( dst, src );     assert(dst.mod != mod_REG || src.mod != mod_REG);     emit_1ub(p, X86_TWOB);     emit_op_modrm( p, 0x16, 0x17, dst, src ); /* cf movlhps */ @@ -489,6 +648,7 @@ void sse_movlps( struct x86_function *p,  		 struct x86_reg dst,  		 struct x86_reg src )  { +   DUMP_RR( dst, src );     assert(dst.mod != mod_REG || src.mod != mod_REG);     emit_1ub(p, X86_TWOB);     emit_op_modrm( p, 0x12, 0x13, dst, src ); /* cf movhlps */ @@ -498,6 +658,7 @@ void sse_maxps( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x5F);     emit_modrm( p, dst, src );  } @@ -506,6 +667,7 @@ void sse_maxss( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0xF3, X86_TWOB, 0x5F);     emit_modrm( p, dst, src );  } @@ -514,6 +676,7 @@ void sse_divss( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0xF3, X86_TWOB, 0x5E);     emit_modrm( p, dst, src );  } @@ -522,6 +685,7 @@ void sse_minps( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x5D);     emit_modrm( p, dst, src );  } @@ -530,6 +694,7 @@ void sse_subps( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x5C);     emit_modrm( p, dst, src );  } @@ -538,6 +703,7 @@ void sse_mulps( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x59);     emit_modrm( p, dst, src );  } @@ -546,6 +712,7 @@ void sse_mulss( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0xF3, X86_TWOB, 0x59);     emit_modrm( p, dst, src );  } @@ -554,6 +721,7 @@ void sse_addps( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x58);     emit_modrm( p, dst, src );  } @@ -562,6 +730,7 @@ void sse_addss( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0xF3, X86_TWOB, 0x58);     emit_modrm( p, dst, src );  } @@ -570,6 +739,7 @@ void sse_andnps( struct x86_function *p,                   struct x86_reg dst,                   struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x55);     emit_modrm( p, dst, src );  } @@ -578,6 +748,7 @@ void sse_andps( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x54);     emit_modrm( p, dst, src );  } @@ -586,6 +757,7 @@ void sse_rsqrtps( struct x86_function *p,                    struct x86_reg dst,                    struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x52);     emit_modrm( p, dst, src );  } @@ -594,6 +766,7 @@ void sse_rsqrtss( struct x86_function *p,  		  struct x86_reg dst,  		  struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0xF3, X86_TWOB, 0x52);     emit_modrm( p, dst, src ); @@ -603,6 +776,7 @@ void sse_movhlps( struct x86_function *p,  		  struct x86_reg dst,  		  struct x86_reg src )  { +   DUMP_RR( dst, src );     assert(dst.mod == mod_REG && src.mod == mod_REG);     emit_2ub(p, X86_TWOB, 0x12);     emit_modrm( p, dst, src ); @@ -612,6 +786,7 @@ void sse_movlhps( struct x86_function *p,  		  struct x86_reg dst,  		  struct x86_reg src )  { +   DUMP_RR( dst, src );     assert(dst.mod == mod_REG && src.mod == mod_REG);     emit_2ub(p, X86_TWOB, 0x16);     emit_modrm( p, dst, src ); @@ -621,6 +796,7 @@ void sse_orps( struct x86_function *p,                 struct x86_reg dst,                 struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x56);     emit_modrm( p, dst, src );  } @@ -629,6 +805,7 @@ void sse_xorps( struct x86_function *p,                  struct x86_reg dst,                  struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x57);     emit_modrm( p, dst, src );  } @@ -637,6 +814,7 @@ void sse_cvtps2pi( struct x86_function *p,  		   struct x86_reg dst,  		   struct x86_reg src )  { +   DUMP_RR( dst, src );     assert(dst.file == file_MMX &&   	  (src.file == file_XMM || src.mod != mod_REG)); @@ -646,36 +824,62 @@ void sse_cvtps2pi( struct x86_function *p,     emit_modrm( p, dst, src );  } +void sse2_cvtdq2ps( struct x86_function *p, +		   struct x86_reg dst, +		   struct x86_reg src ) +{ +   DUMP_RR( dst, src ); +   emit_2ub(p, X86_TWOB, 0x5b); +   emit_modrm( p, dst, src ); +} +  /* Shufps can also be used to implement a reduced swizzle when dest ==   * arg0.   */  void sse_shufps( struct x86_function *p, -		 struct x86_reg dest, -		 struct x86_reg arg0, +		 struct x86_reg dst, +		 struct x86_reg src,  		 unsigned char shuf)   { +   DUMP_RRI( dst, src, shuf );     emit_2ub(p, X86_TWOB, 0xC6); -   emit_modrm(p, dest, arg0); +   emit_modrm(p, dst, src);     emit_1ub(p, shuf);   } +void sse_unpckhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) +{ +   DUMP_RR( dst, src ); +   emit_2ub( p, X86_TWOB, 0x15 ); +   emit_modrm( p, dst, src ); +} + +void sse_unpcklps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) +{ +   DUMP_RR( dst, src ); +   emit_2ub( p, X86_TWOB, 0x14 ); +   emit_modrm( p, dst, src ); +} +  void sse_cmpps( struct x86_function *p, -		struct x86_reg dest, -		struct x86_reg arg0, +		struct x86_reg dst, +		struct x86_reg src,  		unsigned char cc)   { +   DUMP_RRI( dst, src, cc );     emit_2ub(p, X86_TWOB, 0xC2); -   emit_modrm(p, dest, arg0); +   emit_modrm(p, dst, src);     emit_1ub(p, cc);   }  void sse_pmovmskb( struct x86_function *p, -                   struct x86_reg dest, +                   struct x86_reg dst,                     struct x86_reg src)  { -    emit_3ub(p, 0x66, X86_TWOB, 0xD7); -    emit_modrm(p, dest, src); +   DUMP_RR( dst, src ); +   emit_3ub(p, 0x66, X86_TWOB, 0xD7); +   emit_modrm(p, dst, src);  }  /*********************************************************************** @@ -686,12 +890,13 @@ void sse_pmovmskb( struct x86_function *p,   * Perform a reduced swizzle:   */  void sse2_pshufd( struct x86_function *p, -		  struct x86_reg dest, -		  struct x86_reg arg0, +		  struct x86_reg dst, +		  struct x86_reg src,  		  unsigned char shuf)   { +   DUMP_RRI( dst, src, shuf );     emit_3ub(p, 0x66, X86_TWOB, 0x70); -   emit_modrm(p, dest, arg0); +   emit_modrm(p, dst, src);     emit_1ub(p, shuf);   } @@ -699,6 +904,7 @@ void sse2_cvttps2dq( struct x86_function *p,                       struct x86_reg dst,                       struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub( p, 0xF3, X86_TWOB, 0x5B );     emit_modrm( p, dst, src );  } @@ -707,6 +913,7 @@ void sse2_cvtps2dq( struct x86_function *p,  		    struct x86_reg dst,  		    struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0x66, X86_TWOB, 0x5B);     emit_modrm( p, dst, src );  } @@ -715,6 +922,7 @@ void sse2_packssdw( struct x86_function *p,  		    struct x86_reg dst,  		    struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0x66, X86_TWOB, 0x6B);     emit_modrm( p, dst, src );  } @@ -723,6 +931,7 @@ void sse2_packsswb( struct x86_function *p,  		    struct x86_reg dst,  		    struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0x66, X86_TWOB, 0x63);     emit_modrm( p, dst, src );  } @@ -731,14 +940,26 @@ void sse2_packuswb( struct x86_function *p,  		    struct x86_reg dst,  		    struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0x66, X86_TWOB, 0x67);     emit_modrm( p, dst, src );  } +void sse2_punpcklbw( struct x86_function *p, +		    struct x86_reg dst, +		    struct x86_reg src ) +{ +   DUMP_RR( dst, src ); +   emit_3ub(p, 0x66, X86_TWOB, 0x60); +   emit_modrm( p, dst, src ); +} + +  void sse2_rcpps( struct x86_function *p,                   struct x86_reg dst,                   struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, X86_TWOB, 0x53);     emit_modrm( p, dst, src );  } @@ -747,6 +968,7 @@ void sse2_rcpss( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_3ub(p, 0xF3, X86_TWOB, 0x53);     emit_modrm( p, dst, src );  } @@ -755,6 +977,7 @@ void sse2_movd( struct x86_function *p,  		struct x86_reg dst,  		struct x86_reg src )  { +   DUMP_RR( dst, src );     emit_2ub(p, 0x66, X86_TWOB);     emit_op_modrm( p, 0x6e, 0x7e, dst, src );  } @@ -767,30 +990,35 @@ void sse2_movd( struct x86_function *p,   */  void x87_fist( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     emit_1ub(p, 0xdb);     emit_modrm_noreg(p, 2, dst);  }  void x87_fistp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     emit_1ub(p, 0xdb);     emit_modrm_noreg(p, 3, dst);  }  void x87_fild( struct x86_function *p, struct x86_reg arg )  { +   DUMP_R( arg );     emit_1ub(p, 0xdf);     emit_modrm_noreg(p, 0, arg);  }  void x87_fldz( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xee);  }  void x87_fldcw( struct x86_function *p, struct x86_reg arg )  { +   DUMP_R( arg );     assert(arg.file == file_REG32);     assert(arg.mod != mod_REG);     emit_1ub(p, 0xd9); @@ -799,26 +1027,31 @@ void x87_fldcw( struct x86_function *p, struct x86_reg arg )  void x87_fld1( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xe8);  }  void x87_fldl2e( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xea);  }  void x87_fldln2( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xed);  }  void x87_fwait( struct x86_function *p )  { +   DUMP();     emit_1ub(p, 0x9b);  }  void x87_fnclex( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xdb, 0xe2);  } @@ -855,49 +1088,55 @@ static void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86        assert(0);  } -void x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) +void x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg src )  { -   x87_arith_op(p, dst, arg,  +   DUMP_RR( dst, src ); +   x87_arith_op(p, dst, src,   		0xd8, 0xc8,  		0xdc, 0xc8,  		4);  } -void x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) +void x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg src )  { -   x87_arith_op(p, dst, arg,  +   DUMP_RR( dst, src ); +   x87_arith_op(p, dst, src,   		0xd8, 0xe0,  		0xdc, 0xe8,  		4);  } -void x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) +void x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg src )  { -   x87_arith_op(p, dst, arg,  +   DUMP_RR( dst, src ); +   x87_arith_op(p, dst, src,   		0xd8, 0xe8,  		0xdc, 0xe0,  		5);  } -void x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) +void x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg src )  { -   x87_arith_op(p, dst, arg,  +   DUMP_RR( dst, src ); +   x87_arith_op(p, dst, src,   		0xd8, 0xc0,  		0xdc, 0xc0,  		0);  } -void x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) +void x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg src )  { -   x87_arith_op(p, dst, arg,  +   DUMP_RR( dst, src ); +   x87_arith_op(p, dst, src,   		0xd8, 0xf0,  		0xdc, 0xf8,  		6);  } -void x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ) +void x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg src )  { -   x87_arith_op(p, dst, arg,  +   DUMP_RR( dst, src ); +   x87_arith_op(p, dst, src,   		0xd8, 0xf8,  		0xdc, 0xf0,  		7); @@ -905,6 +1144,7 @@ void x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg )  void x87_fmulp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     assert(dst.file == file_x87);     assert(dst.idx >= 1);     emit_2ub(p, 0xde, 0xc8+dst.idx); @@ -912,6 +1152,7 @@ void x87_fmulp( struct x86_function *p, struct x86_reg dst )  void x87_fsubp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     assert(dst.file == file_x87);     assert(dst.idx >= 1);     emit_2ub(p, 0xde, 0xe8+dst.idx); @@ -919,6 +1160,7 @@ void x87_fsubp( struct x86_function *p, struct x86_reg dst )  void x87_fsubrp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     assert(dst.file == file_x87);     assert(dst.idx >= 1);     emit_2ub(p, 0xde, 0xe0+dst.idx); @@ -926,6 +1168,7 @@ void x87_fsubrp( struct x86_function *p, struct x86_reg dst )  void x87_faddp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     assert(dst.file == file_x87);     assert(dst.idx >= 1);     emit_2ub(p, 0xde, 0xc0+dst.idx); @@ -933,6 +1176,7 @@ void x87_faddp( struct x86_function *p, struct x86_reg dst )  void x87_fdivp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     assert(dst.file == file_x87);     assert(dst.idx >= 1);     emit_2ub(p, 0xde, 0xf8+dst.idx); @@ -940,6 +1184,7 @@ void x87_fdivp( struct x86_function *p, struct x86_reg dst )  void x87_fdivrp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     assert(dst.file == file_x87);     assert(dst.idx >= 1);     emit_2ub(p, 0xde, 0xf0+dst.idx); @@ -947,70 +1192,83 @@ void x87_fdivrp( struct x86_function *p, struct x86_reg dst )  void x87_fucom( struct x86_function *p, struct x86_reg arg )  { +   DUMP_R( arg );     assert(arg.file == file_x87);     emit_2ub(p, 0xdd, 0xe0+arg.idx);  }  void x87_fucomp( struct x86_function *p, struct x86_reg arg )  { +   DUMP_R( arg );     assert(arg.file == file_x87);     emit_2ub(p, 0xdd, 0xe8+arg.idx);  }  void x87_fucompp( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xda, 0xe9);  }  void x87_fxch( struct x86_function *p, struct x86_reg arg )  { +   DUMP_R( arg );     assert(arg.file == file_x87);     emit_2ub(p, 0xd9, 0xc8+arg.idx);  }  void x87_fabs( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xe1);  }  void x87_fchs( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xe0);  }  void x87_fcos( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xff);  }  void x87_fprndint( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xfc);  }  void x87_fscale( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xfd);  }  void x87_fsin( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xfe);  }  void x87_fsincos( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xfb);  }  void x87_fsqrt( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xfa);  }  void x87_fxtract( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xf4);  } @@ -1020,6 +1278,7 @@ void x87_fxtract( struct x86_function *p )   */  void x87_f2xm1( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xf0);  } @@ -1028,6 +1287,7 @@ void x87_f2xm1( struct x86_function *p )   */  void x87_fyl2x( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xf1);  } @@ -1038,12 +1298,14 @@ void x87_fyl2x( struct x86_function *p )   */  void x87_fyl2xp1( struct x86_function *p )  { +   DUMP();     emit_2ub(p, 0xd9, 0xf9);  }  void x87_fld( struct x86_function *p, struct x86_reg arg )  { +   DUMP_R( arg );     if (arg.file == file_x87)         emit_2ub(p, 0xd9, 0xc0 + arg.idx);     else { @@ -1054,6 +1316,7 @@ void x87_fld( struct x86_function *p, struct x86_reg arg )  void x87_fst( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     if (dst.file == file_x87)         emit_2ub(p, 0xdd, 0xd0 + dst.idx);     else { @@ -1064,6 +1327,7 @@ void x87_fst( struct x86_function *p, struct x86_reg dst )  void x87_fstp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     if (dst.file == file_x87)         emit_2ub(p, 0xdd, 0xd8 + dst.idx);     else { @@ -1074,6 +1338,7 @@ void x87_fstp( struct x86_function *p, struct x86_reg dst )  void x87_fcom( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     if (dst.file == file_x87)         emit_2ub(p, 0xd8, 0xd0 + dst.idx);     else { @@ -1084,6 +1349,7 @@ void x87_fcom( struct x86_function *p, struct x86_reg dst )  void x87_fcomp( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     if (dst.file == file_x87)         emit_2ub(p, 0xd8, 0xd8 + dst.idx);     else { @@ -1095,6 +1361,7 @@ void x87_fcomp( struct x86_function *p, struct x86_reg dst )  void x87_fnstsw( struct x86_function *p, struct x86_reg dst )  { +   DUMP_R( dst );     assert(dst.file == file_REG32);     if (dst.idx == reg_AX && @@ -1115,6 +1382,7 @@ void x87_fnstsw( struct x86_function *p, struct x86_reg dst )  void mmx_emms( struct x86_function *p )  { +   DUMP();     assert(p->need_emms);     emit_2ub(p, 0x0f, 0x77);     p->need_emms = 0; @@ -1124,6 +1392,7 @@ void mmx_packssdw( struct x86_function *p,  		   struct x86_reg dst,  		   struct x86_reg src )  { +   DUMP_RR( dst, src );     assert(dst.file == file_MMX &&   	  (src.file == file_MMX || src.mod != mod_REG)); @@ -1137,6 +1406,7 @@ void mmx_packuswb( struct x86_function *p,  		   struct x86_reg dst,  		   struct x86_reg src )  { +   DUMP_RR( dst, src );     assert(dst.file == file_MMX &&   	  (src.file == file_MMX || src.mod != mod_REG)); @@ -1150,6 +1420,7 @@ void mmx_movd( struct x86_function *p,  	       struct x86_reg dst,  	       struct x86_reg src )  { +   DUMP_RR( dst, src );     p->need_emms = 1;     emit_1ub(p, X86_TWOB);     emit_op_modrm( p, 0x6e, 0x7e, dst, src ); @@ -1159,6 +1430,7 @@ void mmx_movq( struct x86_function *p,  	       struct x86_reg dst,  	       struct x86_reg src )  { +   DUMP_RR( dst, src );     p->need_emms = 1;     emit_1ub(p, X86_TWOB);     emit_op_modrm( p, 0x6f, 0x7f, dst, src ); @@ -1186,18 +1458,25 @@ void x86_init_func( struct x86_function *p )     p->size = 0;     p->store = NULL;     p->csr = p->store; +   DUMP_START();  }  void x86_init_func_size( struct x86_function *p, unsigned code_size )  {     p->size = code_size;     p->store = rtasm_exec_malloc(code_size); +   if (p->store == NULL) { +      p->store = p->error_overflow; +   }     p->csr = p->store; +   DUMP_START();  }  void x86_release_func( struct x86_function *p )  { -   rtasm_exec_free(p->store); +   if (p->store && p->store != p->error_overflow) +      rtasm_exec_free(p->store); +     p->store = NULL;     p->csr = NULL;     p->size = 0; @@ -1206,9 +1485,14 @@ void x86_release_func( struct x86_function *p )  void (*x86_get_func( struct x86_function *p ))(void)  { +   DUMP_END();     if (DISASSEM && p->store)        debug_printf("disassemble %p %p\n", p->store, p->csr); -   return (void (*)(void)) p->store; + +   if (p->store == p->error_overflow) +      return (void (*)(void)) NULL; +   else +      return (void (*)(void)) p->store;  }  #else diff --git a/src/gallium/auxiliary/rtasm/rtasm_x86sse.h b/src/gallium/auxiliary/rtasm/rtasm_x86sse.h index 606b41eb35..eacaeeaf6f 100644 --- a/src/gallium/auxiliary/rtasm/rtasm_x86sse.h +++ b/src/gallium/auxiliary/rtasm/rtasm_x86sse.h @@ -43,6 +43,7 @@ struct x86_function {     unsigned char *csr;     unsigned stack_offset;     int need_emms; +   unsigned char error_overflow[4];     const char *fn;  }; @@ -123,23 +124,23 @@ struct x86_reg x86_get_base_reg( struct x86_reg reg );  /* Labels, jumps and fixup:   */ -unsigned char *x86_get_label( struct x86_function *p ); +int x86_get_label( struct x86_function *p );  void x86_jcc( struct x86_function *p,  	      enum x86_cc cc, -	      unsigned char *label ); +	      int label ); -unsigned char *x86_jcc_forward( struct x86_function *p, +int x86_jcc_forward( struct x86_function *p,  			  enum x86_cc cc ); -unsigned char *x86_jmp_forward( struct x86_function *p); +int x86_jmp_forward( struct x86_function *p); -unsigned char *x86_call_forward( struct x86_function *p); +int x86_call_forward( struct x86_function *p);  void x86_fixup_fwd_jump( struct x86_function *p, -			 unsigned char *fixup ); +			 int fixup ); -void x86_jmp( struct x86_function *p, unsigned char *label ); +void x86_jmp( struct x86_function *p, int label );  /* void x86_call( struct x86_function *p, void (*label)() ); */  void x86_call( struct x86_function *p, struct x86_reg reg); @@ -165,6 +166,7 @@ void mmx_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg sr  void sse2_cvtps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void sse2_cvttps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); +void sse2_cvtdq2ps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void sse2_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void sse2_packssdw( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void sse2_packsswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); @@ -201,7 +203,10 @@ void sse_rsqrtps( struct x86_function *p, struct x86_reg dst, struct x86_reg src  void sse_rsqrtss( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void sse_shufps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0,                   unsigned char shuf ); +void sse_unpckhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); +void sse_unpcklps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void sse_pmovmskb( struct x86_function *p, struct x86_reg dest, struct x86_reg src ); +void sse2_punpcklbw( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_add( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_and( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); @@ -211,10 +216,12 @@ void x86_inc( struct x86_function *p, struct x86_reg reg );  void x86_lea( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_mov( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_mul( struct x86_function *p, struct x86_reg src ); +void x86_imul( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_or( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_pop( struct x86_function *p, struct x86_reg reg );  void x86_push( struct x86_function *p, struct x86_reg reg );  void x86_ret( struct x86_function *p ); +void x86_retw( struct x86_function *p, unsigned short imm );  void x86_sub( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_test( struct x86_function *p, struct x86_reg dst, struct x86_reg src );  void x86_xor( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); diff --git a/src/gallium/auxiliary/sct/sct.c b/src/gallium/auxiliary/sct/sct.c index 97ee5882a1..5e4126e014 100644 --- a/src/gallium/auxiliary/sct/sct.c +++ b/src/gallium/auxiliary/sct/sct.c @@ -209,6 +209,7 @@ remove_context_from_surface(struct sct_surface *si,        }        else {           prev = curr; +         next = curr->next;        }     }  } diff --git a/src/gallium/auxiliary/tgsi/exec/Makefile b/src/gallium/auxiliary/tgsi/exec/Makefile new file mode 100644 index 0000000000..451911a354 --- /dev/null +++ b/src/gallium/auxiliary/tgsi/exec/Makefile @@ -0,0 +1,2 @@ +default: +	cd .. ; make diff --git a/src/gallium/auxiliary/tgsi/exec/tgsi_exec.c b/src/gallium/auxiliary/tgsi/exec/tgsi_exec.c index 78e7dec569..826b432f09 100644 --- a/src/gallium/auxiliary/tgsi/exec/tgsi_exec.c +++ b/src/gallium/auxiliary/tgsi/exec/tgsi_exec.c @@ -88,6 +88,10 @@  #define TEMP_OUTPUT_C      TGSI_EXEC_TEMP_OUTPUT_C  #define TEMP_PRIMITIVE_I   TGSI_EXEC_TEMP_PRIMITIVE_I  #define TEMP_PRIMITIVE_C   TGSI_EXEC_TEMP_PRIMITIVE_C +#define TEMP_3_I           TGSI_EXEC_TEMP_THREE_I +#define TEMP_3_C           TGSI_EXEC_TEMP_THREE_C +#define TEMP_HALF_I        TGSI_EXEC_TEMP_HALF_I +#define TEMP_HALF_C        TGSI_EXEC_TEMP_HALF_C  #define TEMP_R0            TGSI_EXEC_TEMP_R0  #define FOR_EACH_CHANNEL(CHAN)\ @@ -262,6 +266,8 @@ tgsi_exec_machine_init(        mach->Temps[TEMP_2_I].xyzw[TEMP_2_C].f[i] = 2.0f;        mach->Temps[TEMP_128_I].xyzw[TEMP_128_C].f[i] = 128.0f;        mach->Temps[TEMP_M128_I].xyzw[TEMP_M128_C].f[i] = -128.0f; +      mach->Temps[TEMP_3_I].xyzw[TEMP_3_C].f[i] = 3.0f; +      mach->Temps[TEMP_HALF_I].xyzw[TEMP_HALF_C].f[i] = 0.5f;     }  } @@ -287,10 +293,10 @@ micro_abs(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) fabs( (double) src->f[0] ); -   dst->f[1] = (float) fabs( (double) src->f[1] ); -   dst->f[2] = (float) fabs( (double) src->f[2] ); -   dst->f[3] = (float) fabs( (double) src->f[3] ); +   dst->f[0] = fabsf( src->f[0] ); +   dst->f[1] = fabsf( src->f[1] ); +   dst->f[2] = fabsf( src->f[2] ); +   dst->f[3] = fabsf( src->f[3] );  }  static void @@ -334,10 +340,10 @@ micro_ceil(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) ceil( (double) src->f[0] ); -   dst->f[1] = (float) ceil( (double) src->f[1] ); -   dst->f[2] = (float) ceil( (double) src->f[2] ); -   dst->f[3] = (float) ceil( (double) src->f[3] ); +   dst->f[0] = ceilf( src->f[0] ); +   dst->f[1] = ceilf( src->f[1] ); +   dst->f[2] = ceilf( src->f[2] ); +   dst->f[3] = ceilf( src->f[3] );  }  static void @@ -345,10 +351,10 @@ micro_cos(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) cos( (double) src->f[0] ); -   dst->f[1] = (float) cos( (double) src->f[1] ); -   dst->f[2] = (float) cos( (double) src->f[2] ); -   dst->f[3] = (float) cos( (double) src->f[3] ); +   dst->f[0] = cosf( src->f[0] ); +   dst->f[1] = cosf( src->f[1] ); +   dst->f[2] = cosf( src->f[2] ); +   dst->f[3] = cosf( src->f[3] );  }  static void @@ -430,10 +436,10 @@ micro_exp2(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src)  { -   dst->f[0] = (float) pow( 2.0, (double) src->f[0] ); -   dst->f[1] = (float) pow( 2.0, (double) src->f[1] ); -   dst->f[2] = (float) pow( 2.0, (double) src->f[2] ); -   dst->f[3] = (float) pow( 2.0, (double) src->f[3] ); +   dst->f[0] = powf( 2.0f, src->f[0] ); +   dst->f[1] = powf( 2.0f, src->f[1] ); +   dst->f[2] = powf( 2.0f, src->f[2] ); +   dst->f[3] = powf( 2.0f, src->f[3] );  }  static void @@ -463,10 +469,10 @@ micro_flr(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) floor( (double) src->f[0] ); -   dst->f[1] = (float) floor( (double) src->f[1] ); -   dst->f[2] = (float) floor( (double) src->f[2] ); -   dst->f[3] = (float) floor( (double) src->f[3] ); +   dst->f[0] = floorf( src->f[0] ); +   dst->f[1] = floorf( src->f[1] ); +   dst->f[2] = floorf( src->f[2] ); +   dst->f[3] = floorf( src->f[3] );  }  static void @@ -474,10 +480,10 @@ micro_frc(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = src->f[0] - (float) floor( (double) src->f[0] ); -   dst->f[1] = src->f[1] - (float) floor( (double) src->f[1] ); -   dst->f[2] = src->f[2] - (float) floor( (double) src->f[2] ); -   dst->f[3] = src->f[3] - (float) floor( (double) src->f[3] ); +   dst->f[0] = src->f[0] - floorf( src->f[0] ); +   dst->f[1] = src->f[1] - floorf( src->f[1] ); +   dst->f[2] = src->f[2] - floorf( src->f[2] ); +   dst->f[3] = src->f[3] - floorf( src->f[3] );  }  static void @@ -510,10 +516,24 @@ micro_lg2(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) log( (double) src->f[0] ) * 1.442695f; -   dst->f[1] = (float) log( (double) src->f[1] ) * 1.442695f; -   dst->f[2] = (float) log( (double) src->f[2] ) * 1.442695f; -   dst->f[3] = (float) log( (double) src->f[3] ) * 1.442695f; +   dst->f[0] = logf( src->f[0] ) * 1.442695f; +   dst->f[1] = logf( src->f[1] ) * 1.442695f; +   dst->f[2] = logf( src->f[2] ) * 1.442695f; +   dst->f[3] = logf( src->f[3] ) * 1.442695f; +} + +static void +micro_le( +   union tgsi_exec_channel *dst, +   const union tgsi_exec_channel *src0, +   const union tgsi_exec_channel *src1, +   const union tgsi_exec_channel *src2, +   const union tgsi_exec_channel *src3 ) +{ +   dst->f[0] = src0->f[0] <= src1->f[0] ? src2->f[0] : src3->f[0]; +   dst->f[1] = src0->f[1] <= src1->f[1] ? src2->f[1] : src3->f[1]; +   dst->f[2] = src0->f[2] <= src1->f[2] ? src2->f[2] : src3->f[2]; +   dst->f[3] = src0->f[3] <= src1->f[3] ? src2->f[3] : src3->f[3];  }  static void @@ -764,10 +784,10 @@ micro_pow(     const union tgsi_exec_channel *src0,     const union tgsi_exec_channel *src1 )  { -   dst->f[0] = (float) pow( (double) src0->f[0], (double) src1->f[0] ); -   dst->f[1] = (float) pow( (double) src0->f[1], (double) src1->f[1] ); -   dst->f[2] = (float) pow( (double) src0->f[2], (double) src1->f[2] ); -   dst->f[3] = (float) pow( (double) src0->f[3], (double) src1->f[3] ); +   dst->f[0] = powf( src0->f[0], src1->f[0] ); +   dst->f[1] = powf( src0->f[1], src1->f[1] ); +   dst->f[2] = powf( src0->f[2], src1->f[2] ); +   dst->f[3] = powf( src0->f[3], src1->f[3] );  }  static void @@ -775,10 +795,10 @@ micro_rnd(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) floor( (double) (src->f[0] + 0.5f) ); -   dst->f[1] = (float) floor( (double) (src->f[1] + 0.5f) ); -   dst->f[2] = (float) floor( (double) (src->f[2] + 0.5f) ); -   dst->f[3] = (float) floor( (double) (src->f[3] + 0.5f) ); +   dst->f[0] = floorf( src->f[0] + 0.5f ); +   dst->f[1] = floorf( src->f[1] + 0.5f ); +   dst->f[2] = floorf( src->f[2] + 0.5f ); +   dst->f[3] = floorf( src->f[3] + 0.5f );  }  static void @@ -833,20 +853,20 @@ micro_sin(     union tgsi_exec_channel *dst,     const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) sin( (double) src->f[0] ); -   dst->f[1] = (float) sin( (double) src->f[1] ); -   dst->f[2] = (float) sin( (double) src->f[2] ); -   dst->f[3] = (float) sin( (double) src->f[3] ); +   dst->f[0] = sinf( src->f[0] ); +   dst->f[1] = sinf( src->f[1] ); +   dst->f[2] = sinf( src->f[2] ); +   dst->f[3] = sinf( src->f[3] );  }  static void  micro_sqrt( union tgsi_exec_channel *dst,              const union tgsi_exec_channel *src )  { -   dst->f[0] = (float) sqrt( (double) src->f[0] ); -   dst->f[1] = (float) sqrt( (double) src->f[1] ); -   dst->f[2] = (float) sqrt( (double) src->f[2] ); -   dst->f[3] = (float) sqrt( (double) src->f[3] ); +   dst->f[0] = sqrtf( src->f[0] ); +   dst->f[1] = sqrtf( src->f[1] ); +   dst->f[2] = sqrtf( src->f[2] ); +   dst->f[3] = sqrtf( src->f[3] );  }  static void @@ -1516,41 +1536,44 @@ exec_instruction(        break;     case TGSI_OPCODE_EXP: -      debug_printf("TGSI: EXP opcode not implemented\n"); -      /* from ARB_v_p: -      tmp = ScalarLoad(op0); -      result.x = 2^floor(tmp); -      result.y = tmp - floor(tmp); -      result.z = RoughApprox2ToX(tmp); -      result.w = 1.0; -      */ -#if 0 -      /* something like this: */        FETCH( &r[0], 0, CHAN_X ); -      micro_exp2( &r[0], &r[0] ); -      FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { -	 STORE( &r[0], 0, chan_index ); +      micro_flr( &r[1], &r[0] );  /* r1 = floor(r0) */ +      if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) { +         micro_exp2( &r[2], &r[1] );       /* r2 = 2 ^ r1 */ +	 STORE( &r[2], 0, CHAN_X );        /* store r2 */ +      } +      if (IS_CHANNEL_ENABLED( *inst, CHAN_Y )) { +         micro_sub( &r[2], &r[0], &r[1] ); /* r2 = r0 - r1 */ +	 STORE( &r[2], 0, CHAN_Y );        /* store r2 */ +      } +      if (IS_CHANNEL_ENABLED( *inst, CHAN_Z )) { +         micro_exp2( &r[2], &r[0] );       /* r2 = 2 ^ r0 */ +	 STORE( &r[2], 0, CHAN_Z );        /* store r2 */ +      } +      if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) { +	 STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_W );        } -#endif        break;     case TGSI_OPCODE_LOG: -      debug_printf("TGSI: LOG opcode not implemented\n"); -      /* from ARB_v_p: -      tmp = fabs(ScalarLoad(op0)); -      result.x = floor(log2(tmp)); -      result.y = tmp / 2^(floor(log2(tmp))); -      result.z = RoughApproxLog2(tmp); -      result.w = 1.0; -      */ -#if 0 -      /* something like this: */        FETCH( &r[0], 0, CHAN_X ); -      micro_lg2( &r[0], &r[0] ); -      FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { -	 STORE( &r[0], 0, chan_index ); +      micro_abs( &r[2], &r[0] );  /* r2 = abs(r0) */ +      micro_lg2( &r[1], &r[2] );  /* r1 = lg2(r2) */ +      micro_flr( &r[0], &r[1] );  /* r0 = floor(r1) */ +      if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) { +	 STORE( &r[0], 0, CHAN_X ); +      } +      if (IS_CHANNEL_ENABLED( *inst, CHAN_Y )) { +         micro_exp2( &r[0], &r[0] );       /* r0 = 2 ^ r0 */ +         micro_div( &r[0], &r[2], &r[0] ); /* r0 = r2 / r0 */ +	 STORE( &r[0], 0, CHAN_Y ); +      } +      if (IS_CHANNEL_ENABLED( *inst, CHAN_Z )) { +	 STORE( &r[1], 0, CHAN_Z ); +      } +      if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) { +	 STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_W );        } -#endif        break;     case TGSI_OPCODE_MUL: @@ -1975,7 +1998,7 @@ exec_instruction(        FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {           FETCH( &r[0], 0, chan_index );           FETCH( &r[1], 1, chan_index ); -         micro_lt( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] ); +         micro_le( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] );           STORE( &r[0], 0, chan_index );        }        break; @@ -1992,7 +2015,7 @@ exec_instruction(        FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {           FETCH( &r[0], 0, chan_index );           FETCH( &r[1], 1, chan_index ); -         micro_ge( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] ); +         micro_le( &r[0], &r[0], &r[1], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] );           STORE( &r[0], 0, chan_index );        }        break; diff --git a/src/gallium/auxiliary/tgsi/exec/tgsi_exec.h b/src/gallium/auxiliary/tgsi/exec/tgsi_exec.h index 45c49dd007..19bd78df3d 100644 --- a/src/gallium/auxiliary/tgsi/exec/tgsi_exec.h +++ b/src/gallium/auxiliary/tgsi/exec/tgsi_exec.h @@ -133,9 +133,15 @@ struct tgsi_exec_labels  #define TGSI_EXEC_TEMP_PRIMITIVE_I  34  #define TGSI_EXEC_TEMP_PRIMITIVE_C  2 -#define TGSI_EXEC_TEMP_R0           35 +#define TGSI_EXEC_TEMP_THREE_I      34 +#define TGSI_EXEC_TEMP_THREE_C      3 -#define TGSI_EXEC_NUM_TEMPS   (32 + 4) +#define TGSI_EXEC_TEMP_HALF_I       35 +#define TGSI_EXEC_TEMP_HALF_C       0 + +#define TGSI_EXEC_TEMP_R0           36 + +#define TGSI_EXEC_NUM_TEMPS   (32 + 5)  #define TGSI_EXEC_NUM_ADDRS   1  #define TGSI_EXEC_NUM_IMMEDIATES  256 @@ -166,7 +172,7 @@ struct tgsi_exec_machine     float                         Imms[TGSI_EXEC_NUM_IMMEDIATES][4];     unsigned                      ImmLimit; -   float                         (*Consts)[4]; +   const float                   (*Consts)[4];     struct tgsi_exec_vector       *Inputs;     struct tgsi_exec_vector       *Outputs;     const struct tgsi_token       *Tokens; diff --git a/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.c b/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.c index 4e80597b3f..8018bd7fa4 100755 --- a/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.c +++ b/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.c @@ -34,115 +34,14 @@  #include "rtasm/rtasm_x86sse.h" -#if defined(__i386__) || defined(__386__) +#ifdef PIPE_ARCH_X86 -#define DUMP_SSE  0 - -#if DUMP_SSE - -static void -_print_reg( -   struct x86_reg reg ) -{ -   if (reg.mod != mod_REG)  -      debug_printf( "[" ); -       -   switch( reg.file ) { -   case file_REG32: -      switch( reg.idx ) { -      case reg_AX: -         debug_printf( "EAX" ); -         break; -      case reg_CX: -         debug_printf( "ECX" ); -         break; -      case reg_DX: -         debug_printf( "EDX" ); -         break; -      case reg_BX: -         debug_printf( "EBX" ); -         break; -      case reg_SP: -         debug_printf( "ESP" ); -         break; -      case reg_BP: -         debug_printf( "EBP" ); -         break; -      case reg_SI: -         debug_printf( "ESI" ); -         break; -      case reg_DI: -         debug_printf( "EDI" ); -         break; -      } -      break; -   case file_MMX: -      assert( 0 ); -      break; -   case file_XMM: -      debug_printf( "XMM%u", reg.idx ); -      break; -   case file_x87: -      assert( 0 ); -      break; -   } - -   if (reg.mod == mod_DISP8 || -       reg.mod == mod_DISP32) -      debug_printf("+%d", reg.disp); - -   if (reg.mod != mod_REG)  -      debug_printf( "]" ); -} - -static void -_fill( -   const char  *op ) -{ -   unsigned count = 10 - strlen( op ); - -   while( count-- ) { -      debug_printf( " " ); -   } -} - -#define DUMP_START() debug_printf( "\nsse-dump start ----------------" ) -#define DUMP_END() debug_printf( "\nsse-dump end ----------------\n" ) -#define DUMP( OP ) debug_printf( "\n%s", OP ) -#define DUMP_I( OP, I ) do {\ -   debug_printf( "\n%s", OP );\ -   _fill( OP );\ -   debug_printf( "%u", I ); } while( 0 ) -#define DUMP_R( OP, R0 ) do {\ -   debug_printf( "\n%s", OP );\ -   _fill( OP );\ -   _print_reg( R0 ); } while( 0 ) -#define DUMP_RR( OP, R0, R1 ) do {\ -   debug_printf( "\n%s", OP );\ -   _fill( OP );\ -   _print_reg( R0 );\ -   debug_printf( ", " );\ -   _print_reg( R1 ); } while( 0 ) -#define DUMP_RRI( OP, R0, R1, I ) do {\ -   debug_printf( "\n%s", OP );\ -   _fill( OP );\ -   _print_reg( R0 );\ -   debug_printf( ", " );\ -   _print_reg( R1 );\ -   debug_printf( ", " );\ -   debug_printf( "%u", I ); } while( 0 ) - -#else - -#define DUMP_START() -#define DUMP_END() -#define DUMP( OP ) -#define DUMP_I( OP, I ) -#define DUMP_R( OP, R0 ) -#define DUMP_RR( OP, R0, R1 ) -#define DUMP_RRI( OP, R0, R1, I ) +/* for 1/sqrt() + * + * This costs about 100fps (close to 10%) in gears: + */ +#define HIGH_PRECISION 1 -#endif  #define FOR_EACH_CHANNEL( CHAN )\     for( CHAN = 0; CHAN < 4; CHAN++ ) @@ -208,15 +107,9 @@ get_output_base( void )  static struct x86_reg  get_temp_base( void )  { -#ifdef WIN32     return x86_make_reg(        file_REG32,        reg_BX ); -#else -   return x86_make_reg( -      file_REG32, -      reg_SI ); -#endif  }  static struct x86_reg @@ -225,17 +118,28 @@ get_coef_base( void )     return get_output_base();  } +static struct x86_reg +get_immediate_base( void ) +{ +   return x86_make_reg( +      file_REG32, +      reg_DI ); +} + +  /**   * Data access helpers.   */ +  static struct x86_reg -get_argument( -   unsigned index ) +get_immediate( +   unsigned vec, +   unsigned chan )  {     return x86_make_disp( -      x86_make_reg( file_REG32, reg_SP ), -      (index + 1) * 4 ); +      get_immediate_base(), +      (vec * 4 + chan) * 4 );  }  static struct x86_reg @@ -289,200 +193,6 @@ get_coef(        ((vec * 3 + member) * 4 + chan) * 4 );  } -/** - * X86 rtasm wrappers. - */ - -static void -emit_addps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "ADDPS", dst, src ); -   sse_addps( func, dst, src ); -} - -static void -emit_andnps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "ANDNPS", dst, src ); -   sse_andnps( func, dst, src ); -} - -static void -emit_andps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "ANDPS", dst, src ); -   sse_andps( func, dst, src ); -} - -static void -emit_call( -   struct x86_function  *func, -   void                 (* addr)() ) -{ -   struct x86_reg ecx = x86_make_reg( file_REG32, reg_CX ); - -   DUMP_I( "CALL", addr ); -   x86_mov_reg_imm( func, ecx, (unsigned long) addr ); -   x86_call( func, ecx ); -} - -static void -emit_cmpps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src, -   enum sse_cc          cc ) -{ -   DUMP_RRI( "CMPPS", dst, src, cc ); -   sse_cmpps( func, dst, src, cc ); -} - -static void -emit_cvttps2dq( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "CVTTPS2DQ", dst, src ); -   sse2_cvttps2dq( func, dst, src ); -} - -static void -emit_maxps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "MAXPS", dst, src ); -   sse_maxps( func, dst, src ); -} - -static void -emit_minps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "MINPS", dst, src ); -   sse_minps( func, dst, src ); -} - -static void -emit_mov( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "MOV", dst, src ); -   x86_mov( func, dst, src ); -} - -static void -emit_movaps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "MOVAPS", dst, src ); -   sse_movaps( func, dst, src ); -} - -static void -emit_movss( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "MOVSS", dst, src ); -   sse_movss( func, dst, src ); -} - -static void -emit_movups( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "MOVUPS", dst, src ); -   sse_movups( func, dst, src ); -} - -static void -emit_mulps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "MULPS", dst, src ); -   sse_mulps( func, dst, src ); -} - -static void -emit_or( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "OR", dst, src ); -   x86_or( func, dst, src ); -} - -static void -emit_orps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "ORPS", dst, src ); -   sse_orps( func, dst, src ); -} - -static void -emit_pmovmskb( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "PMOVMSKB", dst, src ); -   sse_pmovmskb( func, dst, src ); -} - -static void -emit_pop( -   struct x86_function  *func, -   struct x86_reg       dst ) -{ -   DUMP_R( "POP", dst ); -   x86_pop( func, dst ); -} - -static void -emit_push( -   struct x86_function  *func, -   struct x86_reg       dst ) -{ -   DUMP_R( "PUSH", dst ); -   x86_push( func, dst ); -} - -static void -emit_rcpps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "RCPPS", dst, src ); -   sse2_rcpps( func, dst, src ); -}  #ifdef WIN32  static void @@ -490,7 +200,6 @@ emit_retw(     struct x86_function  *func,     unsigned             size )  { -   DUMP_I( "RET", size );     x86_retw( func, size );  }  #else @@ -498,56 +207,21 @@ static void  emit_ret(     struct x86_function  *func )  { -   DUMP( "RET" );     x86_ret( func );  }  #endif -static void -emit_rsqrtps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "RSQRTPS", dst, src ); -   sse_rsqrtps( func, dst, src ); -} - -static void -emit_shufps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src, -   unsigned char        shuf ) -{ -   DUMP_RRI( "SHUFPS", dst, src, shuf ); -   sse_shufps( func, dst, src, shuf ); -} - -static void -emit_subps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "SUBPS", dst, src ); -   sse_subps( func, dst, src ); -} - -static void -emit_xorps( -   struct x86_function  *func, -   struct x86_reg       dst, -   struct x86_reg       src ) -{ -   DUMP_RR( "XORPS", dst, src ); -   sse_xorps( func, dst, src ); -}  /**   * Data fetch helpers.   */ +/** + * Copy a shader constant to xmm register + * \param xmm  the destination xmm register + * \param vec  the src const buffer index + * \param chan  src channel to fetch (X, Y, Z or W) + */  static void  emit_const(     struct x86_function *func, @@ -555,17 +229,42 @@ emit_const(     unsigned vec,     unsigned chan )  { -   emit_movss( +   sse_movss(        func,        make_xmm( xmm ),        get_const( vec, chan ) ); -   emit_shufps( +   sse_shufps( +      func, +      make_xmm( xmm ), +      make_xmm( xmm ), +      SHUF( 0, 0, 0, 0 ) ); +} + +static void +emit_immediate( +   struct x86_function *func, +   unsigned xmm, +   unsigned vec, +   unsigned chan ) +{ +   sse_movss( +      func, +      make_xmm( xmm ), +      get_immediate( vec, chan ) ); +   sse_shufps(        func,        make_xmm( xmm ),        make_xmm( xmm ),        SHUF( 0, 0, 0, 0 ) );  } + +/** + * Copy a shader input to xmm register + * \param xmm  the destination xmm register + * \param vec  the src input attrib + * \param chan  src channel to fetch (X, Y, Z or W) + */  static void  emit_inputf(     struct x86_function *func, @@ -573,12 +272,18 @@ emit_inputf(     unsigned vec,     unsigned chan )  { -   emit_movups( +   sse_movups(        func,        make_xmm( xmm ),        get_input( vec, chan ) );  } +/** + * Store an xmm register to a shader output + * \param xmm  the source xmm register + * \param vec  the dest output attrib + * \param chan  src dest channel to store (X, Y, Z or W) + */  static void  emit_output(     struct x86_function *func, @@ -586,12 +291,18 @@ emit_output(     unsigned vec,     unsigned chan )  { -   emit_movups( +   sse_movups(        func,        get_output( vec, chan ),        make_xmm( xmm ) );  } +/** + * Copy a shader temporary to xmm register + * \param xmm  the destination xmm register + * \param vec  the src temp register + * \param chan  src channel to fetch (X, Y, Z or W) + */  static void  emit_tempf(     struct x86_function *func, @@ -599,12 +310,19 @@ emit_tempf(     unsigned vec,     unsigned chan )  { -   emit_movaps( +   sse_movaps(        func,        make_xmm( xmm ),        get_temp( vec, chan ) );  } +/** + * Load an xmm register with an input attrib coefficient (a0, dadx or dady) + * \param xmm  the destination xmm register + * \param vec  the src input/attribute coefficient index + * \param chan  src channel to fetch (X, Y, Z or W) + * \param member  0=a0, 1=dadx, 2=dady + */  static void  emit_coef(     struct x86_function *func, @@ -613,11 +331,11 @@ emit_coef(     unsigned chan,     unsigned member )  { -   emit_movss( +   sse_movss(        func,        make_xmm( xmm ),        get_coef( vec, chan, member ) ); -   emit_shufps( +   sse_shufps(        func,        make_xmm( xmm ),        make_xmm( xmm ), @@ -635,7 +353,7 @@ emit_inputs(     unsigned vec,     unsigned chan )  { -   emit_movups( +   sse_movups(        func,        get_input( vec, chan ),        make_xmm( xmm ) ); @@ -648,7 +366,7 @@ emit_temps(     unsigned vec,     unsigned chan )  { -   emit_movaps( +   sse_movaps(        func,        get_temp( vec, chan ),        make_xmm( xmm ) ); @@ -725,41 +443,32 @@ static void  emit_push_gp(     struct x86_function *func )  { -   emit_push( +   x86_push(        func, -      get_const_base() ); -   emit_push( +      x86_make_reg( file_REG32, reg_AX) ); +   x86_push(        func, -      get_input_base() ); -   emit_push( +      x86_make_reg( file_REG32, reg_CX) ); +   x86_push(        func, -      get_output_base() ); - -   /* It is important on non-win32 platforms that temp base is pushed last. -    */ -   emit_push( -      func, -      get_temp_base() ); +      x86_make_reg( file_REG32, reg_DX) );  }  static void -emit_pop_gp( +x86_pop_gp(     struct x86_function *func )  {     /* Restore GP registers in a reverse order.      */ -   emit_pop( -      func, -      get_temp_base() ); -   emit_pop( +   x86_pop(        func, -      get_output_base() ); -   emit_pop( +      x86_make_reg( file_REG32, reg_DX) ); +   x86_pop(        func, -      get_input_base() ); -   emit_pop( +      x86_make_reg( file_REG32, reg_CX) ); +   x86_pop(        func, -      get_const_base() ); +      x86_make_reg( file_REG32, reg_AX) );  }  static void @@ -768,7 +477,7 @@ emit_func_call_dst(     unsigned xmm_dst,     void (*code)() )  { -   emit_movaps( +   sse_movaps(        func,        get_temp( TEMP_R0, 0 ),        make_xmm( xmm_dst ) ); @@ -776,20 +485,27 @@ emit_func_call_dst(     emit_push_gp(        func ); -#ifdef WIN32 -   emit_push( -      func, -      get_temp( TEMP_R0, 0 ) ); +   { +      struct x86_reg ecx = x86_make_reg( file_REG32, reg_CX ); + +      x86_lea( +         func, +         ecx, +         get_temp( TEMP_R0, 0 ) ); + +      x86_push( func, ecx ); +      x86_mov_reg_imm( func, ecx, (unsigned long) code ); +      x86_call( func, ecx ); +#ifndef WIN32 +      x86_pop(func, ecx );   #endif +   } -   emit_call( -      func, -      code ); -   emit_pop_gp( +   x86_pop_gp(        func ); -   emit_movaps( +   sse_movaps(        func,        make_xmm( xmm_dst ),        get_temp( TEMP_R0, 0 ) ); @@ -802,7 +518,7 @@ emit_func_call_dst_src(     unsigned xmm_src,     void (*code)() )  { -   emit_movaps( +   sse_movaps(        func,        get_temp( TEMP_R0, 1 ),        make_xmm( xmm_src ) ); @@ -822,7 +538,7 @@ emit_abs(     struct x86_function *func,     unsigned xmm )  { -   emit_andps( +   sse_andps(        func,        make_xmm( xmm ),        get_temp( @@ -836,7 +552,7 @@ emit_add(     unsigned xmm_dst,     unsigned xmm_src )  { -   emit_addps( +   sse_addps(        func,        make_xmm( xmm_dst ),        make_xmm( xmm_src ) ); @@ -846,18 +562,12 @@ static void XSTDCALL  cos4f(     float *store )  { -#ifdef WIN32 -   store[0] = (float) cos( (double) store[0] ); -   store[1] = (float) cos( (double) store[1] ); -   store[2] = (float) cos( (double) store[2] ); -   store[3] = (float) cos( (double) store[3] ); -#else -   const unsigned X = TEMP_R0 * 16; +   const unsigned X = 0; +     store[X + 0] = cosf( store[X + 0] );     store[X + 1] = cosf( store[X + 1] );     store[X + 2] = cosf( store[X + 2] );     store[X + 3] = cosf( store[X + 3] ); -#endif  }  static void @@ -875,18 +585,12 @@ static void XSTDCALL  ex24f(     float *store )  { -#ifdef WIN32 -   store[0] = (float) pow( 2.0, (double) store[0] ); -   store[1] = (float) pow( 2.0, (double) store[1] ); -   store[2] = (float) pow( 2.0, (double) store[2] ); -   store[3] = (float) pow( 2.0, (double) store[3] ); -#else -   const unsigned X = TEMP_R0 * 16; +   const unsigned X = 0; +     store[X + 0] = powf( 2.0f, store[X + 0] );     store[X + 1] = powf( 2.0f, store[X + 1] );     store[X + 2] = powf( 2.0f, store[X + 2] );     store[X + 3] = powf( 2.0f, store[X + 3] ); -#endif  }  static void @@ -905,7 +609,7 @@ emit_f2it(     struct x86_function *func,     unsigned xmm )  { -   emit_cvttps2dq( +   sse2_cvttps2dq(        func,        make_xmm( xmm ),        make_xmm( xmm ) ); @@ -915,15 +619,12 @@ static void XSTDCALL  flr4f(     float *store )  { -#ifdef WIN32     const unsigned X = 0; -#else -   const unsigned X = TEMP_R0 * 16; -#endif -   store[X + 0] = (float) floor( (double) store[X + 0] ); -   store[X + 1] = (float) floor( (double) store[X + 1] ); -   store[X + 2] = (float) floor( (double) store[X + 2] ); -   store[X + 3] = (float) floor( (double) store[X + 3] ); + +   store[X + 0] = floorf( store[X + 0] ); +   store[X + 1] = floorf( store[X + 1] ); +   store[X + 2] = floorf( store[X + 2] ); +   store[X + 3] = floorf( store[X + 3] );  }  static void @@ -941,15 +642,12 @@ static void XSTDCALL  frc4f(     float *store )  { -#ifdef WIN32     const unsigned X = 0; -#else -   const unsigned X = TEMP_R0 * 16; -#endif -   store[X + 0] -= (float) floor( (double) store[X + 0] ); -   store[X + 1] -= (float) floor( (double) store[X + 1] ); -   store[X + 2] -= (float) floor( (double) store[X + 2] ); -   store[X + 3] -= (float) floor( (double) store[X + 3] ); + +   store[X + 0] -= floorf( store[X + 0] ); +   store[X + 1] -= floorf( store[X + 1] ); +   store[X + 2] -= floorf( store[X + 2] ); +   store[X + 3] -= floorf( store[X + 3] );  }  static void @@ -967,11 +665,8 @@ static void XSTDCALL  lg24f(     float *store )  { -#ifdef WIN32     const unsigned X = 0; -#else -   const unsigned X = TEMP_R0 * 16; -#endif +     store[X + 0] = LOG2( store[X + 0] );     store[X + 1] = LOG2( store[X + 1] );     store[X + 2] = LOG2( store[X + 2] ); @@ -995,7 +690,7 @@ emit_MOV(     unsigned xmm_dst,     unsigned xmm_src )  { -   emit_movups( +   sse_movups(        func,        make_xmm( xmm_dst ),        make_xmm( xmm_src ) ); @@ -1006,7 +701,7 @@ emit_mul (struct x86_function *func,            unsigned xmm_dst,            unsigned xmm_src)  { -   emit_mulps( +   sse_mulps(        func,        make_xmm( xmm_dst ),        make_xmm( xmm_src ) ); @@ -1017,7 +712,7 @@ emit_neg(     struct x86_function *func,     unsigned xmm )  { -   emit_xorps( +   sse_xorps(        func,        make_xmm( xmm ),        get_temp( @@ -1029,18 +724,12 @@ static void XSTDCALL  pow4f(     float *store )  { -#ifdef WIN32 -   store[0] = (float) pow( (double) store[0], (double) store[4] ); -   store[1] = (float) pow( (double) store[1], (double) store[5] ); -   store[2] = (float) pow( (double) store[2], (double) store[6] ); -   store[3] = (float) pow( (double) store[3], (double) store[7] ); -#else -   const unsigned X = TEMP_R0 * 16; +   const unsigned X = 0; +     store[X + 0] = powf( store[X + 0], store[X + 4] );     store[X + 1] = powf( store[X + 1], store[X + 5] );     store[X + 2] = powf( store[X + 2], store[X + 6] );     store[X + 3] = powf( store[X + 3], store[X + 7] ); -#endif  }  static void @@ -1062,7 +751,11 @@ emit_rcp (     unsigned xmm_dst,     unsigned xmm_src )  { -   emit_rcpps( +   /* On Intel CPUs at least, this is only accurate to 12 bits -- not +    * good enough.  Need to either emit a proper divide or use the +    * iterative technique described below in emit_rsqrt(). +    */ +   sse2_rcpps(        func,        make_xmm( xmm_dst ),        make_xmm( xmm_src ) ); @@ -1074,10 +767,44 @@ emit_rsqrt(     unsigned xmm_dst,     unsigned xmm_src )  { -   emit_rsqrtps( +#if HIGH_PRECISION +   /* Although rsqrtps() and rcpps() are low precision on some/all SSE +    * implementations, it is possible to improve its precision at +    * fairly low cost, using a newton/raphson step, as below: +    *  +    * x1 = 2 * rcpps(a) - a * rcpps(a) * rcpps(a) +    * x1 = 0.5 * rsqrtps(a) * [3.0 - (a * rsqrtps(a))* rsqrtps(a)] +    * +    * See: http://softwarecommunity.intel.com/articles/eng/1818.htm +    */ +   { +      struct x86_reg dst = make_xmm( xmm_dst ); +      struct x86_reg src = make_xmm( xmm_src ); +      struct x86_reg tmp0 = make_xmm( 2 ); +      struct x86_reg tmp1 = make_xmm( 3 ); + +      assert( xmm_dst != xmm_src ); +      assert( xmm_dst != 2 && xmm_dst != 3 ); +      assert( xmm_src != 2 && xmm_src != 3 ); + +      sse_movaps(  func, dst,  get_temp( TGSI_EXEC_TEMP_HALF_I, TGSI_EXEC_TEMP_HALF_C ) ); +      sse_movaps(  func, tmp0, get_temp( TGSI_EXEC_TEMP_THREE_I, TGSI_EXEC_TEMP_THREE_C ) ); +      sse_rsqrtps( func, tmp1, src  ); +      sse_mulps(   func, src,  tmp1 ); +      sse_mulps(   func, dst,  tmp1 ); +      sse_mulps(   func, src,  tmp1 ); +      sse_subps(   func, tmp0, src  ); +      sse_mulps(   func, dst,  tmp0 ); +   } +#else +   /* On Intel CPUs at least, this is only accurate to 12 bits -- not +    * good enough. +    */ +   sse_rsqrtps(        func,        make_xmm( xmm_dst ),        make_xmm( xmm_src ) ); +#endif  }  static void @@ -1085,7 +812,7 @@ emit_setsign(     struct x86_function *func,     unsigned xmm )  { -   emit_orps( +   sse_orps(        func,        make_xmm( xmm ),        get_temp( @@ -1097,18 +824,12 @@ static void XSTDCALL  sin4f(     float *store )  { -#ifdef WIN32 -   store[0] = (float) sin( (double) store[0] ); -   store[1] = (float) sin( (double) store[1] ); -   store[2] = (float) sin( (double) store[2] ); -   store[3] = (float) sin( (double) store[3] ); -#else -   const unsigned X = TEMP_R0 * 16; +   const unsigned X = 0; +     store[X + 0] = sinf( store[X + 0] );     store[X + 1] = sinf( store[X + 1] );     store[X + 2] = sinf( store[X + 2] );     store[X + 3] = sinf( store[X + 3] ); -#endif  }  static void @@ -1127,7 +848,7 @@ emit_sub(     unsigned xmm_dst,     unsigned xmm_src )  { -   emit_subps( +   sse_subps(        func,        make_xmm( xmm_dst ),        make_xmm( xmm_src ) ); @@ -1160,6 +881,14 @@ emit_fetch(              swizzle );           break; +      case TGSI_FILE_IMMEDIATE: +         emit_immediate( +            func, +            xmm, +            reg->SrcRegister.Index, +            swizzle ); +         break; +        case TGSI_FILE_INPUT:           emit_inputf(              func, @@ -1328,16 +1057,16 @@ emit_kil(        }     } -   emit_push( +   x86_push(        func,        x86_make_reg( file_REG32, reg_AX ) ); -   emit_push( +   x86_push(        func,        x86_make_reg( file_REG32, reg_DX ) );     FOR_EACH_CHANNEL( chan_index ) {        if( uniquemask & (1 << chan_index) ) { -         emit_cmpps( +         sse_cmpps(              func,              make_xmm( registers[chan_index] ),              get_temp( @@ -1346,17 +1075,17 @@ emit_kil(              cc_LessThan );           if( chan_index == firstchan ) { -            emit_pmovmskb( +            sse_pmovmskb(                 func,                 x86_make_reg( file_REG32, reg_AX ),                 make_xmm( registers[chan_index] ) );           }           else { -            emit_pmovmskb( +            sse_pmovmskb(                 func,                 x86_make_reg( file_REG32, reg_DX ),                 make_xmm( registers[chan_index] ) ); -            emit_or( +            x86_or(                 func,                 x86_make_reg( file_REG32, reg_AX ),                 x86_make_reg( file_REG32, reg_DX ) ); @@ -1364,17 +1093,17 @@ emit_kil(        }     } -   emit_or( +   x86_or(        func,        get_temp(           TGSI_EXEC_TEMP_KILMASK_I,           TGSI_EXEC_TEMP_KILMASK_C ),        x86_make_reg( file_REG32, reg_AX ) ); -   emit_pop( +   x86_pop(        func,        x86_make_reg( file_REG32, reg_DX ) ); -   emit_pop( +   x86_pop(        func,        x86_make_reg( file_REG32, reg_AX ) );  } @@ -1390,12 +1119,12 @@ emit_setcc(     FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {        FETCH( func, *inst, 0, 0, chan_index );        FETCH( func, *inst, 1, 1, chan_index ); -      emit_cmpps( +      sse_cmpps(           func,           make_xmm( 0 ),           make_xmm( 1 ),           cc ); -      emit_andps( +      sse_andps(           func,           make_xmm( 0 ),           get_temp( @@ -1416,22 +1145,22 @@ emit_cmp(        FETCH( func, *inst, 0, 0, chan_index );        FETCH( func, *inst, 1, 1, chan_index );        FETCH( func, *inst, 2, 2, chan_index ); -      emit_cmpps( +      sse_cmpps(           func,           make_xmm( 0 ),           get_temp(              TGSI_EXEC_TEMP_00000000_I,              TGSI_EXEC_TEMP_00000000_C ),           cc_LessThan ); -      emit_andps( +      sse_andps(           func,           make_xmm( 1 ),           make_xmm( 0 ) ); -      emit_andnps( +      sse_andnps(           func,           make_xmm( 0 ),           make_xmm( 2 ) ); -      emit_orps( +      sse_orps(           func,           make_xmm( 0 ),           make_xmm( 1 ) ); @@ -1448,11 +1177,16 @@ emit_instruction(     switch( inst->Instruction.Opcode ) {     case TGSI_OPCODE_ARL: +#if 0 +      /* XXX this isn't working properly (see glean vertProg1 test) */        FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {           FETCH( func, *inst, 0, 0, chan_index );           emit_f2it( func, 0 );           STORE( func, *inst, 0, 0, chan_index );        } +#else +      return 0; +#endif        break;     case TGSI_OPCODE_MOV: @@ -1482,7 +1216,7 @@ emit_instruction(            IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) ) {           if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) ) {              FETCH( func, *inst, 0, 0, CHAN_X ); -            emit_maxps( +            sse_maxps(                 func,                 make_xmm( 0 ),                 get_temp( @@ -1491,21 +1225,26 @@ emit_instruction(              STORE( func, *inst, 0, 0, CHAN_Y );           }           if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) ) { +            /* XMM[1] = SrcReg[0].yyyy */              FETCH( func, *inst, 1, 0, CHAN_Y ); -            emit_maxps( +            /* XMM[1] = max(XMM[1], 0) */ +            sse_maxps(                 func,                 make_xmm( 1 ),                 get_temp(                    TGSI_EXEC_TEMP_00000000_I,                    TGSI_EXEC_TEMP_00000000_C ) ); +            /* XMM[2] = SrcReg[0].wwww */              FETCH( func, *inst, 2, 0, CHAN_W ); -            emit_minps( +            /* XMM[2] = min(XMM[2], 128.0) */ +            sse_minps(                 func,                 make_xmm( 2 ),                 get_temp(                    TGSI_EXEC_TEMP_128_I,                    TGSI_EXEC_TEMP_128_C ) ); -            emit_maxps( +            /* XMM[2] = max(XMM[2], -128.0) */ +            sse_maxps(                 func,                 make_xmm( 2 ),                 get_temp( @@ -1513,16 +1252,16 @@ emit_instruction(                    TGSI_EXEC_TEMP_MINUS_128_C ) );              emit_pow( func, 1, 2 );              FETCH( func, *inst, 0, 0, CHAN_X ); -            emit_xorps( +            sse_xorps(                 func,                 make_xmm( 2 ),                 make_xmm( 2 ) ); -            emit_cmpps( +            sse_cmpps(                 func,                 make_xmm( 2 ),                 make_xmm( 0 ),                 cc_LessThanEqual ); -            emit_andps( +            sse_andps(                 func,                 make_xmm( 2 ),                 make_xmm( 1 ) ); @@ -1543,9 +1282,9 @@ emit_instruction(     case TGSI_OPCODE_RSQ:     /* TGSI_OPCODE_RECIPSQRT */        FETCH( func, *inst, 0, 0, CHAN_X ); -      emit_rsqrt( func, 0, 0 ); +      emit_rsqrt( func, 1, 0 );        FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { -         STORE( func, *inst, 0, 0, chan_index ); +         STORE( func, *inst, 1, 0, chan_index );        }        break; @@ -1644,7 +1383,7 @@ emit_instruction(        FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {           FETCH( func, *inst, 0, 0, chan_index );           FETCH( func, *inst, 1, 1, chan_index ); -         emit_minps( +         sse_minps(              func,              make_xmm( 0 ),              make_xmm( 1 ) ); @@ -1656,7 +1395,7 @@ emit_instruction(        FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {           FETCH( func, *inst, 0, 0, chan_index );           FETCH( func, *inst, 1, 1, chan_index ); -         emit_maxps( +         sse_maxps(              func,              make_xmm( 0 ),              make_xmm( 1 ) ); @@ -1997,7 +1736,6 @@ emit_instruction(        break;     case TGSI_OPCODE_RET: -   case TGSI_OPCODE_END:  #ifdef WIN32        emit_retw( func, 16 );  #else @@ -2005,6 +1743,9 @@ emit_instruction(  #endif        break; +   case TGSI_OPCODE_END: +      break; +     case TGSI_OPCODE_SSG:        return 0;        break; @@ -2020,7 +1761,7 @@ emit_instruction(           STORE( func, *inst, 0, 0, CHAN_X );        }        IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) { -         FETCH( func, *inst, 0, 0, CHAN_Y ); +         FETCH( func, *inst, 0, 0, CHAN_X );           emit_sin( func, 0 );           STORE( func, *inst, 0, 0, CHAN_Y );        } @@ -2236,149 +1977,289 @@ emit_declaration(     }  } -unsigned -tgsi_emit_sse2( -   struct tgsi_token *tokens, -   struct x86_function *func ) +static void aos_to_soa( struct x86_function *func,  +                        uint arg_aos, +                        uint arg_soa,  +                        uint arg_num,  +                        uint arg_stride )  { -   struct tgsi_parse_context parse; -   unsigned ok = 1; +   struct x86_reg soa_input = x86_make_reg( file_REG32, reg_AX ); +   struct x86_reg aos_input = x86_make_reg( file_REG32, reg_BX ); +   struct x86_reg num_inputs = x86_make_reg( file_REG32, reg_CX ); +   struct x86_reg stride = x86_make_reg( file_REG32, reg_DX ); +   int inner_loop; -   DUMP_START(); -   func->csr = func->store; +   /* Save EBX */ +   x86_push( func, x86_make_reg( file_REG32, reg_BX ) ); -   emit_mov( -      func, -      get_input_base(), -      get_argument( 0 ) ); -   emit_mov( -      func, -      get_output_base(), -      get_argument( 1 ) ); -   emit_mov( -      func, -      get_const_base(), -      get_argument( 2 ) ); -   emit_mov( -      func, -      get_temp_base(), -      get_argument( 3 ) ); +   x86_mov( func, aos_input,  x86_fn_arg( func, arg_aos ) ); +   x86_mov( func, soa_input,  x86_fn_arg( func, arg_soa ) ); +   x86_mov( func, num_inputs, x86_fn_arg( func, arg_num ) ); +   x86_mov( func, stride,     x86_fn_arg( func, arg_stride ) ); -   tgsi_parse_init( &parse, tokens ); +   /* do */ +   inner_loop = x86_get_label( func ); +   { +      x86_push( func, aos_input ); +      sse_movlps( func, make_xmm( 0 ), x86_make_disp( aos_input, 0 ) ); +      sse_movlps( func, make_xmm( 3 ), x86_make_disp( aos_input, 8 ) ); +      x86_add( func, aos_input, stride ); +      sse_movhps( func, make_xmm( 0 ), x86_make_disp( aos_input, 0 ) ); +      sse_movhps( func, make_xmm( 3 ), x86_make_disp( aos_input, 8 ) ); +      x86_add( func, aos_input, stride ); +      sse_movlps( func, make_xmm( 1 ), x86_make_disp( aos_input, 0 ) ); +      sse_movlps( func, make_xmm( 4 ), x86_make_disp( aos_input, 8 ) ); +      x86_add( func, aos_input, stride ); +      sse_movhps( func, make_xmm( 1 ), x86_make_disp( aos_input, 0 ) ); +      sse_movhps( func, make_xmm( 4 ), x86_make_disp( aos_input, 8 ) ); +      x86_pop( func, aos_input ); -   while( !tgsi_parse_end_of_tokens( &parse ) && ok ) { -      tgsi_parse_token( &parse ); +      sse_movaps( func, make_xmm( 2 ), make_xmm( 0 ) ); +      sse_movaps( func, make_xmm( 5 ), make_xmm( 3 ) ); +      sse_shufps( func, make_xmm( 0 ), make_xmm( 1 ), 0x88 ); +      sse_shufps( func, make_xmm( 2 ), make_xmm( 1 ), 0xdd ); +      sse_shufps( func, make_xmm( 3 ), make_xmm( 4 ), 0x88 ); +      sse_shufps( func, make_xmm( 5 ), make_xmm( 4 ), 0xdd ); -      switch( parse.FullToken.Token.Type ) { -      case TGSI_TOKEN_TYPE_DECLARATION: -         break; +      sse_movups( func, x86_make_disp( soa_input, 0 ), make_xmm( 0 ) ); +      sse_movups( func, x86_make_disp( soa_input, 16 ), make_xmm( 2 ) ); +      sse_movups( func, x86_make_disp( soa_input, 32 ), make_xmm( 3 ) ); +      sse_movups( func, x86_make_disp( soa_input, 48 ), make_xmm( 5 ) ); -      case TGSI_TOKEN_TYPE_INSTRUCTION: -         ok = emit_instruction( -	    func, -	    &parse.FullToken.FullInstruction ); +      /* Advance to next input */ +      x86_lea( func, aos_input, x86_make_disp(aos_input, 16) ); +      x86_lea( func, soa_input, x86_make_disp(soa_input, 64) ); +   } +   /* while --num_inputs */ +   x86_dec( func, num_inputs ); +   x86_jcc( func, cc_NE, inner_loop ); -	 if (!ok) { -	    debug_printf("failed to translate tgsi opcode %d to SSE\n",  -			 parse.FullToken.FullInstruction.Instruction.Opcode ); -	 } -         break; +   /* Restore EBX */ +   x86_pop( func, aos_input ); +} -      case TGSI_TOKEN_TYPE_IMMEDIATE: -         /* XXX implement this */ -	 ok = 0; -	 debug_printf("failed to emit immediate value to SSE\n"); -	 break; +static void soa_to_aos( struct x86_function *func, uint aos, uint soa, uint num, uint stride ) +{ +   struct x86_reg soa_output; +   struct x86_reg aos_output; +   struct x86_reg num_outputs; +   struct x86_reg temp; +   int inner_loop; -      default: -         assert( 0 ); -	 ok = 0; -	 break; -      } -   } +   soa_output = x86_make_reg( file_REG32, reg_AX ); +   aos_output = x86_make_reg( file_REG32, reg_BX ); +   num_outputs = x86_make_reg( file_REG32, reg_CX ); +   temp = x86_make_reg( file_REG32, reg_DX ); -   tgsi_parse_free( &parse ); +   /* Save EBX */ +   x86_push( func, aos_output ); -   DUMP_END(); +   x86_mov( func, soa_output, x86_fn_arg( func, soa ) ); +   x86_mov( func, aos_output, x86_fn_arg( func, aos ) ); +   x86_mov( func, num_outputs, x86_fn_arg( func, num ) ); -   return ok; +   /* do */ +   inner_loop = x86_get_label( func ); +   { +      sse_movups( func, make_xmm( 0 ), x86_make_disp( soa_output, 0 ) ); +      sse_movups( func, make_xmm( 1 ), x86_make_disp( soa_output, 16 ) ); +      sse_movups( func, make_xmm( 3 ), x86_make_disp( soa_output, 32 ) ); +      sse_movups( func, make_xmm( 4 ), x86_make_disp( soa_output, 48 ) ); + +      sse_movaps( func, make_xmm( 2 ), make_xmm( 0 ) ); +      sse_movaps( func, make_xmm( 5 ), make_xmm( 3 ) ); +      sse_unpcklps( func, make_xmm( 0 ), make_xmm( 1 ) ); +      sse_unpckhps( func, make_xmm( 2 ), make_xmm( 1 ) ); +      sse_unpcklps( func, make_xmm( 3 ), make_xmm( 4 ) ); +      sse_unpckhps( func, make_xmm( 5 ), make_xmm( 4 ) ); + +      x86_mov( func, temp, x86_fn_arg( func, stride ) ); +      x86_push( func, aos_output ); +      sse_movlps( func, x86_make_disp( aos_output, 0 ), make_xmm( 0 ) ); +      sse_movlps( func, x86_make_disp( aos_output, 8 ), make_xmm( 3 ) ); +      x86_add( func, aos_output, temp ); +      sse_movhps( func, x86_make_disp( aos_output, 0 ), make_xmm( 0 ) ); +      sse_movhps( func, x86_make_disp( aos_output, 8 ), make_xmm( 3 ) ); +      x86_add( func, aos_output, temp ); +      sse_movlps( func, x86_make_disp( aos_output, 0 ), make_xmm( 2 ) ); +      sse_movlps( func, x86_make_disp( aos_output, 8 ), make_xmm( 5 ) ); +      x86_add( func, aos_output, temp ); +      sse_movhps( func, x86_make_disp( aos_output, 0 ), make_xmm( 2 ) ); +      sse_movhps( func, x86_make_disp( aos_output, 8 ), make_xmm( 5 ) ); +      x86_pop( func, aos_output ); + +      /* Advance to next output */ +      x86_lea( func, aos_output, x86_make_disp(aos_output, 16) ); +      x86_lea( func, soa_output, x86_make_disp(soa_output, 64) ); +   } +   /* while --num_outputs */ +   x86_dec( func, num_outputs ); +   x86_jcc( func, cc_NE, inner_loop ); + +   /* Restore EBX */ +   x86_pop( func, aos_output );  }  /** - * Fragment shaders are responsible for interpolating shader inputs. Because on - * x86 we have only 4 GP registers, and here we have 5 shader arguments (input, - * output, const, temp and coef), the code is split into two phases -- - * DECLARATION and INSTRUCTION phase. - * GP register holding the output argument is aliased with the coeff argument, - * as outputs are not needed in the DECLARATION phase. + * Translate a TGSI vertex/fragment shader to SSE2 code. + * Slightly different things are done for vertex vs. fragment shaders. + * + * Note that fragment shaders are responsible for interpolating shader + * inputs. Because on x86 we have only 4 GP registers, and here we + * have 5 shader arguments (input, output, const, temp and coef), the + * code is split into two phases -- DECLARATION and INSTRUCTION phase. + * GP register holding the output argument is aliased with the coeff + * argument, as outputs are not needed in the DECLARATION phase. + * + * \param tokens  the TGSI input shader + * \param func  the output SSE code/function + * \param immediates  buffer to place immediates, later passed to SSE func + * \param return  1 for success, 0 if translation failed   */  unsigned -tgsi_emit_sse2_fs( -   struct tgsi_token *tokens, -   struct x86_function *func ) +tgsi_emit_sse2( +   const struct tgsi_token *tokens, +   struct x86_function *func, +   float (*immediates)[4], +   boolean do_swizzles )  {     struct tgsi_parse_context parse;     boolean instruction_phase = FALSE;     unsigned ok = 1; - -   DUMP_START(); +   uint num_immediates = 0;     func->csr = func->store; -   /* DECLARATION phase, do not load output argument. */ -   emit_mov( -      func, -      get_input_base(), -      get_argument( 0 ) ); -   emit_mov( -      func, -      get_const_base(), -      get_argument( 2 ) ); -   emit_mov( +   tgsi_parse_init( &parse, tokens ); + +   /* Can't just use EDI, EBX without save/restoring them: +    */ +   x86_push(        func, -      get_temp_base(), -      get_argument( 3 ) ); -   emit_mov( +      get_immediate_base() ); + +   x86_push(        func, -      get_coef_base(), -      get_argument( 4 ) ); +      get_temp_base() ); -   tgsi_parse_init( &parse, tokens ); + +   /* +    * Different function args for vertex/fragment shaders: +    */ +   if (parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_FRAGMENT) { +      /* DECLARATION phase, do not load output argument. */ +      x86_mov( +         func, +         get_input_base(), +         x86_fn_arg( func, 1 ) ); +      /* skipping outputs argument here */ +      x86_mov( +         func, +         get_const_base(), +         x86_fn_arg( func, 3 ) ); +      x86_mov( +         func, +         get_temp_base(), +         x86_fn_arg( func, 4 ) ); +      x86_mov( +         func, +         get_coef_base(), +         x86_fn_arg( func, 5 ) ); +      x86_mov( +         func, +         get_immediate_base(), +         x86_fn_arg( func, 6 ) ); +   } +   else { +      assert(parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_VERTEX); + +      if (do_swizzles) +         aos_to_soa( func,  +                     6,         /* aos_input */ +                     1,         /* machine->input */ +                     7,         /* num_inputs */ +                     8 );       /* input_stride */ + +      x86_mov( +         func, +         get_input_base(), +         x86_fn_arg( func, 1 ) ); +      x86_mov( +         func, +         get_output_base(), +         x86_fn_arg( func, 2 ) ); +      x86_mov( +         func, +         get_const_base(), +         x86_fn_arg( func, 3 ) ); +      x86_mov( +         func, +         get_temp_base(), +         x86_fn_arg( func, 4 ) ); +      x86_mov( +         func, +         get_immediate_base(), +         x86_fn_arg( func, 5 ) ); +   }     while( !tgsi_parse_end_of_tokens( &parse ) && ok ) {        tgsi_parse_token( &parse );        switch( parse.FullToken.Token.Type ) {        case TGSI_TOKEN_TYPE_DECLARATION: -         emit_declaration( -            func, -            &parse.FullToken.FullDeclaration ); +         if (parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_FRAGMENT) { +            emit_declaration( +               func, +               &parse.FullToken.FullDeclaration ); +         }           break;        case TGSI_TOKEN_TYPE_INSTRUCTION: -         if( !instruction_phase ) { -            /* INSTRUCTION phase, overwrite coeff with output. */ -            instruction_phase = TRUE; -            emit_mov( -               func, -               get_output_base(), -               get_argument( 1 ) ); +         if (parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_FRAGMENT) { +            if( !instruction_phase ) { +               /* INSTRUCTION phase, overwrite coeff with output. */ +               instruction_phase = TRUE; +               x86_mov( +                  func, +                  get_output_base(), +                  x86_fn_arg( func, 2 ) ); +            }           } +           ok = emit_instruction(              func,              &parse.FullToken.FullInstruction );  	 if (!ok) { -	    debug_printf("failed to translate tgsi opcode %d to SSE\n",  -			 parse.FullToken.FullInstruction.Instruction.Opcode ); +	    debug_printf("failed to translate tgsi opcode %d to SSE (%s)\n",  +			 parse.FullToken.FullInstruction.Instruction.Opcode, +                         parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_VERTEX ? +                         "vertex shader" : "fragment shader");  	 }           break;        case TGSI_TOKEN_TYPE_IMMEDIATE: -         /* XXX implement this */ -	 ok = 0; -	 debug_printf("failed to emit immediate value to SSE\n"); +         /* simply copy the immediate values into the next immediates[] slot */ +         { +            const uint size = parse.FullToken.FullImmediate.Immediate.Size - 1; +            uint i; +            assert(size <= 4); +            assert(num_immediates < TGSI_EXEC_NUM_IMMEDIATES); +            for( i = 0; i < size; i++ ) { +               immediates[num_immediates][i] = +		  parse.FullToken.FullImmediate.u.ImmediateFloat32[i].Float; +            } +#if 0 +            debug_printf("SSE FS immediate[%d] = %f %f %f %f\n", +                   num_immediates, +                   immediates[num_immediates][0], +                   immediates[num_immediates][1], +                   immediates[num_immediates][2], +                   immediates[num_immediates][3]); +#endif +            num_immediates++; +         }           break;        default: @@ -2387,11 +2268,30 @@ tgsi_emit_sse2_fs(        }     } -   tgsi_parse_free( &parse ); +   if (parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_VERTEX) { +      if (do_swizzles) +         soa_to_aos( func, 9, 2, 10, 11 ); +   } -   DUMP_END(); +   /* Can't just use EBX, EDI without save/restoring them: +    */ +   x86_pop( +      func, +      get_temp_base() ); + +   x86_pop( +      func, +      get_immediate_base() ); + +#ifdef WIN32 +   emit_retw( func, 16 ); +#else +   emit_ret( func ); +#endif + +   tgsi_parse_free( &parse );     return ok;  } -#endif /* i386 */ +#endif /* PIPE_ARCH_X86 */ diff --git a/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.h b/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.h index 63b8ef3911..e66d115283 100755 --- a/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.h +++ b/src/gallium/auxiliary/tgsi/exec/tgsi_sse2.h @@ -10,13 +10,10 @@ struct x86_function;  unsigned  tgsi_emit_sse2( -   struct tgsi_token *tokens, -   struct x86_function *function ); - -unsigned -tgsi_emit_sse2_fs( -   struct tgsi_token *tokens, -   struct x86_function *function ); +   const struct tgsi_token *tokens, +   struct x86_function *function, +   float (*immediates)[4], +   boolean do_swizzles );  #if defined __cplusplus  } diff --git a/src/gallium/auxiliary/tgsi/util/tgsi_dump.c b/src/gallium/auxiliary/tgsi/util/tgsi_dump.c index 7d292778ad..4c65ffd780 100644 --- a/src/gallium/auxiliary/tgsi/util/tgsi_dump.c +++ b/src/gallium/auxiliary/tgsi/util/tgsi_dump.c @@ -25,205 +25,36 @@   *    **************************************************************************/ -#include <stdio.h>  -  #include "pipe/p_debug.h"  #include "pipe/p_util.h"  #include "pipe/p_shader_tokens.h" +#include "util/u_string.h"  #include "tgsi_dump.h"  #include "tgsi_parse.h"  #include "tgsi_build.h" -struct gen_dump -{ -   unsigned tabs; -   void  (* write)( -               struct gen_dump   *dump, -               const void        *data, -               unsigned          size ); -}; - -struct text_dump -{ -   struct gen_dump   base; -   char              *text; -   unsigned          length; -   unsigned          capacity; -}; - -static void -_text_dump_write( -   struct gen_dump   *dump, -   const void        *data, -   unsigned          size ) -{ -   struct text_dump  *td = (struct text_dump *) dump; -   unsigned          new_length = td->length + size; - -   if( new_length >= td->capacity ) { -      unsigned new_capacity = td->capacity; - -      do { -         if( new_capacity == 0 ) { -            new_capacity = 256; -         } -         else { -            new_capacity *= 2; -         } -      } while( new_length >= new_capacity ); -      td->text = (char *) REALLOC( -         td->text, -         td->capacity, -         new_capacity ); -      td->capacity = new_capacity; -   } -   memcpy( -      &td->text[td->length], -      data, -      size ); -   td->length = new_length; -   td->text[td->length] = '\0'; -} - -struct file_dump -{ -   struct gen_dump   base; -   FILE              *file; -}; - -static void -_file_dump_write( -   struct gen_dump   *dump, -   const void        *data, -   unsigned          size ) -{ -   struct file_dump  *fd = (struct file_dump *) dump; - -#if 0 -   fwrite( data, 1, size, fd->file ); -#else -   { -      unsigned i; - -      for (i = 0; i < size; i++ ) { -         fprintf( fd->file, "%c", ((const char *) data)[i] ); -      } -   } -#endif -} - -static void -gen_dump_str( -   struct gen_dump   *dump, -   const char        *str ) -{ -   unsigned i; -   size_t   len = strlen( str ); - -   for (i = 0; i < len; i++) { -      dump->write( dump, &str[i], 1 ); -      if (str[i] == '\n') { -         unsigned i; - -         for (i = 0; i < dump->tabs; i++) { -            dump->write( dump, "    ", 4 ); -         } -      } -   } -} -  static void -gen_dump_chr( -   struct gen_dump   *dump, -   const char        chr ) -{ -   dump->write( dump, &chr, 1 ); -} - -static void -gen_dump_uix( -   struct gen_dump   *dump, -   const unsigned    ui ) -{ -   char  str[36]; - -   sprintf( str, "0x%x", ui ); -   gen_dump_str( dump, str ); -} - -static void -gen_dump_uid( -   struct gen_dump   *dump, -   const unsigned    ui ) -{ -   char  str[16]; - -   sprintf( str, "%u", ui ); -   gen_dump_str( dump, str ); -} - -static void -gen_dump_sid( -   struct gen_dump   *dump, -   const int         si ) -{ -   char  str[16]; - -   sprintf( str, "%d", si ); -   gen_dump_str( dump, str ); -} - -static void -gen_dump_flt( -   struct gen_dump   *dump, -   const float       flt ) -{ -   char  str[48]; - -   sprintf( str, "%10.4f", flt ); -   gen_dump_str( dump, str ); -} - -static void -gen_dump_enum( -   struct gen_dump   *dump, +dump_enum(     const unsigned    e,     const char        **enums,     const unsigned    enums_count )  {     if (e >= enums_count) { -      gen_dump_uid( dump, e ); +      debug_printf( "%u", e );     }     else { -      gen_dump_str( dump, enums[e] ); +      debug_printf( "%s", enums[e] );     }  } -static void -gen_dump_tab( -   struct gen_dump   *dump ) -{ -   ++dump->tabs; -} - -static void -gen_dump_untab( -   struct gen_dump   *dump ) -{ -   assert( dump->tabs > 0 ); - -   --dump->tabs; -} - -#define TXT(S)          gen_dump_str( dump, S ) -#define CHR(C)          gen_dump_chr( dump, C ) -#define UIX(I)          gen_dump_uix( dump, I ) -#define UID(I)          gen_dump_uid( dump, I ) -#define SID(I)          gen_dump_sid( dump, I ) -#define FLT(F)          gen_dump_flt( dump, F ) -#define TAB()           gen_dump_tab( dump ) -#define UNT()           gen_dump_untab( dump ) -#define ENM(E,ENUMS)    gen_dump_enum( dump, E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) ) +#define EOL()           debug_printf( "\n" ) +#define TXT(S)          debug_printf( "%s", S ) +#define CHR(C)          debug_printf( "%c", C ) +#define UIX(I)          debug_printf( "0x%x", I ) +#define UID(I)          debug_printf( "%u", I ) +#define SID(I)          debug_printf( "%d", I ) +#define FLT(F)          debug_printf( "%10.4f", F ) +#define ENM(E,ENUMS)    dump_enum( E, ENUMS, sizeof( ENUMS ) / sizeof( *ENUMS ) )  static const char *TGSI_PROCESSOR_TYPES[] =  { @@ -710,7 +541,6 @@ static const char *TGSI_MODULATES[] =  static void  dump_declaration_short( -   struct gen_dump               *dump,     struct tgsi_full_declaration  *decl )  {     TXT( "\nDCL " ); @@ -746,23 +576,24 @@ dump_declaration_short(        }     } -   if( decl->Declaration.Interpolate ) { +   if (decl->Declaration.Semantic) {        TXT( ", " ); -      ENM( decl->Interpolation.Interpolate, TGSI_INTERPOLATES_SHORT ); +      ENM( decl->Semantic.SemanticName, TGSI_SEMANTICS_SHORT ); +      if (decl->Semantic.SemanticIndex != 0) { +         CHR( '[' ); +         UID( decl->Semantic.SemanticIndex ); +         CHR( ']' ); +      }     } -   if( decl->Declaration.Semantic ) { +   if (decl->Declaration.Interpolate) {        TXT( ", " ); -      ENM( decl->Semantic.SemanticName, TGSI_SEMANTICS_SHORT ); -      CHR( '[' ); -      UID( decl->Semantic.SemanticIndex ); -      CHR( ']' ); +      ENM( decl->Interpolation.Interpolate, TGSI_INTERPOLATES_SHORT );     }  }  static void  dump_declaration_verbose( -   struct gen_dump               *dump,     struct tgsi_full_declaration  *decl,     unsigned                      ignored,     unsigned                      deflt, @@ -800,7 +631,7 @@ dump_declaration_verbose(        UIX( decl->Declaration.Padding );     } -   CHR( '\n' ); +   EOL();     switch( decl->Declaration.Declare ) {     case TGSI_DECLARE_RANGE:        TXT( "\nFirst: " ); @@ -819,7 +650,7 @@ dump_declaration_verbose(     }     if( decl->Declaration.Interpolate ) { -      CHR( '\n' ); +      EOL();        TXT( "\nInterpolate: " );        ENM( decl->Interpolation.Interpolate, TGSI_INTERPOLATES );        if( ignored ) { @@ -829,7 +660,7 @@ dump_declaration_verbose(     }     if( decl->Declaration.Semantic ) { -      CHR( '\n' ); +      EOL();        TXT( "\nSemanticName : " );        ENM( decl->Semantic.SemanticName, TGSI_SEMANTICS );        TXT( "\nSemanticIndex: " ); @@ -843,7 +674,6 @@ dump_declaration_verbose(  static void  dump_immediate_short( -   struct gen_dump            *dump,     struct tgsi_full_immediate *imm )  {     unsigned i; @@ -871,7 +701,6 @@ dump_immediate_short(  static void  dump_immediate_verbose( -   struct gen_dump            *dump,     struct tgsi_full_immediate *imm,     unsigned                   ignored )  { @@ -885,7 +714,7 @@ dump_immediate_verbose(     }     for( i = 0; i < imm->Immediate.Size - 1; i++ ) { -      CHR( '\n' ); +      EOL();        switch( imm->Immediate.DataType ) {        case TGSI_IMM_FLOAT32:           TXT( "\nFloat: " ); @@ -900,14 +729,13 @@ dump_immediate_verbose(  static void  dump_instruction_short( -   struct gen_dump               *dump,     struct tgsi_full_instruction  *inst,     unsigned                      instno )  {     unsigned i;     boolean  first_reg = TRUE; -   CHR( '\n' ); +   EOL();     UID( instno );     CHR( ':' );     ENM( inst->Instruction.Opcode, TGSI_OPCODES_SHORT ); @@ -939,6 +767,31 @@ dump_instruction_short(        SID( dst->DstRegister.Index );        CHR( ']' ); +      switch (dst->DstRegisterExtModulate.Modulate) { +      case TGSI_MODULATE_1X: +         break; +      case TGSI_MODULATE_2X: +         TXT( "_2X" ); +         break; +      case TGSI_MODULATE_4X: +         TXT( "_4X" ); +         break; +      case TGSI_MODULATE_8X: +         TXT( "_8X" ); +         break; +      case TGSI_MODULATE_HALF: +         TXT( "_D2" ); +         break; +      case TGSI_MODULATE_QUARTER: +         TXT( "_D4" ); +         break; +      case TGSI_MODULATE_EIGHTH: +         TXT( "_D8" ); +         break; +      default: +         assert( 0 ); +      } +        if( dst->DstRegister.WriteMask != TGSI_WRITEMASK_XYZW ) {           CHR( '.' );           if( dst->DstRegister.WriteMask & TGSI_WRITEMASK_X ) { @@ -966,18 +819,18 @@ dump_instruction_short(        }        CHR( ' ' ); -      if( src->SrcRegisterExtMod.Complement ) { -         TXT( "(1 - " ); -      } -      if( src->SrcRegisterExtMod.Negate  ) { -         CHR( '-' ); -      } -      if( src->SrcRegisterExtMod.Absolute ) { +      if (src->SrcRegisterExtMod.Negate) +         TXT( "-(" ); +      if (src->SrcRegisterExtMod.Absolute)           CHR( '|' ); -      } -      if( src->SrcRegister.Negate ) { +      if (src->SrcRegisterExtMod.Scale2X) +         TXT( "2*(" ); +      if (src->SrcRegisterExtMod.Bias) +         CHR( '(' ); +      if (src->SrcRegisterExtMod.Complement) +         TXT( "1-(" ); +      if (src->SrcRegister.Negate)           CHR( '-' ); -      }        ENM( src->SrcRegister.File, TGSI_FILES_SHORT ); @@ -985,35 +838,37 @@ dump_instruction_short(        SID( src->SrcRegister.Index );        CHR( ']' ); -      if (src->SrcRegister.Extended) { -         if (src->SrcRegisterExtSwz.ExtSwizzleX != TGSI_EXTSWIZZLE_X || -             src->SrcRegisterExtSwz.ExtSwizzleY != TGSI_EXTSWIZZLE_Y || -             src->SrcRegisterExtSwz.ExtSwizzleZ != TGSI_EXTSWIZZLE_Z || -             src->SrcRegisterExtSwz.ExtSwizzleW != TGSI_EXTSWIZZLE_W) { -            CHR( '.' ); -            ENM( src->SrcRegisterExtSwz.ExtSwizzleX, TGSI_EXTSWIZZLES_SHORT ); -            ENM( src->SrcRegisterExtSwz.ExtSwizzleY, TGSI_EXTSWIZZLES_SHORT ); -            ENM( src->SrcRegisterExtSwz.ExtSwizzleZ, TGSI_EXTSWIZZLES_SHORT ); -            ENM( src->SrcRegisterExtSwz.ExtSwizzleW, TGSI_EXTSWIZZLES_SHORT ); -         } -      } -      else if( src->SrcRegister.SwizzleX != TGSI_SWIZZLE_X || -               src->SrcRegister.SwizzleY != TGSI_SWIZZLE_Y || -               src->SrcRegister.SwizzleZ != TGSI_SWIZZLE_Z || -               src->SrcRegister.SwizzleW != TGSI_SWIZZLE_W ) { +      if (src->SrcRegister.SwizzleX != TGSI_SWIZZLE_X || +          src->SrcRegister.SwizzleY != TGSI_SWIZZLE_Y || +          src->SrcRegister.SwizzleZ != TGSI_SWIZZLE_Z || +          src->SrcRegister.SwizzleW != TGSI_SWIZZLE_W) {           CHR( '.' );           ENM( src->SrcRegister.SwizzleX, TGSI_SWIZZLES_SHORT );           ENM( src->SrcRegister.SwizzleY, TGSI_SWIZZLES_SHORT );           ENM( src->SrcRegister.SwizzleZ, TGSI_SWIZZLES_SHORT );           ENM( src->SrcRegister.SwizzleW, TGSI_SWIZZLES_SHORT );        } +      if (src->SrcRegisterExtSwz.ExtSwizzleX != TGSI_EXTSWIZZLE_X || +          src->SrcRegisterExtSwz.ExtSwizzleY != TGSI_EXTSWIZZLE_Y || +          src->SrcRegisterExtSwz.ExtSwizzleZ != TGSI_EXTSWIZZLE_Z || +          src->SrcRegisterExtSwz.ExtSwizzleW != TGSI_EXTSWIZZLE_W) { +         CHR( '.' ); +         ENM( src->SrcRegisterExtSwz.ExtSwizzleX, TGSI_EXTSWIZZLES_SHORT ); +         ENM( src->SrcRegisterExtSwz.ExtSwizzleY, TGSI_EXTSWIZZLES_SHORT ); +         ENM( src->SrcRegisterExtSwz.ExtSwizzleZ, TGSI_EXTSWIZZLES_SHORT ); +         ENM( src->SrcRegisterExtSwz.ExtSwizzleW, TGSI_EXTSWIZZLES_SHORT ); +      } -      if( src->SrcRegisterExtMod.Absolute ) { +      if (src->SrcRegisterExtMod.Complement) +         CHR( ')' ); +      if (src->SrcRegisterExtMod.Bias) +         TXT( ")-.5" ); +      if (src->SrcRegisterExtMod.Scale2X) +         CHR( ')' ); +      if (src->SrcRegisterExtMod.Absolute)           CHR( '|' ); -      } -      if( src->SrcRegisterExtMod.Complement ) { +      if (src->SrcRegisterExtMod.Negate)           CHR( ')' ); -      }        first_reg = FALSE;     } @@ -1037,7 +892,6 @@ dump_instruction_short(  static void  dump_instruction_verbose( -   struct gen_dump               *dump,     struct tgsi_full_instruction  *inst,     unsigned                      ignored,     unsigned                      deflt, @@ -1065,7 +919,7 @@ dump_instruction_verbose(     }     if( deflt || tgsi_compare_instruction_ext_nv( inst->InstructionExtNv, fi->InstructionExtNv ) ) { -      CHR( '\n' ); +      EOL();        TXT( "\nType          : " );        ENM( inst->InstructionExtNv.Type, TGSI_INSTRUCTION_EXTS );        if( deflt || fi->InstructionExtNv.Precision != inst->InstructionExtNv.Precision ) { @@ -1119,7 +973,7 @@ dump_instruction_verbose(     }     if( deflt || tgsi_compare_instruction_ext_label( inst->InstructionExtLabel, fi->InstructionExtLabel ) ) { -      CHR( '\n' ); +      EOL();        TXT( "\nType    : " );        ENM( inst->InstructionExtLabel.Type, TGSI_INSTRUCTION_EXTS );        if( deflt || fi->InstructionExtLabel.Label != inst->InstructionExtLabel.Label ) { @@ -1137,7 +991,7 @@ dump_instruction_verbose(     }     if( deflt || tgsi_compare_instruction_ext_texture( inst->InstructionExtTexture, fi->InstructionExtTexture ) ) { -      CHR( '\n' ); +      EOL();        TXT( "\nType    : " );        ENM( inst->InstructionExtTexture.Type, TGSI_INSTRUCTION_EXTS );        if( deflt || fi->InstructionExtTexture.Texture != inst->InstructionExtTexture.Texture ) { @@ -1158,7 +1012,7 @@ dump_instruction_verbose(        struct tgsi_full_dst_register *dst = &inst->FullDstRegisters[i];        struct tgsi_full_dst_register *fd = &fi->FullDstRegisters[i]; -      CHR( '\n' ); +      EOL();        TXT( "\nFile     : " );        ENM( dst->DstRegister.File, TGSI_FILES );        if( deflt || fd->DstRegister.WriteMask != dst->DstRegister.WriteMask ) { @@ -1189,7 +1043,7 @@ dump_instruction_verbose(        }        if( deflt || tgsi_compare_dst_register_ext_concode( dst->DstRegisterExtConcode, fd->DstRegisterExtConcode ) ) { -         CHR( '\n' ); +         EOL();           TXT( "\nType        : " );           ENM( dst->DstRegisterExtConcode.Type, TGSI_DST_REGISTER_EXTS );           if( deflt || fd->DstRegisterExtConcode.CondMask != dst->DstRegisterExtConcode.CondMask ) { @@ -1227,7 +1081,7 @@ dump_instruction_verbose(        }        if( deflt || tgsi_compare_dst_register_ext_modulate( dst->DstRegisterExtModulate, fd->DstRegisterExtModulate ) ) { -         CHR( '\n' ); +         EOL();           TXT( "\nType    : " );           ENM( dst->DstRegisterExtModulate.Type, TGSI_DST_REGISTER_EXTS );           if( deflt || fd->DstRegisterExtModulate.Modulate != dst->DstRegisterExtModulate.Modulate ) { @@ -1249,7 +1103,7 @@ dump_instruction_verbose(        struct tgsi_full_src_register *src = &inst->FullSrcRegisters[i];        struct tgsi_full_src_register *fs = &fi->FullSrcRegisters[i]; -      CHR( '\n' ); +      EOL();        TXT( "\nFile     : ");        ENM( src->SrcRegister.File, TGSI_FILES );        if( deflt || fs->SrcRegister.SwizzleX != src->SrcRegister.SwizzleX ) { @@ -1294,7 +1148,7 @@ dump_instruction_verbose(        }        if( deflt || tgsi_compare_src_register_ext_swz( src->SrcRegisterExtSwz, fs->SrcRegisterExtSwz ) ) { -         CHR( '\n' ); +         EOL();           TXT( "\nType       : " );           ENM( src->SrcRegisterExtSwz.Type, TGSI_SRC_REGISTER_EXTS );           if( deflt || fs->SrcRegisterExtSwz.ExtSwizzleX != src->SrcRegisterExtSwz.ExtSwizzleX ) { @@ -1340,7 +1194,7 @@ dump_instruction_verbose(        }        if( deflt || tgsi_compare_src_register_ext_mod( src->SrcRegisterExtMod, fs->SrcRegisterExtMod ) ) { -         CHR( '\n' ); +         EOL();           TXT( "\nType     : " );           ENM( src->SrcRegisterExtMod.Type, TGSI_SRC_REGISTER_EXTS );           if( deflt || fs->SrcRegisterExtMod.Complement != src->SrcRegisterExtMod.Complement ) { @@ -1375,9 +1229,8 @@ dump_instruction_verbose(     }  } -static void -dump_gen( -   struct gen_dump         *dump, +void +tgsi_dump(     const struct tgsi_token *tokens,     unsigned                flags )  { @@ -1389,18 +1242,17 @@ dump_gen(     unsigned deflt = !(flags & TGSI_DUMP_NO_DEFAULT);     unsigned instno = 0; -   dump->tabs = 0; - -   /* sanity check */ +   /* sanity checks */     assert(strcmp(TGSI_OPCODES[TGSI_OPCODE_CONT], "OPCODE_CONT") == 0); +   assert(strcmp(TGSI_OPCODES[TGSI_OPCODE_END], "OPCODE_END") == 0); +   assert(strcmp(TGSI_OPCODES_SHORT[TGSI_OPCODE_END], "END") == 0);     tgsi_parse_init( &parse, tokens );     TXT( "tgsi-dump begin -----------------" ); -   CHR( '\n' ); +   EOL();     ENM( parse.FullHeader.Processor.Processor, TGSI_PROCESSOR_TYPES_SHORT ); -   CHR( ' ' );     UID( parse.FullVersion.Version.MajorVersion );     CHR( '.' );     UID( parse.FullVersion.Version.MinorVersion ); @@ -1410,7 +1262,7 @@ dump_gen(        UID( parse.FullVersion.Version.MajorVersion );        TXT( "\nMinorVersion: " );        UID( parse.FullVersion.Version.MinorVersion ); -      CHR( '\n' ); +      EOL();        TXT( "\nHeaderSize: " );        UID( parse.FullHeader.Header.HeaderSize ); @@ -1418,7 +1270,7 @@ dump_gen(        UID( parse.FullHeader.Header.BodySize );        TXT( "\nProcessor : " );        ENM( parse.FullHeader.Processor.Processor, TGSI_PROCESSOR_TYPES ); -      CHR( '\n' ); +      EOL();     }     fi = tgsi_default_full_instruction(); @@ -1430,19 +1282,16 @@ dump_gen(        switch( parse.FullToken.Token.Type ) {        case TGSI_TOKEN_TYPE_DECLARATION:           dump_declaration_short( -            dump,              &parse.FullToken.FullDeclaration );           break;        case TGSI_TOKEN_TYPE_IMMEDIATE:           dump_immediate_short( -            dump,              &parse.FullToken.FullImmediate );           break;        case TGSI_TOKEN_TYPE_INSTRUCTION:           dump_instruction_short( -            dump,              &parse.FullToken.FullInstruction,              instno );           instno++; @@ -1467,7 +1316,6 @@ dump_gen(           switch( parse.FullToken.Token.Type ) {           case TGSI_TOKEN_TYPE_DECLARATION:              dump_declaration_verbose( -               dump,                 &parse.FullToken.FullDeclaration,                 ignored,                 deflt, @@ -1476,14 +1324,12 @@ dump_gen(           case TGSI_TOKEN_TYPE_IMMEDIATE:              dump_immediate_verbose( -               dump,                 &parse.FullToken.FullImmediate,                 ignored );              break;           case TGSI_TOKEN_TYPE_INSTRUCTION:              dump_instruction_verbose( -               dump,                 &parse.FullToken.FullInstruction,                 ignored,                 deflt, @@ -1494,7 +1340,7 @@ dump_gen(              assert( 0 );           } -         CHR( '\n' ); +         EOL();        }     } @@ -1502,86 +1348,3 @@ dump_gen(     tgsi_parse_free( &parse );  } - - -static void -sanity_checks(void) -{ -   assert(strcmp(TGSI_OPCODES[TGSI_OPCODE_END], "OPCODE_END") == 0); -   assert(strcmp(TGSI_OPCODES_SHORT[TGSI_OPCODE_END], "END") == 0); -} - - -void -tgsi_dump( -   const struct tgsi_token *tokens, -   unsigned                flags ) -{ -   struct file_dump  dump; - -   sanity_checks(); - -   dump.base.write = _file_dump_write; -#if 0 -   { -      static unsigned   counter = 0; -      char              buffer[64]; -      sprintf( buffer, "tgsi-dump-%.4u.txt", counter++ ); -      dump.file = fopen( buffer, "wt" ); -   } -#else -   dump.file = stderr; -#endif - -   dump_gen( -      &dump.base, -      tokens, -      flags ); - -#if 0 -   fclose( dump.file ); -#endif -} - -void -tgsi_dump_str( -   char                    **str, -   const struct tgsi_token *tokens, -   unsigned                flags ) -{ -   struct text_dump  dump; - -   dump.base.write = _text_dump_write; -   dump.text = NULL; -   dump.length = 0; -   dump.capacity = 0; - -   dump_gen( -      &dump.base, -      tokens, -      flags ); - -   *str = dump.text; -} - - -void tgsi_debug_dump( struct tgsi_token *tokens ) -{ -   char *str, *p; - -   tgsi_dump_str( &str, tokens, 0 ); - -   p = str; -   while (p != NULL) -   { -      char *end = strchr( p, '\n' ); -      if (end != NULL) -      { -         *end++ = '\0'; -      } -      debug_printf( "%s\n", p ); -      p = end; -   } - -   FREE( str ); -} diff --git a/src/gallium/auxiliary/tgsi/util/tgsi_dump.h b/src/gallium/auxiliary/tgsi/util/tgsi_dump.h index 51d79a0362..beb0155d56 100644 --- a/src/gallium/auxiliary/tgsi/util/tgsi_dump.h +++ b/src/gallium/auxiliary/tgsi/util/tgsi_dump.h @@ -14,16 +14,6 @@ tgsi_dump(     const struct tgsi_token *tokens,     unsigned                flags ); -void -tgsi_dump_str( -   char                    **str, -   const struct tgsi_token *tokens, -   unsigned                flags ); - -/* Dump to debug_printf() - */ -void tgsi_debug_dump( struct tgsi_token *tokens ); -  #if defined __cplusplus  }  #endif diff --git a/src/gallium/auxiliary/tgsi/util/tgsi_parse.c b/src/gallium/auxiliary/tgsi/util/tgsi_parse.c index c3526cb71f..5c0b0bfd61 100644 --- a/src/gallium/auxiliary/tgsi/util/tgsi_parse.c +++ b/src/gallium/auxiliary/tgsi/util/tgsi_parse.c @@ -43,7 +43,7 @@ tgsi_full_token_free(     union tgsi_full_token *full_token )  {     if( full_token->Token.Type == TGSI_TOKEN_TYPE_IMMEDIATE ) { -      FREE( full_token->FullImmediate.u.Pointer ); +      FREE( (void *) full_token->FullImmediate.u.Pointer );     }  } @@ -156,7 +156,7 @@ tgsi_parse_token(           imm->u.Pointer = MALLOC(              sizeof( struct tgsi_immediate_float32 ) * (imm->Immediate.Size - 1) );           for( i = 0; i < imm->Immediate.Size - 1; i++ ) { -            next_token( ctx, &imm->u.ImmediateFloat32[i] ); +            next_token( ctx, (struct tgsi_immediate_float32 *) &imm->u.ImmediateFloat32[i] );           }           break; @@ -330,3 +330,18 @@ tgsi_num_tokens(const struct tgsi_token *tokens)     }     return 0;  } + + +/** + * Make a new copy of a token array. + */ +struct tgsi_token * +tgsi_dup_tokens(const struct tgsi_token *tokens) +{ +   unsigned n = tgsi_num_tokens(tokens); +   unsigned bytes = n * sizeof(struct tgsi_token); +   struct tgsi_token *new_tokens = (struct tgsi_token *) MALLOC(bytes); +   if (new_tokens) +      memcpy(new_tokens, tokens, bytes); +   return new_tokens; +} diff --git a/src/gallium/auxiliary/tgsi/util/tgsi_parse.h b/src/gallium/auxiliary/tgsi/util/tgsi_parse.h index a98e88e343..4102101093 100644 --- a/src/gallium/auxiliary/tgsi/util/tgsi_parse.h +++ b/src/gallium/auxiliary/tgsi/util/tgsi_parse.h @@ -1,6 +1,35 @@ -#if !defined TGSI_PARSE_H +/************************************************************************** + *  + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + *  + **************************************************************************/ + +#ifndef TGSI_PARSE_H  #define TGSI_PARSE_H +#include "pipe/p_shader_tokens.h" +  #if defined __cplusplus  extern "C" {  #endif @@ -50,8 +79,8 @@ struct tgsi_full_immediate     struct tgsi_immediate   Immediate;     union     { -      void                          *Pointer; -      struct tgsi_immediate_float32 *ImmediateFloat32; +      const void                          *Pointer; +      const struct tgsi_immediate_float32 *ImmediateFloat32;     } u;  }; @@ -116,6 +145,8 @@ tgsi_parse_token(  unsigned  tgsi_num_tokens(const struct tgsi_token *tokens); +struct tgsi_token * +tgsi_dup_tokens(const struct tgsi_token *tokens);  #if defined __cplusplus  } diff --git a/src/gallium/auxiliary/tgsi/util/tgsi_scan.c b/src/gallium/auxiliary/tgsi/util/tgsi_scan.c index ea4a72967d..65650ed22a 100644 --- a/src/gallium/auxiliary/tgsi/util/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/util/tgsi_scan.c @@ -103,18 +103,14 @@ tgsi_scan_shader(const struct tgsi_token *tokens,                 info->file_max[file] = MAX2(info->file_max[file], (int)i);                 if (file == TGSI_FILE_INPUT) { -                  info->input_semantic_name[info->num_inputs] -                     = (ubyte)fulldecl->Semantic.SemanticName; -                  info->input_semantic_index[info->num_inputs] -                     = (ubyte)fulldecl->Semantic.SemanticIndex; +                  info->input_semantic_name[i] = (ubyte)fulldecl->Semantic.SemanticName; +                  info->input_semantic_index[i] = (ubyte)fulldecl->Semantic.SemanticIndex;                    info->num_inputs++;                 }                 if (file == TGSI_FILE_OUTPUT) { -                  info->output_semantic_name[info->num_outputs] -                     = (ubyte)fulldecl->Semantic.SemanticName; -                  info->output_semantic_index[info->num_outputs] -                     = (ubyte)fulldecl->Semantic.SemanticIndex; +                  info->output_semantic_name[i] = (ubyte)fulldecl->Semantic.SemanticName; +                  info->output_semantic_index[i] = (ubyte)fulldecl->Semantic.SemanticIndex;                    info->num_outputs++;                 } @@ -137,6 +133,9 @@ tgsi_scan_shader(const struct tgsi_token *tokens,        }     } +   assert( info->file_max[TGSI_FILE_INPUT] + 1 == info->num_inputs ); +   assert( info->file_max[TGSI_FILE_OUTPUT] + 1 == info->num_outputs ); +     info->uses_kill = (info->opcode_count[TGSI_OPCODE_KIL] ||                        info->opcode_count[TGSI_OPCODE_KILP]); diff --git a/src/gallium/auxiliary/translate/Makefile b/src/gallium/auxiliary/translate/Makefile new file mode 100644 index 0000000000..ad2a5b705e --- /dev/null +++ b/src/gallium/auxiliary/translate/Makefile @@ -0,0 +1,15 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +LIBNAME = translate + +C_SOURCES = \ +	translate_generic.c \ +	translate_sse.c \ +	translate.c \ +        translate_cache.c + +include ../../Makefile.template + +symlinks: + diff --git a/src/gallium/auxiliary/translate/SConscript b/src/gallium/auxiliary/translate/SConscript new file mode 100644 index 0000000000..9553a67537 --- /dev/null +++ b/src/gallium/auxiliary/translate/SConscript @@ -0,0 +1,12 @@ +Import('*') + +translate = env.ConvenienceLibrary( +	target = 'translate', +	source = [ +		'translate_generic.c', +		'translate_sse.c', +		'translate.c', +		'translate_cache.c', +	]) + +auxiliaries.insert(0, translate) diff --git a/src/mesa/state_tracker/st_texobj.h b/src/gallium/auxiliary/translate/translate.c index 3c66031018..b04bc6eefd 100644 --- a/src/mesa/state_tracker/st_texobj.h +++ b/src/gallium/auxiliary/translate/translate.c @@ -25,17 +25,24 @@   *    **************************************************************************/ -/* - * Authors: - *   Brian Paul - */ + /* +  * Authors: +  *   Keith Whitwell <keith@tungstengraphics.com> +  */ -#ifndef ST_TEXOBJ_H -#define ST_TEXOBJ_H 1 +#include "pipe/p_util.h" +#include "pipe/p_state.h" +#include "translate.h" +struct translate *translate_create( const struct translate_key *key ) +{ +   struct translate *translate = NULL; -extern struct pipe_texture_object * -create_texture_object(struct gl_texture_object *texObj); +#if defined(__i386__) || defined(__386__) || defined(i386) +   translate = translate_sse2_create( key ); +   if (translate) +      return translate; +#endif - -#endif /* ST_TEXOBJ_H */ +   return translate_generic_create( key ); +} diff --git a/src/gallium/auxiliary/translate/translate.h b/src/gallium/auxiliary/translate/translate.h new file mode 100644 index 0000000000..b8210af50c --- /dev/null +++ b/src/gallium/auxiliary/translate/translate.h @@ -0,0 +1,127 @@ +/* + * Copyright 2008 Tungsten Graphics, 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 + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL + * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/** + * Vertex fetch/store/convert code.  This functionality is used in two places: + * 1. Vertex fetch/convert - to grab vertex data from incoming vertex + *    arrays and convert to format needed by vertex shaders. + * 2. Vertex store/emit - to convert simple float[][4] vertex attributes + *    (which is the organization used throughout the draw/prim pipeline) to + *    hardware-specific formats and emit into hardware vertex buffers. + * + * + * Authors: + *    Keith Whitwell <keithw@tungstengraphics.com> + */ + +#ifndef _TRANSLATE_H +#define _TRANSLATE_H + + +#include "pipe/p_compiler.h" +#include "pipe/p_format.h" +#include "pipe/p_state.h" + +struct translate_element  +{ +   enum pipe_format input_format; +   enum pipe_format output_format; +   unsigned input_buffer; +   unsigned input_offset;       /* can't really reduce the size of these */ +   unsigned output_offset; +}; + + +struct translate_key { +   unsigned output_stride; +   unsigned nr_elements; +   struct translate_element element[PIPE_MAX_ATTRIBS]; +}; + + +struct translate { +   struct translate_key key; + +   void (*release)( struct translate * ); + +   void (*set_buffer)( struct translate *, +		       unsigned i, +		       const void *ptr, +		       unsigned stride ); + +   void (*run_elts)( struct translate *, +		     const unsigned *elts, +		     unsigned count, +		     void *output_buffer); + +   void (*run)( struct translate *, +		unsigned start, +		unsigned count, +		void *output_buffer); +}; + + + +#if 0 +struct translate_context *translate_context_create( void ); +void translate_context_destroy( struct translate_context * ); + +struct translate *translate_lookup_or_create( struct translate_context *tctx, +					      const struct translate_key *key ); +#endif + + +struct translate *translate_create( const struct translate_key *key ); + +static INLINE int translate_keysize( const struct translate_key *key ) +{ +   return 2 * sizeof(int) + key->nr_elements * sizeof(struct translate_element); +} + +static INLINE int translate_key_compare( const struct translate_key *a, +                                         const struct translate_key *b ) +{ +   int keysize = translate_keysize(a); +   return memcmp(a, b, keysize); +} + + +static INLINE void translate_key_sanitize( struct translate_key *a ) +{ +   int keysize = translate_keysize(a); +   char *ptr = (char *)a; +   memset(ptr + keysize, 0, sizeof(*a) - keysize); +} + + +/******************************************************************************* + *  Private: + */ +struct translate *translate_sse2_create( const struct translate_key *key ); + +struct translate *translate_generic_create( const struct translate_key *key ); + + +#endif diff --git a/src/gallium/auxiliary/translate/translate_cache.c b/src/gallium/auxiliary/translate/translate_cache.c new file mode 100644 index 0000000000..115dc9287e --- /dev/null +++ b/src/gallium/auxiliary/translate/translate_cache.c @@ -0,0 +1,102 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +#include "pipe/p_util.h" +#include "pipe/p_state.h" +#include "translate.h" +#include "translate_cache.h" + +#include "cso_cache/cso_cache.h" +#include "cso_cache/cso_hash.h" + +struct translate_cache { +   struct cso_hash *hash; +}; + +struct translate_cache * translate_cache_create( void ) +{ +   struct translate_cache *cache = MALLOC_STRUCT(translate_cache); +   cache->hash = cso_hash_create(); +   return cache; +} + + +static INLINE void delete_translates(struct translate_cache *cache) +{ +   struct cso_hash *hash = cache->hash; +   struct cso_hash_iter iter = cso_hash_first_node(hash); +   while (!cso_hash_iter_is_null(iter)) { +      struct translate *state = (struct translate*)cso_hash_iter_data(iter); +      iter = cso_hash_iter_next(iter); +      if (state) { +         state->release(state); +      } +   } +} + +void translate_cache_destroy(struct translate_cache *cache) +{ +   delete_translates(cache); +   cso_hash_delete(cache->hash); +   FREE(cache); +} + + +static INLINE unsigned translate_hash_key_size(struct translate_key *key) +{ +   unsigned size = sizeof(struct translate_key) - +                   sizeof(struct translate_element) * (PIPE_MAX_ATTRIBS - key->nr_elements); +   return size; +} + +static INLINE unsigned create_key(struct translate_key *key) +{ +   unsigned hash_key; +   unsigned size = translate_hash_key_size(key); +   /*debug_printf("key size = %d, (els = %d)\n", +     size, key->nr_elements);*/ +   hash_key = cso_construct_key(key, size); +   return hash_key; +} + +struct translate * translate_cache_find(struct translate_cache *cache, +                                        struct translate_key *key) +{ +   unsigned hash_key = create_key(key); +   struct translate *translate = (struct translate*) +      cso_hash_find_data_from_template(cache->hash, +                                       hash_key, +                                       key, sizeof(*key)); + +   if (!translate) { +      /* create/insert */ +      translate = translate_create(key); +      cso_hash_insert(cache->hash, hash_key, translate); +   } + +   return translate; +} diff --git a/src/gallium/auxiliary/translate/translate_cache.h b/src/gallium/auxiliary/translate/translate_cache.h new file mode 100644 index 0000000000..7dba871e57 --- /dev/null +++ b/src/gallium/auxiliary/translate/translate_cache.h @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Tungsten Graphics, 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 + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL + * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef _TRANSLATE_CACHE_H +#define _TRANSLATE_CACHE_H + + +/******************************************************************************* + * Translate cache. + * Simply used to cache created translates. Avoids unecessary creation of + * translate's if one suitable for a given translate_key has already been + * created. + * + * Note: this functionality depends and requires the CSO module. + */ +struct translate_cache; + +struct translate_key; +struct translate; + +struct translate_cache *translate_cache_create( void ); +void translate_cache_destroy(struct translate_cache *cache); + +/** + * Will try to find a translate structure matched by the given key. + * If such a structure doesn't exist in the cache the function + * will automatically create it, insert it in the cache and + * return the created version. + * + */ +struct translate *translate_cache_find(struct translate_cache *cache, +                                       struct translate_key *key); + +#endif diff --git a/src/gallium/auxiliary/translate/translate_generic.c b/src/gallium/auxiliary/translate/translate_generic.c new file mode 100644 index 0000000000..402780ee53 --- /dev/null +++ b/src/gallium/auxiliary/translate/translate_generic.c @@ -0,0 +1,676 @@ +/************************************************************************** + *  + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: +  *   Keith Whitwell <keith@tungstengraphics.com> +  */ + +#include "pipe/p_util.h" +#include "pipe/p_state.h" +#include "translate.h" + + +#define DRAW_DBG 0 + +typedef void (*fetch_func)(const void *ptr, float *attrib); +typedef void (*emit_func)(const float *attrib, void *ptr); + + + +struct translate_generic { +   struct translate translate; + +   struct { +      fetch_func fetch; +      unsigned buffer; +      unsigned input_offset; + +      emit_func emit; +      unsigned output_offset; +       +      char *input_ptr; +      unsigned input_stride; + +   } attrib[PIPE_MAX_ATTRIBS]; + +   unsigned nr_attrib; +}; + + +static struct translate_generic *translate_generic( struct translate *translate ) +{ +   return (struct translate_generic *)translate; +} + +/** + * Fetch a float[4] vertex attribute from memory, doing format/type + * conversion as needed. + * + * This is probably needed/dupliocated elsewhere, eg format + * conversion, texture sampling etc. + */ +#define ATTRIB( NAME, SZ, TYPE, FROM, TO )		\ +static void						\ +fetch_##NAME(const void *ptr, float *attrib)		\ +{							\ +   const float defaults[4] = { 0.0f,0.0f,0.0f,1.0f };	\ +   unsigned i;						\ +							\ +   for (i = 0; i < SZ; i++) {				\ +      attrib[i] = FROM(i);				\ +   }							\ +							\ +   for (; i < 4; i++) {					\ +      attrib[i] = defaults[i];				\ +   }							\ +}							\ +							\ +static void						\ +emit_##NAME(const float *attrib, void *ptr)		\ +{  \ +   unsigned i;						\ +   TYPE *out = (TYPE *)ptr;				\ +							\ +   for (i = 0; i < SZ; i++) {				\ +      out[i] = TO(attrib[i]);				\ +   }							\ +} + + +#define FROM_64_FLOAT(i)   ((float) ((double *) ptr)[i]) +#define FROM_32_FLOAT(i)   (((float *) ptr)[i]) + +#define FROM_8_USCALED(i)  ((float) ((unsigned char *) ptr)[i]) +#define FROM_16_USCALED(i) ((float) ((unsigned short *) ptr)[i]) +#define FROM_32_USCALED(i) ((float) ((unsigned int *) ptr)[i]) + +#define FROM_8_SSCALED(i)  ((float) ((char *) ptr)[i]) +#define FROM_16_SSCALED(i) ((float) ((short *) ptr)[i]) +#define FROM_32_SSCALED(i) ((float) ((int *) ptr)[i]) + +#define FROM_8_UNORM(i)    ((float) ((unsigned char *) ptr)[i] / 255.0f) +#define FROM_16_UNORM(i)   ((float) ((unsigned short *) ptr)[i] / 65535.0f) +#define FROM_32_UNORM(i)   ((float) ((unsigned int *) ptr)[i] / 4294967295.0f) + +#define FROM_8_SNORM(i)    ((float) ((char *) ptr)[i] / 127.0f) +#define FROM_16_SNORM(i)   ((float) ((short *) ptr)[i] / 32767.0f) +#define FROM_32_SNORM(i)   ((float) ((int *) ptr)[i] / 2147483647.0f) + +#define TO_64_FLOAT(x)   ((double) x) +#define TO_32_FLOAT(x)   (x) + +#define TO_8_USCALED(x)  ((unsigned char) x) +#define TO_16_USCALED(x) ((unsigned short) x) +#define TO_32_USCALED(x) ((unsigned int) x) + +#define TO_8_SSCALED(x)  ((char) x) +#define TO_16_SSCALED(x) ((short) x) +#define TO_32_SSCALED(x) ((int) x) + +#define TO_8_UNORM(x)    ((unsigned char) (x * 255.0f)) +#define TO_16_UNORM(x)   ((unsigned short) (x * 65535.0f)) +#define TO_32_UNORM(x)   ((unsigned int) (x * 4294967295.0f)) + +#define TO_8_SNORM(x)    ((char) (x * 127.0f)) +#define TO_16_SNORM(x)   ((short) (x * 32767.0f)) +#define TO_32_SNORM(x)   ((int) (x * 2147483647.0f)) + + + +ATTRIB( R64G64B64A64_FLOAT,   4, double, FROM_64_FLOAT, TO_64_FLOAT ) +ATTRIB( R64G64B64_FLOAT,      3, double, FROM_64_FLOAT, TO_64_FLOAT ) +ATTRIB( R64G64_FLOAT,         2, double, FROM_64_FLOAT, TO_64_FLOAT ) +ATTRIB( R64_FLOAT,            1, double, FROM_64_FLOAT, TO_64_FLOAT ) + +ATTRIB( R32G32B32A32_FLOAT,   4, float, FROM_32_FLOAT, TO_32_FLOAT ) +ATTRIB( R32G32B32_FLOAT,      3, float, FROM_32_FLOAT, TO_32_FLOAT ) +ATTRIB( R32G32_FLOAT,         2, float, FROM_32_FLOAT, TO_32_FLOAT ) +ATTRIB( R32_FLOAT,            1, float, FROM_32_FLOAT, TO_32_FLOAT ) + +ATTRIB( R32G32B32A32_USCALED, 4, unsigned, FROM_32_USCALED, TO_32_USCALED ) +ATTRIB( R32G32B32_USCALED,    3, unsigned, FROM_32_USCALED, TO_32_USCALED ) +ATTRIB( R32G32_USCALED,       2, unsigned, FROM_32_USCALED, TO_32_USCALED ) +ATTRIB( R32_USCALED,          1, unsigned, FROM_32_USCALED, TO_32_USCALED ) + +ATTRIB( R32G32B32A32_SSCALED, 4, int, FROM_32_SSCALED, TO_32_SSCALED ) +ATTRIB( R32G32B32_SSCALED,    3, int, FROM_32_SSCALED, TO_32_SSCALED ) +ATTRIB( R32G32_SSCALED,       2, int, FROM_32_SSCALED, TO_32_SSCALED ) +ATTRIB( R32_SSCALED,          1, int, FROM_32_SSCALED, TO_32_SSCALED ) + +ATTRIB( R32G32B32A32_UNORM, 4, unsigned, FROM_32_UNORM, TO_32_UNORM ) +ATTRIB( R32G32B32_UNORM,    3, unsigned, FROM_32_UNORM, TO_32_UNORM ) +ATTRIB( R32G32_UNORM,       2, unsigned, FROM_32_UNORM, TO_32_UNORM ) +ATTRIB( R32_UNORM,          1, unsigned, FROM_32_UNORM, TO_32_UNORM ) + +ATTRIB( R32G32B32A32_SNORM, 4, int, FROM_32_SNORM, TO_32_SNORM ) +ATTRIB( R32G32B32_SNORM,    3, int, FROM_32_SNORM, TO_32_SNORM ) +ATTRIB( R32G32_SNORM,       2, int, FROM_32_SNORM, TO_32_SNORM ) +ATTRIB( R32_SNORM,          1, int, FROM_32_SNORM, TO_32_SNORM ) + +ATTRIB( R16G16B16A16_USCALED, 4, ushort, FROM_16_USCALED, TO_16_USCALED ) +ATTRIB( R16G16B16_USCALED,    3, ushort, FROM_16_USCALED, TO_16_USCALED ) +ATTRIB( R16G16_USCALED,       2, ushort, FROM_16_USCALED, TO_16_USCALED ) +ATTRIB( R16_USCALED,          1, ushort, FROM_16_USCALED, TO_16_USCALED ) + +ATTRIB( R16G16B16A16_SSCALED, 4, short, FROM_16_SSCALED, TO_16_SSCALED ) +ATTRIB( R16G16B16_SSCALED,    3, short, FROM_16_SSCALED, TO_16_SSCALED ) +ATTRIB( R16G16_SSCALED,       2, short, FROM_16_SSCALED, TO_16_SSCALED ) +ATTRIB( R16_SSCALED,          1, short, FROM_16_SSCALED, TO_16_SSCALED ) + +ATTRIB( R16G16B16A16_UNORM, 4, ushort, FROM_16_UNORM, TO_16_UNORM ) +ATTRIB( R16G16B16_UNORM,    3, ushort, FROM_16_UNORM, TO_16_UNORM ) +ATTRIB( R16G16_UNORM,       2, ushort, FROM_16_UNORM, TO_16_UNORM ) +ATTRIB( R16_UNORM,          1, ushort, FROM_16_UNORM, TO_16_UNORM ) + +ATTRIB( R16G16B16A16_SNORM, 4, short, FROM_16_SNORM, TO_16_SNORM ) +ATTRIB( R16G16B16_SNORM,    3, short, FROM_16_SNORM, TO_16_SNORM ) +ATTRIB( R16G16_SNORM,       2, short, FROM_16_SNORM, TO_16_SNORM ) +ATTRIB( R16_SNORM,          1, short, FROM_16_SNORM, TO_16_SNORM ) + +ATTRIB( R8G8B8A8_USCALED,   4, ubyte, FROM_8_USCALED, TO_8_USCALED ) +ATTRIB( R8G8B8_USCALED,     3, ubyte, FROM_8_USCALED, TO_8_USCALED ) +ATTRIB( R8G8_USCALED,       2, ubyte, FROM_8_USCALED, TO_8_USCALED ) +ATTRIB( R8_USCALED,         1, ubyte, FROM_8_USCALED, TO_8_USCALED ) + +ATTRIB( R8G8B8A8_SSCALED,  4, char, FROM_8_SSCALED, TO_8_SSCALED ) +ATTRIB( R8G8B8_SSCALED,    3, char, FROM_8_SSCALED, TO_8_SSCALED ) +ATTRIB( R8G8_SSCALED,      2, char, FROM_8_SSCALED, TO_8_SSCALED ) +ATTRIB( R8_SSCALED,        1, char, FROM_8_SSCALED, TO_8_SSCALED ) + +ATTRIB( R8G8B8A8_UNORM,  4, ubyte, FROM_8_UNORM, TO_8_UNORM ) +ATTRIB( R8G8B8_UNORM,    3, ubyte, FROM_8_UNORM, TO_8_UNORM ) +ATTRIB( R8G8_UNORM,      2, ubyte, FROM_8_UNORM, TO_8_UNORM ) +ATTRIB( R8_UNORM,        1, ubyte, FROM_8_UNORM, TO_8_UNORM ) + +ATTRIB( R8G8B8A8_SNORM,  4, char, FROM_8_SNORM, TO_8_SNORM ) +ATTRIB( R8G8B8_SNORM,    3, char, FROM_8_SNORM, TO_8_SNORM ) +ATTRIB( R8G8_SNORM,      2, char, FROM_8_SNORM, TO_8_SNORM ) +ATTRIB( R8_SNORM,        1, char, FROM_8_SNORM, TO_8_SNORM ) + +ATTRIB( A8R8G8B8_UNORM,       4, ubyte, FROM_8_UNORM, TO_8_UNORM ) +//ATTRIB( R8G8B8A8_UNORM,       4, ubyte, FROM_8_UNORM, TO_8_UNORM ) + + + +static void +fetch_B8G8R8A8_UNORM(const void *ptr, float *attrib) +{ +   attrib[2] = FROM_8_UNORM(0); +   attrib[1] = FROM_8_UNORM(1); +   attrib[0] = FROM_8_UNORM(2); +   attrib[3] = FROM_8_UNORM(3); +} + +static void +emit_B8G8R8A8_UNORM( const float *attrib, void *ptr) +{ +   ubyte *out = (ubyte *)ptr; +   out[2] = TO_8_UNORM(attrib[0]); +   out[1] = TO_8_UNORM(attrib[1]); +   out[0] = TO_8_UNORM(attrib[2]); +   out[3] = TO_8_UNORM(attrib[3]); +} + +static void  +fetch_NULL( const void *ptr, float *attrib ) +{ +   attrib[0] = 0; +   attrib[1] = 0; +   attrib[2] = 0; +   attrib[3] = 1; +} + +static void  +emit_NULL( const float *attrib, void *ptr ) +{ +   /* do nothing is the only sensible option */ +} + +static fetch_func get_fetch_func( enum pipe_format format ) +{ +   switch (format) { +   case PIPE_FORMAT_R64_FLOAT: +      return fetch_R64_FLOAT; +   case PIPE_FORMAT_R64G64_FLOAT: +      return fetch_R64G64_FLOAT; +   case PIPE_FORMAT_R64G64B64_FLOAT: +      return fetch_R64G64B64_FLOAT; +   case PIPE_FORMAT_R64G64B64A64_FLOAT: +      return fetch_R64G64B64A64_FLOAT; + +   case PIPE_FORMAT_R32_FLOAT: +      return fetch_R32_FLOAT; +   case PIPE_FORMAT_R32G32_FLOAT: +      return fetch_R32G32_FLOAT; +   case PIPE_FORMAT_R32G32B32_FLOAT: +      return fetch_R32G32B32_FLOAT; +   case PIPE_FORMAT_R32G32B32A32_FLOAT: +      return fetch_R32G32B32A32_FLOAT; + +   case PIPE_FORMAT_R32_UNORM: +      return fetch_R32_UNORM; +   case PIPE_FORMAT_R32G32_UNORM: +      return fetch_R32G32_UNORM; +   case PIPE_FORMAT_R32G32B32_UNORM: +      return fetch_R32G32B32_UNORM; +   case PIPE_FORMAT_R32G32B32A32_UNORM: +      return fetch_R32G32B32A32_UNORM; + +   case PIPE_FORMAT_R32_USCALED: +      return fetch_R32_USCALED; +   case PIPE_FORMAT_R32G32_USCALED: +      return fetch_R32G32_USCALED; +   case PIPE_FORMAT_R32G32B32_USCALED: +      return fetch_R32G32B32_USCALED; +   case PIPE_FORMAT_R32G32B32A32_USCALED: +      return fetch_R32G32B32A32_USCALED; + +   case PIPE_FORMAT_R32_SNORM: +      return fetch_R32_SNORM; +   case PIPE_FORMAT_R32G32_SNORM: +      return fetch_R32G32_SNORM; +   case PIPE_FORMAT_R32G32B32_SNORM: +      return fetch_R32G32B32_SNORM; +   case PIPE_FORMAT_R32G32B32A32_SNORM: +      return fetch_R32G32B32A32_SNORM; + +   case PIPE_FORMAT_R32_SSCALED: +      return fetch_R32_SSCALED; +   case PIPE_FORMAT_R32G32_SSCALED: +      return fetch_R32G32_SSCALED; +   case PIPE_FORMAT_R32G32B32_SSCALED: +      return fetch_R32G32B32_SSCALED; +   case PIPE_FORMAT_R32G32B32A32_SSCALED: +      return fetch_R32G32B32A32_SSCALED; + +   case PIPE_FORMAT_R16_UNORM: +      return fetch_R16_UNORM; +   case PIPE_FORMAT_R16G16_UNORM: +      return fetch_R16G16_UNORM; +   case PIPE_FORMAT_R16G16B16_UNORM: +      return fetch_R16G16B16_UNORM; +   case PIPE_FORMAT_R16G16B16A16_UNORM: +      return fetch_R16G16B16A16_UNORM; + +   case PIPE_FORMAT_R16_USCALED: +      return fetch_R16_USCALED; +   case PIPE_FORMAT_R16G16_USCALED: +      return fetch_R16G16_USCALED; +   case PIPE_FORMAT_R16G16B16_USCALED: +      return fetch_R16G16B16_USCALED; +   case PIPE_FORMAT_R16G16B16A16_USCALED: +      return fetch_R16G16B16A16_USCALED; + +   case PIPE_FORMAT_R16_SNORM: +      return fetch_R16_SNORM; +   case PIPE_FORMAT_R16G16_SNORM: +      return fetch_R16G16_SNORM; +   case PIPE_FORMAT_R16G16B16_SNORM: +      return fetch_R16G16B16_SNORM; +   case PIPE_FORMAT_R16G16B16A16_SNORM: +      return fetch_R16G16B16A16_SNORM; + +   case PIPE_FORMAT_R16_SSCALED: +      return fetch_R16_SSCALED; +   case PIPE_FORMAT_R16G16_SSCALED: +      return fetch_R16G16_SSCALED; +   case PIPE_FORMAT_R16G16B16_SSCALED: +      return fetch_R16G16B16_SSCALED; +   case PIPE_FORMAT_R16G16B16A16_SSCALED: +      return fetch_R16G16B16A16_SSCALED; + +   case PIPE_FORMAT_R8_UNORM: +      return fetch_R8_UNORM; +   case PIPE_FORMAT_R8G8_UNORM: +      return fetch_R8G8_UNORM; +   case PIPE_FORMAT_R8G8B8_UNORM: +      return fetch_R8G8B8_UNORM; +   case PIPE_FORMAT_R8G8B8A8_UNORM: +      return fetch_R8G8B8A8_UNORM; + +   case PIPE_FORMAT_R8_USCALED: +      return fetch_R8_USCALED; +   case PIPE_FORMAT_R8G8_USCALED: +      return fetch_R8G8_USCALED; +   case PIPE_FORMAT_R8G8B8_USCALED: +      return fetch_R8G8B8_USCALED; +   case PIPE_FORMAT_R8G8B8A8_USCALED: +      return fetch_R8G8B8A8_USCALED; + +   case PIPE_FORMAT_R8_SNORM: +      return fetch_R8_SNORM; +   case PIPE_FORMAT_R8G8_SNORM: +      return fetch_R8G8_SNORM; +   case PIPE_FORMAT_R8G8B8_SNORM: +      return fetch_R8G8B8_SNORM; +   case PIPE_FORMAT_R8G8B8A8_SNORM: +      return fetch_R8G8B8A8_SNORM; + +   case PIPE_FORMAT_R8_SSCALED: +      return fetch_R8_SSCALED; +   case PIPE_FORMAT_R8G8_SSCALED: +      return fetch_R8G8_SSCALED; +   case PIPE_FORMAT_R8G8B8_SSCALED: +      return fetch_R8G8B8_SSCALED; +   case PIPE_FORMAT_R8G8B8A8_SSCALED: +      return fetch_R8G8B8A8_SSCALED; + +   case PIPE_FORMAT_A8R8G8B8_UNORM: +      return fetch_A8R8G8B8_UNORM; + +   case PIPE_FORMAT_B8G8R8A8_UNORM: +      return fetch_B8G8R8A8_UNORM; + +   default: +      assert(0);  +      return fetch_NULL; +   } +} + + + + +static emit_func get_emit_func( enum pipe_format format ) +{ +   switch (format) { +   case PIPE_FORMAT_R64_FLOAT: +      return emit_R64_FLOAT; +   case PIPE_FORMAT_R64G64_FLOAT: +      return emit_R64G64_FLOAT; +   case PIPE_FORMAT_R64G64B64_FLOAT: +      return emit_R64G64B64_FLOAT; +   case PIPE_FORMAT_R64G64B64A64_FLOAT: +      return emit_R64G64B64A64_FLOAT; + +   case PIPE_FORMAT_R32_FLOAT: +      return emit_R32_FLOAT; +   case PIPE_FORMAT_R32G32_FLOAT: +      return emit_R32G32_FLOAT; +   case PIPE_FORMAT_R32G32B32_FLOAT: +      return emit_R32G32B32_FLOAT; +   case PIPE_FORMAT_R32G32B32A32_FLOAT: +      return emit_R32G32B32A32_FLOAT; + +   case PIPE_FORMAT_R32_UNORM: +      return emit_R32_UNORM; +   case PIPE_FORMAT_R32G32_UNORM: +      return emit_R32G32_UNORM; +   case PIPE_FORMAT_R32G32B32_UNORM: +      return emit_R32G32B32_UNORM; +   case PIPE_FORMAT_R32G32B32A32_UNORM: +      return emit_R32G32B32A32_UNORM; + +   case PIPE_FORMAT_R32_USCALED: +      return emit_R32_USCALED; +   case PIPE_FORMAT_R32G32_USCALED: +      return emit_R32G32_USCALED; +   case PIPE_FORMAT_R32G32B32_USCALED: +      return emit_R32G32B32_USCALED; +   case PIPE_FORMAT_R32G32B32A32_USCALED: +      return emit_R32G32B32A32_USCALED; + +   case PIPE_FORMAT_R32_SNORM: +      return emit_R32_SNORM; +   case PIPE_FORMAT_R32G32_SNORM: +      return emit_R32G32_SNORM; +   case PIPE_FORMAT_R32G32B32_SNORM: +      return emit_R32G32B32_SNORM; +   case PIPE_FORMAT_R32G32B32A32_SNORM: +      return emit_R32G32B32A32_SNORM; + +   case PIPE_FORMAT_R32_SSCALED: +      return emit_R32_SSCALED; +   case PIPE_FORMAT_R32G32_SSCALED: +      return emit_R32G32_SSCALED; +   case PIPE_FORMAT_R32G32B32_SSCALED: +      return emit_R32G32B32_SSCALED; +   case PIPE_FORMAT_R32G32B32A32_SSCALED: +      return emit_R32G32B32A32_SSCALED; + +   case PIPE_FORMAT_R16_UNORM: +      return emit_R16_UNORM; +   case PIPE_FORMAT_R16G16_UNORM: +      return emit_R16G16_UNORM; +   case PIPE_FORMAT_R16G16B16_UNORM: +      return emit_R16G16B16_UNORM; +   case PIPE_FORMAT_R16G16B16A16_UNORM: +      return emit_R16G16B16A16_UNORM; + +   case PIPE_FORMAT_R16_USCALED: +      return emit_R16_USCALED; +   case PIPE_FORMAT_R16G16_USCALED: +      return emit_R16G16_USCALED; +   case PIPE_FORMAT_R16G16B16_USCALED: +      return emit_R16G16B16_USCALED; +   case PIPE_FORMAT_R16G16B16A16_USCALED: +      return emit_R16G16B16A16_USCALED; + +   case PIPE_FORMAT_R16_SNORM: +      return emit_R16_SNORM; +   case PIPE_FORMAT_R16G16_SNORM: +      return emit_R16G16_SNORM; +   case PIPE_FORMAT_R16G16B16_SNORM: +      return emit_R16G16B16_SNORM; +   case PIPE_FORMAT_R16G16B16A16_SNORM: +      return emit_R16G16B16A16_SNORM; + +   case PIPE_FORMAT_R16_SSCALED: +      return emit_R16_SSCALED; +   case PIPE_FORMAT_R16G16_SSCALED: +      return emit_R16G16_SSCALED; +   case PIPE_FORMAT_R16G16B16_SSCALED: +      return emit_R16G16B16_SSCALED; +   case PIPE_FORMAT_R16G16B16A16_SSCALED: +      return emit_R16G16B16A16_SSCALED; + +   case PIPE_FORMAT_R8_UNORM: +      return emit_R8_UNORM; +   case PIPE_FORMAT_R8G8_UNORM: +      return emit_R8G8_UNORM; +   case PIPE_FORMAT_R8G8B8_UNORM: +      return emit_R8G8B8_UNORM; +   case PIPE_FORMAT_R8G8B8A8_UNORM: +      return emit_R8G8B8A8_UNORM; + +   case PIPE_FORMAT_R8_USCALED: +      return emit_R8_USCALED; +   case PIPE_FORMAT_R8G8_USCALED: +      return emit_R8G8_USCALED; +   case PIPE_FORMAT_R8G8B8_USCALED: +      return emit_R8G8B8_USCALED; +   case PIPE_FORMAT_R8G8B8A8_USCALED: +      return emit_R8G8B8A8_USCALED; + +   case PIPE_FORMAT_R8_SNORM: +      return emit_R8_SNORM; +   case PIPE_FORMAT_R8G8_SNORM: +      return emit_R8G8_SNORM; +   case PIPE_FORMAT_R8G8B8_SNORM: +      return emit_R8G8B8_SNORM; +   case PIPE_FORMAT_R8G8B8A8_SNORM: +      return emit_R8G8B8A8_SNORM; + +   case PIPE_FORMAT_R8_SSCALED: +      return emit_R8_SSCALED; +   case PIPE_FORMAT_R8G8_SSCALED: +      return emit_R8G8_SSCALED; +   case PIPE_FORMAT_R8G8B8_SSCALED: +      return emit_R8G8B8_SSCALED; +   case PIPE_FORMAT_R8G8B8A8_SSCALED: +      return emit_R8G8B8A8_SSCALED; + +   case PIPE_FORMAT_A8R8G8B8_UNORM: +      return emit_A8R8G8B8_UNORM; + +   case PIPE_FORMAT_B8G8R8A8_UNORM: +      return emit_B8G8R8A8_UNORM; + +   default: +      assert(0);  +      return emit_NULL; +   } +} + + + +/** + * Fetch vertex attributes for 'count' vertices. + */ +static void generic_run_elts( struct translate *translate, +			      const unsigned *elts, +			      unsigned count, +			      void *output_buffer ) +{ +   struct translate_generic *tg = translate_generic(translate); +   char *vert = output_buffer; +   unsigned nr_attrs = tg->nr_attrib; +   unsigned attr; +   unsigned i; + +   /* loop over vertex attributes (vertex shader inputs) +    */ +   for (i = 0; i < count; i++) { +      unsigned elt = *elts++; + +      for (attr = 0; attr < nr_attrs; attr++) { +	 float data[4]; + +	 const char *src = (tg->attrib[attr].input_ptr +  +			    tg->attrib[attr].input_stride * elt); + +	 char *dst = (vert +  +		      tg->attrib[attr].output_offset); + +	 tg->attrib[attr].fetch( src, data ); + +         if (0) debug_printf("vert %d/%d attr %d: %f %f %f %f\n", +                             i, elt, attr, data[0], data[1], data[2], data[3]); + +	 tg->attrib[attr].emit( data, dst ); +      } +       +      vert += tg->translate.key.output_stride; +   } +} + + + +static void generic_run( struct translate *translate, +			 unsigned start, +			 unsigned count, +			 void *output_buffer ) +{ +   struct translate_generic *tg = translate_generic(translate); +   char *vert = output_buffer; +   unsigned nr_attrs = tg->nr_attrib; +   unsigned attr; +   unsigned i; + +   /* loop over vertex attributes (vertex shader inputs) +    */ +   for (i = 0; i < count; i++) { +      unsigned elt = start + i; + +      for (attr = 0; attr < nr_attrs; attr++) { +	 float data[4]; + +	 const char *src = (tg->attrib[attr].input_ptr +  +			    tg->attrib[attr].input_stride * elt); + +	 char *dst = (vert +  +		      tg->attrib[attr].output_offset); + +	 tg->attrib[attr].fetch( src, data ); + +         if (0) debug_printf("vert %d attr %d: %f %f %f %f\n", +                             i, attr, data[0], data[1], data[2], data[3]); + +	 tg->attrib[attr].emit( data, dst ); +      } +       +      vert += tg->translate.key.output_stride; +   } +} + + +			        +static void generic_set_buffer( struct translate *translate, +				unsigned buf, +				const void *ptr, +				unsigned stride ) +{ +   struct translate_generic *tg = translate_generic(translate); +   unsigned i; + +   for (i = 0; i < tg->nr_attrib; i++) { +      if (tg->attrib[i].buffer == buf) { +	 tg->attrib[i].input_ptr = ((char *)ptr + +				    tg->attrib[i].input_offset); +	 tg->attrib[i].input_stride = stride; +      } +   } +} + + +static void generic_release( struct translate *translate ) +{ +   /* Refcount? +    */ +   FREE(translate); +} + +struct translate *translate_generic_create( const struct translate_key *key ) +{ +   struct translate_generic *tg = CALLOC_STRUCT(translate_generic); +   unsigned i; + +   if (tg == NULL) +      return NULL; + +   tg->translate.key = *key; +   tg->translate.release = generic_release; +   tg->translate.set_buffer = generic_set_buffer; +   tg->translate.run_elts = generic_run_elts; +   tg->translate.run = generic_run; + +   for (i = 0; i < key->nr_elements; i++) { + +      tg->attrib[i].fetch = get_fetch_func(key->element[i].input_format); +      tg->attrib[i].buffer = key->element[i].input_buffer; +      tg->attrib[i].input_offset = key->element[i].input_offset; + +      tg->attrib[i].emit = get_emit_func(key->element[i].output_format); +      tg->attrib[i].output_offset = key->element[i].output_offset; + +   } + +   tg->nr_attrib = key->nr_elements; + + +   return &tg->translate; +} diff --git a/src/gallium/auxiliary/translate/translate_sse.c b/src/gallium/auxiliary/translate/translate_sse.c new file mode 100644 index 0000000000..a54ac5a82f --- /dev/null +++ b/src/gallium/auxiliary/translate/translate_sse.c @@ -0,0 +1,625 @@ +/* + * Copyright 2003 Tungsten Graphics, 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 + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL + * TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + *    Keith Whitwell <keithw@tungstengraphics.com> + */ + + +#include "pipe/p_compiler.h" +#include "pipe/p_util.h" +#include "util/u_simple_list.h" + +#include "translate.h" + + +#if defined(__i386__) || defined(__386__) || defined(i386) + +#include "rtasm/rtasm_cpu.h" +#include "rtasm/rtasm_x86sse.h" + + +#define X    0 +#define Y    1 +#define Z    2 +#define W    3 + + +#ifdef WIN32 +#define RTASM __cdecl +#else +#define RTASM +#endif + +typedef void (RTASM *run_func)( struct translate *translate, +                                unsigned start, +                                unsigned count, +                                void *output_buffer ); + +typedef void (RTASM *run_elts_func)( struct translate *translate, +                                     const unsigned *elts, +                                     unsigned count, +                                     void *output_buffer ); + + + +struct translate_sse { +   struct translate translate; + +   struct x86_function linear_func; +   struct x86_function elt_func; +   struct x86_function *func; + +   boolean loaded_identity; +   boolean loaded_255; +   boolean loaded_inv_255; + +   float identity[4]; +   float float_255[4]; +   float inv_255[4]; + +   struct { +      char *input_ptr; +      unsigned input_stride; +   } attrib[PIPE_MAX_ATTRIBS]; + +   run_func      gen_run; +   run_elts_func gen_run_elts; + +}; + +static int get_offset( const void *a, const void *b ) +{ +   return (const char *)b - (const char *)a; +} + + + +static struct x86_reg get_identity( struct translate_sse *p ) +{ +   struct x86_reg reg = x86_make_reg(file_XMM, 6); + +   if (!p->loaded_identity) { +      /* Nasty:  +       */ +      struct x86_reg translateESI = x86_make_reg(file_REG32, reg_SI); + +      p->loaded_identity = TRUE; +      p->identity[0] = 0; +      p->identity[1] = 0; +      p->identity[2] = 0; +      p->identity[3] = 1; + +      sse_movups(p->func, reg,  +		 x86_make_disp(translateESI,  +			       get_offset(p, &p->identity[0]))); +   } + +   return reg; +} + +static struct x86_reg get_255( struct translate_sse *p ) +{ +   struct x86_reg reg = x86_make_reg(file_XMM, 6); + +   if (!p->loaded_255) { +      struct x86_reg translateESI = x86_make_reg(file_REG32, reg_SI); + +      p->loaded_255 = TRUE; +      p->float_255[0] = +	 p->float_255[1] = +	 p->float_255[2] = +	 p->float_255[3] = 255.0f; + +      sse_movups(p->func, reg,  +		 x86_make_disp(translateESI,  +			       get_offset(p, &p->float_255[0]))); +   } + +   return reg; +   return x86_make_reg(file_XMM, 7); +} + +static struct x86_reg get_inv_255( struct translate_sse *p ) +{ +   struct x86_reg reg = x86_make_reg(file_XMM, 5); + +   if (!p->loaded_inv_255) { +      struct x86_reg translateESI = x86_make_reg(file_REG32, reg_SI); + +      p->loaded_inv_255 = TRUE; +      p->inv_255[0] = +	 p->inv_255[1] = +	 p->inv_255[2] = +	 p->inv_255[3] = 1.0f / 255.0f; + +      sse_movups(p->func, reg,  +		 x86_make_disp(translateESI,  +			       get_offset(p, &p->inv_255[0]))); +   } + +   return reg; +} + + +static void emit_load_R32G32B32A32( struct translate_sse *p, 			    +				    struct x86_reg data, +				    struct x86_reg arg0 ) +{ +   sse_movups(p->func, data, arg0); +} + +static void emit_load_R32G32B32( struct translate_sse *p, 			    +				 struct x86_reg data, +				 struct x86_reg arg0 ) +{ +   /* Have to jump through some hoops: +    * +    * c 0 0 0 +    * c 0 0 1 +    * 0 0 c 1 +    * a b c 1 +    */ +   sse_movss(p->func, data, x86_make_disp(arg0, 8)); +   sse_shufps(p->func, data, get_identity(p), SHUF(X,Y,Z,W) ); +   sse_shufps(p->func, data, data, SHUF(Y,Z,X,W) ); +   sse_movlps(p->func, data, arg0); +} + +static void emit_load_R32G32( struct translate_sse *p,  +			   struct x86_reg data, +			   struct x86_reg arg0 ) +{ +   /* 0 0 0 1 +    * a b 0 1 +    */ +   sse_movups(p->func, data, get_identity(p) ); +   sse_movlps(p->func, data, arg0); +} + + +static void emit_load_R32( struct translate_sse *p,  +			   struct x86_reg data, +			   struct x86_reg arg0 ) +{ +   /* a 0 0 0 +    * a 0 0 1 +    */ +   sse_movss(p->func, data, arg0); +   sse_orps(p->func, data, get_identity(p) ); +} + + +static void emit_load_R8G8B8A8_UNORM( struct translate_sse *p, +				       struct x86_reg data, +				       struct x86_reg src ) +{ + +   /* Load and unpack twice: +    */ +   sse_movss(p->func, data, src); +   sse2_punpcklbw(p->func, data, get_identity(p)); +   sse2_punpcklbw(p->func, data, get_identity(p)); + +   /* Convert to float: +    */ +   sse2_cvtdq2ps(p->func, data, data); + + +   /* Scale by 1/255.0 +    */ +   sse_mulps(p->func, data, get_inv_255(p)); +} + + + + +static void emit_store_R32G32B32A32( struct translate_sse *p, 			    +				     struct x86_reg dest, +				     struct x86_reg dataXMM ) +{ +   sse_movups(p->func, dest, dataXMM); +} + +static void emit_store_R32G32B32( struct translate_sse *p,  +				  struct x86_reg dest, +				  struct x86_reg dataXMM ) +{ +   /* Emit two, shuffle, emit one. +    */ +   sse_movlps(p->func, dest, dataXMM); +   sse_shufps(p->func, dataXMM, dataXMM, SHUF(Z,Z,Z,Z) ); /* NOTE! destructive */ +   sse_movss(p->func, x86_make_disp(dest,8), dataXMM); +} + +static void emit_store_R32G32( struct translate_sse *p,  +			       struct x86_reg dest, +			       struct x86_reg dataXMM ) +{ +   sse_movlps(p->func, dest, dataXMM); +} + +static void emit_store_R32( struct translate_sse *p,  +			    struct x86_reg dest, +			    struct x86_reg dataXMM ) +{ +   sse_movss(p->func, dest, dataXMM); +} + + + +static void emit_store_R8G8B8A8_UNORM( struct translate_sse *p, +				       struct x86_reg dest, +				       struct x86_reg dataXMM ) +{ +   /* Scale by 255.0 +    */ +   sse_mulps(p->func, dataXMM, get_255(p)); + +   /* Pack and emit: +    */ +   sse2_cvtps2dq(p->func, dataXMM, dataXMM); +   sse2_packssdw(p->func, dataXMM, dataXMM); +   sse2_packuswb(p->func, dataXMM, dataXMM); +   sse_movss(p->func, dest, dataXMM); +} + + + + + +static void get_src_ptr( struct translate_sse *p, +			 struct x86_reg srcEAX, +			 struct x86_reg translateREG, +			 struct x86_reg eltREG,	 +			 unsigned a ) +{ +   struct x86_reg input_ptr =  +      x86_make_disp(translateREG,  +		    get_offset(p, &p->attrib[a].input_ptr)); + +   struct x86_reg input_stride =  +      x86_make_disp(translateREG,  +		    get_offset(p, &p->attrib[a].input_stride)); + +   /* Calculate pointer to current attrib: +    */ +   x86_mov(p->func, srcEAX, input_stride); +   x86_imul(p->func, srcEAX, eltREG);	 +   x86_add(p->func, srcEAX, input_ptr); +} + + +/* Extended swizzles?  Maybe later. + */   +static void emit_swizzle( struct translate_sse *p, +			  struct x86_reg dest, +			  struct x86_reg src, +			  unsigned shuffle ) +{ +   sse_shufps(p->func, dest, src, shuffle); +} + + +static boolean translate_attr( struct translate_sse *p, +			       const struct translate_element *a, +			       struct x86_reg srcECX, +			       struct x86_reg dstEAX) +{ +   struct x86_reg dataXMM = x86_make_reg(file_XMM, 0); + +   switch (a->input_format) { +   case PIPE_FORMAT_R32_FLOAT: +      emit_load_R32(p, dataXMM, srcECX); +      break; +   case PIPE_FORMAT_R32G32_FLOAT: +      emit_load_R32G32(p, dataXMM, srcECX); +      break; +   case PIPE_FORMAT_R32G32B32_FLOAT: +      emit_load_R32G32B32(p, dataXMM, srcECX); +      break; +   case PIPE_FORMAT_R32G32B32A32_FLOAT: +      emit_load_R32G32B32A32(p, dataXMM, srcECX); +      break; +   case PIPE_FORMAT_B8G8R8A8_UNORM: +      emit_load_R8G8B8A8_UNORM(p, dataXMM, srcECX); +      emit_swizzle(p, dataXMM, dataXMM, SHUF(Z,Y,X,W)); +      break; +   case PIPE_FORMAT_R8G8B8A8_UNORM: +      emit_load_R8G8B8A8_UNORM(p, dataXMM, srcECX); +      break; +   default: +      return FALSE; +   } + +   switch (a->output_format) { +   case PIPE_FORMAT_R32_FLOAT: +      emit_store_R32(p, dstEAX, dataXMM); +      break; +   case PIPE_FORMAT_R32G32_FLOAT: +      emit_store_R32G32(p, dstEAX, dataXMM); +      break; +   case PIPE_FORMAT_R32G32B32_FLOAT: +      emit_store_R32G32B32(p, dstEAX, dataXMM); +      break; +   case PIPE_FORMAT_R32G32B32A32_FLOAT: +      emit_store_R32G32B32A32(p, dstEAX, dataXMM); +      break; +   case PIPE_FORMAT_B8G8R8A8_UNORM: +      emit_swizzle(p, dataXMM, dataXMM, SHUF(Z,Y,X,W)); +      emit_store_R8G8B8A8_UNORM(p, dstEAX, dataXMM); +      break; +   case PIPE_FORMAT_R8G8B8A8_UNORM: +      emit_store_R8G8B8A8_UNORM(p, dstEAX, dataXMM); +      break; +   default: +      return FALSE; +   } + +   return TRUE; +} + +/* Build run( struct translate *translate, + *            unsigned start, + *            unsigned count, + *            void *output_buffer ) + * or + *  run_elts( struct translate *translate, + *            unsigned *elts, + *            unsigned count, + *            void *output_buffer ) + * + *  Lots of hardcoding + * + * EAX -- pointer to current output vertex + * ECX -- pointer to current attribute  + *  + */ +static boolean build_vertex_emit( struct translate_sse *p, +				  struct x86_function *func, +				  boolean linear ) +{ +   struct x86_reg vertexECX    = x86_make_reg(file_REG32, reg_AX); +   struct x86_reg idxEBX       = x86_make_reg(file_REG32, reg_BX); +   struct x86_reg srcEAX       = x86_make_reg(file_REG32, reg_CX); +   struct x86_reg countEBP     = x86_make_reg(file_REG32, reg_BP); +   struct x86_reg translateESI = x86_make_reg(file_REG32, reg_SI); +   int fixup, label; +   unsigned j; + +   p->func = func; +   p->loaded_inv_255 = FALSE; +   p->loaded_255 = FALSE; +   p->loaded_identity = FALSE; + +   x86_init_func(p->func); + +   /* Push a few regs? +    */ +   x86_push(p->func, countEBP); +   x86_push(p->func, translateESI); +   x86_push(p->func, idxEBX); + +   /* Get vertex count, compare to zero +    */ +   x86_xor(p->func, idxEBX, idxEBX); +   x86_mov(p->func, countEBP, x86_fn_arg(p->func, 3)); +   x86_cmp(p->func, countEBP, idxEBX); +   fixup = x86_jcc_forward(p->func, cc_E); + +   /* If linear, idx is the current element, otherwise it is a pointer +    * to the current element. +    */ +   x86_mov(p->func, idxEBX, x86_fn_arg(p->func, 2)); + +   /* Initialize destination register.  +    */ +   x86_mov(p->func, vertexECX, x86_fn_arg(p->func, 4)); + +   /* Move argument 1 (translate_sse pointer) into a reg: +    */ +   x86_mov(p->func, translateESI, x86_fn_arg(p->func, 1)); + +    +   /* always load, needed or not: +    */ + +   /* Note address for loop jump */ +   label = x86_get_label(p->func); + + +   for (j = 0; j < p->translate.key.nr_elements; j++) { +      const struct translate_element *a = &p->translate.key.element[j]; + +      struct x86_reg destEAX = x86_make_disp(vertexECX,  +					     a->output_offset); + +      /* Figure out source pointer address: +       */ +      if (linear) { +	 get_src_ptr(p, srcEAX, translateESI, idxEBX, j); +      } +      else { +	 get_src_ptr(p, srcEAX, translateESI, x86_deref(idxEBX), j); +      } + +      if (!translate_attr( p, a, x86_deref(srcEAX), destEAX )) +	 return FALSE; +   } + +   /* Next vertex: +    */ +   x86_lea(p->func, vertexECX, x86_make_disp(vertexECX, p->translate.key.output_stride)); + +   /* Incr index +    */   /* Emit code for each of the attributes.  Currently routes +    * everything through SSE registers, even when it might be more +    * efficient to stick with regular old x86.  No optimization or +    * other tricks - enough new ground to cover here just getting +    * things working. +    */ + +   if (linear) { +      x86_inc(p->func, idxEBX); +   }  +   else { +      x86_lea(p->func, idxEBX, x86_make_disp(idxEBX, 4)); +   } + +   /* decr count, loop if not zero +    */ +   x86_dec(p->func, countEBP); +   x86_test(p->func, countEBP, countEBP);  +   x86_jcc(p->func, cc_NZ, label); + +   /* Exit mmx state? +    */ +   if (p->func->need_emms) +      mmx_emms(p->func); + +   /* Land forward jump here: +    */ +   x86_fixup_fwd_jump(p->func, fixup); + +   /* Pop regs and return +    */ +    +   x86_pop(p->func, idxEBX); +   x86_pop(p->func, translateESI); +   x86_pop(p->func, countEBP); +   x86_ret(p->func); + +   return TRUE; +} + + + + + + +			        +static void translate_sse_set_buffer( struct translate *translate, +				unsigned buf, +				const void *ptr, +				unsigned stride ) +{ +   struct translate_sse *p = (struct translate_sse *)translate; +   unsigned i; + +   for (i = 0; i < p->translate.key.nr_elements; i++) { +      if (p->translate.key.element[i].input_buffer == buf) { +	 p->attrib[i].input_ptr = ((char *)ptr + +				    p->translate.key.element[i].input_offset); +	 p->attrib[i].input_stride = stride; +      } +   } +} + + +static void translate_sse_release( struct translate *translate ) +{ +   struct translate_sse *p = (struct translate_sse *)translate; + +   x86_release_func( &p->linear_func ); +   x86_release_func( &p->elt_func ); + +   FREE(p); +} + +static void translate_sse_run_elts( struct translate *translate, +			      const unsigned *elts, +			      unsigned count, +			      void *output_buffer ) +{ +   struct translate_sse *p = (struct translate_sse *)translate; + +   p->gen_run_elts( translate, +		    elts, +		    count, +		    output_buffer ); +} + +static void translate_sse_run( struct translate *translate, +			 unsigned start, +			 unsigned count, +			 void *output_buffer ) +{ +   struct translate_sse *p = (struct translate_sse *)translate; + +   p->gen_run( translate, +	       start, +	       count, +	       output_buffer ); +} + + +struct translate *translate_sse2_create( const struct translate_key *key ) +{ +   struct translate_sse *p = NULL; + +   if (!rtasm_cpu_has_sse() || !rtasm_cpu_has_sse2()) +      goto fail; + +   p = CALLOC_STRUCT( translate_sse ); +   if (p == NULL)  +      goto fail; + +   p->translate.key = *key; +   p->translate.release = translate_sse_release; +   p->translate.set_buffer = translate_sse_set_buffer; +   p->translate.run_elts = translate_sse_run_elts; +   p->translate.run = translate_sse_run; + +   if (!build_vertex_emit(p, &p->linear_func, TRUE)) +      goto fail; + +   if (!build_vertex_emit(p, &p->elt_func, FALSE)) +      goto fail; + +   p->gen_run = (run_func)x86_get_func(&p->linear_func); +   if (p->gen_run == NULL) +      goto fail; + +   p->gen_run_elts = (run_elts_func)x86_get_func(&p->elt_func); +   if (p->gen_run_elts == NULL) +      goto fail; + +   return &p->translate; + + fail: +   if (p) +      translate_sse_release( &p->translate ); + +   return NULL; +} + + + +#else + +void translate_create_sse( const struct translate_key *key ) +{ +   return NULL; +} + +#endif diff --git a/src/gallium/auxiliary/util/Makefile b/src/gallium/auxiliary/util/Makefile index 9b6c2708b6..05bc43131a 100644 --- a/src/gallium/auxiliary/util/Makefile +++ b/src/gallium/auxiliary/util/Makefile @@ -14,7 +14,9 @@ C_SOURCES = \  	u_hash_table.c \  	u_mm.c \  	u_simple_shaders.c \ -	u_snprintf.c +	u_snprintf.c \ +	u_time.c \ +	u_mm.c  include ../../Makefile.template diff --git a/src/gallium/auxiliary/util/SConscript b/src/gallium/auxiliary/util/SConscript index 9b3929eb2d..d55d2c7081 100644 --- a/src/gallium/auxiliary/util/SConscript +++ b/src/gallium/auxiliary/util/SConscript @@ -15,6 +15,7 @@ util = env.ConvenienceLibrary(  		'u_mm.c',  		'u_simple_shaders.c',  		'u_snprintf.c', +		'u_time.c',  	])  auxiliaries.insert(0, util) diff --git a/src/gallium/auxiliary/util/p_debug.c b/src/gallium/auxiliary/util/p_debug.c index 090e3b7794..4ec1746662 100644 --- a/src/gallium/auxiliary/util/p_debug.c +++ b/src/gallium/auxiliary/util/p_debug.c @@ -26,9 +26,11 @@   **************************************************************************/ +#include "pipe/p_config.h"  +  #include <stdarg.h> -#ifdef WIN32 +#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY  #include <windows.h>  #include <winddi.h>  #else @@ -39,9 +41,11 @@  #include "pipe/p_compiler.h"   #include "pipe/p_util.h"   #include "pipe/p_debug.h"  +#include "pipe/p_format.h"  +#include "util/u_string.h"  -#ifdef WIN32 +#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY  static INLINE void   _EngDebugPrint(const char *format, ...)  { @@ -55,13 +59,18 @@ _EngDebugPrint(const char *format, ...)  void _debug_vprintf(const char *format, va_list ap)  { -#ifdef WIN32 +#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY  #ifndef WINCE     /* EngDebugPrint does not handle float point arguments, so we need to use -    * our own vsnprintf implementation */ -   char buf[512 + 1]; -   vsnprintf(buf, sizeof(buf), format, ap); -   _EngDebugPrint("%s", buf); +    * our own vsnprintf implementation. It is also very slow, so buffer until +    * we find a newline. */ +   static char buf[512 + 1] = {'\0'}; +   size_t len = strlen(buf); +   int ret = util_vsnprintf(buf + len, sizeof(buf) - len, format, ap); +   if(ret > (int)(sizeof(buf) - len - 1) || strchr(buf + len, '\n')) { +      _EngDebugPrint("%s", buf); +      buf[0] = '\0'; +   }  #else     /* TODO: Implement debug print for WINCE */  #endif @@ -95,7 +104,7 @@ void _debug_break(void)     __asm("int3");  #elif (defined(__i386__) || defined(__386__)) && defined(__MSC__)     _asm {int 3}; -#elif defined(WIN32) && !defined(WINCE) +#elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)     EngDebugBreak();  #else     abort(); @@ -103,7 +112,7 @@ void _debug_break(void)  } -#ifdef WIN32 +#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY  static const char *  find(const char *start, const char *end, char c)   { @@ -144,7 +153,7 @@ const char *  debug_get_option(const char *name, const char *dfault)  {     const char *result; -#ifdef WIN32 +#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY     ULONG_PTR iFile = 0;     const void *pMap = NULL;     const char *sol, *eol, *sep; @@ -194,6 +203,8 @@ debug_get_bool_option(const char *name, boolean dfault)     if(str == NULL)        result = dfault; +   else if(!strcmp(str, "n")) +      result = FALSE;     else if(!strcmp(str, "no"))        result = FALSE;     else if(!strcmp(str, "0")) @@ -245,57 +256,16 @@ debug_get_flags_option(const char *name,  } -#if defined(WIN32) -ULONG_PTR debug_config_file = 0; -void *mapped_config_file = 0; - -enum { -	eAssertAbortEn = 0x1, -}; - -/* Check for aborts enabled. */ -static unsigned abort_en(void) -{ -   if (!mapped_config_file) -   { -      /* Open an 8 byte file for configuration data. */ -      mapped_config_file = EngMapFile(L"\\??\\c:\\gaDebug.cfg", 8, &debug_config_file); -   } - -   /* A value of "0" (ascii) in the configuration file will clear the -    * first 8 bits in the test byte.  -    * -    * A value of "1" (ascii) in the configuration file will set the -    * first bit in the test byte.  -    * -    * A value of "2" (ascii) in the configuration file will set the -    * second bit in the test byte.  -    * -    * Currently the only interesting values are 0 and 1, which clear -    * and set abort-on-assert behaviour respectively. -    */ -   return ((((char *)mapped_config_file)[0]) - 0x30) & eAssertAbortEn; -} -#else /* WIN32 */ -static unsigned abort_en(void) -{ -   return !GETENV("GALLIUM_ABORT_ON_ASSERT"); -} -#endif -  void _debug_assert_fail(const char *expr,                           const char *file,                           unsigned line,                           const char *function)   {     _debug_printf("%s:%u:%s: Assertion `%s' failed.\n", file, line, function, expr); -   if (abort_en()) -   { +   if (debug_get_bool_option("GALLIUM_ABORT_ON_ASSERT", TRUE))        debug_break(); -   } else -   { +   else        _debug_printf("continuing...\n"); -   }  } @@ -311,7 +281,7 @@ debug_dump_enum(const struct debug_named_value *names,        ++names;     } -   snprintf(rest, sizeof(rest), "0x%08lx", value); +   util_snprintf(rest, sizeof(rest), "0x%08lx", value);     return rest;  } @@ -344,7 +314,7 @@ debug_dump_flags(const struct debug_named_value *names,        else  	 first = 0; -      snprintf(rest, sizeof(rest), "0x%08lx", value); +      util_snprintf(rest, sizeof(rest), "0x%08lx", value);        strncat(output, rest, sizeof(output));     } @@ -355,3 +325,101 @@ debug_dump_flags(const struct debug_named_value *names,  } + + + + +char *pf_sprint_name( char *str, enum pipe_format format ) +{ +   strcpy( str, "PIPE_FORMAT_" ); +   switch (pf_layout( format )) { +   case PIPE_FORMAT_LAYOUT_RGBAZS: +      { +         pipe_format_rgbazs_t rgbazs = (pipe_format_rgbazs_t) format; +         uint                 i; +         uint                 scale = 1 << (pf_exp8( rgbazs ) * 3); + +         for (i = 0; i < 4; i++) { +            uint  size = pf_size_xyzw( rgbazs, i ); + +            if (size == 0) { +               break; +            } +            switch (pf_swizzle_xyzw( rgbazs, i )) { +            case PIPE_FORMAT_COMP_R: +               strcat( str, "R" ); +               break; +            case PIPE_FORMAT_COMP_G: +               strcat( str, "G" ); +               break; +            case PIPE_FORMAT_COMP_B: +               strcat( str, "B" ); +               break; +            case PIPE_FORMAT_COMP_A: +               strcat( str, "A" ); +               break; +            case PIPE_FORMAT_COMP_0: +               strcat( str, "0" ); +               break; +            case PIPE_FORMAT_COMP_1: +               strcat( str, "1" ); +               break; +            case PIPE_FORMAT_COMP_Z: +               strcat( str, "Z" ); +               break; +            case PIPE_FORMAT_COMP_S: +               strcat( str, "S" ); +               break; +            } +            util_snprintf( &str[strlen( str )], 32, "%u", size * scale ); +         } +         if (i != 0) { +            strcat( str, "_" ); +         } +         switch (pf_type( rgbazs )) { +         case PIPE_FORMAT_TYPE_UNKNOWN: +            strcat( str, "NONE" ); +            break; +         case PIPE_FORMAT_TYPE_FLOAT: +            strcat( str, "FLOAT" ); +            break; +         case PIPE_FORMAT_TYPE_UNORM: +            strcat( str, "UNORM" ); +            break; +         case PIPE_FORMAT_TYPE_SNORM: +            strcat( str, "SNORM" ); +            break; +         case PIPE_FORMAT_TYPE_USCALED: +            strcat( str, "USCALED" ); +            break; +         case PIPE_FORMAT_TYPE_SSCALED: +            strcat( str, "SSCALED" ); +            break; +         } +      } +      break; +   case PIPE_FORMAT_LAYOUT_YCBCR: +      { +         pipe_format_ycbcr_t  ycbcr = (pipe_format_ycbcr_t) format; + +         strcat( str, "YCBCR" ); +         if (pf_rev( ycbcr )) { +            strcat( str, "_REV" ); +         } +      } +      break; +   } +   return str; +} + + +#ifdef DEBUG +void debug_print_format(const char *msg, unsigned fmt ) +{ +   char fmtstr[80]; +  +   pf_sprint_name(fmtstr, (enum pipe_format)fmt); + +   debug_printf("%s: %s\n", msg, fmtstr);  +} +#endif diff --git a/src/gallium/auxiliary/util/p_debug_mem.c b/src/gallium/auxiliary/util/p_debug_mem.c index c160afe5b7..3b5e4fbaee 100644 --- a/src/gallium/auxiliary/util/p_debug_mem.c +++ b/src/gallium/auxiliary/util/p_debug_mem.c @@ -32,9 +32,13 @@   * @author José Fonseca <jrfonseca@tungstengraphics.com>   */ -#ifdef WIN32 +#include "pipe/p_config.h"  + +#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)  #include <windows.h>  #include <winddi.h> +#elif defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT) +#include <wdm.h>  #else  #include <stdio.h>  #include <stdlib.h> @@ -47,9 +51,12 @@  #define DEBUG_MEMORY_MAGIC 0x6e34090aU  -#if defined(WIN32) && !defined(WINCE) +#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) && !defined(WINCE)  #define real_malloc(_size) EngAllocMem(0, _size, 'D3AG')  #define real_free(_ptr) EngFreeMem(_ptr) +#elif defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT) +#define real_malloc(_size) ExAllocatePool(0, _size) +#define real_free(_ptr) ExFreePool(_ptr)  #else  #define real_malloc(_size) malloc(_size)  #define real_free(_ptr) free(_ptr) @@ -70,8 +77,26 @@ struct debug_memory_header  static struct list_head list = { &list, &list }; -static unsigned long start_no = 0; -static unsigned long end_no = 0; +static unsigned long last_no = 0; + + +static INLINE struct debug_memory_header * +header_from_data(void *data) +{ +   if(data) +      return (struct debug_memory_header *)((char *)data - sizeof(struct debug_memory_header)); +   else +      return NULL; +} + +static INLINE void * +data_from_header(struct debug_memory_header *hdr) +{ +   if(hdr) +      return (void *)((char *)hdr + sizeof(struct debug_memory_header)); +   else +      return NULL; +}  void * @@ -84,7 +109,7 @@ debug_malloc(const char *file, unsigned line, const char *function,     if(!hdr)        return NULL; -   hdr->no = end_no++; +   hdr->no = last_no++;     hdr->file = file;     hdr->line = line;     hdr->function = function; @@ -93,7 +118,7 @@ debug_malloc(const char *file, unsigned line, const char *function,     LIST_ADDTAIL(&hdr->head, &list); -   return (void *)((char *)hdr + sizeof(*hdr)); +   return data_from_header(hdr);  }  void @@ -105,7 +130,7 @@ debug_free(const char *file, unsigned line, const char *function,     if(!ptr)        return; -   hdr = (struct debug_memory_header *)((char *)ptr - sizeof(*hdr)); +   hdr = header_from_data(ptr);     if(hdr->magic != DEBUG_MEMORY_MAGIC) {        debug_printf("%s:%u:%s: freeing bad or corrupted memory %p\n",                     file, line, function, @@ -134,27 +159,57 @@ void *  debug_realloc(const char *file, unsigned line, const char *function,                void *old_ptr, size_t old_size, size_t new_size )  { -   void *new_ptr = NULL; - -   if (new_size != 0) { -      new_ptr = debug_malloc( file, line, function, new_size ); -       -      if( new_ptr && old_ptr ) -         memcpy( new_ptr, old_ptr, old_size ); +   struct debug_memory_header *old_hdr, *new_hdr; +   void *new_ptr; +    +   if(!old_ptr) +      return debug_malloc( file, line, function, new_size ); +    +   if(!new_size) { +      debug_free( file, line, function, old_ptr ); +      return NULL; +   } +    +   old_hdr = header_from_data(old_ptr); +   if(old_hdr->magic != DEBUG_MEMORY_MAGIC) { +      debug_printf("%s:%u:%s: reallocating bad or corrupted memory %p\n", +                   file, line, function, +                   old_ptr); +      debug_assert(0); +      return NULL;     } +    +   /* alloc new */ +   new_hdr = real_malloc(sizeof(*new_hdr) + new_size); +   if(!new_hdr) +      return NULL; +   new_hdr->no = old_hdr->no; +   new_hdr->file = old_hdr->file; +   new_hdr->line = old_hdr->line; +   new_hdr->function = old_hdr->function; +   new_hdr->size = new_size; +   new_hdr->magic = DEBUG_MEMORY_MAGIC; +   LIST_REPLACE(&old_hdr->head, &new_hdr->head); +    +   /* copy data */ +   new_ptr = data_from_header(new_hdr); +   memcpy( new_ptr, old_ptr, old_size < new_size ? old_size : new_size ); + +   /* free old */ +   old_hdr->magic = 0; +   real_free(old_hdr); -   debug_free( file, line, function, old_ptr );     return new_ptr;  } -void -debug_memory_reset(void) +unsigned long +debug_memory_begin(void)  { -   start_no = end_no; +   return last_no;  }  void  -debug_memory_report(void) +debug_memory_end(unsigned long start_no)  {     struct list_head *entry; @@ -163,8 +218,9 @@ debug_memory_report(void)        struct debug_memory_header *hdr;        void *ptr;        hdr = LIST_ENTRY(struct debug_memory_header, entry, head); -      ptr = (void *)((char *)hdr + sizeof(*hdr)); -      if(hdr->no >= start_no) +      ptr = data_from_header(hdr); +      if(start_no <= hdr->no && hdr->no < last_no || +	 last_no < start_no && (hdr->no < last_no || start_no <= hdr->no))  	 debug_printf("%s:%u:%s: %u bytes at %p not freed\n",  		      hdr->file, hdr->line, hdr->function,  		      hdr->size, ptr); diff --git a/src/gallium/auxiliary/util/p_tile.c b/src/gallium/auxiliary/util/p_tile.c index 520da5cecd..63e1cc6013 100644 --- a/src/gallium/auxiliary/util/p_tile.c +++ b/src/gallium/auxiliary/util/p_tile.c @@ -169,6 +169,52 @@ a8r8g8b8_put_tile_rgba(unsigned *dst,  } +/*** PIPE_FORMAT_A8R8G8B8_UNORM ***/ + +static void +x8r8g8b8_get_tile_rgba(unsigned *src, +                       unsigned w, unsigned h, +                       float *p, +                       unsigned dst_stride) +{ +   unsigned i, j; + +   for (i = 0; i < h; i++) { +      float *pRow = p; +      for (j = 0; j < w; j++, pRow += 4) { +         const unsigned pixel = *src++; +         pRow[0] = UBYTE_TO_FLOAT((pixel >> 16) & 0xff); +         pRow[1] = UBYTE_TO_FLOAT((pixel >>  8) & 0xff); +         pRow[2] = UBYTE_TO_FLOAT((pixel >>  0) & 0xff); +         pRow[3] = UBYTE_TO_FLOAT(0xff); +      } +      p += dst_stride; +   } +} + + +static void +x8r8g8b8_put_tile_rgba(unsigned *dst, +                       unsigned w, unsigned h, +                       const float *p, +                       unsigned src_stride) +{ +   unsigned i, j; + +   for (i = 0; i < h; i++) { +      const float *pRow = p; +      for (j = 0; j < w; j++, pRow += 4) { +         unsigned r, g, b; +         UNCLAMPED_FLOAT_TO_UBYTE(r, pRow[0]); +         UNCLAMPED_FLOAT_TO_UBYTE(g, pRow[1]); +         UNCLAMPED_FLOAT_TO_UBYTE(b, pRow[2]); +         *dst++ = (0xff << 24) | (r << 16) | (g << 8) | b; +      } +      p += src_stride; +   } +} + +  /*** PIPE_FORMAT_B8G8R8A8_UNORM ***/  static void @@ -339,7 +385,7 @@ z16_get_tile_rgba(ushort *src, -/*** PIPE_FORMAT_U_L8 ***/ +/*** PIPE_FORMAT_L8_UNORM ***/  static void  l8_get_tile_rgba(ubyte *src, @@ -362,7 +408,7 @@ l8_get_tile_rgba(ubyte *src,  } -/*** PIPE_FORMAT_U_A8 ***/ +/*** PIPE_FORMAT_A8_UNORM ***/  static void  a8_get_tile_rgba(ubyte *src, @@ -430,7 +476,7 @@ r16g16b16a16_put_tile_rgba(short *dst, -/*** PIPE_FORMAT_U_I8 ***/ +/*** PIPE_FORMAT_I8_UNORM ***/  static void  i8_get_tile_rgba(ubyte *src, @@ -453,7 +499,7 @@ i8_get_tile_rgba(ubyte *src,  } -/*** PIPE_FORMAT_U_A8_L8 ***/ +/*** PIPE_FORMAT_A8L8_UNORM ***/  static void  a8_l8_get_tile_rgba(ushort *src, @@ -647,6 +693,9 @@ pipe_get_tile_rgba(struct pipe_context *pipe,     case PIPE_FORMAT_A8R8G8B8_UNORM:        a8r8g8b8_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);        break; +   case PIPE_FORMAT_X8R8G8B8_UNORM: +      x8r8g8b8_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride); +      break;     case PIPE_FORMAT_B8G8R8A8_UNORM:        b8g8r8a8_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);        break; @@ -659,16 +708,16 @@ pipe_get_tile_rgba(struct pipe_context *pipe,     case PIPE_FORMAT_R5G6B5_UNORM:        r5g6b5_get_tile_rgba((ushort *) packed, w, h, p, dst_stride);        break; -   case PIPE_FORMAT_U_L8: +   case PIPE_FORMAT_L8_UNORM:        l8_get_tile_rgba((ubyte *) packed, w, h, p, dst_stride);        break; -   case PIPE_FORMAT_U_A8: +   case PIPE_FORMAT_A8_UNORM:        a8_get_tile_rgba((ubyte *) packed, w, h, p, dst_stride);        break; -   case PIPE_FORMAT_U_I8: +   case PIPE_FORMAT_I8_UNORM:        i8_get_tile_rgba((ubyte *) packed, w, h, p, dst_stride);        break; -   case PIPE_FORMAT_U_A8_L8: +   case PIPE_FORMAT_A8L8_UNORM:        a8_l8_get_tile_rgba((ushort *) packed, w, h, p, dst_stride);        break;     case PIPE_FORMAT_R16G16B16A16_SNORM: @@ -681,6 +730,7 @@ pipe_get_tile_rgba(struct pipe_context *pipe,        z32_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);        break;     case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_X8Z24_UNORM:        s8z24_get_tile_rgba((unsigned *) packed, w, h, p, dst_stride);        break;     case PIPE_FORMAT_Z24S8_UNORM: @@ -723,6 +773,9 @@ pipe_put_tile_rgba(struct pipe_context *pipe,     case PIPE_FORMAT_A8R8G8B8_UNORM:        a8r8g8b8_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);        break; +   case PIPE_FORMAT_X8R8G8B8_UNORM: +      x8r8g8b8_put_tile_rgba((unsigned *) packed, w, h, p, src_stride); +      break;     case PIPE_FORMAT_B8G8R8A8_UNORM:        b8g8r8a8_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);        break; @@ -734,16 +787,16 @@ pipe_put_tile_rgba(struct pipe_context *pipe,        break;     case PIPE_FORMAT_R8G8B8A8_UNORM:        break; -   case PIPE_FORMAT_U_L8: +   case PIPE_FORMAT_L8_UNORM:        /*l8_put_tile_rgba((ubyte *) packed, w, h, p, src_stride);*/        break; -   case PIPE_FORMAT_U_A8: +   case PIPE_FORMAT_A8_UNORM:        /*a8_put_tile_rgba((ubyte *) packed, w, h, p, src_stride);*/        break; -   case PIPE_FORMAT_U_I8: +   case PIPE_FORMAT_I8_UNORM:        /*i8_put_tile_rgba((ubyte *) packed, w, h, p, src_stride);*/        break; -   case PIPE_FORMAT_U_A8_L8: +   case PIPE_FORMAT_A8L8_UNORM:        /*a8_l8_put_tile_rgba((ushort *) packed, w, h, p, src_stride);*/        break;     case PIPE_FORMAT_R16G16B16A16_SNORM: @@ -756,6 +809,7 @@ pipe_put_tile_rgba(struct pipe_context *pipe,        /*z32_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/        break;     case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_X8Z24_UNORM:        /*s8z24_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/        break;     case PIPE_FORMAT_Z24S8_UNORM: @@ -800,6 +854,7 @@ pipe_get_tile_z(struct pipe_context *pipe,        }        break;     case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_X8Z24_UNORM:        {           const uint *pSrc              = (const uint *) pipe_surface_map(ps) + (y * ps->pitch + x); @@ -860,6 +915,7 @@ pipe_put_tile_z(struct pipe_context *pipe,        }        break;     case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_X8Z24_UNORM:        {           uint *pDest = (uint *) pipe_surface_map(ps) + (y * ps->pitch + x);           for (i = 0; i < h; i++) { diff --git a/src/gallium/auxiliary/util/u_blit.c b/src/gallium/auxiliary/util/u_blit.c index eec5e600c9..568d62ced1 100644 --- a/src/gallium/auxiliary/util/u_blit.c +++ b/src/gallium/auxiliary/util/u_blit.c @@ -57,6 +57,7 @@ struct blit_state     struct pipe_depth_stencil_alpha_state depthstencil;     struct pipe_rasterizer_state rasterizer;     struct pipe_sampler_state sampler; +   struct pipe_viewport_state viewport;     struct pipe_shader_state vert_shader;     struct pipe_shader_state frag_shader; @@ -100,7 +101,7 @@ util_create_blit(struct pipe_context *pipe, struct cso_context *cso)     memset(&ctx->rasterizer, 0, sizeof(ctx->rasterizer));     ctx->rasterizer.front_winding = PIPE_WINDING_CW;     ctx->rasterizer.cull_mode = PIPE_WINDING_NONE; -   ctx->rasterizer.bypass_clipping = 1;  /* bypasses viewport too */ +   ctx->rasterizer.bypass_clipping = 1;     /*ctx->rasterizer.bypass_vs = 1;*/     /* samplers */ @@ -113,8 +114,7 @@ util_create_blit(struct pipe_context *pipe, struct cso_context *cso)     ctx->sampler.mag_img_filter = 0; /* set later */     ctx->sampler.normalized_coords = 1; -#if 0 -   /* viewport */ +   /* viewport (identity, we setup vertices in wincoords) */     ctx->viewport.scale[0] = 1.0;     ctx->viewport.scale[1] = 1.0;     ctx->viewport.scale[2] = 1.0; @@ -123,7 +123,6 @@ util_create_blit(struct pipe_context *pipe, struct cso_context *cso)     ctx->viewport.translate[1] = 0.0;     ctx->viewport.translate[2] = 0.0;     ctx->viewport.translate[3] = 0.0; -#endif     /* vertex shader */     { @@ -265,6 +264,9 @@ util_blit_pixels(struct blit_state *ctx,        dstY1 = tmp;     } +   assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE)); +   assert(screen->is_format_supported(screen, dst->format, PIPE_SURFACE)); +     /*      * XXX for now we're always creating a temporary texture.      * Strictly speaking that's not always needed. @@ -293,6 +295,8 @@ util_blit_pixels(struct blit_state *ctx,                        src, srcLeft, srcTop, /* src */                        srcW, srcH);     /* size */ +   pipe->texture_update(pipe, tex, 0, 1 << 0); +     /* save state (restored below) */     cso_save_blend(ctx->cso);     cso_save_depth_stencil_alpha(ctx->cso); @@ -300,11 +304,15 @@ util_blit_pixels(struct blit_state *ctx,     cso_save_samplers(ctx->cso);     cso_save_sampler_textures(ctx->cso);     cso_save_framebuffer(ctx->cso); +   cso_save_fragment_shader(ctx->cso); +   cso_save_vertex_shader(ctx->cso); +   cso_save_viewport(ctx->cso);     /* set misc state we care about */     cso_set_blend(ctx->cso, &ctx->blend);     cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);     cso_set_rasterizer(ctx->cso, &ctx->rasterizer); +   cso_set_viewport(ctx->cso, &ctx->viewport);     /* sampler */     ctx->sampler.min_img_filter = filter; @@ -313,11 +321,11 @@ util_blit_pixels(struct blit_state *ctx,     cso_single_sampler_done(ctx->cso);     /* texture */ -   pipe->set_sampler_textures(pipe, 1, &tex); +   cso_set_sampler_textures(ctx->cso, 1, &tex);     /* shaders */ -   pipe->bind_fs_state(pipe, ctx->fs); -   pipe->bind_vs_state(pipe, ctx->vs); +   cso_set_fragment_shader_handle(ctx->cso, ctx->fs); +   cso_set_vertex_shader_handle(ctx->cso, ctx->vs);     /* drawing dest */     memset(&fb, 0, sizeof(fb)); @@ -344,6 +352,9 @@ util_blit_pixels(struct blit_state *ctx,     cso_restore_samplers(ctx->cso);     cso_restore_sampler_textures(ctx->cso);     cso_restore_framebuffer(ctx->cso); +   cso_restore_fragment_shader(ctx->cso); +   cso_restore_vertex_shader(ctx->cso); +   cso_restore_viewport(ctx->cso);     /* free the texture */     pipe_surface_reference(&texSurf, NULL); diff --git a/src/gallium/auxiliary/util/u_blit.h b/src/gallium/auxiliary/util/u_blit.h index 61f1d9bb32..0ce9732e62 100644 --- a/src/gallium/auxiliary/util/u_blit.h +++ b/src/gallium/auxiliary/util/u_blit.h @@ -30,7 +30,11 @@  #define U_BLIT_H +#ifdef __cplusplus +extern "C" { +#endif +     struct pipe_context;  struct pipe_surface;  struct cso_context; @@ -58,4 +62,8 @@ util_blit_pixels(struct blit_state *ctx,                   float z, uint filter); +#ifdef __cplusplus +} +#endif +  #endif diff --git a/src/gallium/auxiliary/util/u_double_list.h b/src/gallium/auxiliary/util/u_double_list.h index 8cb10c9820..d108d92e52 100644 --- a/src/gallium/auxiliary/util/u_double_list.h +++ b/src/gallium/auxiliary/util/u_double_list.h @@ -70,6 +70,14 @@ struct list_head      (__list)->prev = (__item);			\    } while(0) +#define LIST_REPLACE(__from, __to)		\ +  do {						\ +    (__to)->prev = (__from)->prev;		\ +    (__to)->next = (__from)->next;		\ +    (__from)->next->prev = (__to);		\ +    (__from)->prev->next = (__to);		\ +  } while (0) +  #define LIST_DEL(__item)			\    do {						\      (__item)->prev->next = (__item)->next;	\ diff --git a/src/gallium/auxiliary/util/u_gen_mipmap.c b/src/gallium/auxiliary/util/u_gen_mipmap.c index 2fd214d22e..c53c512268 100644 --- a/src/gallium/auxiliary/util/u_gen_mipmap.c +++ b/src/gallium/auxiliary/util/u_gen_mipmap.c @@ -61,6 +61,7 @@ struct gen_mipmap_state     struct pipe_depth_stencil_alpha_state depthstencil;     struct pipe_rasterizer_state rasterizer;     struct pipe_sampler_state sampler; +   struct pipe_viewport_state viewport;     struct pipe_shader_state vert_shader;     struct pipe_shader_state frag_shader; @@ -474,7 +475,9 @@ format_to_type_comps(enum pipe_format pformat,  {     switch (pformat) {     case PIPE_FORMAT_A8R8G8B8_UNORM: +   case PIPE_FORMAT_X8R8G8B8_UNORM:     case PIPE_FORMAT_B8G8R8A8_UNORM: +   case PIPE_FORMAT_B8G8R8X8_UNORM:        *datatype = UBYTE;        *comps = 4;        return; @@ -490,18 +493,21 @@ format_to_type_comps(enum pipe_format pformat,        *datatype = USHORT_5_6_5;        *comps = 3;        return; -   case PIPE_FORMAT_U_L8: -   case PIPE_FORMAT_U_A8: -   case PIPE_FORMAT_U_I8: +   case PIPE_FORMAT_L8_UNORM: +   case PIPE_FORMAT_A8_UNORM: +   case PIPE_FORMAT_I8_UNORM:        *datatype = UBYTE;        *comps = 1;        return; -   case PIPE_FORMAT_U_A8_L8: +   case PIPE_FORMAT_A8L8_UNORM:        *datatype = UBYTE;        *comps = 2;        return;     default:        assert(0); +      *datatype = UBYTE; +      *comps = 0; +      break;     }  } @@ -712,7 +718,7 @@ util_create_gen_mipmap(struct pipe_context *pipe,     memset(&ctx->rasterizer, 0, sizeof(ctx->rasterizer));     ctx->rasterizer.front_winding = PIPE_WINDING_CW;     ctx->rasterizer.cull_mode = PIPE_WINDING_NONE; -   ctx->rasterizer.bypass_clipping = 1;  /* bypasses viewport too */ +   ctx->rasterizer.bypass_clipping = 1;     /*ctx->rasterizer.bypass_vs = 1;*/     /* sampler state */ @@ -723,9 +729,7 @@ util_create_gen_mipmap(struct pipe_context *pipe,     ctx->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST;     ctx->sampler.normalized_coords = 1; - -#if 0 -   /* viewport */ +   /* viewport state (identity, verts are in wincoords) */     ctx->viewport.scale[0] = 1.0;     ctx->viewport.scale[1] = 1.0;     ctx->viewport.scale[2] = 1.0; @@ -734,7 +738,6 @@ util_create_gen_mipmap(struct pipe_context *pipe,     ctx->viewport.translate[1] = 0.0;     ctx->viewport.translate[2] = 0.0;     ctx->viewport.translate[3] = 0.0; -#endif     /* vertex shader */     { @@ -775,23 +778,23 @@ set_vertex_data(struct gen_mipmap_state *ctx, float width, float height)  {     void *buf; -   ctx->vertices[0][0][0] = -0.5f; /*x*/ -   ctx->vertices[0][0][1] = -0.5f; /*y*/ +   ctx->vertices[0][0][0] = 0.0f; /*x*/ +   ctx->vertices[0][0][1] = 0.0f; /*y*/     ctx->vertices[0][1][0] = 0.0f; /*s*/     ctx->vertices[0][1][1] = 0.0f; /*t*/ -   ctx->vertices[1][0][0] = width - 0.5f; /*x*/ -   ctx->vertices[1][0][1] = -0.5f;  /*y*/ -   ctx->vertices[1][1][0] = 1.0f; /*s*/ -   ctx->vertices[1][1][1] = 0.0f; /*t*/ +   ctx->vertices[1][0][0] = width; +   ctx->vertices[1][0][1] = 0.0f; +   ctx->vertices[1][1][0] = 1.0f; +   ctx->vertices[1][1][1] = 0.0f; -   ctx->vertices[2][0][0] = width - 0.5f; -   ctx->vertices[2][0][1] = height - 0.5f; +   ctx->vertices[2][0][0] = width; +   ctx->vertices[2][0][1] = height;     ctx->vertices[2][1][0] = 1.0f;     ctx->vertices[2][1][1] = 1.0f; -   ctx->vertices[3][0][0] = -0.5f; -   ctx->vertices[3][0][1] = height - 0.5f; +   ctx->vertices[3][0][0] = 0.0f; +   ctx->vertices[3][0][1] = height;     ctx->vertices[3][1][0] = 0.0f;     ctx->vertices[3][1][1] = 1.0f; @@ -825,26 +828,6 @@ util_destroy_gen_mipmap(struct gen_mipmap_state *ctx)  } -#if 0 -static void -simple_viewport(struct pipe_context *pipe, uint width, uint height) -{ -   struct pipe_viewport_state vp; - -   vp.scale[0] =  0.5 * width; -   vp.scale[1] = -0.5 * height; -   vp.scale[2] = 1.0; -   vp.scale[3] = 1.0; -   vp.translate[0] = 0.5 * width; -   vp.translate[1] = 0.5 * height; -   vp.translate[2] = 0.0; -   vp.translate[3] = 0.0; - -   pipe->set_viewport_state(pipe, &vp); -} -#endif - -  /**   * Generate mipmap images.  It's assumed all needed texture memory is   * already allocated. @@ -880,17 +863,18 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,     cso_save_samplers(ctx->cso);     cso_save_sampler_textures(ctx->cso);     cso_save_framebuffer(ctx->cso); +   cso_save_fragment_shader(ctx->cso); +   cso_save_vertex_shader(ctx->cso); +   cso_save_viewport(ctx->cso);     /* bind our state */     cso_set_blend(ctx->cso, &ctx->blend);     cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);     cso_set_rasterizer(ctx->cso, &ctx->rasterizer); +   cso_set_viewport(ctx->cso, &ctx->viewport); -   pipe->bind_vs_state(pipe, ctx->vs); -   pipe->bind_fs_state(pipe, ctx->fs); -#if 0 -   pipe->set_viewport_state(pipe, &ctx->viewport); -#endif +   cso_set_fragment_shader_handle(ctx->cso, ctx->fs); +   cso_set_vertex_shader_handle(ctx->cso, ctx->vs);     /* init framebuffer state */     memset(&fb, 0, sizeof(fb)); @@ -926,11 +910,8 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,        ctx->sampler.lod_bias = (float) srcLevel;        cso_single_sampler(ctx->cso, 0, &ctx->sampler);        cso_single_sampler_done(ctx->cso); -#if 0 -      simple_viewport(pipe, pt->width[dstLevel], pt->height[dstLevel]); -#endif -      pipe->set_sampler_textures(pipe, 1, &pt); +      cso_set_sampler_textures(ctx->cso, 1, &pt);        /* quad coords in window coords (bypassing clipping, viewport mapping) */        set_vertex_data(ctx, @@ -954,4 +935,7 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,     cso_restore_samplers(ctx->cso);     cso_restore_sampler_textures(ctx->cso);     cso_restore_framebuffer(ctx->cso); +   cso_restore_fragment_shader(ctx->cso); +   cso_restore_vertex_shader(ctx->cso); +   cso_restore_viewport(ctx->cso);  } diff --git a/src/gallium/auxiliary/util/u_gen_mipmap.h b/src/gallium/auxiliary/util/u_gen_mipmap.h index bd9af54fb7..3277024f07 100644 --- a/src/gallium/auxiliary/util/u_gen_mipmap.h +++ b/src/gallium/auxiliary/util/u_gen_mipmap.h @@ -31,6 +31,11 @@  #include "pipe/p_state.h" +#ifdef __cplusplus +extern "C" { +#endif + +     struct pipe_context;  struct pipe_texture;  struct cso_context; @@ -52,4 +57,9 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,                  struct pipe_texture *pt,                  uint face, uint baseLevel, uint lastLevel, uint filter); + +#ifdef __cplusplus +} +#endif +  #endif diff --git a/src/gallium/auxiliary/util/u_pack_color.h b/src/gallium/auxiliary/util/u_pack_color.h index cd13823985..0b917c005f 100644 --- a/src/gallium/auxiliary/util/u_pack_color.h +++ b/src/gallium/auxiliary/util/u_pack_color.h @@ -40,6 +40,94 @@  /** + * Pack ubyte R,G,B,A into dest pixel. + */ +static INLINE void +util_pack_color_ub(ubyte r, ubyte g, ubyte b, ubyte a, +                   enum pipe_format format, void *dest) +{ +   switch (format) { +   case PIPE_FORMAT_R8G8B8A8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (r << 24) | (g << 16) | (b << 8) | a; +      } +      return; +   case PIPE_FORMAT_R8G8B8X8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (r << 24) | (g << 16) | (b << 8) | 0xff; +      } +      return; +   case PIPE_FORMAT_A8R8G8B8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (a << 24) | (r << 16) | (g << 8) | b; +      } +      return; +   case PIPE_FORMAT_X8R8G8B8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (0xff << 24) | (r << 16) | (g << 8) | b; +      } +      return; +   case PIPE_FORMAT_B8G8R8A8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (b << 24) | (g << 16) | (r << 8) | a; +      } +      return; +   case PIPE_FORMAT_B8G8R8X8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (b << 24) | (g << 16) | (r << 8) | 0xff; +      } +      return; +   case PIPE_FORMAT_R5G6B5_UNORM: +      { +         ushort *d = (ushort *) dest; +         *d = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3); +      } +      return; +   case PIPE_FORMAT_A1R5G5B5_UNORM: +      { +         ushort *d = (ushort *) dest; +         *d = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3); +      } +      return; +   case PIPE_FORMAT_A4R4G4B4_UNORM: +      { +         ushort *d = (ushort *) dest; +         *d = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4); +      } +      return; +   case PIPE_FORMAT_R32G32B32A32_FLOAT: +      { +         float *d = (float *) dest; +         d[0] = (float)r / 255.0f; +         d[1] = (float)g / 255.0f; +         d[2] = (float)b / 255.0f; +         d[3] = (float)a / 255.0f; +      } +      return; +   case PIPE_FORMAT_R32G32B32_FLOAT: +      { +         float *d = (float *) dest; +         d[0] = (float)r / 255.0f; +         d[1] = (float)g / 255.0f; +         d[2] = (float)b / 255.0f; +      } +      return; + +   /* XXX lots more cases to add */ +   default: +      debug_print_format("gallium: unhandled format in util_pack_color_ub()", format); +      assert(0); +   } +} +  + +/**   * Note rgba outside [0,1] will be clamped for int pixel formats.   */  static INLINE void @@ -62,24 +150,54 @@ util_pack_color(const float rgba[4], enum pipe_format format, void *dest)           *d = (r << 24) | (g << 16) | (b << 8) | a;        }        return; +   case PIPE_FORMAT_R8G8B8X8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (r << 24) | (g << 16) | (b << 8) | 0xff; +      } +      return;     case PIPE_FORMAT_A8R8G8B8_UNORM:        {           uint *d = (uint *) dest;           *d = (a << 24) | (r << 16) | (g << 8) | b;        }        return; +   case PIPE_FORMAT_X8R8G8B8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (0xff << 24) | (r << 16) | (g << 8) | b; +      } +      return;     case PIPE_FORMAT_B8G8R8A8_UNORM:        {           uint *d = (uint *) dest;           *d = (b << 24) | (g << 16) | (r << 8) | a;        }        return; +   case PIPE_FORMAT_B8G8R8X8_UNORM: +      { +         uint *d = (uint *) dest; +         *d = (b << 24) | (g << 16) | (r << 8) | 0xff; +      } +      return;     case PIPE_FORMAT_R5G6B5_UNORM:        {           ushort *d = (ushort *) dest;           *d = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);        }        return; +   case PIPE_FORMAT_A1R5G5B5_UNORM: +      { +         ushort *d = (ushort *) dest; +         *d = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3); +      } +      return; +   case PIPE_FORMAT_A4R4G4B4_UNORM: +      { +         ushort *d = (ushort *) dest; +         *d = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4); +      } +      return;     case PIPE_FORMAT_R32G32B32A32_FLOAT:        {           float *d = (float *) dest; @@ -99,7 +217,8 @@ util_pack_color(const float rgba[4], enum pipe_format format, void *dest)        return;     /* XXX lots more cases to add */     default: -      debug_printf("gallium: unhandled format in util_pack_color()"); +      debug_print_format("gallium: unhandled format in util_pack_color()", format); +      assert(0);     }  } @@ -120,11 +239,14 @@ util_pack_z(enum pipe_format format, double z)        else           return (uint) (z * 0xffffffff);     case PIPE_FORMAT_S8Z24_UNORM: +   case PIPE_FORMAT_X8Z24_UNORM:        return (uint) (z * 0xffffff);     case PIPE_FORMAT_Z24S8_UNORM: +   case PIPE_FORMAT_Z24X8_UNORM:        return ((uint) (z * 0xffffff)) << 8;     default: -      debug_printf("gallium: unhandled fomrat in util_pack_z()"); +      debug_print_format("gallium: unhandled format in util_pack_z()", format); +      assert(0);        return 0;     }  } diff --git a/src/gallium/auxiliary/util/u_snprintf.c b/src/gallium/auxiliary/util/u_snprintf.c index 48426abcb7..c4f4bbd30c 100644 --- a/src/gallium/auxiliary/util/u_snprintf.c +++ b/src/gallium/auxiliary/util/u_snprintf.c @@ -166,8 +166,8 @@  #include <config.h>  #else  #ifdef WIN32 -#define vsnprintf rpl_vsnprintf -#define snprintf rpl_snprintf +#define vsnprintf util_vsnprintf +#define snprintf util_snprintf  #define HAVE_VSNPRINTF 0  #define HAVE_SNPRINTF 0  #define HAVE_VASPRINTF 1 /* not needed */ @@ -445,7 +445,7 @@ static UINTMAX_T myround(LDOUBLE);  static LDOUBLE mypow10(int);  int -rpl_vsnprintf(char *str, size_t size, const char *format, va_list args) +util_vsnprintf(char *str, size_t size, const char *format, va_list args)  {  	LDOUBLE fvalue;  	INTMAX_T value; @@ -1404,7 +1404,7 @@ mymemcpy(void *dst, void *src, size_t len)  #endif	/* NEED_MYMEMCPY */  int -rpl_vasprintf(char **ret, const char *format, va_list ap) +util_vasprintf(char **ret, const char *format, va_list ap)  {  	size_t size;  	int len; @@ -1422,10 +1422,10 @@ rpl_vasprintf(char **ret, const char *format, va_list ap)  #if !HAVE_SNPRINTF  #if HAVE_STDARG_H  int -rpl_snprintf(char *str, size_t size, const char *format, ...) +util_snprintf(char *str, size_t size, const char *format, ...)  #else  int -rpl_snprintf(va_alist) va_dcl +util_snprintf(va_alist) va_dcl  #endif	/* HAVE_STDARG_H */  {  #if !HAVE_STDARG_H @@ -1449,10 +1449,10 @@ rpl_snprintf(va_alist) va_dcl  #if !HAVE_ASPRINTF  #if HAVE_STDARG_H  int -rpl_asprintf(char **ret, const char *format, ...) +util_asprintf(char **ret, const char *format, ...)  #else  int -rpl_asprintf(va_alist) va_dcl +util_asprintf(va_alist) va_dcl  #endif	/* HAVE_STDARG_H */  {  #if !HAVE_STDARG_H diff --git a/src/gallium/auxiliary/util/u_string.h b/src/gallium/auxiliary/util/u_string.h new file mode 100644 index 0000000000..b99d4e8021 --- /dev/null +++ b/src/gallium/auxiliary/util/u_string.h @@ -0,0 +1,63 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +/** + * @file + * Platform independent functions for string manipulation. + *  + * @author Jose Fonseca <jrfonseca@tungstengraphics.com> + */ + +#ifndef U_STRING_H_ +#define U_STRING_H_ + +#ifndef WIN32 +#include <stdio.h> +#endif +#include <stddef.h> +#include <stdarg.h> + + +#ifdef __cplusplus +extern "C" { +#endif + +    +#ifdef WIN32 +int util_vsnprintf(char *, size_t, const char *, va_list); +int util_snprintf(char *str, size_t size, const char *format, ...); +#else +#define util_vsnprintf vsnprintf +#define util_snprintf snprintf +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* U_STRING_H_ */ diff --git a/src/gallium/auxiliary/util/u_time.c b/src/gallium/auxiliary/util/u_time.c new file mode 100644 index 0000000000..9b97050d51 --- /dev/null +++ b/src/gallium/auxiliary/util/u_time.c @@ -0,0 +1,162 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +/** + * @file + * OS independent time-manipulation functions. + *  + * @author Jose Fonseca <jrfonseca@tungstengraphics.com> + */ + + +#include "util/u_time.h" + +#if defined(PIPE_OS_LINUX) +#include <sys/time.h> +#elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) +#include <windows.h> +#include <winddi.h> +#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) +#include <windows.h> +#else +#error Unsupported OS +#endif + + +#if defined(PIPE_OS_WINDOWS) +static LONGLONG frequency = 0; +#if !defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) +#define EngQueryPerformanceFrequency(p) QueryPerformanceFrequency((LARGE_INTEGER*)(p)) +#define EngQueryPerformanceCounter(p) QueryPerformanceCounter((LARGE_INTEGER*)(p)) +#endif +#endif + + +void  +util_time_get(struct util_time *t) +{ +#if defined(PIPE_OS_LINUX) +   gettimeofday(&t->tv, NULL); +#elif defined(PIPE_OS_WINDOWS) +   EngQueryPerformanceCounter(&t->counter); +#endif +} + + +void  +util_time_add(const struct util_time *t1, +              int64_t usecs, +              struct util_time *t2) +{ +#if defined(PIPE_OS_LINUX) +   t2->tv.tv_sec = t1->tv.tv_sec + usecs / 1000000; +   t2->tv.tv_usec = t1->tv.tv_usec + usecs % 1000000; +#elif defined(PIPE_OS_WINDOWS) +   if(!frequency) +      EngQueryPerformanceFrequency(&frequency); +   t2->counter = t1->counter + (usecs * frequency + 999999LL)/1000000LL; +#endif +} + + +int64_t +util_time_diff(const struct util_time *t1,  +               const struct util_time *t2) +{ +#if defined(PIPE_OS_LINUX) +   return (t2->tv.tv_usec - t1->tv.tv_usec) +  +          (t2->tv.tv_sec - t1->tv.tv_sec)*1000000; +#elif defined(PIPE_OS_WINDOWS) +   if(!frequency) +      EngQueryPerformanceFrequency(&frequency); +   return (t2->counter - t1->counter)*1000000LL/frequency; +#endif +} + + +/** + * Compare two time values. + *  + * Not publicly available because it does not take in account wrap-arounds.  + * Use util_time_timeout instead. + */ +static INLINE int +util_time_compare(const struct util_time *t1,  +                  const struct util_time *t2) +{ +#if defined(PIPE_OS_LINUX) +   if (t1->tv.tv_sec < t2->tv.tv_sec) +      return -1; +   else if(t1->tv.tv_sec > t2->tv.tv_sec) +      return 1; +   else if (t1->tv.tv_usec < t2->tv.tv_usec) +      return -1; +   else if(t1->tv.tv_usec > t2->tv.tv_usec) +      return 1; +   else  +      return 0; +#elif defined(PIPE_OS_WINDOWS) +   if (t1->counter < t2->counter) +      return -1; +   else if(t1->counter > t2->counter) +      return 1; +   else  +      return 0; +#endif +} + + +boolean  +util_time_timeout(const struct util_time *start,  +                  const struct util_time *end, +                  const struct util_time *curr)  +{ +   if(util_time_compare(start, end) <= 0) +      return !(util_time_compare(start, curr) <= 0 && util_time_compare(curr, end) < 0); +   else +      return !(util_time_compare(start, curr) <= 0 || util_time_compare(curr, end) < 0); +} + + +#if defined(PIPE_OS_WINDOWS) +void util_time_sleep(unsigned usecs) +{ +   LONGLONG start, curr, end; +    +   EngQueryPerformanceCounter(&start); +    +   if(!frequency) +      EngQueryPerformanceFrequency(&frequency); +    +   end = start + (usecs * frequency + 999999LL)/1000000LL; +    +   do { +      EngQueryPerformanceCounter(&curr); +   } while(start <= curr && curr < end ||  +	   end < start && (curr < end || start <= curr)); +} +#endif diff --git a/src/gallium/auxiliary/util/u_time.h b/src/gallium/auxiliary/util/u_time.h new file mode 100644 index 0000000000..48ec7a4a96 --- /dev/null +++ b/src/gallium/auxiliary/util/u_time.h @@ -0,0 +1,101 @@ +/************************************************************************** + * + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +/** + * @file + * OS independent time-manipulation functions. + *  + * @author Jose Fonseca <jrfonseca@tungstengraphics.com> + */ + +#ifndef U_TIME_H_ +#define U_TIME_H_ + + +#include "pipe/p_config.h" + +#if defined(PIPE_OS_LINUX) +#include <time.h> /* timeval */ +#include <unistd.h> /* usleep */ +#endif + +#include "pipe/p_compiler.h" + + +#ifdef	__cplusplus +extern "C" { +#endif + + +/** + * Time abstraction. + *  + * Do not access this structure directly. Use the provided function instead. + */ +struct util_time  +{ +#if defined(PIPE_OS_LINUX) +   struct timeval tv; +#else +   long long counter; +#endif +}; +    + +void  +util_time_get(struct util_time *t); + +void  +util_time_add(const struct util_time *t1, +              int64_t usecs, +              struct util_time *t2); + +int64_t +util_time_diff(const struct util_time *t1,  +               const struct util_time *t2); + +/** + * Returns non-zero when the timeout expires. + */ +boolean  +util_time_timeout(const struct util_time *start,  +                  const struct util_time *end, +                  const struct util_time *curr); + +#if defined(PIPE_OS_LINUX) +#define util_time_sleep usleep +#else +void +util_time_sleep(unsigned usecs); +#endif + + +#ifdef	__cplusplus +} +#endif + +#endif /* U_TIME_H_ */ diff --git a/src/gallium/drivers/cell/ppu/cell_context.h b/src/gallium/drivers/cell/ppu/cell_context.h index 7f656a9744..8df41c1d4c 100644 --- a/src/gallium/drivers/cell/ppu/cell_context.h +++ b/src/gallium/drivers/cell/ppu/cell_context.h @@ -104,7 +104,9 @@ struct cell_context     uint num_textures;     struct pipe_viewport_state viewport;     struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; +   uint num_vertex_buffers;     struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS]; +   uint num_vertex_elements;     ubyte *cbuf_map[PIPE_MAX_COLOR_BUFS];     ubyte *zsbuf_map; diff --git a/src/gallium/drivers/cell/ppu/cell_draw_arrays.c b/src/gallium/drivers/cell/ppu/cell_draw_arrays.c index b896252f81..6e08cf6fe8 100644 --- a/src/gallium/drivers/cell/ppu/cell_draw_arrays.c +++ b/src/gallium/drivers/cell/ppu/cell_draw_arrays.c @@ -101,17 +101,6 @@ cell_draw_elements(struct pipe_context *pipe,     struct draw_context *draw = sp->draw;     unsigned i; -   /* first, check that the primitive is not malformed.  It is the -    * state tracker's responsibility to do send only correctly formed -    * primitives down.  It currently isn't doing that though... -    */ -#if 1 -   count = draw_trim_prim( mode, count ); -#else -   if (!draw_validate_prim( mode, count )) -      assert(0); -#endif -     if (sp->dirty)        cell_update_derived( sp ); @@ -123,14 +112,12 @@ cell_draw_elements(struct pipe_context *pipe,     /*      * Map vertex buffers      */ -   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { -      if (sp->vertex_buffer[i].buffer) { -         void *buf = pipe->winsys->buffer_map(pipe->winsys, -                                              sp->vertex_buffer[i].buffer, -                                              PIPE_BUFFER_USAGE_CPU_READ); -	 cell_flush_buffer_range(sp, buf, sp->vertex_buffer[i].buffer->size); -         draw_set_mapped_vertex_buffer(draw, i, buf); -      } +   for (i = 0; i < sp->num_vertex_buffers; i++) { +      void *buf = pipe->winsys->buffer_map(pipe->winsys, +                                           sp->vertex_buffer[i].buffer, +                                           PIPE_BUFFER_USAGE_CPU_READ); +      cell_flush_buffer_range(sp, buf, sp->vertex_buffer[i].buffer->size); +      draw_set_mapped_vertex_buffer(draw, i, buf);     }     /* Map index buffer, if present */     if (indexBuffer) { @@ -151,11 +138,9 @@ cell_draw_elements(struct pipe_context *pipe,     /*      * unmap vertex/index buffers - will cause draw module to flush      */ -   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { -      if (sp->vertex_buffer[i].buffer) { -         draw_set_mapped_vertex_buffer(draw, i, NULL); -         pipe->winsys->buffer_unmap(pipe->winsys, sp->vertex_buffer[i].buffer); -      } +   for (i = 0; i < sp->num_vertex_buffers; i++) { +      draw_set_mapped_vertex_buffer(draw, i, NULL); +      pipe->winsys->buffer_unmap(pipe->winsys, sp->vertex_buffer[i].buffer);     }     if (indexBuffer) {        draw_set_mapped_element_buffer(draw, 0, NULL); diff --git a/src/gallium/drivers/cell/ppu/cell_state_shader.c b/src/gallium/drivers/cell/ppu/cell_state_shader.c index fb2e940348..c3a3fbd066 100644 --- a/src/gallium/drivers/cell/ppu/cell_state_shader.c +++ b/src/gallium/drivers/cell/ppu/cell_state_shader.c @@ -30,33 +30,50 @@  #include "pipe/p_inlines.h"  #include "pipe/p_winsys.h"  #include "draw/draw_context.h" -#if 0 -#include "pipe/p_shader_tokens.h" -#include "gallivm/gallivm.h" -#include "tgsi/util/tgsi_dump.h" -#include "tgsi/exec/tgsi_sse2.h" -#endif +#include "tgsi/util/tgsi_parse.h"  #include "cell_context.h"  #include "cell_state.h" + +/** cast wrapper */ +static INLINE struct cell_fragment_shader_state * +cell_fragment_shader_state(void *shader) +{ +   return (struct pipe_shader_state *) shader; +} + + +/** cast wrapper */ +static INLINE struct cell_vertex_shader_state * +cell_vertex_shader_state(void *shader) +{ +   return (struct pipe_shader_state *) shader; +} + + +  static void *  cell_create_fs_state(struct pipe_context *pipe,                       const struct pipe_shader_state *templ)  {     /*struct cell_context *cell = cell_context(pipe);*/ -   struct cell_fragment_shader_state *state; +   struct cell_fragment_shader_state *cfs; -   state = CALLOC_STRUCT(cell_fragment_shader_state); -   if (!state) +   cfs = CALLOC_STRUCT(cell_fragment_shader_state); +   if (!cfs)        return NULL; -   state->shader = *templ; +   cfs->shader.tokens = tgsi_dup_tokens(templ->tokens); +   if (!cfs->shader.tokens) { +      FREE(cfs); +      return NULL; +   } -   tgsi_scan_shader(templ->tokens, &state->info); +   tgsi_scan_shader(templ->tokens, &cfs->info); -   return state; +   return cfs;  } @@ -65,7 +82,7 @@ cell_bind_fs_state(struct pipe_context *pipe, void *fs)  {     struct cell_context *cell = cell_context(pipe); -   cell->fs = (struct cell_fragment_shader_state *) fs; +   cell->fs = cell_fragment_shader_state(fs);     cell->dirty |= CELL_NEW_FS;  } @@ -74,10 +91,10 @@ cell_bind_fs_state(struct pipe_context *pipe, void *fs)  static void  cell_delete_fs_state(struct pipe_context *pipe, void *fs)  { -   struct cell_fragment_shader_state *state = -      (struct cell_fragment_shader_state *) fs; +   struct cell_fragment_shader_state *cfs = cell_fragment_shader_state(fs); -   FREE( state ); +   FREE((void *) cfs->shader.tokens); +   FREE(cfs);  } @@ -86,22 +103,28 @@ cell_create_vs_state(struct pipe_context *pipe,                       const struct pipe_shader_state *templ)  {     struct cell_context *cell = cell_context(pipe); -   struct cell_vertex_shader_state *state; +   struct cell_vertex_shader_state *cvs; -   state = CALLOC_STRUCT(cell_vertex_shader_state); -   if (!state) +   cvs = CALLOC_STRUCT(cell_vertex_shader_state); +   if (!cvs)        return NULL; -   state->shader = *templ; -   tgsi_scan_shader(templ->tokens, &state->info); +   cvs->shader.tokens = tgsi_dup_tokens(templ->tokens); +   if (!cvs->shader.tokens) { +      FREE(cvs); +      return NULL; +   } -   state->draw_data = draw_create_vertex_shader(cell->draw, &state->shader); -   if (state->draw_data == NULL) { -      FREE( state ); +   tgsi_scan_shader(templ->tokens, &cvs->info); + +   cvs->draw_data = draw_create_vertex_shader(cell->draw, &cvs->shader); +   if (cvs->draw_data == NULL) { +      FREE( (void *) cvs->shader.tokens ); +      FREE( cvs );        return NULL;     } -   return state; +   return cvs;  } @@ -110,7 +133,7 @@ cell_bind_vs_state(struct pipe_context *pipe, void *vs)  {     struct cell_context *cell = cell_context(pipe); -   cell->vs = (const struct cell_vertex_shader_state *) vs; +   cell->vs = cell_vertex_shader_state(vs);     draw_bind_vertex_shader(cell->draw,                             (cell->vs ? cell->vs->draw_data : NULL)); @@ -123,12 +146,11 @@ static void  cell_delete_vs_state(struct pipe_context *pipe, void *vs)  {     struct cell_context *cell = cell_context(pipe); +   struct cell_vertex_shader_state *cvs = cell_vertex_shader_state(vs); -   struct cell_vertex_shader_state *state = -      (struct cell_vertex_shader_state *) vs; - -   draw_delete_vertex_shader(cell->draw, state->draw_data); -   FREE( state ); +   draw_delete_vertex_shader(cell->draw, cvs->draw_data); +   FREE( (void *) cvs->shader.tokens ); +   FREE( cvs );  } diff --git a/src/gallium/drivers/cell/ppu/cell_state_vertex.c b/src/gallium/drivers/cell/ppu/cell_state_vertex.c index 6c83b8dc72..114684c2a3 100644 --- a/src/gallium/drivers/cell/ppu/cell_state_vertex.c +++ b/src/gallium/drivers/cell/ppu/cell_state_vertex.c @@ -45,6 +45,7 @@ cell_set_vertex_elements(struct pipe_context *pipe,     assert(count <= PIPE_MAX_ATTRIBS);     memcpy(cell->vertex_element, elements, count * sizeof(elements[0])); +   cell->num_vertex_elements = count;     cell->dirty |= CELL_NEW_VERTEX; @@ -62,6 +63,7 @@ cell_set_vertex_buffers(struct pipe_context *pipe,     assert(count <= PIPE_MAX_ATTRIBS);     memcpy(cell->vertex_buffer, buffers, count * sizeof(buffers[0])); +   cell->num_vertex_buffers = count;     cell->dirty |= CELL_NEW_VERTEX; diff --git a/src/gallium/drivers/i915simple/i915_context.c b/src/gallium/drivers/i915simple/i915_context.c index fee33d82de..4bef21619c 100644 --- a/src/gallium/drivers/i915simple/i915_context.c +++ b/src/gallium/drivers/i915simple/i915_context.c @@ -65,14 +65,12 @@ i915_draw_elements( struct pipe_context *pipe,     /*      * Map vertex buffers      */ -   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { -      if (i915->vertex_buffer[i].buffer) { -         void *buf -            = pipe->winsys->buffer_map(pipe->winsys, -                                       i915->vertex_buffer[i].buffer, -                                       PIPE_BUFFER_USAGE_CPU_READ); -         draw_set_mapped_vertex_buffer(draw, i, buf); -      } +   for (i = 0; i < i915->num_vertex_buffers; i++) { +      void *buf +         = pipe->winsys->buffer_map(pipe->winsys, +                                    i915->vertex_buffer[i].buffer, +                                    PIPE_BUFFER_USAGE_CPU_READ); +      draw_set_mapped_vertex_buffer(draw, i, buf);     }     /* Map index buffer, if present */     if (indexBuffer) { @@ -96,11 +94,9 @@ i915_draw_elements( struct pipe_context *pipe,     /*      * unmap vertex/index buffers      */ -   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { -      if (i915->vertex_buffer[i].buffer) { -         pipe->winsys->buffer_unmap(pipe->winsys, i915->vertex_buffer[i].buffer); -         draw_set_mapped_vertex_buffer(draw, i, NULL); -      } +   for (i = 0; i < i915->num_vertex_buffers; i++) { +      pipe->winsys->buffer_unmap(pipe->winsys, i915->vertex_buffer[i].buffer); +      draw_set_mapped_vertex_buffer(draw, i, NULL);     }     if (indexBuffer) {        pipe->winsys->buffer_unmap(pipe->winsys, indexBuffer); @@ -146,7 +142,7 @@ struct pipe_context *i915_create_context( struct pipe_screen *screen,      */     i915->draw = draw_create();     assert(i915->draw); -   if (GETENV("I915_VBUF")) { +   if (!GETENV("I915_NO_VBUF")) {        draw_set_rasterize_stage(i915->draw, i915_draw_vbuf_stage(i915));     }     else { diff --git a/src/gallium/drivers/i915simple/i915_context.h b/src/gallium/drivers/i915simple/i915_context.h index 8e707ea574..38e6a34884 100644 --- a/src/gallium/drivers/i915simple/i915_context.h +++ b/src/gallium/drivers/i915simple/i915_context.h @@ -238,6 +238,8 @@ struct i915_context     unsigned num_samplers;
     unsigned num_textures;
 +   unsigned num_vertex_elements;
 +   unsigned num_vertex_buffers;
     unsigned *batch_start;
 diff --git a/src/gallium/drivers/i915simple/i915_debug_fp.c b/src/gallium/drivers/i915simple/i915_debug_fp.c index 37a3508fe1..c024a051a5 100644 --- a/src/gallium/drivers/i915simple/i915_debug_fp.c +++ b/src/gallium/drivers/i915simple/i915_debug_fp.c @@ -333,12 +333,11 @@ void  i915_disassemble_program(struct debug_stream *stream,   			 const unsigned * program, unsigned sz)  { -   unsigned size = program[0] & 0x1ff;     unsigned i;     PRINTF(stream, "\t\tBEGIN\n"); -   assert(size + 2 == sz); +   assert((program[0] & 0x1ff) + 2 == sz);     program++;     for (i = 1; i < sz; i += 3, program += 3) { diff --git a/src/gallium/drivers/i915simple/i915_fpc_translate.c b/src/gallium/drivers/i915simple/i915_fpc_translate.c index 7b4fca5db1..3ccf74c72c 100644 --- a/src/gallium/drivers/i915simple/i915_fpc_translate.c +++ b/src/gallium/drivers/i915simple/i915_fpc_translate.c @@ -33,6 +33,7 @@  #include "i915_fpc.h"  #include "pipe/p_shader_tokens.h" +#include "util/u_string.h"  #include "tgsi/util/tgsi_parse.h"  #include "tgsi/util/tgsi_dump.h" @@ -122,7 +123,7 @@ i915_program_error(struct i915_fp_compile *p, const char *msg, ...)     debug_printf("i915_program_error: ");     va_start( args, msg );   -   vsprintf( buffer, msg, args ); +   util_vsnprintf( buffer, sizeof(buffer), msg, args );     va_end( args );     debug_printf(buffer);     debug_printf("\n"); diff --git a/src/gallium/drivers/i915simple/i915_prim_emit.c b/src/gallium/drivers/i915simple/i915_prim_emit.c index b6fb0a6d88..9ffa460138 100644 --- a/src/gallium/drivers/i915simple/i915_prim_emit.c +++ b/src/gallium/drivers/i915simple/i915_prim_emit.c @@ -26,7 +26,7 @@   **************************************************************************/ -#include "draw/draw_private.h" +#include "draw/draw_pipe.h"  #include "pipe/p_util.h"  #include "i915_context.h" @@ -78,9 +78,6 @@ emit_hw_vertex( struct i915_context *i915,        const uint j = vinfo->src_index[i];        const float *attrib = vertex->data[j];        switch (vinfo->emit[i]) { -      case EMIT_OMIT: -         /* no-op */ -         break;        case EMIT_1F:           OUT_BATCH( fui(attrib[0]) );           count++; diff --git a/src/gallium/drivers/i915simple/i915_screen.c b/src/gallium/drivers/i915simple/i915_screen.c index 839b98c0ce..646cfd921d 100644 --- a/src/gallium/drivers/i915simple/i915_screen.c +++ b/src/gallium/drivers/i915simple/i915_screen.c @@ -28,6 +28,7 @@  #include "pipe/p_util.h"  #include "pipe/p_winsys.h" +#include "util/u_string.h"  #include "i915_reg.h"  #include "i915_context.h" @@ -78,7 +79,7 @@ i915_get_name( struct pipe_screen *pscreen )        break;     } -   sprintf(buffer, "i915 (chipset: %s)", chipset); +   util_snprintf(buffer, sizeof(buffer), "i915 (chipset: %s)", chipset);     return buffer;  } @@ -153,10 +154,10 @@ i915_is_format_supported( struct pipe_screen *screen,        PIPE_FORMAT_R8G8B8A8_UNORM,        PIPE_FORMAT_A8R8G8B8_UNORM,        PIPE_FORMAT_R5G6B5_UNORM, -      PIPE_FORMAT_U_L8, -      PIPE_FORMAT_U_A8, -      PIPE_FORMAT_U_I8, -      PIPE_FORMAT_U_A8_L8, +      PIPE_FORMAT_L8_UNORM, +      PIPE_FORMAT_A8_UNORM, +      PIPE_FORMAT_I8_UNORM, +      PIPE_FORMAT_A8L8_UNORM,        PIPE_FORMAT_YCBCR,        PIPE_FORMAT_YCBCR_REV,        PIPE_FORMAT_S8Z24_UNORM, @@ -181,6 +182,7 @@ i915_is_format_supported( struct pipe_screen *screen,        break;     default:        assert(0); +      return FALSE;     }     for (i = 0; list[i] != PIPE_FORMAT_NONE; i++) { diff --git a/src/gallium/drivers/i915simple/i915_state.c b/src/gallium/drivers/i915simple/i915_state.c index 4404bc4590..4adeb37e86 100644 --- a/src/gallium/drivers/i915simple/i915_state.c +++ b/src/gallium/drivers/i915simple/i915_state.c @@ -33,6 +33,7 @@  #include "pipe/p_winsys.h"  #include "pipe/p_util.h"  #include "pipe/p_inlines.h" +#include "tgsi/util/tgsi_parse.h"  #include "i915_context.h"  #include "i915_reg.h" @@ -436,7 +437,7 @@ i915_create_fs_state(struct pipe_context *pipe,     if (!ifs)        return NULL; -   ifs->state = *templ; +   ifs->state.tokens = tgsi_dup_tokens(templ->tokens);     tgsi_scan_shader(templ->tokens, &ifs->info); @@ -465,6 +466,8 @@ void i915_delete_fs_state(struct pipe_context *pipe, void *shader)        FREE(ifs->program);     ifs->program_len = 0; +   FREE(ifs->state.tokens); +     FREE(ifs);  } @@ -549,6 +552,9 @@ static void i915_set_sampler_textures(struct pipe_context *pipe,         !memcmp(i915->texture, texture, num * sizeof(struct pipe_texture *)))        return; +   /* Fixes wrong texture in texobj with VBUF */ +   draw_flush(i915->draw); +     for (i = 0; i < num; i++)        pipe_texture_reference((struct pipe_texture **) &i915->texture[i],                               texture[i]); @@ -694,6 +700,8 @@ static void i915_set_vertex_buffers(struct pipe_context *pipe,     struct i915_context *i915 = i915_context(pipe);     memcpy(i915->vertex_buffer, buffers, count * sizeof(buffers[0])); +   i915->num_vertex_buffers = count; +     /* pass-through to draw module */     draw_set_vertex_buffers(i915->draw, count, buffers);  } @@ -703,6 +711,7 @@ static void i915_set_vertex_elements(struct pipe_context *pipe,                                       const struct pipe_vertex_element *elements)  {     struct i915_context *i915 = i915_context(pipe); +   i915->num_vertex_elements = count;     /* pass-through to draw module */     draw_set_vertex_elements(i915->draw, count, elements);  } diff --git a/src/gallium/drivers/i915simple/i915_state_sampler.c b/src/gallium/drivers/i915simple/i915_state_sampler.c index 84f6529a3a..982eec4a1b 100644 --- a/src/gallium/drivers/i915simple/i915_state_sampler.c +++ b/src/gallium/drivers/i915simple/i915_state_sampler.c @@ -131,13 +131,13 @@ static uint  translate_texture_format(enum pipe_format pipeFormat)  {     switch (pipeFormat) { -   case PIPE_FORMAT_U_L8: +   case PIPE_FORMAT_L8_UNORM:        return MAPSURF_8BIT | MT_8BIT_L8; -   case PIPE_FORMAT_U_I8: +   case PIPE_FORMAT_I8_UNORM:        return MAPSURF_8BIT | MT_8BIT_I8; -   case PIPE_FORMAT_U_A8: +   case PIPE_FORMAT_A8_UNORM:        return MAPSURF_8BIT | MT_8BIT_A8; -   case PIPE_FORMAT_U_A8_L8: +   case PIPE_FORMAT_A8L8_UNORM:        return MAPSURF_16BIT | MT_16BIT_AY88;     case PIPE_FORMAT_R5G6B5_UNORM:        return MAPSURF_16BIT | MT_16BIT_RGB565; diff --git a/src/gallium/drivers/i965simple/brw_screen.c b/src/gallium/drivers/i965simple/brw_screen.c index 5be369fe52..b700f7e4f5 100644 --- a/src/gallium/drivers/i965simple/brw_screen.c +++ b/src/gallium/drivers/i965simple/brw_screen.c @@ -28,6 +28,7 @@  #include "pipe/p_util.h"  #include "pipe/p_winsys.h" +#include "util/u_string.h"  #include "brw_context.h"  #include "brw_screen.h" @@ -66,7 +67,7 @@ brw_get_name( struct pipe_screen *screen )        break;     } -   sprintf(buffer, "i965 (chipset: %s)", chipset); +   util_snprintf(buffer, sizeof(buffer), "i965 (chipset: %s)", chipset);     return buffer;  } @@ -140,13 +141,13 @@ brw_is_format_supported( struct pipe_screen *screen,  #if 0     /* XXX: This is broken -- rewrite if still needed. */     static const unsigned tex_supported[] = { -      PIPE_FORMAT_U_R8_G8_B8_A8, -      PIPE_FORMAT_U_A8_R8_G8_B8, -      PIPE_FORMAT_U_R5_G6_B5, -      PIPE_FORMAT_U_L8, -      PIPE_FORMAT_U_A8, -      PIPE_FORMAT_U_I8, -      PIPE_FORMAT_U_L8_A8, +      PIPE_FORMAT_R8G8B8A8_UNORM, +      PIPE_FORMAT_A8R8G8B8_UNORM, +      PIPE_FORMAT_R5G6B5_UNORM, +      PIPE_FORMAT_L8_UNORM, +      PIPE_FORMAT_A8_UNORM, +      PIPE_FORMAT_I8_UNORM, +      PIPE_FORMAT_L8A8_UNORM,        PIPE_FORMAT_YCBCR,        PIPE_FORMAT_YCBCR_REV,        PIPE_FORMAT_S8_Z24, @@ -156,16 +157,16 @@ brw_is_format_supported( struct pipe_screen *screen,     /* Actually a lot more than this - add later:      */     static const unsigned render_supported[] = { -      PIPE_FORMAT_U_A8_R8_G8_B8, -      PIPE_FORMAT_U_R5_G6_B5, +      PIPE_FORMAT_A8R8G8B8_UNORM, +      PIPE_FORMAT_R5G6B5_UNORM,     };     /*      */     static const unsigned z_stencil_supported[] = { -      PIPE_FORMAT_U_Z16, -      PIPE_FORMAT_U_Z32, -      PIPE_FORMAT_S8_Z24, +      PIPE_FORMAT_Z16_UNORM, +      PIPE_FORMAT_Z32_UNORM, +      PIPE_FORMAT_S8Z24_UNORM,     };     switch (type) { diff --git a/src/gallium/drivers/i965simple/brw_state.c b/src/gallium/drivers/i965simple/brw_state.c index 376f1487b2..ac243b7e4f 100644 --- a/src/gallium/drivers/i965simple/brw_state.c +++ b/src/gallium/drivers/i965simple/brw_state.c @@ -35,6 +35,7 @@  #include "pipe/p_inlines.h"
  #include "pipe/p_shader_tokens.h"
  #include "tgsi/util/tgsi_dump.h"
 +#include "tgsi/util/tgsi_parse.h"
  #include "brw_context.h"
  #include "brw_defines.h"
 @@ -182,9 +183,7 @@ static void * brw_create_fs_state(struct pipe_context *pipe,  {
     struct brw_fragment_program *brw_fp = CALLOC_STRUCT(brw_fragment_program);
 -   /* XXX: Do I have to duplicate the tokens as well??
 -    */
 -   brw_fp->program = *shader;
 +   brw_fp->program.tokens = tgsi_dup_tokens(shader->tokens);
     brw_fp->id = brw_context(pipe)->program_id++;
     tgsi_scan_shader(shader->tokens, &brw_fp->info);
 @@ -210,7 +209,10 @@ static void brw_bind_fs_state(struct pipe_context *pipe, void *shader)  static void brw_delete_fs_state(struct pipe_context *pipe, void *shader)
  {
 -   FREE(shader);
 +   struct brw_fragment_program *brw_fp = (struct brw_fragment_program *) shader;
 +
 +   FREE((void *) brw_fp->program.tokens);
 +   FREE(brw_fp);
  }
 @@ -223,9 +225,7 @@ static void *brw_create_vs_state(struct pipe_context *pipe,  {
     struct brw_vertex_program *brw_vp = CALLOC_STRUCT(brw_vertex_program);
 -   /* XXX: Do I have to duplicate the tokens as well??
 -    */
 -   brw_vp->program = *shader;
 +   brw_vp->program.tokens = tgsi_dup_tokens(shader->tokens);
     brw_vp->id = brw_context(pipe)->program_id++;
     tgsi_scan_shader(shader->tokens, &brw_vp->info);
 @@ -251,7 +251,10 @@ static void brw_bind_vs_state(struct pipe_context *pipe, void *vs)  static void brw_delete_vs_state(struct pipe_context *pipe, void *shader)
  {
 -   FREE(shader);
 +   struct brw_vertex_program *brw_vp = (struct brw_vertex_program *) shader;
 +
 +   FREE((void *) brw_vp->program.tokens);
 +   FREE(brw_vp);
  }
 diff --git a/src/gallium/drivers/i965simple/brw_wm_surface_state.c b/src/gallium/drivers/i965simple/brw_wm_surface_state.c index 853c743ccf..69e56dc8bd 100644 --- a/src/gallium/drivers/i965simple/brw_wm_surface_state.c +++ b/src/gallium/drivers/i965simple/brw_wm_surface_state.c @@ -57,16 +57,16 @@ static unsigned translate_tex_target( enum pipe_texture_target target )  static unsigned translate_tex_format( enum pipe_format pipe_format )  {     switch( pipe_format ) { -   case PIPE_FORMAT_U_L8: +   case PIPE_FORMAT_L8_UNORM:        return BRW_SURFACEFORMAT_L8_UNORM; -   case PIPE_FORMAT_U_I8: +   case PIPE_FORMAT_I8_UNORM:        return BRW_SURFACEFORMAT_I8_UNORM; -   case PIPE_FORMAT_U_A8: +   case PIPE_FORMAT_A8_UNORM:        return BRW_SURFACEFORMAT_A8_UNORM; -   case PIPE_FORMAT_U_A8_L8: +   case PIPE_FORMAT_A8L8_UNORM:        return BRW_SURFACEFORMAT_L8A8_UNORM;     case PIPE_FORMAT_R8G8B8_UNORM: diff --git a/src/gallium/drivers/softpipe/Makefile b/src/gallium/drivers/softpipe/Makefile index f32db35d58..120bdfd9dd 100644 --- a/src/gallium/drivers/softpipe/Makefile +++ b/src/gallium/drivers/softpipe/Makefile @@ -17,7 +17,6 @@ C_SOURCES = \  	sp_quad.c \  	sp_quad_alpha_test.c \  	sp_quad_blend.c \ -	sp_quad_bufloop.c \  	sp_quad_colormask.c \  	sp_quad_coverage.c \  	sp_quad_depth_test.c \ @@ -28,6 +27,7 @@ C_SOURCES = \  	sp_quad_stencil.c \  	sp_quad_stipple.c \  	sp_screen.c \ +        sp_setup.c \  	sp_state_blend.c \  	sp_state_clip.c \  	sp_state_derived.c \ diff --git a/src/gallium/drivers/softpipe/SConscript b/src/gallium/drivers/softpipe/SConscript index 88c21ee3b0..c1f7daa8ab 100644 --- a/src/gallium/drivers/softpipe/SConscript +++ b/src/gallium/drivers/softpipe/SConscript @@ -14,9 +14,9 @@ softpipe = env.ConvenienceLibrary(  		'sp_flush.c',  		'sp_prim_setup.c',  		'sp_prim_vbuf.c', +		'sp_setup.c',  		'sp_quad_alpha_test.c',  		'sp_quad_blend.c', -		'sp_quad_bufloop.c',  		'sp_quad.c',  		'sp_quad_colormask.c',  		'sp_quad_coverage.c', diff --git a/src/gallium/drivers/softpipe/sp_clear.c b/src/gallium/drivers/softpipe/sp_clear.c index 39aed151c7..1236706891 100644 --- a/src/gallium/drivers/softpipe/sp_clear.c +++ b/src/gallium/drivers/softpipe/sp_clear.c @@ -49,6 +49,9 @@ softpipe_clear(struct pipe_context *pipe, struct pipe_surface *ps,     struct softpipe_context *softpipe = softpipe_context(pipe);     uint i; +   if (softpipe->no_rast) +      return; +  #if 0     softpipe_update_derived(softpipe); /* not needed?? */  #endif diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c index e298ed37c3..fe9cd8375e 100644 --- a/src/gallium/drivers/softpipe/sp_context.c +++ b/src/gallium/drivers/softpipe/sp_context.c @@ -98,7 +98,6 @@ static void softpipe_destroy( struct pipe_context *pipe )     softpipe->quad.stencil_test->destroy( softpipe->quad.stencil_test );     softpipe->quad.occlusion->destroy( softpipe->quad.occlusion );     softpipe->quad.coverage->destroy( softpipe->quad.coverage ); -   softpipe->quad.bufloop->destroy( softpipe->quad.bufloop );     softpipe->quad.blend->destroy( softpipe->quad.blend );     softpipe->quad.colormask->destroy( softpipe->quad.colormask );     softpipe->quad.output->destroy( softpipe->quad.output ); @@ -123,12 +122,12 @@ static void softpipe_destroy( struct pipe_context *pipe )  struct pipe_context *  softpipe_create( struct pipe_screen *screen,                   struct pipe_winsys *pipe_winsys, -                 struct softpipe_winsys *softpipe_winsys ) +                 void *unused )  {     struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);     uint i; -#if defined(__i386__) || defined(__386__) +#ifdef PIPE_ARCH_X86     softpipe->use_sse = GETENV( "GALLIUM_NOSSE" ) == NULL;  #else     softpipe->use_sse = FALSE; @@ -179,6 +178,8 @@ softpipe_create( struct pipe_screen *screen,     softpipe->pipe.draw_arrays = softpipe_draw_arrays;     softpipe->pipe.draw_elements = softpipe_draw_elements; +   softpipe->pipe.set_edgeflags = softpipe_set_edgeflags; +     softpipe->pipe.clear = softpipe_clear;     softpipe->pipe.flush = softpipe_flush; @@ -207,13 +208,10 @@ softpipe_create( struct pipe_screen *screen,     softpipe->quad.stencil_test = sp_quad_stencil_test_stage(softpipe);     softpipe->quad.occlusion = sp_quad_occlusion_stage(softpipe);     softpipe->quad.coverage = sp_quad_coverage_stage(softpipe); -   softpipe->quad.bufloop = sp_quad_bufloop_stage(softpipe);     softpipe->quad.blend = sp_quad_blend_stage(softpipe);     softpipe->quad.colormask = sp_quad_colormask_stage(softpipe);     softpipe->quad.output = sp_quad_output_stage(softpipe); -   softpipe->winsys = softpipe_winsys; -     /*      * Create drawing context and plug our rendering stage into it.      */ @@ -221,6 +219,9 @@ softpipe_create( struct pipe_screen *screen,     assert(softpipe->draw);     softpipe->setup = sp_draw_render_stage(softpipe); +   if (GETENV( "SP_NO_RAST" ) != NULL) +      softpipe->no_rast = TRUE; +     if (GETENV( "SP_VBUF" ) != NULL) {        sp_init_vbuf(softpipe);     } diff --git a/src/gallium/drivers/softpipe/sp_context.h b/src/gallium/drivers/softpipe/sp_context.h index dc9d0e6d5d..62eabfb30e 100644 --- a/src/gallium/drivers/softpipe/sp_context.h +++ b/src/gallium/drivers/softpipe/sp_context.h @@ -57,8 +57,6 @@ struct sp_vertex_shader;  struct softpipe_context {     struct pipe_context pipe;  /**< base class */ -   struct softpipe_winsys *winsys;	/**< window system interface */ -     /* The most recent drawing state as set by the driver:      */ @@ -83,6 +81,10 @@ struct softpipe_context {     unsigned num_samplers;     unsigned num_textures; +   unsigned num_vertex_elements; +   unsigned num_vertex_buffers; + +   boolean no_rast;     /* Counter for occlusion queries.  Note this supports overlapping      * queries. @@ -103,6 +105,8 @@ struct softpipe_context {     int psize_slot; +   unsigned reduced_api_prim;  /**< PIPE_PRIM_POINTS, _LINES or _TRIANGLES */ +  #if 0     /* Stipple derived state:      */ @@ -124,7 +128,6 @@ struct softpipe_context {        struct quad_stage *depth_test;        struct quad_stage *occlusion;        struct quad_stage *coverage; -      struct quad_stage *bufloop;        struct quad_stage *blend;        struct quad_stage *colormask;        struct quad_stage *output; @@ -138,8 +141,6 @@ struct softpipe_context {     struct draw_stage *vbuf;     struct softpipe_vbuf_render *vbuf_render; -   uint current_cbuf;      /**< current color buffer being written to */ -     struct softpipe_tile_cache *cbuf_cache[PIPE_MAX_COLOR_BUFS];     struct softpipe_tile_cache *zsbuf_cache; diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c b/src/gallium/drivers/softpipe/sp_draw_arrays.c index ab54050d3f..6c58f9909d 100644 --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c @@ -78,6 +78,20 @@ softpipe_unmap_constant_buffers(struct softpipe_context *sp)  } +static unsigned reduced_prim[PIPE_PRIM_POLYGON + 1] = { +   PIPE_PRIM_POINTS, +   PIPE_PRIM_LINES, +   PIPE_PRIM_LINES, +   PIPE_PRIM_LINES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES, +   PIPE_PRIM_TRIANGLES +}; + +  boolean  softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,                       unsigned start, unsigned count) @@ -104,17 +118,7 @@ softpipe_draw_elements(struct pipe_context *pipe,     struct draw_context *draw = sp->draw;     unsigned i; -   /* first, check that the primitive is not malformed.  It is the -    * state tracker's responsibility to do send only correctly formed -    * primitives down.  It currently isn't doing that though... -    */ -#if 1 -   count = draw_trim_prim( mode, count ); -#else -   if (!draw_validate_prim( mode, count )) -      assert(0); -#endif - +   sp->reduced_api_prim = reduced_prim[mode];     if (sp->dirty)        softpipe_update_derived( sp ); @@ -125,14 +129,12 @@ softpipe_draw_elements(struct pipe_context *pipe,     /*      * Map vertex buffers      */ -   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { -      if (sp->vertex_buffer[i].buffer) { -         void *buf -            = pipe->winsys->buffer_map(pipe->winsys, -                                       sp->vertex_buffer[i].buffer, -                                       PIPE_BUFFER_USAGE_CPU_READ); -         draw_set_mapped_vertex_buffer(draw, i, buf); -      } +   for (i = 0; i < sp->num_vertex_buffers; i++) { +      void *buf +         = pipe->winsys->buffer_map(pipe->winsys, +                                    sp->vertex_buffer[i].buffer, +                                    PIPE_BUFFER_USAGE_CPU_READ); +      draw_set_mapped_vertex_buffer(draw, i, buf);     }     /* Map index buffer, if present */     if (indexBuffer) { @@ -153,11 +155,9 @@ softpipe_draw_elements(struct pipe_context *pipe,     /*      * unmap vertex/index buffers - will cause draw module to flush      */ -   for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { -      if (sp->vertex_buffer[i].buffer) { -         draw_set_mapped_vertex_buffer(draw, i, NULL); -         pipe->winsys->buffer_unmap(pipe->winsys, sp->vertex_buffer[i].buffer); -      } +   for (i = 0; i < sp->num_vertex_buffers; i++) { +      draw_set_mapped_vertex_buffer(draw, i, NULL); +      pipe->winsys->buffer_unmap(pipe->winsys, sp->vertex_buffer[i].buffer);     }     if (indexBuffer) {        draw_set_mapped_element_buffer(draw, 0, NULL); @@ -170,3 +170,12 @@ softpipe_draw_elements(struct pipe_context *pipe,     return TRUE;  } + + +void +softpipe_set_edgeflags(struct pipe_context *pipe, const unsigned *edgeflags) +{ +   struct softpipe_context *sp = softpipe_context(pipe); +   draw_set_edgeflags(sp->draw, edgeflags); +} + diff --git a/src/gallium/drivers/softpipe/sp_fs_exec.c b/src/gallium/drivers/softpipe/sp_fs_exec.c index d5bd7a702f..0b199a2193 100644 --- a/src/gallium/drivers/softpipe/sp_fs_exec.c +++ b/src/gallium/drivers/softpipe/sp_fs_exec.c @@ -37,6 +37,7 @@  #include "pipe/p_util.h"  #include "pipe/p_inlines.h"  #include "tgsi/exec/tgsi_exec.h" +#include "tgsi/util/tgsi_parse.h"  struct sp_exec_fragment_shader {     struct sp_fragment_shader base; @@ -116,6 +117,7 @@ exec_run( const struct sp_fragment_shader *base,  static void   exec_delete( struct sp_fragment_shader *base )  { +   FREE((void *) base->shader.tokens);     FREE(base);  } @@ -137,7 +139,8 @@ softpipe_create_fs_exec(struct softpipe_context *softpipe,     if (!shader)        return NULL; -   shader->base.shader = *templ; +   /* we need to keep a local copy of the tokens */ +   shader->base.shader.tokens = tgsi_dup_tokens(templ->tokens);     shader->base.prepare = exec_prepare;     shader->base.run = exec_run;     shader->base.delete = exec_delete; diff --git a/src/gallium/drivers/softpipe/sp_fs_llvm.c b/src/gallium/drivers/softpipe/sp_fs_llvm.c index 07d058155f..6e1d9280bb 100644 --- a/src/gallium/drivers/softpipe/sp_fs_llvm.c +++ b/src/gallium/drivers/softpipe/sp_fs_llvm.c @@ -99,19 +99,19 @@ shade_quad_llvm(struct quad_stage *qs,        allvmrt(qss->stage.softpipe->fs->info.output_semantic_name[qss->colorOutSlot]               == TGSI_SEMANTIC_COLOR);        for (i = 0; i < QUAD_SIZE; ++i) { -         quad->outputs.color[0][i] = dests[i][qss->colorOutSlot][0]; -         quad->outputs.color[1][i] = dests[i][qss->colorOutSlot][1]; -         quad->outputs.color[2][i] = dests[i][qss->colorOutSlot][2]; -         quad->outputs.color[3][i] = dests[i][qss->colorOutSlot][3]; +         quad->outputs.color[0][0][i] = dests[i][qss->colorOutSlot][0]; +         quad->outputs.color[0][1][i] = dests[i][qss->colorOutSlot][1]; +         quad->outputs.color[0][2][i] = dests[i][qss->colorOutSlot][2]; +         quad->outputs.color[0][3][i] = dests[i][qss->colorOutSlot][3];        }     }  #if DLLVM     for (int i = 0; i < QUAD_SIZE; ++i) {        debug_printf("QLLVM%d(%d) [%f, %f, %f, %f]\n", i, qss->colorOutSlot, -             quad->outputs.color[0][i], -             quad->outputs.color[1][i], -             quad->outputs.color[2][i], -             quad->outputs.color[3][i]); +             quad->outputs.color[0][0][i], +             quad->outputs.color[0][1][i], +             quad->outputs.color[0][2][i], +             quad->outputs.color[0][3][i]);     }  #endif diff --git a/src/gallium/drivers/softpipe/sp_fs_sse.c b/src/gallium/drivers/softpipe/sp_fs_sse.c index 8095d662ee..55741cc1df 100644 --- a/src/gallium/drivers/softpipe/sp_fs_sse.c +++ b/src/gallium/drivers/softpipe/sp_fs_sse.c @@ -40,7 +40,7 @@  #include "tgsi/exec/tgsi_sse2.h" -#if defined(__i386__) || defined(__386__) +#ifdef PIPE_ARCH_X86  #include "rtasm/rtasm_x86sse.h" @@ -49,9 +49,10 @@  typedef void (XSTDCALL *codegen_function)(     const struct tgsi_exec_vector *input,     struct tgsi_exec_vector *output, -   float (*constant)[4], +   const float (*constant)[4],     struct tgsi_exec_vector *temporary, -   const struct tgsi_interp_coef *coef +   const struct tgsi_interp_coef *coef, +   float (*immediates)[4]     //, const struct tgsi_exec_vector *quadPos   ); @@ -60,14 +61,15 @@ struct sp_sse_fragment_shader {     struct sp_fragment_shader base;     struct x86_function             sse2_program;     codegen_function func; +   float immediates[TGSI_EXEC_NUM_IMMEDIATES][4];  };  static void -fs_sse_prepare( struct sp_fragment_shader *base, -	      struct tgsi_exec_machine *machine, -	      struct tgsi_sampler *samplers ) +fs_sse_prepare( const struct sp_fragment_shader *base, +		struct tgsi_exec_machine *machine, +		struct tgsi_sampler *samplers )  {  } @@ -78,9 +80,9 @@ fs_sse_prepare( struct sp_fragment_shader *base,   * TODO: process >1 quad at a time   */  static unsigned  -fs_sse_run( struct sp_fragment_shader *base, -	 struct tgsi_exec_machine *machine, -	 struct quad_header *quad ) +fs_sse_run( const struct sp_fragment_shader *base, +	    struct tgsi_exec_machine *machine, +	    struct quad_header *quad )  {     struct sp_sse_fragment_shader *shader = (struct sp_sse_fragment_shader *) base; @@ -96,7 +98,8 @@ fs_sse_run( struct sp_fragment_shader *base,  		 machine->Outputs,  		 machine->Consts,  		 machine->Temps, -		 machine->InterpCoefs +		 machine->InterpCoefs, +                 shader->immediates  		 //	 , &machine->QuadPos        ); @@ -129,13 +132,18 @@ softpipe_create_fs_sse(struct softpipe_context *softpipe,     x86_init_func( &shader->sse2_program ); -   if (!tgsi_emit_sse2_fs( templ->tokens, &shader->sse2_program )) { +   if (!tgsi_emit_sse2( templ->tokens, &shader->sse2_program, +                        shader->immediates, FALSE )) {        FREE(shader);        return NULL;     }     shader->func = (codegen_function) x86_get_func( &shader->sse2_program ); -   assert(shader->func); +   if (!shader->func) { +      x86_release_func( &shader->sse2_program ); +      FREE(shader); +      return NULL; +   }     shader->base.shader = *templ;     shader->base.prepare = fs_sse_prepare; diff --git a/src/gallium/drivers/softpipe/sp_headers.h b/src/gallium/drivers/softpipe/sp_headers.h index 9cf8222133..3d9ede69bb 100644 --- a/src/gallium/drivers/softpipe/sp_headers.h +++ b/src/gallium/drivers/softpipe/sp_headers.h @@ -31,6 +31,7 @@  #ifndef SP_HEADERS_H  #define SP_HEADERS_H +#include "pipe/p_state.h"  #include "tgsi/exec/tgsi_exec.h"  #define PRIM_POINT 1 @@ -66,7 +67,8 @@ struct quad_header {     unsigned prim:2;     /**< PRIM_POINT, LINE, TRI */     struct { -      float color[NUM_CHANNELS][QUAD_SIZE];	/* rrrr, gggg, bbbb, aaaa */ +      /** colors in SOA format (rrrr, gggg, bbbb, aaaa) */ +      float color[PIPE_MAX_COLOR_BUFS][NUM_CHANNELS][QUAD_SIZE];        float depth[QUAD_SIZE];     } outputs; diff --git a/src/gallium/drivers/softpipe/sp_prim_setup.c b/src/gallium/drivers/softpipe/sp_prim_setup.c index c7eb12b3bb..1cf9ffa632 100644 --- a/src/gallium/drivers/softpipe/sp_prim_setup.c +++ b/src/gallium/drivers/softpipe/sp_prim_setup.c @@ -26,7 +26,9 @@   **************************************************************************/  /** - * \brief  Primitive rasterization/rendering (points, lines, triangles) + * \brief A draw stage that drives our triangle setup routines from + * within the draw pipeline.  One of two ways to drive setup, the + * other being in sp_prim_vbuf.c.   *   * \author  Keith Whitwell <keith@tungstengraphics.com>   * \author  Brian Paul @@ -34,29 +36,12 @@  #include "sp_context.h" -#include "sp_headers.h" -#include "sp_quad.h" +#include "sp_setup.h"  #include "sp_state.h"  #include "sp_prim_setup.h" -#include "draw/draw_private.h" +#include "draw/draw_pipe.h"  #include "draw/draw_vertex.h"  #include "pipe/p_util.h" -#include "pipe/p_shader_tokens.h" - -#define DEBUG_VERTS 0 -#define DEBUG_FRAGS 0 - -/** - * Triangle edge info - */ -struct edge { -   float dx;		/**< X(v1) - X(v0), used only during setup */ -   float dy;		/**< Y(v1) - Y(v0), used only during setup */ -   float dxdy;		/**< dx/dy */ -   float sx, sy;	/**< first sample point coord */ -   int lines;		/**< number of lines on this edge */ -}; -  /**   * Triangle setup info (derived from draw_stage). @@ -65,39 +50,7 @@ struct edge {  struct setup_stage {     struct draw_stage stage; /**< This must be first (base class) */ -   struct softpipe_context *softpipe; - -   /* Vertices are just an array of floats making up each attribute in -    * turn.  Currently fixed at 4 floats, but should change in time. -    * Codegen will help cope with this. -    */ -   const struct vertex_header *vmax; -   const struct vertex_header *vmid; -   const struct vertex_header *vmin; -   const struct vertex_header *vprovoke; - -   struct edge ebot; -   struct edge etop; -   struct edge emaj; - -   float oneoverarea; - -   struct tgsi_interp_coef coef[PIPE_MAX_SHADER_INPUTS]; -   struct tgsi_interp_coef posCoef;  /* For Z, W */ -   struct quad_header quad;  - -   struct { -      int left[2];   /**< [0] = row0, [1] = row1 */ -      int right[2]; -      int y; -      unsigned y_flags; -      unsigned mask;     /**< mask of MASK_BOTTOM/TOP_LEFT/RIGHT bits */ -   } span; - -#if DEBUG_FRAGS -   uint numFragsEmitted;  /**< per primitive */ -   uint numFragsWritten;  /**< per primitive */ -#endif +   struct setup_context *setup;  }; @@ -111,1112 +64,49 @@ static INLINE struct setup_stage *setup_stage( struct draw_stage *stage )  } -/** - * Clip setup->quad against the scissor/surface bounds. - */ -static INLINE void -quad_clip(struct setup_stage *setup) -{ -   const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect; -   const int minx = (int) cliprect->minx; -   const int maxx = (int) cliprect->maxx; -   const int miny = (int) cliprect->miny; -   const int maxy = (int) cliprect->maxy; - -   if (setup->quad.x0 >= maxx || -       setup->quad.y0 >= maxy || -       setup->quad.x0 + 1 < minx || -       setup->quad.y0 + 1 < miny) { -      /* totally clipped */ -      setup->quad.mask = 0x0; -      return; -   } -   if (setup->quad.x0 < minx) -      setup->quad.mask &= (MASK_BOTTOM_RIGHT | MASK_TOP_RIGHT); -   if (setup->quad.y0 < miny) -      setup->quad.mask &= (MASK_BOTTOM_LEFT | MASK_BOTTOM_RIGHT); -   if (setup->quad.x0 == maxx - 1) -      setup->quad.mask &= (MASK_BOTTOM_LEFT | MASK_TOP_LEFT); -   if (setup->quad.y0 == maxy - 1) -      setup->quad.mask &= (MASK_TOP_LEFT | MASK_TOP_RIGHT); -} - - -/** - * Emit a quad (pass to next stage) with clipping. - */ -static INLINE void -clip_emit_quad(struct setup_stage *setup) -{ -   quad_clip(setup); -   if (setup->quad.mask) { -      struct softpipe_context *sp = setup->softpipe; -      sp->quad.first->run(sp->quad.first, &setup->quad); -   } -} - - -/** - * Emit a quad (pass to next stage).  No clipping is done. - */ -static INLINE void -emit_quad( struct setup_stage *setup, int x, int y, unsigned mask ) -{ -   struct softpipe_context *sp = setup->softpipe; -   setup->quad.x0 = x; -   setup->quad.y0 = y; -   setup->quad.mask = mask; -#if DEBUG_FRAGS -   if (mask & 1) setup->numFragsEmitted++; -   if (mask & 2) setup->numFragsEmitted++; -   if (mask & 4) setup->numFragsEmitted++; -   if (mask & 8) setup->numFragsEmitted++; -#endif -   sp->quad.first->run(sp->quad.first, &setup->quad); -#if DEBUG_FRAGS -   mask = setup->quad.mask; -   if (mask & 1) setup->numFragsWritten++; -   if (mask & 2) setup->numFragsWritten++; -   if (mask & 4) setup->numFragsWritten++; -   if (mask & 8) setup->numFragsWritten++; -#endif -} - - -/** - * Given an X or Y coordinate, return the block/quad coordinate that it - * belongs to. - */ -static INLINE int block( int x ) -{ -   return x & ~1; -} - - -/** - * Compute mask which indicates which pixels in the 2x2 quad are actually inside - * the triangle's bounds. - * - * this is pretty nasty...  may need to rework flush_spans again to - * fix it, if possible. - */ -static unsigned calculate_mask( struct setup_stage *setup, int x ) -{ -   unsigned mask = 0x0; - -   if (x >= setup->span.left[0] && x < setup->span.right[0])  -      mask |= MASK_TOP_LEFT; - -   if (x >= setup->span.left[1] && x < setup->span.right[1])  -      mask |= MASK_BOTTOM_LEFT; -       -   if (x+1 >= setup->span.left[0] && x+1 < setup->span.right[0])  -      mask |= MASK_TOP_RIGHT; - -   if (x+1 >= setup->span.left[1] && x+1 < setup->span.right[1])  -      mask |= MASK_BOTTOM_RIGHT; - -   return mask; -} - - -/** - * Render a horizontal span of quads - */ -static void flush_spans( struct setup_stage *setup ) -{ -   int minleft, maxright; -   int x; - -   switch (setup->span.y_flags) { -   case 0x3: -      /* both odd and even lines written (both quad rows) */ -      minleft = MIN2(setup->span.left[0], setup->span.left[1]); -      maxright = MAX2(setup->span.right[0], setup->span.right[1]); -      break; - -   case 0x1: -      /* only even line written (quad top row) */ -      minleft = setup->span.left[0]; -      maxright = setup->span.right[0]; -      break; - -   case 0x2: -      /* only odd line written (quad bottom row) */ -      minleft = setup->span.left[1]; -      maxright = setup->span.right[1]; -      break; - -   default: -      return; -   } - -   /* XXX this loop could be moved into the above switch cases and -    * calculate_mask() could be simplified a bit... -    */ -   for (x = block(minleft); x <= block(maxright); x += 2) { -      emit_quad( setup, x, setup->span.y,  -                 calculate_mask( setup, x ) ); -   } - -   setup->span.y = 0; -   setup->span.y_flags = 0; -   setup->span.right[0] = 0; -   setup->span.right[1] = 0; -} - -#if DEBUG_VERTS -static void print_vertex(const struct setup_stage *setup, -                         const struct vertex_header *v) -{ -   int i; -   debug_printf("Vertex: (%p)\n", v); -   for (i = 0; i < setup->quad.nr_attrs; i++) { -      debug_printf("  %d: %f %f %f %f\n",  i,  -              v->data[i][0], v->data[i][1], v->data[i][2], v->data[i][3]); -   } -} -#endif - -static boolean setup_sort_vertices( struct setup_stage *setup, -				      const struct prim_header *prim ) -{ -   const struct vertex_header *v0 = prim->v[0]; -   const struct vertex_header *v1 = prim->v[1]; -   const struct vertex_header *v2 = prim->v[2]; - -#if DEBUG_VERTS -   debug_printf("Triangle:\n"); -   print_vertex(setup, v0); -   print_vertex(setup, v1); -   print_vertex(setup, v2); -#endif - -   setup->vprovoke = v2; - -   /* determine bottom to top order of vertices */ -   { -      float y0 = v0->data[0][1]; -      float y1 = v1->data[0][1]; -      float y2 = v2->data[0][1]; -      if (y0 <= y1) { -	 if (y1 <= y2) { -	    /* y0<=y1<=y2 */ -	    setup->vmin = v0;    -	    setup->vmid = v1;    -	    setup->vmax = v2; -	 } -	 else if (y2 <= y0) { -	    /* y2<=y0<=y1 */ -	    setup->vmin = v2;    -	    setup->vmid = v0;    -	    setup->vmax = v1;    -	 } -	 else { -	    /* y0<=y2<=y1 */ -	    setup->vmin = v0;    -	    setup->vmid = v2;    -	    setup->vmax = v1;   -	 } -      } -      else { -	 if (y0 <= y2) { -	    /* y1<=y0<=y2 */ -	    setup->vmin = v1;    -	    setup->vmid = v0;    -	    setup->vmax = v2;   -	 } -	 else if (y2 <= y1) { -	    /* y2<=y1<=y0 */ -	    setup->vmin = v2;    -	    setup->vmid = v1;    -	    setup->vmax = v0;   -	 } -	 else { -	    /* y1<=y2<=y0 */ -	    setup->vmin = v1;    -	    setup->vmid = v2;    -	    setup->vmax = v0; -	 } -      } -   } - -   setup->ebot.dx = setup->vmid->data[0][0] - setup->vmin->data[0][0]; -   setup->ebot.dy = setup->vmid->data[0][1] - setup->vmin->data[0][1]; -   setup->emaj.dx = setup->vmax->data[0][0] - setup->vmin->data[0][0]; -   setup->emaj.dy = setup->vmax->data[0][1] - setup->vmin->data[0][1]; -   setup->etop.dx = setup->vmax->data[0][0] - setup->vmid->data[0][0]; -   setup->etop.dy = setup->vmax->data[0][1] - setup->vmid->data[0][1]; - -   /* -    * Compute triangle's area.  Use 1/area to compute partial -    * derivatives of attributes later. -    * -    * The area will be the same as prim->det, but the sign may be -    * different depending on how the vertices get sorted above. -    * -    * To determine whether the primitive is front or back facing we -    * use the prim->det value because its sign is correct. -    */ -   { -      const float area = (setup->emaj.dx * setup->ebot.dy -  -			    setup->ebot.dx * setup->emaj.dy); - -      setup->oneoverarea = 1.0f / area; -      /* -      debug_printf("%s one-over-area %f  area %f  det %f\n", -                   __FUNCTION__, setup->oneoverarea, area, prim->det ); -      */ -   } - -   /* We need to know if this is a front or back-facing triangle for: -    *  - the GLSL gl_FrontFacing fragment attribute (bool) -    *  - two-sided stencil test -    */ -   setup->quad.facing = (prim->det > 0.0) ^ (setup->softpipe->rasterizer->front_winding == PIPE_WINDING_CW); - -   return TRUE; -} - - -/** - * Compute a0 for a constant-valued coefficient (GL_FLAT shading). - * The value value comes from vertex->data[slot][i]. - * The result will be put into setup->coef[slot].a0[i]. - * \param slot  which attribute slot  - * \param i  which component of the slot (0..3) - */ -static void const_coeff( struct setup_stage *setup, -                         struct tgsi_interp_coef *coef, -                         uint vertSlot, uint i) -{ -   assert(i <= 3); - -   coef->dadx[i] = 0; -   coef->dady[i] = 0; -   /* need provoking vertex info! -    */ -   coef->a0[i] = setup->vprovoke->data[vertSlot][i]; -} - - -/** - * Compute a0, dadx and dady for a linearly interpolated coefficient, - * for a triangle. - */ -static void tri_linear_coeff( struct setup_stage *setup, -                              struct tgsi_interp_coef *coef, -                              uint vertSlot, uint i) -{ -   float botda = setup->vmid->data[vertSlot][i] - setup->vmin->data[vertSlot][i]; -   float majda = setup->vmax->data[vertSlot][i] - setup->vmin->data[vertSlot][i]; -   float a = setup->ebot.dy * majda - botda * setup->emaj.dy; -   float b = setup->emaj.dx * botda - majda * setup->ebot.dx; -   float dadx = a * setup->oneoverarea; -   float dady = b * setup->oneoverarea; - -   assert(i <= 3); - -   coef->dadx[i] = dadx; -   coef->dady[i] = dady; - -   /* calculate a0 as the value which would be sampled for the -    * fragment at (0,0), taking into account that we want to sample at -    * pixel centers, in other words (0.5, 0.5). -    * -    * this is neat but unfortunately not a good way to do things for -    * triangles with very large values of dadx or dady as it will -    * result in the subtraction and re-addition from a0 of a very -    * large number, which means we'll end up loosing a lot of the -    * fractional bits and precision from a0.  the way to fix this is -    * to define a0 as the sample at a pixel center somewhere near vmin -    * instead - i'll switch to this later. -    */ -   coef->a0[i] = (setup->vmin->data[vertSlot][i] -  -                  (dadx * (setup->vmin->data[0][0] - 0.5f) +  -                   dady * (setup->vmin->data[0][1] - 0.5f))); - -   /* -   debug_printf("attr[%d].%c: %f dx:%f dy:%f\n", -		slot, "xyzw"[i],  -		setup->coef[slot].a0[i], -		setup->coef[slot].dadx[i], -		setup->coef[slot].dady[i]); -   */ -} - - -/** - * Compute a0, dadx and dady for a perspective-corrected interpolant, - * for a triangle. - * We basically multiply the vertex value by 1/w before computing - * the plane coefficients (a0, dadx, dady). - * Later, when we compute the value at a particular fragment position we'll - * divide the interpolated value by the interpolated W at that fragment. - */ -static void tri_persp_coeff( struct setup_stage *setup, -                             struct tgsi_interp_coef *coef, -                             uint vertSlot, uint i) -{ -   /* premultiply by 1/w  (v->data[0][3] is always W): -    */ -   float mina = setup->vmin->data[vertSlot][i] * setup->vmin->data[0][3]; -   float mida = setup->vmid->data[vertSlot][i] * setup->vmid->data[0][3]; -   float maxa = setup->vmax->data[vertSlot][i] * setup->vmax->data[0][3]; -   float botda = mida - mina; -   float majda = maxa - mina; -   float a = setup->ebot.dy * majda - botda * setup->emaj.dy; -   float b = setup->emaj.dx * botda - majda * setup->ebot.dx; -   float dadx = a * setup->oneoverarea; -   float dady = b * setup->oneoverarea; -       -   /* -   debug_printf("tri persp %d,%d: %f %f %f\n", vertSlot, i, -          	setup->vmin->data[vertSlot][i], -          	setup->vmid->data[vertSlot][i], -       		setup->vmax->data[vertSlot][i] -          ); -   */ -   assert(i <= 3); - -   coef->dadx[i] = dadx; -   coef->dady[i] = dady; -   coef->a0[i] = (mina -  -                  (dadx * (setup->vmin->data[0][0] - 0.5f) +  -                   dady * (setup->vmin->data[0][1] - 0.5f))); -} - - -/** - * Special coefficient setup for gl_FragCoord. - * X and Y are trivial, though Y has to be inverted for OpenGL. - * Z and W are copied from posCoef which should have already been computed. - * We could do a bit less work if we'd examine gl_FragCoord's swizzle mask. - */  static void -setup_fragcoord_coeff(struct setup_stage *setup, uint slot) -{ -   /*X*/ -   setup->coef[slot].a0[0] = 0; -   setup->coef[slot].dadx[0] = 1.0; -   setup->coef[slot].dady[0] = 0.0; -   /*Y*/ -   if (setup->softpipe->rasterizer->origin_lower_left) { -      /* y=0=bottom */ -      const int winHeight = setup->softpipe->framebuffer.height; -      setup->coef[slot].a0[1] = (float) (winHeight - 1); -      setup->coef[slot].dady[1] = -1.0; -   } -   else { -      /* y=0=top */ -      setup->coef[slot].a0[1] = 0.0; -      setup->coef[slot].dady[1] = 1.0; -   } -   setup->coef[slot].dadx[1] = 0.0; -   /*Z*/ -   setup->coef[slot].a0[2] = setup->posCoef.a0[2]; -   setup->coef[slot].dadx[2] = setup->posCoef.dadx[2]; -   setup->coef[slot].dady[2] = setup->posCoef.dady[2]; -   /*W*/ -   setup->coef[slot].a0[3] = setup->posCoef.a0[3]; -   setup->coef[slot].dadx[3] = setup->posCoef.dadx[3]; -   setup->coef[slot].dady[3] = setup->posCoef.dady[3]; -} - - - -/** - * Compute the setup->coef[] array dadx, dady, a0 values. - * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized. - */ -static void setup_tri_coefficients( struct setup_stage *setup ) -{ -   struct softpipe_context *softpipe = setup->softpipe; -   const struct sp_fragment_shader *spfs = softpipe->fs; -   const struct vertex_info *vinfo = softpipe_get_vertex_info(softpipe); -   uint fragSlot; - -   /* z and w are done by linear interpolation: -    */ -   tri_linear_coeff(setup, &setup->posCoef, 0, 2); -   tri_linear_coeff(setup, &setup->posCoef, 0, 3); - -   /* setup interpolation for all the remaining attributes: -    */ -   for (fragSlot = 0; fragSlot < spfs->info.num_inputs; fragSlot++) { -      const uint vertSlot = vinfo->src_index[fragSlot]; -      uint j; - -      switch (vinfo->interp_mode[fragSlot]) { -      case INTERP_CONSTANT: -         for (j = 0; j < NUM_CHANNELS; j++) -            const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_LINEAR: -         for (j = 0; j < NUM_CHANNELS; j++) -            tri_linear_coeff(setup, &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_PERSPECTIVE: -         for (j = 0; j < NUM_CHANNELS; j++) -            tri_persp_coeff(setup, &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_POS: -         setup_fragcoord_coeff(setup, fragSlot); -         break; -      default: -         assert(0); -      } - -      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) { -         /* FOG.y = front/back facing  XXX fix this */ -         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.facing; -         setup->coef[fragSlot].dadx[1] = 0.0; -         setup->coef[fragSlot].dady[1] = 0.0; -      } -   } -} - - - -static void setup_tri_edges( struct setup_stage *setup ) -{ -   float vmin_x = setup->vmin->data[0][0] + 0.5f; -   float vmid_x = setup->vmid->data[0][0] + 0.5f; - -   float vmin_y = setup->vmin->data[0][1] - 0.5f; -   float vmid_y = setup->vmid->data[0][1] - 0.5f; -   float vmax_y = setup->vmax->data[0][1] - 0.5f; - -   setup->emaj.sy = CEILF(vmin_y); -   setup->emaj.lines = (int) CEILF(vmax_y - setup->emaj.sy); -   setup->emaj.dxdy = setup->emaj.dx / setup->emaj.dy; -   setup->emaj.sx = vmin_x + (setup->emaj.sy - vmin_y) * setup->emaj.dxdy; - -   setup->etop.sy = CEILF(vmid_y); -   setup->etop.lines = (int) CEILF(vmax_y - setup->etop.sy); -   setup->etop.dxdy = setup->etop.dx / setup->etop.dy; -   setup->etop.sx = vmid_x + (setup->etop.sy - vmid_y) * setup->etop.dxdy; - -   setup->ebot.sy = CEILF(vmin_y); -   setup->ebot.lines = (int) CEILF(vmid_y - setup->ebot.sy); -   setup->ebot.dxdy = setup->ebot.dx / setup->ebot.dy; -   setup->ebot.sx = vmin_x + (setup->ebot.sy - vmin_y) * setup->ebot.dxdy; -} - - -/** - * Render the upper or lower half of a triangle. - * Scissoring/cliprect is applied here too. - */ -static void subtriangle( struct setup_stage *setup, -			 struct edge *eleft, -			 struct edge *eright, -			 unsigned lines ) -{ -   const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect; -   const int minx = (int) cliprect->minx; -   const int maxx = (int) cliprect->maxx; -   const int miny = (int) cliprect->miny; -   const int maxy = (int) cliprect->maxy; -   int y, start_y, finish_y; -   int sy = (int)eleft->sy; - -   assert((int)eleft->sy == (int) eright->sy); - -   /* clip top/bottom */ -   start_y = sy; -   finish_y = sy + lines; - -   if (start_y < miny) -      start_y = miny; - -   if (finish_y > maxy) -      finish_y = maxy; - -   start_y -= sy; -   finish_y -= sy; - -   /* -   debug_printf("%s %d %d\n", __FUNCTION__, start_y, finish_y);   -   */ - -   for (y = start_y; y < finish_y; y++) { - -      /* avoid accumulating adds as floats don't have the precision to -       * accurately iterate large triangle edges that way.  luckily we -       * can just multiply these days. -       * -       * this is all drowned out by the attribute interpolation anyway. -       */ -      int left = (int)(eleft->sx + y * eleft->dxdy); -      int right = (int)(eright->sx + y * eright->dxdy); - -      /* clip left/right */ -      if (left < minx) -         left = minx; -      if (right > maxx) -         right = maxx; - -      if (left < right) { -         int _y = sy + y; -         if (block(_y) != setup->span.y) { -            flush_spans(setup); -            setup->span.y = block(_y); -         } - -         setup->span.left[_y&1] = left; -         setup->span.right[_y&1] = right; -         setup->span.y_flags |= 1<<(_y&1); -      } -   } - - -   /* save the values so that emaj can be restarted: -    */ -   eleft->sx += lines * eleft->dxdy; -   eright->sx += lines * eright->dxdy; -   eleft->sy += lines; -   eright->sy += lines; -} - - -/** - * Do setup for triangle rasterization, then render the triangle. - */ -static void setup_tri( struct draw_stage *stage, -		       struct prim_header *prim ) +do_tri(struct draw_stage *stage, struct prim_header *prim)  {     struct setup_stage *setup = setup_stage( stage ); -   /* -   debug_printf("%s\n", __FUNCTION__ ); -   */ - -#if DEBUG_FRAGS -   setup->numFragsEmitted = 0; -   setup->numFragsWritten = 0; -#endif - -   setup_sort_vertices( setup, prim ); -   setup_tri_coefficients( setup ); -   setup_tri_edges( setup ); - -   setup->quad.prim = PRIM_TRI; - -   setup->span.y = 0; -   setup->span.y_flags = 0; -   setup->span.right[0] = 0; -   setup->span.right[1] = 0; -   /*   setup->span.z_mode = tri_z_mode( setup->ctx ); */ - -   /*   init_constant_attribs( setup ); */ -       -   if (setup->oneoverarea < 0.0) { -      /* emaj on left: -       */ -      subtriangle( setup, &setup->emaj, &setup->ebot, setup->ebot.lines ); -      subtriangle( setup, &setup->emaj, &setup->etop, setup->etop.lines ); -   } -   else { -      /* emaj on right: -       */ -      subtriangle( setup, &setup->ebot, &setup->emaj, setup->ebot.lines ); -      subtriangle( setup, &setup->etop, &setup->emaj, setup->etop.lines ); -   } - -   flush_spans( setup ); - -#if DEBUG_FRAGS -   printf("Tri: %u frags emitted, %u written\n", -          setup->numFragsEmitted, -          setup->numFragsWritten); -#endif -} - - - -/** - * Compute a0, dadx and dady for a linearly interpolated coefficient, - * for a line. - */ -static void -line_linear_coeff(struct setup_stage *setup, -                  struct tgsi_interp_coef *coef, -                  uint vertSlot, uint i) -{ -   const float da = setup->vmax->data[vertSlot][i] - setup->vmin->data[vertSlot][i]; -   const float dadx = da * setup->emaj.dx * setup->oneoverarea; -   const float dady = da * setup->emaj.dy * setup->oneoverarea; -   coef->dadx[i] = dadx; -   coef->dady[i] = dady; -   coef->a0[i] = (setup->vmin->data[vertSlot][i] -  -                  (dadx * (setup->vmin->data[0][0] - 0.5f) +  -                   dady * (setup->vmin->data[0][1] - 0.5f))); -} - - -/** - * Compute a0, dadx and dady for a perspective-corrected interpolant, - * for a line. - */ -static void -line_persp_coeff(struct setup_stage *setup, -                  struct tgsi_interp_coef *coef, -                  uint vertSlot, uint i) -{ -   /* XXX double-check/verify this arithmetic */ -   const float a0 = setup->vmin->data[vertSlot][i] * setup->vmin->data[0][3]; -   const float a1 = setup->vmax->data[vertSlot][i] * setup->vmax->data[0][3]; -   const float da = a1 - a0; -   const float dadx = da * setup->emaj.dx * setup->oneoverarea; -   const float dady = da * setup->emaj.dy * setup->oneoverarea; -   coef->dadx[i] = dadx; -   coef->dady[i] = dady; -   coef->a0[i] = (setup->vmin->data[vertSlot][i] -  -                  (dadx * (setup->vmin->data[0][0] - 0.5f) +  -                   dady * (setup->vmin->data[0][1] - 0.5f))); -} - - -/** - * Compute the setup->coef[] array dadx, dady, a0 values. - * Must be called after setup->vmin,vmax are initialized. - */ -static INLINE void -setup_line_coefficients(struct setup_stage *setup, struct prim_header *prim) -{ -   struct softpipe_context *softpipe = setup->softpipe; -   const struct sp_fragment_shader *spfs = softpipe->fs; -   const struct vertex_info *vinfo = softpipe_get_vertex_info(softpipe); -   uint fragSlot; - -   /* use setup->vmin, vmax to point to vertices */ -   setup->vprovoke = prim->v[1]; -   setup->vmin = prim->v[0]; -   setup->vmax = prim->v[1]; - -   setup->emaj.dx = setup->vmax->data[0][0] - setup->vmin->data[0][0]; -   setup->emaj.dy = setup->vmax->data[0][1] - setup->vmin->data[0][1]; -   /* NOTE: this is not really 1/area */ -   setup->oneoverarea = 1.0f / (setup->emaj.dx * setup->emaj.dx + -                                setup->emaj.dy * setup->emaj.dy); - -   /* z and w are done by linear interpolation: -    */ -   line_linear_coeff(setup, &setup->posCoef, 0, 2); -   line_linear_coeff(setup, &setup->posCoef, 0, 3); - -   /* setup interpolation for all the remaining attributes: -    */ -   for (fragSlot = 0; fragSlot < spfs->info.num_inputs; fragSlot++) { -      const uint vertSlot = vinfo->src_index[fragSlot]; -      uint j; - -      switch (vinfo->interp_mode[fragSlot]) { -      case INTERP_CONSTANT: -         for (j = 0; j < NUM_CHANNELS; j++) -            const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_LINEAR: -         for (j = 0; j < NUM_CHANNELS; j++) -            line_linear_coeff(setup, &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_PERSPECTIVE: -         for (j = 0; j < NUM_CHANNELS; j++) -            line_persp_coeff(setup, &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_POS: -         setup_fragcoord_coeff(setup, fragSlot); -         break; -      default: -         assert(0); -      } - -      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) { -         /* FOG.y = front/back facing  XXX fix this */ -         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.facing; -         setup->coef[fragSlot].dadx[1] = 0.0; -         setup->coef[fragSlot].dady[1] = 0.0; -      } -   } +   setup_tri( setup->setup, +              prim->v[0]->data, +              prim->v[1]->data, +              prim->v[2]->data );  } - -/** - * Plot a pixel in a line segment. - */ -static INLINE void -plot(struct setup_stage *setup, int x, int y) -{ -   const int iy = y & 1; -   const int ix = x & 1; -   const int quadX = x - ix; -   const int quadY = y - iy; -   const int mask = (1 << ix) << (2 * iy); - -   if (quadX != setup->quad.x0 ||  -       quadY != setup->quad.y0)  -   { -      /* flush prev quad, start new quad */ - -      if (setup->quad.x0 != -1) -         clip_emit_quad(setup); - -      setup->quad.x0 = quadX; -      setup->quad.y0 = quadY; -      setup->quad.mask = 0x0; -   } - -   setup->quad.mask |= mask; -} - - -/** - * Do setup for line rasterization, then render the line. - * Single-pixel width, no stipple, etc.  We rely on the 'draw' module - * to handle stippling and wide lines. - */  static void -setup_line(struct draw_stage *stage, struct prim_header *prim) +do_line(struct draw_stage *stage, struct prim_header *prim)  { -   const struct vertex_header *v0 = prim->v[0]; -   const struct vertex_header *v1 = prim->v[1];     struct setup_stage *setup = setup_stage( stage ); -   int x0 = (int) v0->data[0][0]; -   int x1 = (int) v1->data[0][0]; -   int y0 = (int) v0->data[0][1]; -   int y1 = (int) v1->data[0][1]; -   int dx = x1 - x0; -   int dy = y1 - y0; -   int xstep, ystep; -   if (dx == 0 && dy == 0) -      return; - -   setup_line_coefficients(setup, prim); - -   if (dx < 0) { -      dx = -dx;   /* make positive */ -      xstep = -1; -   } -   else { -      xstep = 1; -   } - -   if (dy < 0) { -      dy = -dy;   /* make positive */ -      ystep = -1; -   } -   else { -      ystep = 1; -   } - -   assert(dx >= 0); -   assert(dy >= 0); - -   setup->quad.x0 = setup->quad.y0 = -1; -   setup->quad.mask = 0x0; -   setup->quad.prim = PRIM_LINE; -   /* XXX temporary: set coverage to 1.0 so the line appears -    * if AA mode happens to be enabled. -    */ -   setup->quad.coverage[0] = -   setup->quad.coverage[1] = -   setup->quad.coverage[2] = -   setup->quad.coverage[3] = 1.0; - -   if (dx > dy) { -      /*** X-major line ***/ -      int i; -      const int errorInc = dy + dy; -      int error = errorInc - dx; -      const int errorDec = error - dx; - -      for (i = 0; i < dx; i++) { -         plot(setup, x0, y0); - -         x0 += xstep; -         if (error < 0) { -            error += errorInc; -         } -         else { -            error += errorDec; -            y0 += ystep; -         } -      } -   } -   else { -      /*** Y-major line ***/ -      int i; -      const int errorInc = dx + dx; -      int error = errorInc - dy; -      const int errorDec = error - dy; - -      for (i = 0; i < dy; i++) { -         plot(setup, x0, y0); - -         y0 += ystep; -         if (error < 0) { -            error += errorInc; -         } -         else { -            error += errorDec; -            x0 += xstep; -         } -      } -   } - -   /* draw final quad */ -   if (setup->quad.mask) { -      clip_emit_quad(setup); -   } +   setup_line( setup->setup, +               prim->v[0]->data, +               prim->v[1]->data );  } -  static void -point_persp_coeff(struct setup_stage *setup, -                  const struct vertex_header *vert, -                  struct tgsi_interp_coef *coef, -                  uint vertSlot, uint i) -{ -   assert(i <= 3); -   coef->dadx[i] = 0.0F; -   coef->dady[i] = 0.0F; -   coef->a0[i] = vert->data[vertSlot][i] * vert->data[0][3]; -} - - -/** - * Do setup for point rasterization, then render the point. - * Round or square points... - * XXX could optimize a lot for 1-pixel points. - */ -static void -setup_point(struct draw_stage *stage, struct prim_header *prim) +do_point(struct draw_stage *stage, struct prim_header *prim)  {     struct setup_stage *setup = setup_stage( stage ); -   struct softpipe_context *softpipe = setup->softpipe; -   const struct sp_fragment_shader *spfs = softpipe->fs; -   const struct vertex_header *v0 = prim->v[0]; -   const int sizeAttr = setup->softpipe->psize_slot; -   const float size -      = sizeAttr > 0 ? v0->data[sizeAttr][0] -      : setup->softpipe->rasterizer->point_size; -   const float halfSize = 0.5F * size; -   const boolean round = (boolean) setup->softpipe->rasterizer->point_smooth; -   const float x = v0->data[0][0];  /* Note: data[0] is always position */ -   const float y = v0->data[0][1]; -   const struct vertex_info *vinfo = softpipe_get_vertex_info(softpipe); -   uint fragSlot; - -   /* For points, all interpolants are constant-valued. -    * However, for point sprites, we'll need to setup texcoords appropriately. -    * XXX: which coefficients are the texcoords??? -    * We may do point sprites as textured quads... -    * -    * KW: We don't know which coefficients are texcoords - ultimately -    * the choice of what interpolation mode to use for each attribute -    * should be determined by the fragment program, using -    * per-attribute declaration statements that include interpolation -    * mode as a parameter.  So either the fragment program will have -    * to be adjusted for pointsprite vs normal point behaviour, or -    * otherwise a special interpolation mode will have to be defined -    * which matches the required behaviour for point sprites.  But - -    * the latter is not a feature of normal hardware, and as such -    * probably should be ruled out on that basis. -    */ -   setup->vprovoke = prim->v[0]; - -   /* setup Z, W */ -   const_coeff(setup, &setup->posCoef, 0, 2); -   const_coeff(setup, &setup->posCoef, 0, 3); - -   for (fragSlot = 0; fragSlot < spfs->info.num_inputs; fragSlot++) { -      const uint vertSlot = vinfo->src_index[fragSlot]; -      uint j; - -      switch (vinfo->interp_mode[fragSlot]) { -      case INTERP_CONSTANT: -         /* fall-through */ -      case INTERP_LINEAR: -         for (j = 0; j < NUM_CHANNELS; j++) -            const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_PERSPECTIVE: -         for (j = 0; j < NUM_CHANNELS; j++) -            point_persp_coeff(setup, setup->vprovoke, -                              &setup->coef[fragSlot], vertSlot, j); -         break; -      case INTERP_POS: -         setup_fragcoord_coeff(setup, fragSlot); -         break; -      default: -         assert(0); -      } - -      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) { -         /* FOG.y = front/back facing  XXX fix this */ -         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.facing; -         setup->coef[fragSlot].dadx[1] = 0.0; -         setup->coef[fragSlot].dady[1] = 0.0; -      } -   } - -   setup->quad.prim = PRIM_POINT; - -   if (halfSize <= 0.5 && !round) { -      /* special case for 1-pixel points */ -      const int ix = ((int) x) & 1; -      const int iy = ((int) y) & 1; -      setup->quad.x0 = (int) x - ix; -      setup->quad.y0 = (int) y - iy; -      setup->quad.mask = (1 << ix) << (2 * iy); -      clip_emit_quad(setup); -   } -   else { -      if (round) { -         /* rounded points */ -         const int ixmin = block((int) (x - halfSize)); -         const int ixmax = block((int) (x + halfSize)); -         const int iymin = block((int) (y - halfSize)); -         const int iymax = block((int) (y + halfSize)); -         const float rmin = halfSize - 0.7071F;  /* 0.7071 = sqrt(2)/2 */ -         const float rmax = halfSize + 0.7071F; -         const float rmin2 = MAX2(0.0F, rmin * rmin); -         const float rmax2 = rmax * rmax; -         const float cscale = 1.0F / (rmax2 - rmin2); -         int ix, iy; - -         for (iy = iymin; iy <= iymax; iy += 2) { -            for (ix = ixmin; ix <= ixmax; ix += 2) { -               float dx, dy, dist2, cover; - -               setup->quad.mask = 0x0; - -               dx = (ix + 0.5f) - x; -               dy = (iy + 0.5f) - y; -               dist2 = dx * dx + dy * dy; -               if (dist2 <= rmax2) { -                  cover = 1.0F - (dist2 - rmin2) * cscale; -                  setup->quad.coverage[QUAD_TOP_LEFT] = MIN2(cover, 1.0f); -                  setup->quad.mask |= MASK_TOP_LEFT; -               } - -               dx = (ix + 1.5f) - x; -               dy = (iy + 0.5f) - y; -               dist2 = dx * dx + dy * dy; -               if (dist2 <= rmax2) { -                  cover = 1.0F - (dist2 - rmin2) * cscale; -                  setup->quad.coverage[QUAD_TOP_RIGHT] = MIN2(cover, 1.0f); -                  setup->quad.mask |= MASK_TOP_RIGHT; -               } -               dx = (ix + 0.5f) - x; -               dy = (iy + 1.5f) - y; -               dist2 = dx * dx + dy * dy; -               if (dist2 <= rmax2) { -                  cover = 1.0F - (dist2 - rmin2) * cscale; -                  setup->quad.coverage[QUAD_BOTTOM_LEFT] = MIN2(cover, 1.0f); -                  setup->quad.mask |= MASK_BOTTOM_LEFT; -               } - -               dx = (ix + 1.5f) - x; -               dy = (iy + 1.5f) - y; -               dist2 = dx * dx + dy * dy; -               if (dist2 <= rmax2) { -                  cover = 1.0F - (dist2 - rmin2) * cscale; -                  setup->quad.coverage[QUAD_BOTTOM_RIGHT] = MIN2(cover, 1.0f); -                  setup->quad.mask |= MASK_BOTTOM_RIGHT; -               } - -               if (setup->quad.mask) { -                  setup->quad.x0 = ix; -                  setup->quad.y0 = iy; -                  clip_emit_quad(setup); -               } -            } -         } -      } -      else { -         /* square points */ -         const int xmin = (int) (x + 0.75 - halfSize); -         const int ymin = (int) (y + 0.25 - halfSize); -         const int xmax = xmin + (int) size; -         const int ymax = ymin + (int) size; -         /* XXX could apply scissor to xmin,ymin,xmax,ymax now */ -         const int ixmin = block(xmin); -         const int ixmax = block(xmax - 1); -         const int iymin = block(ymin); -         const int iymax = block(ymax - 1); -         int ix, iy; - -         /* -         debug_printf("(%f, %f) -> X:%d..%d Y:%d..%d\n", x, y, xmin, xmax,ymin,ymax); -         */ -         for (iy = iymin; iy <= iymax; iy += 2) { -            uint rowMask = 0xf; -            if (iy < ymin) { -               /* above the top edge */ -               rowMask &= (MASK_BOTTOM_LEFT | MASK_BOTTOM_RIGHT); -            } -            if (iy + 1 >= ymax) { -               /* below the bottom edge */ -               rowMask &= (MASK_TOP_LEFT | MASK_TOP_RIGHT); -            } - -            for (ix = ixmin; ix <= ixmax; ix += 2) { -               uint mask = rowMask; - -               if (ix < xmin) { -                  /* fragment is past left edge of point, turn off left bits */ -                  mask &= (MASK_BOTTOM_RIGHT | MASK_TOP_RIGHT); -               } -               if (ix + 1 >= xmax) { -                  /* past the right edge */ -                  mask &= (MASK_BOTTOM_LEFT | MASK_TOP_LEFT); -               } -                   -               setup->quad.mask = mask; -               setup->quad.x0 = ix; -               setup->quad.y0 = iy; -               clip_emit_quad(setup); -            } -         } -      } -   } +   setup_point( setup->setup, +                prim->v[0]->data );  } +  static void setup_begin( struct draw_stage *stage )  {     struct setup_stage *setup = setup_stage(stage); -   struct softpipe_context *sp = setup->softpipe; -   const struct sp_fragment_shader *fs = setup->softpipe->fs; -   uint i; - -   if (sp->dirty) { -      softpipe_update_derived(sp); -   } -   /* Mark surfaces as defined now */ -   for (i = 0; i < sp->framebuffer.num_cbufs; i++){ -      if (sp->framebuffer.cbufs[i]) { -         sp->framebuffer.cbufs[i]->status = PIPE_SURFACE_STATUS_DEFINED; -      } -   } -   if (sp->framebuffer.zsbuf) { -      sp->framebuffer.zsbuf->status = PIPE_SURFACE_STATUS_DEFINED; -   } +   setup_prepare( setup->setup ); -   setup->quad.nr_attrs = fs->info.num_inputs; - -   sp->quad.first->begin(sp->quad.first); - -   stage->point = setup_point; -   stage->line = setup_line; -   stage->tri = setup_tri; +   stage->point = do_point; +   stage->line = do_line; +   stage->tri = do_tri;  } @@ -1260,6 +150,8 @@ static void reset_stipple_counter( struct draw_stage *stage )  static void render_destroy( struct draw_stage *stage )  { +   struct setup_stage *ssetup = setup_stage(stage); +   setup_destroy_context(ssetup->setup);     FREE( stage );  } @@ -1269,19 +161,29 @@ static void render_destroy( struct draw_stage *stage )   */  struct draw_stage *sp_draw_render_stage( struct softpipe_context *softpipe )  { -   struct setup_stage *setup = CALLOC_STRUCT(setup_stage); +   struct setup_stage *sstage = CALLOC_STRUCT(setup_stage); -   setup->softpipe = softpipe; -   setup->stage.draw = softpipe->draw; -   setup->stage.point = setup_first_point; -   setup->stage.line = setup_first_line; -   setup->stage.tri = setup_first_tri; -   setup->stage.flush = setup_flush; -   setup->stage.reset_stipple_counter = reset_stipple_counter; -   setup->stage.destroy = render_destroy; +   sstage->setup = setup_create_context(softpipe); +   sstage->stage.draw = softpipe->draw; +   sstage->stage.point = setup_first_point; +   sstage->stage.line = setup_first_line; +   sstage->stage.tri = setup_first_tri; +   sstage->stage.flush = setup_flush; +   sstage->stage.reset_stipple_counter = reset_stipple_counter; +   sstage->stage.destroy = render_destroy; -   setup->quad.coef = setup->coef; -   setup->quad.posCoef = &setup->posCoef; +   return (struct draw_stage *)sstage; +} -   return &setup->stage; +struct setup_context * +sp_draw_setup_context( struct draw_stage *stage ) +{ +   struct setup_stage *ssetup = setup_stage(stage); +   return ssetup->setup; +} + +void +sp_draw_flush( struct draw_stage *stage ) +{ +   stage->flush( stage, 0 );  } diff --git a/src/gallium/drivers/softpipe/sp_prim_setup.h b/src/gallium/drivers/softpipe/sp_prim_setup.h index f3e8a79dd9..49bdd98ed8 100644 --- a/src/gallium/drivers/softpipe/sp_prim_setup.h +++ b/src/gallium/drivers/softpipe/sp_prim_setup.h @@ -69,6 +69,12 @@ typedef void (*vbuf_draw_func)( struct pipe_context *pipe,  extern struct draw_stage *  sp_draw_render_stage( struct softpipe_context *softpipe ); +extern struct setup_context * +sp_draw_setup_context( struct draw_stage * ); + +extern void +sp_draw_flush( struct draw_stage * ); +  extern struct draw_stage *  sp_draw_vbuf_stage( struct draw_context *draw_context, diff --git a/src/gallium/drivers/softpipe/sp_prim_vbuf.c b/src/gallium/drivers/softpipe/sp_prim_vbuf.c index d940718ed2..e063fe82ef 100644 --- a/src/gallium/drivers/softpipe/sp_prim_vbuf.c +++ b/src/gallium/drivers/softpipe/sp_prim_vbuf.c @@ -1,8 +1,8 @@  /************************************************************************** - *  + *   * Copyright 2007 Tungsten Graphics, 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 @@ -10,11 +10,11 @@   * 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. @@ -22,7 +22,7 @@   * 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. - *  + *   **************************************************************************/  /** @@ -30,7 +30,7 @@   * softpipe rendering pipeline.   * Probably not desired in general, but useful for testing/debuggin.   * Enabled/Disabled with SP_VBUF env var. - *  + *   * Authors   *  Brian Paul   */ @@ -39,14 +39,16 @@  #include "sp_context.h"  #include "sp_state.h"  #include "sp_prim_vbuf.h" +#include "sp_prim_setup.h" +#include "sp_setup.h"  #include "draw/draw_context.h" -#include "draw/draw_private.h"  #include "draw/draw_vbuf.h"  #define SP_MAX_VBUF_INDEXES 1024  #define SP_MAX_VBUF_SIZE    4096 +typedef const float (*cptrf4)[4];  /**   * Subclass of vbuf_render. @@ -69,7 +71,6 @@ softpipe_vbuf_render(struct vbuf_render *vbr)  } -  static const struct vertex_info *  sp_vbuf_get_vertex_info(struct vbuf_render *vbr)  { @@ -91,7 +92,7 @@ sp_vbuf_allocate_vertices(struct vbuf_render *vbr,  static void -sp_vbuf_release_vertices(struct vbuf_render *vbr, void *vertices,  +sp_vbuf_release_vertices(struct vbuf_render *vbr, void *vertices,                             unsigned vertex_size, unsigned vertices_used)  {     struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr); @@ -105,6 +106,16 @@ static boolean  sp_vbuf_set_primitive(struct vbuf_render *vbr, unsigned prim)  {     struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr); + +   /* XXX: break this dependency - make setup_context live under +    * softpipe, rename the old "setup" draw stage to something else. +    */ +   struct setup_context *setup_ctx = sp_draw_setup_context(cvbr->softpipe->setup); +    +   setup_prepare( setup_ctx ); + + +     if (prim == PIPE_PRIM_TRIANGLES ||         prim == PIPE_PRIM_LINES ||         prim == PIPE_PRIM_POINTS) { @@ -114,31 +125,10 @@ sp_vbuf_set_primitive(struct vbuf_render *vbr, unsigned prim)     else {        return FALSE;     } -       +  } -/** - * Recalculate prim's determinant. - * XXX is this needed? - */ -static void -calc_det(struct prim_header *header) -{ -   /* Window coords: */ -   const float *v0 = header->v[0]->data[0]; -   const float *v1 = header->v[1]->data[0]; -   const float *v2 = header->v[2]->data[0]; - -   /* edge vectors e = v0 - v2, f = v1 - v2 */ -   const float ex = v0[0] - v2[0]; -   const float ey = v0[1] - v2[1]; -   const float fx = v1[0] - v2[0]; -   const float fy = v1[1] - v2[1]; -    -   /* det = cross(e,f).z */ -   header->det = ex * fy - ey * fx; -}  static void @@ -146,49 +136,59 @@ sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr_indices)  {     struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);     struct softpipe_context *softpipe = cvbr->softpipe; -   struct draw_stage *setup = softpipe->setup; -   struct prim_header prim;     unsigned vertex_size = softpipe->vertex_info_vbuf.size * sizeof(float);     unsigned i, j;     void *vertex_buffer = cvbr->vertex_buffer; +   cptrf4 v[3]; + +   /* XXX: break this dependency - make setup_context live under +    * softpipe, rename the old "setup" draw stage to something else. +    */ +   struct draw_stage *setup = softpipe->setup; +   struct setup_context *setup_ctx = sp_draw_setup_context(softpipe->setup); -   prim.det = 0; -   prim.reset_line_stipple = 0; -   prim.edgeflags = 0; -   prim.pad = 0;     switch (cvbr->prim) {     case PIPE_PRIM_TRIANGLES:        for (i = 0; i < nr_indices; i += 3) { -         for (j = 0; j < 3; j++)  -            prim.v[j] = (struct vertex_header *)((char *)vertex_buffer +  -                                                 indices[i+j] * vertex_size); -          -         calc_det(&prim); -         setup->tri( setup, &prim ); +         for (j = 0; j < 3; j++) +            v[j] = (cptrf4)((char *)vertex_buffer + +                             indices[i+j] * vertex_size); + +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2]);        }        break;     case PIPE_PRIM_LINES:        for (i = 0; i < nr_indices; i += 2) { -         for (j = 0; j < 2; j++)  -            prim.v[j] = (struct vertex_header *)((char *)vertex_buffer +  -                                                 indices[i+j] * vertex_size); -          -         setup->line( setup, &prim ); +         for (j = 0; j < 2; j++) +            v[j] = (cptrf4)((char *)vertex_buffer + +                            indices[i+j] * vertex_size); + +         setup_line( setup_ctx, +                     v[0], +                     v[1] );        }        break;     case PIPE_PRIM_POINTS:        for (i = 0; i < nr_indices; i++) { -         prim.v[0] = (struct vertex_header *)((char *)vertex_buffer +  -                                              indices[i] * vertex_size);          -         setup->point( setup, &prim ); +         v[0] = (cptrf4)((char *)vertex_buffer + +                         indices[i] * vertex_size); + +         setup_point( setup_ctx, +                      v[0] );        }        break;     } -   setup->flush( setup, 0 ); +   /* XXX: why are we calling this???  If we had to call something, it +    * would be a function in sp_setup.c: +    */ +   sp_draw_flush( setup );  } @@ -202,111 +202,123 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)     struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);     struct softpipe_context *softpipe = cvbr->softpipe;     struct draw_stage *setup = softpipe->setup; -   struct prim_header prim;     const void *vertex_buffer = cvbr->vertex_buffer;     const unsigned vertex_size = softpipe->vertex_info_vbuf.size * sizeof(float);     unsigned i; - -   prim.det = 0; -   prim.reset_line_stipple = 0; -   prim.edgeflags = 0; -   prim.pad = 0; +   struct setup_context *setup_ctx = sp_draw_setup_context(setup); +   cptrf4 v[3];  #define VERTEX(I) \ -   (struct vertex_header *) ((char *) vertex_buffer + (I) * vertex_size) +   (cptrf4) ((char *) vertex_buffer + (I) * vertex_size)     switch (cvbr->prim) {     case PIPE_PRIM_POINTS:        for (i = 0; i < nr; i++) { -         prim.v[0] = VERTEX(i); -         setup->point( setup, &prim ); +         v[0] = VERTEX(i); +         setup_point( setup_ctx, v[0] );        }        break;     case PIPE_PRIM_LINES:        assert(nr % 2 == 0);        for (i = 0; i < nr; i += 2) { -         prim.v[0] = VERTEX(i); -         prim.v[1] = VERTEX(i + 1); -         setup->line( setup, &prim ); +         v[0] = VERTEX(i); +         v[1] = VERTEX(i + 1); +         setup_line( setup_ctx, v[0], v[1] );        }        break;     case PIPE_PRIM_LINE_STRIP:        for (i = 1; i < nr; i++) { -         prim.v[0] = VERTEX(i - 1); -         prim.v[1] = VERTEX(i); -         setup->line( setup, &prim ); +         v[0] = VERTEX(i - 1); +         v[1] = VERTEX(i); +         setup_line( setup_ctx, v[0], v[1] );        }        break;     case PIPE_PRIM_TRIANGLES:        assert(nr % 3 == 0);        for (i = 0; i < nr; i += 3) { -         prim.v[0] = VERTEX(i + 0); -         prim.v[1] = VERTEX(i + 1); -         prim.v[2] = VERTEX(i + 2); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(i + 0); +         v[1] = VERTEX(i + 1); +         v[2] = VERTEX(i + 2); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] );        }        break;     case PIPE_PRIM_TRIANGLE_STRIP:        assert(nr >= 3);        for (i = 2; i < nr; i++) { -         prim.v[0] = VERTEX(i - 2); -         prim.v[1] = VERTEX(i - 1); -         prim.v[2] = VERTEX(i); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(i - 2); +         v[1] = VERTEX(i - 1); +         v[2] = VERTEX(i); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] );        }        break;     case PIPE_PRIM_TRIANGLE_FAN:        assert(nr >= 3);        for (i = 2; i < nr; i++) { -         prim.v[0] = VERTEX(0); -         prim.v[1] = VERTEX(i - 1); -         prim.v[2] = VERTEX(i); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(0); +         v[1] = VERTEX(i - 1); +         v[2] = VERTEX(i); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] );        }        break;     case PIPE_PRIM_QUADS:        assert(nr % 4 == 0);        for (i = 0; i < nr; i += 4) { -         prim.v[0] = VERTEX(i + 0); -         prim.v[1] = VERTEX(i + 1); -         prim.v[2] = VERTEX(i + 2); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(i + 0); +         v[1] = VERTEX(i + 1); +         v[2] = VERTEX(i + 2); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] ); -         prim.v[0] = VERTEX(i + 0); -         prim.v[1] = VERTEX(i + 2); -         prim.v[2] = VERTEX(i + 3); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(i + 0); +         v[1] = VERTEX(i + 2); +         v[2] = VERTEX(i + 3); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] );        }        break;     case PIPE_PRIM_QUAD_STRIP:        assert(nr >= 4);        for (i = 2; i < nr; i += 2) { -         prim.v[0] = VERTEX(i - 2); -         prim.v[1] = VERTEX(i); -         prim.v[2] = VERTEX(i + 1); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(i - 2); +         v[1] = VERTEX(i); +         v[2] = VERTEX(i + 1); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] ); -         prim.v[0] = VERTEX(i - 2); -         prim.v[1] = VERTEX(i + 1); -         prim.v[2] = VERTEX(i - 1); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(i - 2); +         v[1] = VERTEX(i + 1); +         v[2] = VERTEX(i - 1); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] );        }        break;     case PIPE_PRIM_POLYGON:        /* draw as tri fan */        for (i = 2; i < nr; i++) { -         prim.v[0] = VERTEX(0); -         prim.v[1] = VERTEX(i - 1); -         prim.v[2] = VERTEX(i); -         calc_det(&prim); -         setup->tri( setup, &prim ); +         v[0] = VERTEX(0); +         v[1] = VERTEX(i - 1); +         v[2] = VERTEX(i); +         setup_tri( setup_ctx, +                    v[0], +                    v[1], +                    v[2] );        }        break;     default: diff --git a/src/gallium/drivers/softpipe/sp_quad.c b/src/gallium/drivers/softpipe/sp_quad.c index 8603c1a367..bc83d78ea1 100644 --- a/src/gallium/drivers/softpipe/sp_quad.c +++ b/src/gallium/drivers/softpipe/sp_quad.c @@ -76,15 +76,6 @@ sp_build_quad_pipeline(struct softpipe_context *sp)        sp_push_quad_first( sp, sp->quad.blend );     } -   if (sp->framebuffer.num_cbufs == 1) { -      /* the usual case: write to exactly one colorbuf */ -      sp->current_cbuf = 0; -   } -   else { -      /* insert bufloop stage */ -      sp_push_quad_first( sp, sp->quad.bufloop ); -   } -     if (sp->depth_stencil->depth.occlusion_count) {        sp_push_quad_first( sp, sp->quad.occlusion );     } diff --git a/src/gallium/drivers/softpipe/sp_quad.h b/src/gallium/drivers/softpipe/sp_quad.h index f1e0281764..08513cb95f 100644 --- a/src/gallium/drivers/softpipe/sp_quad.h +++ b/src/gallium/drivers/softpipe/sp_quad.h @@ -58,7 +58,6 @@ struct quad_stage *sp_quad_stencil_test_stage( struct softpipe_context *softpipe  struct quad_stage *sp_quad_depth_test_stage( struct softpipe_context *softpipe );  struct quad_stage *sp_quad_occlusion_stage( struct softpipe_context *softpipe );  struct quad_stage *sp_quad_coverage_stage( struct softpipe_context *softpipe ); -struct quad_stage *sp_quad_bufloop_stage( struct softpipe_context *softpipe );  struct quad_stage *sp_quad_blend_stage( struct softpipe_context *softpipe );  struct quad_stage *sp_quad_colormask_stage( struct softpipe_context *softpipe );  struct quad_stage *sp_quad_output_stage( struct softpipe_context *softpipe ); diff --git a/src/gallium/drivers/softpipe/sp_quad_alpha_test.c b/src/gallium/drivers/softpipe/sp_quad_alpha_test.c index 318916fe30..7a42b08ef5 100644 --- a/src/gallium/drivers/softpipe/sp_quad_alpha_test.c +++ b/src/gallium/drivers/softpipe/sp_quad_alpha_test.c @@ -16,7 +16,8 @@ alpha_test_quad(struct quad_stage *qs, struct quad_header *quad)     struct softpipe_context *softpipe = qs->softpipe;     const float ref = softpipe->depth_stencil->alpha.ref;     unsigned passMask = 0x0, j; -   const float *aaaa = quad->outputs.color[3]; +   const uint cbuf = 0; /* only output[0].alpha is tested */ +   const float *aaaa = quad->outputs.color[cbuf][3];     switch (softpipe->depth_stencil->alpha.func) {     case PIPE_FUNC_NEVER: @@ -25,7 +26,7 @@ alpha_test_quad(struct quad_stage *qs, struct quad_header *quad)     case PIPE_FUNC_LESS:        /*         * If mask were an array [4] we could do this SIMD-style: -       * passMask = (quad->outputs.color[3] <= vec4(ref)); +       * passMask = (quad->outputs.color[0][3] <= vec4(ref));         */        for (j = 0; j < QUAD_SIZE; j++) {           if (aaaa[j] < ref) { diff --git a/src/gallium/drivers/softpipe/sp_quad_blend.c b/src/gallium/drivers/softpipe/sp_quad_blend.c index 0b79cfa1ed..74c6bff84a 100644 --- a/src/gallium/drivers/softpipe/sp_quad_blend.c +++ b/src/gallium/drivers/softpipe/sp_quad_blend.c @@ -101,114 +101,119 @@ static void  logicop_quad(struct quad_stage *qs, struct quad_header *quad)  {     struct softpipe_context *softpipe = qs->softpipe; -   float dest[4][QUAD_SIZE]; -   ubyte src[4][4], dst[4][4], res[4][4]; -   uint *src4 = (uint *) src; -   uint *dst4 = (uint *) dst; -   uint *res4 = (uint *) res; -   struct softpipe_cached_tile * -      tile = sp_get_cached_tile(softpipe, -                                softpipe->cbuf_cache[softpipe->current_cbuf], -                                quad->x0, quad->y0); -   float (*quadColor)[4] = quad->outputs.color; -   uint i, j; +   uint cbuf; -   /* get/swizzle dest colors */ -   for (j = 0; j < QUAD_SIZE; j++) { -      int x = (quad->x0 & (TILE_SIZE-1)) + (j & 1); -      int y = (quad->y0 & (TILE_SIZE-1)) + (j >> 1); -      for (i = 0; i < 4; i++) { -         dest[i][j] = tile->data.color[y][x][i]; +   /* loop over colorbuffer outputs */ +   for (cbuf = 0; cbuf < softpipe->framebuffer.num_cbufs; cbuf++) { +      float dest[4][QUAD_SIZE]; +      ubyte src[4][4], dst[4][4], res[4][4]; +      uint *src4 = (uint *) src; +      uint *dst4 = (uint *) dst; +      uint *res4 = (uint *) res; +      struct softpipe_cached_tile * +         tile = sp_get_cached_tile(softpipe, +                                   softpipe->cbuf_cache[cbuf], +                                   quad->x0, quad->y0); +      float (*quadColor)[4] = quad->outputs.color[cbuf]; +      uint i, j; + +      /* get/swizzle dest colors */ +      for (j = 0; j < QUAD_SIZE; j++) { +         int x = (quad->x0 & (TILE_SIZE-1)) + (j & 1); +         int y = (quad->y0 & (TILE_SIZE-1)) + (j >> 1); +         for (i = 0; i < 4; i++) { +            dest[i][j] = tile->data.color[y][x][i]; +         }        } -   } -   /* convert to ubyte */ -   for (j = 0; j < 4; j++) { /* loop over R,G,B,A channels */ -      UNCLAMPED_FLOAT_TO_UBYTE(dst[j][0], dest[j][0]); /* P0 */ -      UNCLAMPED_FLOAT_TO_UBYTE(dst[j][1], dest[j][1]); /* P1 */ -      UNCLAMPED_FLOAT_TO_UBYTE(dst[j][2], dest[j][2]); /* P2 */ -      UNCLAMPED_FLOAT_TO_UBYTE(dst[j][3], dest[j][3]); /* P3 */ +      /* convert to ubyte */ +      for (j = 0; j < 4; j++) { /* loop over R,G,B,A channels */ +         UNCLAMPED_FLOAT_TO_UBYTE(dst[j][0], dest[j][0]); /* P0 */ +         UNCLAMPED_FLOAT_TO_UBYTE(dst[j][1], dest[j][1]); /* P1 */ +         UNCLAMPED_FLOAT_TO_UBYTE(dst[j][2], dest[j][2]); /* P2 */ +         UNCLAMPED_FLOAT_TO_UBYTE(dst[j][3], dest[j][3]); /* P3 */ -      UNCLAMPED_FLOAT_TO_UBYTE(src[j][0], quadColor[j][0]); /* P0 */ -      UNCLAMPED_FLOAT_TO_UBYTE(src[j][1], quadColor[j][1]); /* P1 */ -      UNCLAMPED_FLOAT_TO_UBYTE(src[j][2], quadColor[j][2]); /* P2 */ -      UNCLAMPED_FLOAT_TO_UBYTE(src[j][3], quadColor[j][3]); /* P3 */ -   } +         UNCLAMPED_FLOAT_TO_UBYTE(src[j][0], quadColor[j][0]); /* P0 */ +         UNCLAMPED_FLOAT_TO_UBYTE(src[j][1], quadColor[j][1]); /* P1 */ +         UNCLAMPED_FLOAT_TO_UBYTE(src[j][2], quadColor[j][2]); /* P2 */ +         UNCLAMPED_FLOAT_TO_UBYTE(src[j][3], quadColor[j][3]); /* P3 */ +      } -   switch (softpipe->blend->logicop_func) { -   case PIPE_LOGICOP_CLEAR: -      for (j = 0; j < 4; j++) -         res4[j] = 0; -      break; -   case PIPE_LOGICOP_NOR: -      for (j = 0; j < 4; j++) -         res4[j] = ~(src4[j] | dst4[j]); -      break; -   case PIPE_LOGICOP_AND_INVERTED: -      for (j = 0; j < 4; j++) -         res4[j] = ~src4[j] & dst4[j]; -      break; -   case PIPE_LOGICOP_COPY_INVERTED: -      for (j = 0; j < 4; j++) -         res4[j] = ~src4[j]; -      break; -   case PIPE_LOGICOP_AND_REVERSE: -      for (j = 0; j < 4; j++) -         res4[j] = src4[j] & ~dst4[j]; -      break; -   case PIPE_LOGICOP_INVERT: -      for (j = 0; j < 4; j++) -         res4[j] = ~dst4[j]; -      break; -   case PIPE_LOGICOP_XOR: -      for (j = 0; j < 4; j++) -         res4[j] = dst4[j] ^ src4[j]; -      break; -   case PIPE_LOGICOP_NAND: -      for (j = 0; j < 4; j++) -         res4[j] = ~(src4[j] & dst4[j]); -      break; -   case PIPE_LOGICOP_AND: -      for (j = 0; j < 4; j++) -         res4[j] = src4[j] & dst4[j]; -      break; -   case PIPE_LOGICOP_EQUIV: -      for (j = 0; j < 4; j++) -         res4[j] = ~(src4[j] ^ dst4[j]); -      break; -   case PIPE_LOGICOP_NOOP: -      for (j = 0; j < 4; j++) -         res4[j] = dst4[j]; -      break; -   case PIPE_LOGICOP_OR_INVERTED: -      for (j = 0; j < 4; j++) -         res4[j] = ~src4[j] | dst4[j]; -      break; -   case PIPE_LOGICOP_COPY: -      for (j = 0; j < 4; j++) -         res4[j] = src4[j]; -      break; -   case PIPE_LOGICOP_OR_REVERSE: -      for (j = 0; j < 4; j++) -         res4[j] = src4[j] | ~dst4[j]; -      break; -   case PIPE_LOGICOP_OR: -      for (j = 0; j < 4; j++) -         res4[j] = src4[j] | dst4[j]; -      break; -   case PIPE_LOGICOP_SET: -      for (j = 0; j < 4; j++) -         res4[j] = ~0; -      break; -   default: -      assert(0); -   } +      switch (softpipe->blend->logicop_func) { +      case PIPE_LOGICOP_CLEAR: +         for (j = 0; j < 4; j++) +            res4[j] = 0; +         break; +      case PIPE_LOGICOP_NOR: +         for (j = 0; j < 4; j++) +            res4[j] = ~(src4[j] | dst4[j]); +         break; +      case PIPE_LOGICOP_AND_INVERTED: +         for (j = 0; j < 4; j++) +            res4[j] = ~src4[j] & dst4[j]; +         break; +      case PIPE_LOGICOP_COPY_INVERTED: +         for (j = 0; j < 4; j++) +            res4[j] = ~src4[j]; +         break; +      case PIPE_LOGICOP_AND_REVERSE: +         for (j = 0; j < 4; j++) +            res4[j] = src4[j] & ~dst4[j]; +         break; +      case PIPE_LOGICOP_INVERT: +         for (j = 0; j < 4; j++) +            res4[j] = ~dst4[j]; +         break; +      case PIPE_LOGICOP_XOR: +         for (j = 0; j < 4; j++) +            res4[j] = dst4[j] ^ src4[j]; +         break; +      case PIPE_LOGICOP_NAND: +         for (j = 0; j < 4; j++) +            res4[j] = ~(src4[j] & dst4[j]); +         break; +      case PIPE_LOGICOP_AND: +         for (j = 0; j < 4; j++) +            res4[j] = src4[j] & dst4[j]; +         break; +      case PIPE_LOGICOP_EQUIV: +         for (j = 0; j < 4; j++) +            res4[j] = ~(src4[j] ^ dst4[j]); +         break; +      case PIPE_LOGICOP_NOOP: +         for (j = 0; j < 4; j++) +            res4[j] = dst4[j]; +         break; +      case PIPE_LOGICOP_OR_INVERTED: +         for (j = 0; j < 4; j++) +            res4[j] = ~src4[j] | dst4[j]; +         break; +      case PIPE_LOGICOP_COPY: +         for (j = 0; j < 4; j++) +            res4[j] = src4[j]; +         break; +      case PIPE_LOGICOP_OR_REVERSE: +         for (j = 0; j < 4; j++) +            res4[j] = src4[j] | ~dst4[j]; +         break; +      case PIPE_LOGICOP_OR: +         for (j = 0; j < 4; j++) +            res4[j] = src4[j] | dst4[j]; +         break; +      case PIPE_LOGICOP_SET: +         for (j = 0; j < 4; j++) +            res4[j] = ~0; +         break; +      default: +         assert(0); +      } -   for (j = 0; j < 4; j++) { -      quadColor[j][0] = UBYTE_TO_FLOAT(res[j][0]); -      quadColor[j][1] = UBYTE_TO_FLOAT(res[j][1]); -      quadColor[j][2] = UBYTE_TO_FLOAT(res[j][2]); -      quadColor[j][3] = UBYTE_TO_FLOAT(res[j][3]); +      for (j = 0; j < 4; j++) { +         quadColor[j][0] = UBYTE_TO_FLOAT(res[j][0]); +         quadColor[j][1] = UBYTE_TO_FLOAT(res[j][1]); +         quadColor[j][2] = UBYTE_TO_FLOAT(res[j][2]); +         quadColor[j][3] = UBYTE_TO_FLOAT(res[j][3]); +      }     }     /* pass quad to next stage */ @@ -221,504 +226,508 @@ logicop_quad(struct quad_stage *qs, struct quad_header *quad)  static void  blend_quad(struct quad_stage *qs, struct quad_header *quad)  { -   struct softpipe_context *softpipe = qs->softpipe;     static const float zero[4] = { 0, 0, 0, 0 };     static const float one[4] = { 1, 1, 1, 1 }; -   float source[4][QUAD_SIZE], dest[4][QUAD_SIZE]; -   struct softpipe_cached_tile *tile -      = sp_get_cached_tile(softpipe, -                           softpipe->cbuf_cache[softpipe->current_cbuf], -                           quad->x0, quad->y0); -   float (*quadColor)[4] = quad->outputs.color; -   uint i, j; + +   struct softpipe_context *softpipe = qs->softpipe; +   uint cbuf;     if (softpipe->blend->logicop_enable) {        logicop_quad(qs, quad);        return;     } -   /* get/swizzle dest colors */ -   for (j = 0; j < QUAD_SIZE; j++) { -      int x = (quad->x0 & (TILE_SIZE-1)) + (j & 1); -      int y = (quad->y0 & (TILE_SIZE-1)) + (j >> 1); -      for (i = 0; i < 4; i++) { -         dest[i][j] = tile->data.color[y][x][i]; -      } -   } +   /* loop over colorbuffer outputs */ +   for (cbuf = 0; cbuf < softpipe->framebuffer.num_cbufs; cbuf++) { +      float source[4][QUAD_SIZE], dest[4][QUAD_SIZE]; +      struct softpipe_cached_tile *tile +         = sp_get_cached_tile(softpipe, +                              softpipe->cbuf_cache[cbuf], +                              quad->x0, quad->y0); +      float (*quadColor)[4] = quad->outputs.color[cbuf]; +      uint i, j; -   /* -    * Compute src/first term RGB -    */ -   switch (softpipe->blend->rgb_src_factor) { -   case PIPE_BLENDFACTOR_ONE: -      VEC4_COPY(source[0], quadColor[0]); /* R */ -      VEC4_COPY(source[1], quadColor[1]); /* G */ -      VEC4_COPY(source[2], quadColor[2]); /* B */ -      break; -   case PIPE_BLENDFACTOR_SRC_COLOR: -      VEC4_MUL(source[0], quadColor[0], quadColor[0]); /* R */ -      VEC4_MUL(source[1], quadColor[1], quadColor[1]); /* G */ -      VEC4_MUL(source[2], quadColor[2], quadColor[2]); /* B */ -      break; -   case PIPE_BLENDFACTOR_SRC_ALPHA: -      { -         const float *alpha = quadColor[3]; -         VEC4_MUL(source[0], quadColor[0], alpha); /* R */ -         VEC4_MUL(source[1], quadColor[1], alpha); /* G */ -         VEC4_MUL(source[2], quadColor[2], alpha); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_DST_COLOR: -      VEC4_MUL(source[0], quadColor[0], dest[0]); /* R */ -      VEC4_MUL(source[1], quadColor[1], dest[1]); /* G */ -      VEC4_MUL(source[2], quadColor[2], dest[2]); /* B */ -      break; -   case PIPE_BLENDFACTOR_DST_ALPHA: -      { -         const float *alpha = dest[3]; -         VEC4_MUL(source[0], quadColor[0], alpha); /* R */ -         VEC4_MUL(source[1], quadColor[1], alpha); /* G */ -         VEC4_MUL(source[2], quadColor[2], alpha); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: -      { -         const float *alpha = quadColor[3]; -         float diff[4]; -         VEC4_SUB(diff, one, dest[3]); -         VEC4_MIN(source[0], alpha, diff); /* R */ -         VEC4_MIN(source[1], alpha, diff); /* G */ -         VEC4_MIN(source[2], alpha, diff); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_CONST_COLOR: -      { -         float comp[4]; -         VEC4_SCALAR(comp, softpipe->blend_color.color[0]); /* R */ -         VEC4_MUL(source[0], quadColor[0], comp); /* R */ -         VEC4_SCALAR(comp, softpipe->blend_color.color[1]); /* G */ -         VEC4_MUL(source[1], quadColor[1], comp); /* G */ -         VEC4_SCALAR(comp, softpipe->blend_color.color[2]); /* B */ -         VEC4_MUL(source[2], quadColor[2], comp); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_CONST_ALPHA: -      { -         float alpha[4]; -         VEC4_SCALAR(alpha, softpipe->blend_color.color[3]); -         VEC4_MUL(source[0], quadColor[0], alpha); /* R */ -         VEC4_MUL(source[1], quadColor[1], alpha); /* G */ -         VEC4_MUL(source[2], quadColor[2], alpha); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_SRC1_COLOR: -      assert(0); /* to do */ -      break; -   case PIPE_BLENDFACTOR_SRC1_ALPHA: -      assert(0); /* to do */ -      break; -   case PIPE_BLENDFACTOR_ZERO: -      VEC4_COPY(source[0], zero); /* R */ -      VEC4_COPY(source[1], zero); /* G */ -      VEC4_COPY(source[2], zero); /* B */ -      break; -   case PIPE_BLENDFACTOR_INV_SRC_COLOR: -      { -         float inv_comp[4]; -         VEC4_SUB(inv_comp, one, quadColor[0]); /* R */ -         VEC4_MUL(source[0], quadColor[0], inv_comp); /* R */ -         VEC4_SUB(inv_comp, one, quadColor[1]); /* G */ -         VEC4_MUL(source[1], quadColor[1], inv_comp); /* G */ -         VEC4_SUB(inv_comp, one, quadColor[2]); /* B */ -         VEC4_MUL(source[2], quadColor[2], inv_comp); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_SRC_ALPHA: -      { -         float inv_alpha[4]; -         VEC4_SUB(inv_alpha, one, quadColor[3]); -         VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ -         VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ -         VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_DST_ALPHA: -      { -         float inv_alpha[4]; -         VEC4_SUB(inv_alpha, one, dest[3]); -         VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ -         VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ -         VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_DST_COLOR: -      { -         float inv_comp[4]; -         VEC4_SUB(inv_comp, one, dest[0]); /* R */ -         VEC4_MUL(source[0], quadColor[0], inv_comp); /* R */ -         VEC4_SUB(inv_comp, one, dest[1]); /* G */ -         VEC4_MUL(source[1], quadColor[1], inv_comp); /* G */ -         VEC4_SUB(inv_comp, one, dest[2]); /* B */ -         VEC4_MUL(source[2], quadColor[2], inv_comp); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_CONST_COLOR: -      { -         float inv_comp[4]; -         /* R */ -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[0]); -         VEC4_MUL(source[0], quadColor[0], inv_comp); -         /* G */ -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[1]); -         VEC4_MUL(source[1], quadColor[1], inv_comp); -         /* B */ -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[2]); -         VEC4_MUL(source[2], quadColor[2], inv_comp); -      } -      break; -   case PIPE_BLENDFACTOR_INV_CONST_ALPHA: -      { -         float inv_alpha[4]; -         VEC4_SCALAR(inv_alpha, 1.0f - softpipe->blend_color.color[3]); -         VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ -         VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ -         VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_SRC1_COLOR: -      assert(0); /* to do */ -      break; -   case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: -      assert(0); /* to do */ -      break; -   default: -      assert(0); -   } -    -   /* -    * Compute src/first term A -    */ -   switch (softpipe->blend->alpha_src_factor) { -   case PIPE_BLENDFACTOR_ONE: -      VEC4_COPY(source[3], quadColor[3]); /* A */ -      break; -   case PIPE_BLENDFACTOR_SRC_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_SRC_ALPHA: -      { -         const float *alpha = quadColor[3]; -         VEC4_MUL(source[3], quadColor[3], alpha); /* A */ -      } -      break; -   case PIPE_BLENDFACTOR_DST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_DST_ALPHA: -      VEC4_MUL(source[3], quadColor[3], dest[3]); /* A */ -      break; -   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: -      { -         const float *alpha = quadColor[3]; -         float diff[4]; -         VEC4_SUB(diff, one, dest[3]); -         VEC4_MIN(source[3], alpha, diff); /* A */ +      /* get/swizzle dest colors */ +      for (j = 0; j < QUAD_SIZE; j++) { +         int x = (quad->x0 & (TILE_SIZE-1)) + (j & 1); +         int y = (quad->y0 & (TILE_SIZE-1)) + (j >> 1); +         for (i = 0; i < 4; i++) { +            dest[i][j] = tile->data.color[y][x][i]; +         }        } -      break; -   case PIPE_BLENDFACTOR_CONST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_CONST_ALPHA: -      { -         float comp[4]; -         VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */ -         VEC4_MUL(source[3], quadColor[3], comp); /* A */ -      } -      break; -   case PIPE_BLENDFACTOR_ZERO: -      VEC4_COPY(source[3], zero); /* A */ -      break; -   case PIPE_BLENDFACTOR_INV_SRC_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_INV_SRC_ALPHA: -      { -         float inv_alpha[4]; -         VEC4_SUB(inv_alpha, one, quadColor[3]); -         VEC4_MUL(source[3], quadColor[3], inv_alpha); /* A */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_DST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_INV_DST_ALPHA: -      { -         float inv_alpha[4]; -         VEC4_SUB(inv_alpha, one, dest[3]); -         VEC4_MUL(source[3], quadColor[3], inv_alpha); /* A */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_CONST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_INV_CONST_ALPHA: -      { -         float inv_comp[4]; -         /* A */ -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]); -         VEC4_MUL(source[3], quadColor[3], inv_comp); -      } -      break; -   default: -      assert(0); -   } -    -    -   /* -    * Compute dest/second term RGB -    */ -   switch (softpipe->blend->rgb_dst_factor) { -   case PIPE_BLENDFACTOR_ONE: -      /* dest = dest * 1   NO-OP, leave dest as-is */ -      break; -   case PIPE_BLENDFACTOR_SRC_COLOR: -      VEC4_MUL(dest[0], dest[0], quadColor[0]); /* R */ -      VEC4_MUL(dest[1], dest[1], quadColor[1]); /* G */ -      VEC4_MUL(dest[2], dest[2], quadColor[2]); /* B */ -      break; -   case PIPE_BLENDFACTOR_SRC_ALPHA: -      VEC4_MUL(dest[0], dest[0], quadColor[3]); /* R * A */ -      VEC4_MUL(dest[1], dest[1], quadColor[3]); /* G * A */ -      VEC4_MUL(dest[2], dest[2], quadColor[3]); /* B * A */ -      break; -   case PIPE_BLENDFACTOR_DST_ALPHA: -      VEC4_MUL(dest[0], dest[0], dest[3]); /* R * A */ -      VEC4_MUL(dest[1], dest[1], dest[3]); /* G * A */ -      VEC4_MUL(dest[2], dest[2], dest[3]); /* B * A */ -      break; -   case PIPE_BLENDFACTOR_DST_COLOR: -      VEC4_MUL(dest[0], dest[0], dest[0]); /* R */ -      VEC4_MUL(dest[1], dest[1], dest[1]); /* G */ -      VEC4_MUL(dest[2], dest[2], dest[2]); /* B */ -      break; -   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: -      assert(0); /* illegal */ -      break; -   case PIPE_BLENDFACTOR_CONST_COLOR: -      { -         float comp[4]; -         VEC4_SCALAR(comp, softpipe->blend_color.color[0]); /* R */ -         VEC4_MUL(dest[0], dest[0], comp); /* R */ -         VEC4_SCALAR(comp, softpipe->blend_color.color[1]); /* G */ -         VEC4_MUL(dest[1], dest[1], comp); /* G */ -         VEC4_SCALAR(comp, softpipe->blend_color.color[2]); /* B */ -         VEC4_MUL(dest[2], dest[2], comp); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_CONST_ALPHA: -      { -         float comp[4]; -         VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */ -         VEC4_MUL(dest[0], dest[0], comp); /* R */ -         VEC4_MUL(dest[1], dest[1], comp); /* G */ -         VEC4_MUL(dest[2], dest[2], comp); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_ZERO: -      VEC4_COPY(dest[0], zero); /* R */ -      VEC4_COPY(dest[1], zero); /* G */ -      VEC4_COPY(dest[2], zero); /* B */ -      break; -   case PIPE_BLENDFACTOR_SRC1_COLOR: -   case PIPE_BLENDFACTOR_SRC1_ALPHA: -      /* XXX what are these? */ -      assert(0); -      break; -   case PIPE_BLENDFACTOR_INV_SRC_COLOR: -      { -         float inv_comp[4]; -         VEC4_SUB(inv_comp, one, quadColor[0]); /* R */ -         VEC4_MUL(dest[0], inv_comp, dest[0]); /* R */ -         VEC4_SUB(inv_comp, one, quadColor[1]); /* G */ -         VEC4_MUL(dest[1], inv_comp, dest[1]); /* G */ -         VEC4_SUB(inv_comp, one, quadColor[2]); /* B */ -         VEC4_MUL(dest[2], inv_comp, dest[2]); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_SRC_ALPHA: -      { -         float one_minus_alpha[QUAD_SIZE]; -         VEC4_SUB(one_minus_alpha, one, quadColor[3]); -         VEC4_MUL(dest[0], dest[0], one_minus_alpha); /* R */ -         VEC4_MUL(dest[1], dest[1], one_minus_alpha); /* G */ -         VEC4_MUL(dest[2], dest[2], one_minus_alpha); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_DST_ALPHA: -      { -         float inv_comp[4]; -         VEC4_SUB(inv_comp, one, quadColor[3]); /* A */ -         VEC4_MUL(dest[0], inv_comp, dest[0]); /* R */ -         VEC4_MUL(dest[1], inv_comp, dest[1]); /* G */ -         VEC4_MUL(dest[2], inv_comp, dest[2]); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_DST_COLOR: -      { -         float inv_comp[4]; -         VEC4_SUB(inv_comp, one, dest[0]); /* R */ -         VEC4_MUL(dest[0], dest[0], inv_comp); /* R */ -         VEC4_SUB(inv_comp, one, dest[1]); /* G */ -         VEC4_MUL(dest[1], dest[1], inv_comp); /* G */ -         VEC4_SUB(inv_comp, one, dest[2]); /* B */ -         VEC4_MUL(dest[2], dest[2], inv_comp); /* B */ -      } -      break; -   case PIPE_BLENDFACTOR_INV_CONST_COLOR: -      { -         float inv_comp[4]; -         /* R */ -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[0]); -         VEC4_MUL(dest[0], dest[0], inv_comp); -         /* G */ -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[1]); -         VEC4_MUL(dest[1], dest[1], inv_comp); -         /* B */ -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[2]); -         VEC4_MUL(dest[2], dest[2], inv_comp); + +      /* +       * Compute src/first term RGB +       */ +      switch (softpipe->blend->rgb_src_factor) { +      case PIPE_BLENDFACTOR_ONE: +         VEC4_COPY(source[0], quadColor[0]); /* R */ +         VEC4_COPY(source[1], quadColor[1]); /* G */ +         VEC4_COPY(source[2], quadColor[2]); /* B */ +         break; +      case PIPE_BLENDFACTOR_SRC_COLOR: +         VEC4_MUL(source[0], quadColor[0], quadColor[0]); /* R */ +         VEC4_MUL(source[1], quadColor[1], quadColor[1]); /* G */ +         VEC4_MUL(source[2], quadColor[2], quadColor[2]); /* B */ +         break; +      case PIPE_BLENDFACTOR_SRC_ALPHA: +         { +            const float *alpha = quadColor[3]; +            VEC4_MUL(source[0], quadColor[0], alpha); /* R */ +            VEC4_MUL(source[1], quadColor[1], alpha); /* G */ +            VEC4_MUL(source[2], quadColor[2], alpha); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_DST_COLOR: +         VEC4_MUL(source[0], quadColor[0], dest[0]); /* R */ +         VEC4_MUL(source[1], quadColor[1], dest[1]); /* G */ +         VEC4_MUL(source[2], quadColor[2], dest[2]); /* B */ +         break; +      case PIPE_BLENDFACTOR_DST_ALPHA: +         { +            const float *alpha = dest[3]; +            VEC4_MUL(source[0], quadColor[0], alpha); /* R */ +            VEC4_MUL(source[1], quadColor[1], alpha); /* G */ +            VEC4_MUL(source[2], quadColor[2], alpha); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: +         { +            const float *alpha = quadColor[3]; +            float diff[4], temp[4]; +            VEC4_SUB(diff, one, dest[3]); +            VEC4_MIN(temp, alpha, diff); +            VEC4_MUL(source[0], quadColor[0], temp); /* R */ +            VEC4_MUL(source[1], quadColor[1], temp); /* G */ +            VEC4_MUL(source[2], quadColor[2], temp); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_CONST_COLOR: +         { +            float comp[4]; +            VEC4_SCALAR(comp, softpipe->blend_color.color[0]); /* R */ +            VEC4_MUL(source[0], quadColor[0], comp); /* R */ +            VEC4_SCALAR(comp, softpipe->blend_color.color[1]); /* G */ +            VEC4_MUL(source[1], quadColor[1], comp); /* G */ +            VEC4_SCALAR(comp, softpipe->blend_color.color[2]); /* B */ +            VEC4_MUL(source[2], quadColor[2], comp); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_CONST_ALPHA: +         { +            float alpha[4]; +            VEC4_SCALAR(alpha, softpipe->blend_color.color[3]); +            VEC4_MUL(source[0], quadColor[0], alpha); /* R */ +            VEC4_MUL(source[1], quadColor[1], alpha); /* G */ +            VEC4_MUL(source[2], quadColor[2], alpha); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_SRC1_COLOR: +         assert(0); /* to do */ +         break; +      case PIPE_BLENDFACTOR_SRC1_ALPHA: +         assert(0); /* to do */ +         break; +      case PIPE_BLENDFACTOR_ZERO: +         VEC4_COPY(source[0], zero); /* R */ +         VEC4_COPY(source[1], zero); /* G */ +         VEC4_COPY(source[2], zero); /* B */ +         break; +      case PIPE_BLENDFACTOR_INV_SRC_COLOR: +         { +            float inv_comp[4]; +            VEC4_SUB(inv_comp, one, quadColor[0]); /* R */ +            VEC4_MUL(source[0], quadColor[0], inv_comp); /* R */ +            VEC4_SUB(inv_comp, one, quadColor[1]); /* G */ +            VEC4_MUL(source[1], quadColor[1], inv_comp); /* G */ +            VEC4_SUB(inv_comp, one, quadColor[2]); /* B */ +            VEC4_MUL(source[2], quadColor[2], inv_comp); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_SRC_ALPHA: +         { +            float inv_alpha[4]; +            VEC4_SUB(inv_alpha, one, quadColor[3]); +            VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ +            VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ +            VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_DST_ALPHA: +         { +            float inv_alpha[4]; +            VEC4_SUB(inv_alpha, one, dest[3]); +            VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ +            VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ +            VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_DST_COLOR: +         { +            float inv_comp[4]; +            VEC4_SUB(inv_comp, one, dest[0]); /* R */ +            VEC4_MUL(source[0], quadColor[0], inv_comp); /* R */ +            VEC4_SUB(inv_comp, one, dest[1]); /* G */ +            VEC4_MUL(source[1], quadColor[1], inv_comp); /* G */ +            VEC4_SUB(inv_comp, one, dest[2]); /* B */ +            VEC4_MUL(source[2], quadColor[2], inv_comp); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_CONST_COLOR: +         { +            float inv_comp[4]; +            /* R */ +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[0]); +            VEC4_MUL(source[0], quadColor[0], inv_comp); +            /* G */ +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[1]); +            VEC4_MUL(source[1], quadColor[1], inv_comp); +            /* B */ +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[2]); +            VEC4_MUL(source[2], quadColor[2], inv_comp); +         } +         break; +      case PIPE_BLENDFACTOR_INV_CONST_ALPHA: +         { +            float inv_alpha[4]; +            VEC4_SCALAR(inv_alpha, 1.0f - softpipe->blend_color.color[3]); +            VEC4_MUL(source[0], quadColor[0], inv_alpha); /* R */ +            VEC4_MUL(source[1], quadColor[1], inv_alpha); /* G */ +            VEC4_MUL(source[2], quadColor[2], inv_alpha); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_SRC1_COLOR: +         assert(0); /* to do */ +         break; +      case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: +         assert(0); /* to do */ +         break; +      default: +         assert(0);        } -      break; -   case PIPE_BLENDFACTOR_INV_CONST_ALPHA: -      { -         float inv_comp[4]; -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]); -         VEC4_MUL(dest[0], dest[0], inv_comp); -         VEC4_MUL(dest[1], dest[1], inv_comp); -         VEC4_MUL(dest[2], dest[2], inv_comp); + +      /* +       * Compute src/first term A +       */ +      switch (softpipe->blend->alpha_src_factor) { +      case PIPE_BLENDFACTOR_ONE: +         VEC4_COPY(source[3], quadColor[3]); /* A */ +         break; +      case PIPE_BLENDFACTOR_SRC_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_SRC_ALPHA: +         { +            const float *alpha = quadColor[3]; +            VEC4_MUL(source[3], quadColor[3], alpha); /* A */ +         } +         break; +      case PIPE_BLENDFACTOR_DST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_DST_ALPHA: +         VEC4_MUL(source[3], quadColor[3], dest[3]); /* A */ +         break; +      case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: +         /* multiply alpha by 1.0 */ +         VEC4_COPY(source[3], quadColor[3]); /* A */ +         break; +      case PIPE_BLENDFACTOR_CONST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_CONST_ALPHA: +         { +            float comp[4]; +            VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */ +            VEC4_MUL(source[3], quadColor[3], comp); /* A */ +         } +         break; +      case PIPE_BLENDFACTOR_ZERO: +         VEC4_COPY(source[3], zero); /* A */ +         break; +      case PIPE_BLENDFACTOR_INV_SRC_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_INV_SRC_ALPHA: +         { +            float inv_alpha[4]; +            VEC4_SUB(inv_alpha, one, quadColor[3]); +            VEC4_MUL(source[3], quadColor[3], inv_alpha); /* A */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_DST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_INV_DST_ALPHA: +         { +            float inv_alpha[4]; +            VEC4_SUB(inv_alpha, one, dest[3]); +            VEC4_MUL(source[3], quadColor[3], inv_alpha); /* A */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_CONST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_INV_CONST_ALPHA: +         { +            float inv_comp[4]; +            /* A */ +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]); +            VEC4_MUL(source[3], quadColor[3], inv_comp); +         } +         break; +      default: +         assert(0);        } -      break; -   case PIPE_BLENDFACTOR_INV_SRC1_COLOR: -   case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: -      /* XXX what are these? */ -      assert(0); -      break; -   default: -      assert(0); -   } -    -   /* -    * Compute dest/second term A -    */ -   switch (softpipe->blend->alpha_dst_factor) { -   case PIPE_BLENDFACTOR_ONE: -      /* dest = dest * 1   NO-OP, leave dest as-is */ -      break; -   case PIPE_BLENDFACTOR_SRC_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_SRC_ALPHA: -      VEC4_MUL(dest[3], dest[3], quadColor[3]); /* A * A */ -      break; -   case PIPE_BLENDFACTOR_DST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_DST_ALPHA: -      VEC4_MUL(dest[3], dest[3], dest[3]); /* A */ -      break; -   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: -      assert(0); /* illegal */ -      break; -   case PIPE_BLENDFACTOR_CONST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_CONST_ALPHA: -      { -         float comp[4]; -         VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */ -         VEC4_MUL(dest[3], dest[3], comp); /* A */ + + +      /* +       * Compute dest/second term RGB +       */ +      switch (softpipe->blend->rgb_dst_factor) { +      case PIPE_BLENDFACTOR_ONE: +         /* dest = dest * 1   NO-OP, leave dest as-is */ +         break; +      case PIPE_BLENDFACTOR_SRC_COLOR: +         VEC4_MUL(dest[0], dest[0], quadColor[0]); /* R */ +         VEC4_MUL(dest[1], dest[1], quadColor[1]); /* G */ +         VEC4_MUL(dest[2], dest[2], quadColor[2]); /* B */ +         break; +      case PIPE_BLENDFACTOR_SRC_ALPHA: +         VEC4_MUL(dest[0], dest[0], quadColor[3]); /* R * A */ +         VEC4_MUL(dest[1], dest[1], quadColor[3]); /* G * A */ +         VEC4_MUL(dest[2], dest[2], quadColor[3]); /* B * A */ +         break; +      case PIPE_BLENDFACTOR_DST_ALPHA: +         VEC4_MUL(dest[0], dest[0], dest[3]); /* R * A */ +         VEC4_MUL(dest[1], dest[1], dest[3]); /* G * A */ +         VEC4_MUL(dest[2], dest[2], dest[3]); /* B * A */ +         break; +      case PIPE_BLENDFACTOR_DST_COLOR: +         VEC4_MUL(dest[0], dest[0], dest[0]); /* R */ +         VEC4_MUL(dest[1], dest[1], dest[1]); /* G */ +         VEC4_MUL(dest[2], dest[2], dest[2]); /* B */ +         break; +      case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: +         assert(0); /* illegal */ +         break; +      case PIPE_BLENDFACTOR_CONST_COLOR: +         { +            float comp[4]; +            VEC4_SCALAR(comp, softpipe->blend_color.color[0]); /* R */ +            VEC4_MUL(dest[0], dest[0], comp); /* R */ +            VEC4_SCALAR(comp, softpipe->blend_color.color[1]); /* G */ +            VEC4_MUL(dest[1], dest[1], comp); /* G */ +            VEC4_SCALAR(comp, softpipe->blend_color.color[2]); /* B */ +            VEC4_MUL(dest[2], dest[2], comp); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_CONST_ALPHA: +         { +            float comp[4]; +            VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */ +            VEC4_MUL(dest[0], dest[0], comp); /* R */ +            VEC4_MUL(dest[1], dest[1], comp); /* G */ +            VEC4_MUL(dest[2], dest[2], comp); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_ZERO: +         VEC4_COPY(dest[0], zero); /* R */ +         VEC4_COPY(dest[1], zero); /* G */ +         VEC4_COPY(dest[2], zero); /* B */ +         break; +      case PIPE_BLENDFACTOR_SRC1_COLOR: +      case PIPE_BLENDFACTOR_SRC1_ALPHA: +         /* XXX what are these? */ +         assert(0); +         break; +      case PIPE_BLENDFACTOR_INV_SRC_COLOR: +         { +            float inv_comp[4]; +            VEC4_SUB(inv_comp, one, quadColor[0]); /* R */ +            VEC4_MUL(dest[0], inv_comp, dest[0]); /* R */ +            VEC4_SUB(inv_comp, one, quadColor[1]); /* G */ +            VEC4_MUL(dest[1], inv_comp, dest[1]); /* G */ +            VEC4_SUB(inv_comp, one, quadColor[2]); /* B */ +            VEC4_MUL(dest[2], inv_comp, dest[2]); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_SRC_ALPHA: +         { +            float one_minus_alpha[QUAD_SIZE]; +            VEC4_SUB(one_minus_alpha, one, quadColor[3]); +            VEC4_MUL(dest[0], dest[0], one_minus_alpha); /* R */ +            VEC4_MUL(dest[1], dest[1], one_minus_alpha); /* G */ +            VEC4_MUL(dest[2], dest[2], one_minus_alpha); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_DST_ALPHA: +         { +            float inv_comp[4]; +            VEC4_SUB(inv_comp, one, dest[3]); /* A */ +            VEC4_MUL(dest[0], inv_comp, dest[0]); /* R */ +            VEC4_MUL(dest[1], inv_comp, dest[1]); /* G */ +            VEC4_MUL(dest[2], inv_comp, dest[2]); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_DST_COLOR: +         { +            float inv_comp[4]; +            VEC4_SUB(inv_comp, one, dest[0]); /* R */ +            VEC4_MUL(dest[0], dest[0], inv_comp); /* R */ +            VEC4_SUB(inv_comp, one, dest[1]); /* G */ +            VEC4_MUL(dest[1], dest[1], inv_comp); /* G */ +            VEC4_SUB(inv_comp, one, dest[2]); /* B */ +            VEC4_MUL(dest[2], dest[2], inv_comp); /* B */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_CONST_COLOR: +         { +            float inv_comp[4]; +            /* R */ +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[0]); +            VEC4_MUL(dest[0], dest[0], inv_comp); +            /* G */ +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[1]); +            VEC4_MUL(dest[1], dest[1], inv_comp); +            /* B */ +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[2]); +            VEC4_MUL(dest[2], dest[2], inv_comp); +         } +         break; +      case PIPE_BLENDFACTOR_INV_CONST_ALPHA: +         { +            float inv_comp[4]; +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]); +            VEC4_MUL(dest[0], dest[0], inv_comp); +            VEC4_MUL(dest[1], dest[1], inv_comp); +            VEC4_MUL(dest[2], dest[2], inv_comp); +         } +         break; +      case PIPE_BLENDFACTOR_INV_SRC1_COLOR: +      case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: +         /* XXX what are these? */ +         assert(0); +         break; +      default: +         assert(0);        } -      break; -   case PIPE_BLENDFACTOR_ZERO: -      VEC4_COPY(dest[3], zero); /* A */ -      break; -   case PIPE_BLENDFACTOR_INV_SRC_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_INV_SRC_ALPHA: -      { -         float one_minus_alpha[QUAD_SIZE]; -         VEC4_SUB(one_minus_alpha, one, quadColor[3]); -         VEC4_MUL(dest[3], dest[3], one_minus_alpha); /* A */ + +      /* +       * Compute dest/second term A +       */ +      switch (softpipe->blend->alpha_dst_factor) { +      case PIPE_BLENDFACTOR_ONE: +         /* dest = dest * 1   NO-OP, leave dest as-is */ +         break; +      case PIPE_BLENDFACTOR_SRC_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_SRC_ALPHA: +         VEC4_MUL(dest[3], dest[3], quadColor[3]); /* A * A */ +         break; +      case PIPE_BLENDFACTOR_DST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_DST_ALPHA: +         VEC4_MUL(dest[3], dest[3], dest[3]); /* A */ +         break; +      case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: +         assert(0); /* illegal */ +         break; +      case PIPE_BLENDFACTOR_CONST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_CONST_ALPHA: +         { +            float comp[4]; +            VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */ +            VEC4_MUL(dest[3], dest[3], comp); /* A */ +         } +         break; +      case PIPE_BLENDFACTOR_ZERO: +         VEC4_COPY(dest[3], zero); /* A */ +         break; +      case PIPE_BLENDFACTOR_INV_SRC_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_INV_SRC_ALPHA: +         { +            float one_minus_alpha[QUAD_SIZE]; +            VEC4_SUB(one_minus_alpha, one, quadColor[3]); +            VEC4_MUL(dest[3], dest[3], one_minus_alpha); /* A */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_DST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_INV_DST_ALPHA: +         { +            float inv_comp[4]; +            VEC4_SUB(inv_comp, one, dest[3]); /* A */ +            VEC4_MUL(dest[3], inv_comp, dest[3]); /* A */ +         } +         break; +      case PIPE_BLENDFACTOR_INV_CONST_COLOR: +         /* fall-through */ +      case PIPE_BLENDFACTOR_INV_CONST_ALPHA: +         { +            float inv_comp[4]; +            VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]); +            VEC4_MUL(dest[3], dest[3], inv_comp); +         } +         break; +      default: +         assert(0);        } -      break; -   case PIPE_BLENDFACTOR_INV_DST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_INV_DST_ALPHA: -      { -         float inv_comp[4]; -         VEC4_SUB(inv_comp, one, dest[3]); /* A */ -         VEC4_MUL(dest[3], inv_comp, dest[3]); /* A */ + +      /* +       * Combine RGB terms +       */ +      switch (softpipe->blend->rgb_func) { +      case PIPE_BLEND_ADD: +         VEC4_ADD(quadColor[0], source[0], dest[0]); /* R */ +         VEC4_ADD(quadColor[1], source[1], dest[1]); /* G */ +         VEC4_ADD(quadColor[2], source[2], dest[2]); /* B */ +         break; +      case PIPE_BLEND_SUBTRACT: +         VEC4_SUB(quadColor[0], source[0], dest[0]); /* R */ +         VEC4_SUB(quadColor[1], source[1], dest[1]); /* G */ +         VEC4_SUB(quadColor[2], source[2], dest[2]); /* B */ +         break; +      case PIPE_BLEND_REVERSE_SUBTRACT: +         VEC4_SUB(quadColor[0], dest[0], source[0]); /* R */ +         VEC4_SUB(quadColor[1], dest[1], source[1]); /* G */ +         VEC4_SUB(quadColor[2], dest[2], source[2]); /* B */ +         break; +      case PIPE_BLEND_MIN: +         VEC4_MIN(quadColor[0], source[0], dest[0]); /* R */ +         VEC4_MIN(quadColor[1], source[1], dest[1]); /* G */ +         VEC4_MIN(quadColor[2], source[2], dest[2]); /* B */ +         break; +      case PIPE_BLEND_MAX: +         VEC4_MAX(quadColor[0], source[0], dest[0]); /* R */ +         VEC4_MAX(quadColor[1], source[1], dest[1]); /* G */ +         VEC4_MAX(quadColor[2], source[2], dest[2]); /* B */ +         break; +      default: +         assert(0);        } -      break; -   case PIPE_BLENDFACTOR_INV_CONST_COLOR: -      /* fall-through */ -   case PIPE_BLENDFACTOR_INV_CONST_ALPHA: -      { -         float inv_comp[4]; -         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]); -         VEC4_MUL(dest[3], dest[3], inv_comp); + +      /* +       * Combine A terms +       */ +      switch (softpipe->blend->alpha_func) { +      case PIPE_BLEND_ADD: +         VEC4_ADD(quadColor[3], source[3], dest[3]); /* A */ +         break; +      case PIPE_BLEND_SUBTRACT: +         VEC4_SUB(quadColor[3], source[3], dest[3]); /* A */ +         break; +      case PIPE_BLEND_REVERSE_SUBTRACT: +         VEC4_SUB(quadColor[3], dest[3], source[3]); /* A */ +         break; +      case PIPE_BLEND_MIN: +         VEC4_MIN(quadColor[3], source[3], dest[3]); /* A */ +         break; +      case PIPE_BLEND_MAX: +         VEC4_MAX(quadColor[3], source[3], dest[3]); /* A */ +         break; +      default: +         assert(0);        } -      break; -   default: -      assert(0); -   } -    -   /* -    * Combine RGB terms -    */ -   switch (softpipe->blend->rgb_func) { -   case PIPE_BLEND_ADD: -      VEC4_ADD(quadColor[0], source[0], dest[0]); /* R */ -      VEC4_ADD(quadColor[1], source[1], dest[1]); /* G */ -      VEC4_ADD(quadColor[2], source[2], dest[2]); /* B */ -      break; -   case PIPE_BLEND_SUBTRACT: -      VEC4_SUB(quadColor[0], source[0], dest[0]); /* R */ -      VEC4_SUB(quadColor[1], source[1], dest[1]); /* G */ -      VEC4_SUB(quadColor[2], source[2], dest[2]); /* B */ -      break; -   case PIPE_BLEND_REVERSE_SUBTRACT: -      VEC4_SUB(quadColor[0], dest[0], source[0]); /* R */ -      VEC4_SUB(quadColor[1], dest[1], source[1]); /* G */ -      VEC4_SUB(quadColor[2], dest[2], source[2]); /* B */ -      break; -   case PIPE_BLEND_MIN: -      VEC4_MIN(quadColor[0], source[0], dest[0]); /* R */ -      VEC4_MIN(quadColor[1], source[1], dest[1]); /* G */ -      VEC4_MIN(quadColor[2], source[2], dest[2]); /* B */ -      break; -   case PIPE_BLEND_MAX: -      VEC4_MAX(quadColor[0], source[0], dest[0]); /* R */ -      VEC4_MAX(quadColor[1], source[1], dest[1]); /* G */ -      VEC4_MAX(quadColor[2], source[2], dest[2]); /* B */ -      break; -   default: -      assert(0); -   } -    -   /* -    * Combine A terms -    */ -   switch (softpipe->blend->alpha_func) { -   case PIPE_BLEND_ADD: -      VEC4_ADD(quadColor[3], source[3], dest[3]); /* A */ -      break; -   case PIPE_BLEND_SUBTRACT: -      VEC4_SUB(quadColor[3], source[3], dest[3]); /* A */ -      break; -   case PIPE_BLEND_REVERSE_SUBTRACT: -      VEC4_SUB(quadColor[3], dest[3], source[3]); /* A */ -      break; -   case PIPE_BLEND_MIN: -      VEC4_MIN(quadColor[3], source[3], dest[3]); /* A */ -      break; -   case PIPE_BLEND_MAX: -      VEC4_MAX(quadColor[3], source[3], dest[3]); /* A */ -      break; -   default: -      assert(0); -   } -    + +   } /* cbuf loop */ +     /* pass blended quad to next stage */     qs->next->run(qs->next, quad);  } diff --git a/src/gallium/drivers/softpipe/sp_quad_bufloop.c b/src/gallium/drivers/softpipe/sp_quad_bufloop.c index 2ae4e22a7d..b3db428ef1 100644 --- a/src/gallium/drivers/softpipe/sp_quad_bufloop.c +++ b/src/gallium/drivers/softpipe/sp_quad_bufloop.c @@ -13,7 +13,7 @@ static void  cbuf_loop_quad(struct quad_stage *qs, struct quad_header *quad)  {     struct softpipe_context *softpipe = qs->softpipe; -   float tmp[4][QUAD_SIZE]; +   float tmp[PIPE_MAX_COLOR_BUFS][4][QUAD_SIZE];     unsigned i;     assert(sizeof(quad->outputs.color) == sizeof(tmp)); @@ -30,7 +30,9 @@ cbuf_loop_quad(struct quad_stage *qs, struct quad_header *quad)     for (i = 0; i < softpipe->framebuffer.num_cbufs; i++) {        /* set current cbuffer */ +#if 0 /* obsolete & going away */        softpipe->current_cbuf = i; +#endif        /* pass blended quad to next stage */        qs->next->run(qs->next, quad); diff --git a/src/gallium/drivers/softpipe/sp_quad_colormask.c b/src/gallium/drivers/softpipe/sp_quad_colormask.c index 1f09d900ca..7fe080990b 100644 --- a/src/gallium/drivers/softpipe/sp_quad_colormask.c +++ b/src/gallium/drivers/softpipe/sp_quad_colormask.c @@ -47,38 +47,43 @@ static void  colormask_quad(struct quad_stage *qs, struct quad_header *quad)  {     struct softpipe_context *softpipe = qs->softpipe; -   float dest[4][QUAD_SIZE]; -   struct softpipe_cached_tile *tile -      = sp_get_cached_tile(softpipe, -                           softpipe->cbuf_cache[softpipe->current_cbuf], -                           quad->x0, quad->y0); -   float (*quadColor)[4] = quad->outputs.color; -   uint i, j; +   uint cbuf; -   /* get/swizzle dest colors */ -   for (j = 0; j < QUAD_SIZE; j++) { -      int x = (quad->x0 & (TILE_SIZE-1)) + (j & 1); -      int y = (quad->y0 & (TILE_SIZE-1)) + (j >> 1); -      for (i = 0; i < 4; i++) { -         dest[i][j] = tile->data.color[y][x][i]; +   /* loop over colorbuffer outputs */ +   for (cbuf = 0; cbuf < softpipe->framebuffer.num_cbufs; cbuf++) { +      float dest[4][QUAD_SIZE]; +      struct softpipe_cached_tile *tile +         = sp_get_cached_tile(softpipe, +                              softpipe->cbuf_cache[cbuf], +                              quad->x0, quad->y0); +      float (*quadColor)[4] = quad->outputs.color[cbuf]; +      uint i, j; + +      /* get/swizzle dest colors */ +      for (j = 0; j < QUAD_SIZE; j++) { +         int x = (quad->x0 & (TILE_SIZE-1)) + (j & 1); +         int y = (quad->y0 & (TILE_SIZE-1)) + (j >> 1); +         for (i = 0; i < 4; i++) { +            dest[i][j] = tile->data.color[y][x][i]; +         }        } -   } -   /* R */ -   if (!(softpipe->blend->colormask & PIPE_MASK_R)) -       COPY_4V(quadColor[0], dest[0]); +      /* R */ +      if (!(softpipe->blend->colormask & PIPE_MASK_R)) +          COPY_4V(quadColor[0], dest[0]); -   /* G */ -   if (!(softpipe->blend->colormask & PIPE_MASK_G)) -       COPY_4V(quadColor[1], dest[1]); +      /* G */ +      if (!(softpipe->blend->colormask & PIPE_MASK_G)) +          COPY_4V(quadColor[1], dest[1]); -   /* B */ -   if (!(softpipe->blend->colormask & PIPE_MASK_B)) -       COPY_4V(quadColor[2], dest[2]); +      /* B */ +      if (!(softpipe->blend->colormask & PIPE_MASK_B)) +          COPY_4V(quadColor[2], dest[2]); -   /* A */ -   if (!(softpipe->blend->colormask & PIPE_MASK_A)) -       COPY_4V(quadColor[3], dest[3]); +      /* A */ +      if (!(softpipe->blend->colormask & PIPE_MASK_A)) +          COPY_4V(quadColor[3], dest[3]); +   }     /* pass quad to next stage */     qs->next->run(qs->next, quad); diff --git a/src/gallium/drivers/softpipe/sp_quad_coverage.c b/src/gallium/drivers/softpipe/sp_quad_coverage.c index b3d3fae22f..dd5ebb2296 100644 --- a/src/gallium/drivers/softpipe/sp_quad_coverage.c +++ b/src/gallium/drivers/softpipe/sp_quad_coverage.c @@ -50,12 +50,17 @@ coverage_quad(struct quad_stage *qs, struct quad_header *quad)     if ((softpipe->rasterizer->poly_smooth && quad->prim == PRIM_TRI) ||         (softpipe->rasterizer->line_smooth && quad->prim == PRIM_LINE) ||         (softpipe->rasterizer->point_smooth && quad->prim == PRIM_POINT)) { -      float (*quadColor)[4] = quad->outputs.color; -      unsigned j; -      for (j = 0; j < QUAD_SIZE; j++) { -         assert(quad->coverage[j] >= 0.0); -         assert(quad->coverage[j] <= 1.0); +      uint cbuf; + +      /* loop over colorbuffer outputs */ +      for (cbuf = 0; cbuf < softpipe->framebuffer.num_cbufs; cbuf++) { +         float (*quadColor)[4] = quad->outputs.color[cbuf]; +         unsigned j; +         for (j = 0; j < QUAD_SIZE; j++) { +            assert(quad->coverage[j] >= 0.0); +            assert(quad->coverage[j] <= 1.0);           quadColor[3][j] *= quad->coverage[j]; +         }        }     } diff --git a/src/gallium/drivers/softpipe/sp_quad_fs.c b/src/gallium/drivers/softpipe/sp_quad_fs.c index a73df31383..8c88c192f8 100644 --- a/src/gallium/drivers/softpipe/sp_quad_fs.c +++ b/src/gallium/drivers/softpipe/sp_quad_fs.c @@ -53,7 +53,6 @@ struct quad_shade_stage     struct tgsi_sampler samplers[PIPE_MAX_SAMPLERS];     struct tgsi_exec_machine machine;     struct tgsi_exec_vector *inputs, *outputs; -   int colorOutSlot, depthOutSlot;  }; @@ -77,7 +76,8 @@ shade_quad(     struct quad_shade_stage *qss = quad_shade_stage( qs );     struct softpipe_context *softpipe = qs->softpipe;     struct tgsi_exec_machine *machine = &qss->machine; - +   boolean z_written; +        /* Consts do not require 16 byte alignment. */     machine->Consts = softpipe->mapped_constants[PIPE_SHADER_FRAGMENT]; @@ -88,31 +88,37 @@ shade_quad(  				    &qss->machine,  				    quad ); -   /* store result color */ -   if (qss->colorOutSlot >= 0) { -      /* XXX need to handle multiple color outputs someday */ -      assert(qss->stage.softpipe->fs->info.output_semantic_name[qss->colorOutSlot] -             == TGSI_SEMANTIC_COLOR); -      memcpy( -             quad->outputs.color, -             &machine->Outputs[qss->colorOutSlot].xyzw[0].f[0], -             sizeof( quad->outputs.color ) ); -   } - -   /* -    * XXX the following code for updating quad->outputs.depth -    * isn't really needed if we did early z testing. -    */ - -   /* store result Z */ -   if (qss->depthOutSlot >= 0) { -      /* output[slot] is new Z */ +   /* store outputs */ +   z_written = FALSE; +   { +      const ubyte *sem_name = softpipe->fs->info.output_semantic_name; +      const ubyte *sem_index = softpipe->fs->info.output_semantic_index; +      const uint n = qss->stage.softpipe->fs->info.num_outputs;        uint i; -      for (i = 0; i < 4; i++) { -         quad->outputs.depth[i] = machine->Outputs[0].xyzw[2].f[i]; +      for (i = 0; i < n; i++) { +         switch (sem_name[i]) { +         case TGSI_SEMANTIC_COLOR: +            { +               uint cbuf = sem_index[i]; +               memcpy(quad->outputs.color[cbuf], +                      &machine->Outputs[i].xyzw[0].f[0], +                      sizeof(quad->outputs.color[0]) ); +            } +            break; +         case TGSI_SEMANTIC_POSITION: +            { +               uint j; +               for (j = 0; j < 4; j++) { +                  quad->outputs.depth[j] = machine->Outputs[0].xyzw[2].f[j]; +               } +               z_written = TRUE; +            } +            break; +         }        }     } -   else { + +   if (!z_written) {        /* compute Z values now, as in the quad earlyz stage */        /* XXX we should really only do this if the earlyz stage is not used */        const float fx = (float) quad->x0; @@ -149,20 +155,6 @@ static void shade_begin(struct quad_stage *qs)        qss->samplers[i].texture = softpipe->texture[i];     } -   /* find output slots for depth, color */ -   qss->colorOutSlot = -1; -   qss->depthOutSlot = -1; -   for (i = 0; i < qss->stage.softpipe->fs->info.num_outputs; i++) { -      switch (qss->stage.softpipe->fs->info.output_semantic_name[i]) { -      case TGSI_SEMANTIC_POSITION: -         qss->depthOutSlot = i; -         break; -      case TGSI_SEMANTIC_COLOR: -         qss->colorOutSlot = i; -         break; -      } -   } -        softpipe->fs->prepare( softpipe->fs,   			  &qss->machine,  			  qss->samplers ); diff --git a/src/gallium/drivers/softpipe/sp_quad_output.c b/src/gallium/drivers/softpipe/sp_quad_output.c index cfe8f11808..40083138a4 100644 --- a/src/gallium/drivers/softpipe/sp_quad_output.c +++ b/src/gallium/drivers/softpipe/sp_quad_output.c @@ -34,31 +34,36 @@  /** - * Write quad to framebuffer, taking mask into account. - * - * Note that surfaces support only full quad reads and writes. + * Last step of quad processing: write quad colors to the framebuffer, + * taking mask into account.   */  static void  output_quad(struct quad_stage *qs, struct quad_header *quad)  { -   struct softpipe_context *softpipe = qs->softpipe; -   struct softpipe_cached_tile *tile -      = sp_get_cached_tile(softpipe, -                           softpipe->cbuf_cache[softpipe->current_cbuf], -                           quad->x0, quad->y0);     /* in-tile pos: */     const int itx = quad->x0 % TILE_SIZE;     const int ity = quad->y0 % TILE_SIZE; -   float (*quadColor)[4] = quad->outputs.color; -   int i, j; -   /* get/swizzle dest colors */ -   for (j = 0; j < QUAD_SIZE; j++) { -      if (quad->mask & (1 << j)) { -         int x = itx + (j & 1); -         int y = ity + (j >> 1); -         for (i = 0; i < 4; i++) { /* loop over color chans */ -            tile->data.color[y][x][i] = quadColor[i][j]; +   struct softpipe_context *softpipe = qs->softpipe; +   uint cbuf; + +   /* loop over colorbuffer outputs */ +   for (cbuf = 0; cbuf < softpipe->framebuffer.num_cbufs; cbuf++) { +      struct softpipe_cached_tile *tile +         = sp_get_cached_tile(softpipe, +                              softpipe->cbuf_cache[cbuf], +                              quad->x0, quad->y0); +      float (*quadColor)[4] = quad->outputs.color[cbuf]; +      int i, j; + +      /* get/swizzle dest colors */ +      for (j = 0; j < QUAD_SIZE; j++) { +         if (quad->mask & (1 << j)) { +            int x = itx + (j & 1); +            int y = ity + (j >> 1); +            for (i = 0; i < 4; i++) { /* loop over color chans */ +               tile->data.color[y][x][i] = quadColor[i][j]; +            }           }        }     } diff --git a/src/gallium/drivers/softpipe/sp_quad_stencil.c b/src/gallium/drivers/softpipe/sp_quad_stencil.c index 92a0da0083..b4c7e942fa 100644 --- a/src/gallium/drivers/softpipe/sp_quad_stencil.c +++ b/src/gallium/drivers/softpipe/sp_quad_stencil.c @@ -243,7 +243,7 @@ stencil_test_quad(struct quad_stage *qs, struct quad_header *quad)           stencilVals[j] = tile->data.depth32[y][x] & 0xff;        }        break; -   case PIPE_FORMAT_U_S8: +   case PIPE_FORMAT_S8_UNORM:        for (j = 0; j < QUAD_SIZE; j++) {           int x = quad->x0 % TILE_SIZE + (j & 1);           int y = quad->y0 % TILE_SIZE + (j >> 1); @@ -311,7 +311,7 @@ stencil_test_quad(struct quad_stage *qs, struct quad_header *quad)           tile->data.depth32[y][x] = z24s8;        }        break; -   case PIPE_FORMAT_U_S8: +   case PIPE_FORMAT_S8_UNORM:        for (j = 0; j < QUAD_SIZE; j++) {           int x = quad->x0 % TILE_SIZE + (j & 1);           int y = quad->y0 % TILE_SIZE + (j >> 1); diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 1850a1ced3..7dacb1c461 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -68,7 +68,7 @@ softpipe_get_param(struct pipe_screen *screen, int param)     case PIPE_CAP_POINT_SPRITE:        return 1;     case PIPE_CAP_MAX_RENDER_TARGETS: -      return 1; +      return PIPE_MAX_COLOR_BUFS;     case PIPE_CAP_OCCLUSION_QUERY:        return 1;     case PIPE_CAP_TEXTURE_SHADOW_MAP: diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c new file mode 100644 index 0000000000..543d86a5cb --- /dev/null +++ b/src/gallium/drivers/softpipe/sp_setup.c @@ -0,0 +1,1308 @@ +/************************************************************************** + * + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ + +/** + * \brief  Primitive rasterization/rendering (points, lines, triangles) + * + * \author  Keith Whitwell <keith@tungstengraphics.com> + * \author  Brian Paul + */ + +#include "sp_setup.h" + +#include "sp_context.h" +#include "sp_headers.h" +#include "sp_quad.h" +#include "sp_state.h" +#include "sp_prim_setup.h" +#include "draw/draw_private.h" +#include "draw/draw_vertex.h" +#include "pipe/p_util.h" +#include "pipe/p_shader_tokens.h" + +#define DEBUG_VERTS 0 +#define DEBUG_FRAGS 0 + +/** + * Triangle edge info + */ +struct edge { +   float dx;		/**< X(v1) - X(v0), used only during setup */ +   float dy;		/**< Y(v1) - Y(v0), used only during setup */ +   float dxdy;		/**< dx/dy */ +   float sx, sy;	/**< first sample point coord */ +   int lines;		/**< number of lines on this edge */ +}; + + +/** + * Triangle setup info (derived from draw_stage). + * Also used for line drawing (taking some liberties). + */ +struct setup_context { +   struct softpipe_context *softpipe; + +   /* Vertices are just an array of floats making up each attribute in +    * turn.  Currently fixed at 4 floats, but should change in time. +    * Codegen will help cope with this. +    */ +   const float (*vmax)[4]; +   const float (*vmid)[4]; +   const float (*vmin)[4]; +   const float (*vprovoke)[4]; + +   struct edge ebot; +   struct edge etop; +   struct edge emaj; + +   float oneoverarea; + +   struct tgsi_interp_coef coef[PIPE_MAX_SHADER_INPUTS]; +   struct tgsi_interp_coef posCoef;  /* For Z, W */ +   struct quad_header quad; + +   struct { +      int left[2];   /**< [0] = row0, [1] = row1 */ +      int right[2]; +      int y; +      unsigned y_flags; +      unsigned mask;     /**< mask of MASK_BOTTOM/TOP_LEFT/RIGHT bits */ +   } span; + +#if DEBUG_FRAGS +   uint numFragsEmitted;  /**< per primitive */ +   uint numFragsWritten;  /**< per primitive */ +#endif + +   unsigned winding;		/* which winding to cull */ +}; + + + + + +static boolean cull_tri( struct setup_context *setup, +		      float det ) +{ +   if (det != 0)  +   {    +      /* if (det < 0 then Z points toward camera and triangle is  +       * counter-clockwise winding. +       */ +      unsigned winding = (det < 0) ? PIPE_WINDING_CCW : PIPE_WINDING_CW; +       +      if ((winding & setup->winding) == 0)  +	 return FALSE; +   } + +   /* Culled: +    */ +   return TRUE; +} + + + +/** + * Clip setup->quad against the scissor/surface bounds. + */ +static INLINE void +quad_clip(struct setup_context *setup) +{ +   const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect; +   const int minx = (int) cliprect->minx; +   const int maxx = (int) cliprect->maxx; +   const int miny = (int) cliprect->miny; +   const int maxy = (int) cliprect->maxy; + +   if (setup->quad.x0 >= maxx || +       setup->quad.y0 >= maxy || +       setup->quad.x0 + 1 < minx || +       setup->quad.y0 + 1 < miny) { +      /* totally clipped */ +      setup->quad.mask = 0x0; +      return; +   } +   if (setup->quad.x0 < minx) +      setup->quad.mask &= (MASK_BOTTOM_RIGHT | MASK_TOP_RIGHT); +   if (setup->quad.y0 < miny) +      setup->quad.mask &= (MASK_BOTTOM_LEFT | MASK_BOTTOM_RIGHT); +   if (setup->quad.x0 == maxx - 1) +      setup->quad.mask &= (MASK_BOTTOM_LEFT | MASK_TOP_LEFT); +   if (setup->quad.y0 == maxy - 1) +      setup->quad.mask &= (MASK_TOP_LEFT | MASK_TOP_RIGHT); +} + + +/** + * Emit a quad (pass to next stage) with clipping. + */ +static INLINE void +clip_emit_quad(struct setup_context *setup) +{ +   quad_clip(setup); +   if (setup->quad.mask) { +      struct softpipe_context *sp = setup->softpipe; +      sp->quad.first->run(sp->quad.first, &setup->quad); +   } +} + + +/** + * Emit a quad (pass to next stage).  No clipping is done. + */ +static INLINE void +emit_quad( struct setup_context *setup, int x, int y, unsigned mask ) +{ +   struct softpipe_context *sp = setup->softpipe; +   setup->quad.x0 = x; +   setup->quad.y0 = y; +   setup->quad.mask = mask; +#if DEBUG_FRAGS +   if (mask & 1) setup->numFragsEmitted++; +   if (mask & 2) setup->numFragsEmitted++; +   if (mask & 4) setup->numFragsEmitted++; +   if (mask & 8) setup->numFragsEmitted++; +#endif +   sp->quad.first->run(sp->quad.first, &setup->quad); +#if DEBUG_FRAGS +   mask = setup->quad.mask; +   if (mask & 1) setup->numFragsWritten++; +   if (mask & 2) setup->numFragsWritten++; +   if (mask & 4) setup->numFragsWritten++; +   if (mask & 8) setup->numFragsWritten++; +#endif +} + + +/** + * Given an X or Y coordinate, return the block/quad coordinate that it + * belongs to. + */ +static INLINE int block( int x ) +{ +   return x & ~1; +} + + +/** + * Render a horizontal span of quads + */ +static void flush_spans( struct setup_context *setup ) +{ +   const int xleft0 = setup->span.left[0]; +   const int xleft1 = setup->span.left[1]; +   const int xright0 = setup->span.right[0]; +   const int xright1 = setup->span.right[1]; +   int minleft, maxright; +   int x; + +   switch (setup->span.y_flags) { +   case 0x3: +      /* both odd and even lines written (both quad rows) */ +      minleft = block(MIN2(xleft0, xleft1)); +      maxright = block(MAX2(xright0, xright1)); +      for (x = minleft; x <= maxright; x += 2) { +         /* determine which of the four pixels is inside the span bounds */ +         uint mask = 0x0; +         if (x >= xleft0 && x < xright0) +            mask |= MASK_TOP_LEFT; +         if (x >= xleft1 && x < xright1) +            mask |= MASK_BOTTOM_LEFT; +         if (x+1 >= xleft0 && x+1 < xright0) +            mask |= MASK_TOP_RIGHT; +         if (x+1 >= xleft1 && x+1 < xright1) +            mask |= MASK_BOTTOM_RIGHT; +         emit_quad( setup, x, setup->span.y, mask ); +      } +      break; + +   case 0x1: +      /* only even line written (quad top row) */ +      minleft = block(xleft0); +      maxright = block(xright0); +      for (x = minleft; x <= maxright; x += 2) { +         uint mask = 0x0; +         if (x >= xleft0 && x < xright0) +            mask |= MASK_TOP_LEFT; +         if (x+1 >= xleft0 && x+1 < xright0) +            mask |= MASK_TOP_RIGHT; +         emit_quad( setup, x, setup->span.y, mask ); +      } +      break; + +   case 0x2: +      /* only odd line written (quad bottom row) */ +      minleft = block(xleft1); +      maxright = block(xright1); +      for (x = minleft; x <= maxright; x += 2) { +         uint mask = 0x0; +         if (x >= xleft1 && x < xright1) +            mask |= MASK_BOTTOM_LEFT; +         if (x+1 >= xleft1 && x+1 < xright1) +            mask |= MASK_BOTTOM_RIGHT; +         emit_quad( setup, x, setup->span.y, mask ); +      } +      break; + +   default: +      return; +   } + +   setup->span.y = 0; +   setup->span.y_flags = 0; +   setup->span.right[0] = 0; +   setup->span.right[1] = 0; +} + + +#if DEBUG_VERTS +static void print_vertex(const struct setup_context *setup, +                         const float (*v)[4]) +{ +   int i; +   debug_printf("Vertex: (%p)\n", v); +   for (i = 0; i < setup->quad.nr_attrs; i++) { +      debug_printf("  %d: %f %f %f %f\n",  i, +              v[i][0], v[i][1], v[i][2], v[i][3]); +   } +} +#endif + +static boolean setup_sort_vertices( struct setup_context *setup, +                                    float det, +                                    const float (*v0)[4], +                                    const float (*v1)[4], +                                    const float (*v2)[4] ) +{ +   setup->vprovoke = v2; + +   /* determine bottom to top order of vertices */ +   { +      float y0 = v0[0][1]; +      float y1 = v1[0][1]; +      float y2 = v2[0][1]; +      if (y0 <= y1) { +	 if (y1 <= y2) { +	    /* y0<=y1<=y2 */ +	    setup->vmin = v0; +	    setup->vmid = v1; +	    setup->vmax = v2; +	 } +	 else if (y2 <= y0) { +	    /* y2<=y0<=y1 */ +	    setup->vmin = v2; +	    setup->vmid = v0; +	    setup->vmax = v1; +	 } +	 else { +	    /* y0<=y2<=y1 */ +	    setup->vmin = v0; +	    setup->vmid = v2; +	    setup->vmax = v1; +	 } +      } +      else { +	 if (y0 <= y2) { +	    /* y1<=y0<=y2 */ +	    setup->vmin = v1; +	    setup->vmid = v0; +	    setup->vmax = v2; +	 } +	 else if (y2 <= y1) { +	    /* y2<=y1<=y0 */ +	    setup->vmin = v2; +	    setup->vmid = v1; +	    setup->vmax = v0; +	 } +	 else { +	    /* y1<=y2<=y0 */ +	    setup->vmin = v1; +	    setup->vmid = v2; +	    setup->vmax = v0; +	 } +      } +   } + +   setup->ebot.dx = setup->vmid[0][0] - setup->vmin[0][0]; +   setup->ebot.dy = setup->vmid[0][1] - setup->vmin[0][1]; +   setup->emaj.dx = setup->vmax[0][0] - setup->vmin[0][0]; +   setup->emaj.dy = setup->vmax[0][1] - setup->vmin[0][1]; +   setup->etop.dx = setup->vmax[0][0] - setup->vmid[0][0]; +   setup->etop.dy = setup->vmax[0][1] - setup->vmid[0][1]; + +   /* +    * Compute triangle's area.  Use 1/area to compute partial +    * derivatives of attributes later. +    * +    * The area will be the same as prim->det, but the sign may be +    * different depending on how the vertices get sorted above. +    * +    * To determine whether the primitive is front or back facing we +    * use the prim->det value because its sign is correct. +    */ +   { +      const float area = (setup->emaj.dx * setup->ebot.dy - +			    setup->ebot.dx * setup->emaj.dy); + +      setup->oneoverarea = 1.0f / area; +      /* +      debug_printf("%s one-over-area %f  area %f  det %f\n", +                   __FUNCTION__, setup->oneoverarea, area, det ); +      */ +   } + +   /* We need to know if this is a front or back-facing triangle for: +    *  - the GLSL gl_FrontFacing fragment attribute (bool) +    *  - two-sided stencil test +    */ +   setup->quad.facing = (det > 0.0) ^ (setup->softpipe->rasterizer->front_winding == PIPE_WINDING_CW); + +   return TRUE; +} + + +/** + * Compute a0 for a constant-valued coefficient (GL_FLAT shading). + * The value value comes from vertex[slot][i]. + * The result will be put into setup->coef[slot].a0[i]. + * \param slot  which attribute slot + * \param i  which component of the slot (0..3) + */ +static void const_coeff( struct setup_context *setup, +                         struct tgsi_interp_coef *coef, +                         uint vertSlot, uint i) +{ +   assert(i <= 3); + +   coef->dadx[i] = 0; +   coef->dady[i] = 0; + +   /* need provoking vertex info! +    */ +   coef->a0[i] = setup->vprovoke[vertSlot][i]; +} + + +/** + * Compute a0, dadx and dady for a linearly interpolated coefficient, + * for a triangle. + */ +static void tri_linear_coeff( struct setup_context *setup, +                              struct tgsi_interp_coef *coef, +                              uint vertSlot, uint i) +{ +   float botda = setup->vmid[vertSlot][i] - setup->vmin[vertSlot][i]; +   float majda = setup->vmax[vertSlot][i] - setup->vmin[vertSlot][i]; +   float a = setup->ebot.dy * majda - botda * setup->emaj.dy; +   float b = setup->emaj.dx * botda - majda * setup->ebot.dx; +   float dadx = a * setup->oneoverarea; +   float dady = b * setup->oneoverarea; + +   assert(i <= 3); + +   coef->dadx[i] = dadx; +   coef->dady[i] = dady; + +   /* calculate a0 as the value which would be sampled for the +    * fragment at (0,0), taking into account that we want to sample at +    * pixel centers, in other words (0.5, 0.5). +    * +    * this is neat but unfortunately not a good way to do things for +    * triangles with very large values of dadx or dady as it will +    * result in the subtraction and re-addition from a0 of a very +    * large number, which means we'll end up loosing a lot of the +    * fractional bits and precision from a0.  the way to fix this is +    * to define a0 as the sample at a pixel center somewhere near vmin +    * instead - i'll switch to this later. +    */ +   coef->a0[i] = (setup->vmin[vertSlot][i] - +                  (dadx * (setup->vmin[0][0] - 0.5f) + +                   dady * (setup->vmin[0][1] - 0.5f))); + +   /* +   debug_printf("attr[%d].%c: %f dx:%f dy:%f\n", +		slot, "xyzw"[i], +		setup->coef[slot].a0[i], +		setup->coef[slot].dadx[i], +		setup->coef[slot].dady[i]); +   */ +} + + +/** + * Compute a0, dadx and dady for a perspective-corrected interpolant, + * for a triangle. + * We basically multiply the vertex value by 1/w before computing + * the plane coefficients (a0, dadx, dady). + * Later, when we compute the value at a particular fragment position we'll + * divide the interpolated value by the interpolated W at that fragment. + */ +static void tri_persp_coeff( struct setup_context *setup, +                             struct tgsi_interp_coef *coef, +                             uint vertSlot, uint i) +{ +   /* premultiply by 1/w  (v[0][3] is always W): +    */ +   float mina = setup->vmin[vertSlot][i] * setup->vmin[0][3]; +   float mida = setup->vmid[vertSlot][i] * setup->vmid[0][3]; +   float maxa = setup->vmax[vertSlot][i] * setup->vmax[0][3]; +   float botda = mida - mina; +   float majda = maxa - mina; +   float a = setup->ebot.dy * majda - botda * setup->emaj.dy; +   float b = setup->emaj.dx * botda - majda * setup->ebot.dx; +   float dadx = a * setup->oneoverarea; +   float dady = b * setup->oneoverarea; + +   /* +   debug_printf("tri persp %d,%d: %f %f %f\n", vertSlot, i, +          	setup->vmin[vertSlot][i], +          	setup->vmid[vertSlot][i], +       		setup->vmax[vertSlot][i] +          ); +   */ +   assert(i <= 3); + +   coef->dadx[i] = dadx; +   coef->dady[i] = dady; +   coef->a0[i] = (mina - +                  (dadx * (setup->vmin[0][0] - 0.5f) + +                   dady * (setup->vmin[0][1] - 0.5f))); +} + + +/** + * Special coefficient setup for gl_FragCoord. + * X and Y are trivial, though Y has to be inverted for OpenGL. + * Z and W are copied from posCoef which should have already been computed. + * We could do a bit less work if we'd examine gl_FragCoord's swizzle mask. + */ +static void +setup_fragcoord_coeff(struct setup_context *setup, uint slot) +{ +   /*X*/ +   setup->coef[slot].a0[0] = 0; +   setup->coef[slot].dadx[0] = 1.0; +   setup->coef[slot].dady[0] = 0.0; +   /*Y*/ +   if (setup->softpipe->rasterizer->origin_lower_left) { +      /* y=0=bottom */ +      const int winHeight = setup->softpipe->framebuffer.height; +      setup->coef[slot].a0[1] = (float) (winHeight - 1); +      setup->coef[slot].dady[1] = -1.0; +   } +   else { +      /* y=0=top */ +      setup->coef[slot].a0[1] = 0.0; +      setup->coef[slot].dady[1] = 1.0; +   } +   setup->coef[slot].dadx[1] = 0.0; +   /*Z*/ +   setup->coef[slot].a0[2] = setup->posCoef.a0[2]; +   setup->coef[slot].dadx[2] = setup->posCoef.dadx[2]; +   setup->coef[slot].dady[2] = setup->posCoef.dady[2]; +   /*W*/ +   setup->coef[slot].a0[3] = setup->posCoef.a0[3]; +   setup->coef[slot].dadx[3] = setup->posCoef.dadx[3]; +   setup->coef[slot].dady[3] = setup->posCoef.dady[3]; +} + + + +/** + * Compute the setup->coef[] array dadx, dady, a0 values. + * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized. + */ +static void setup_tri_coefficients( struct setup_context *setup ) +{ +   struct softpipe_context *softpipe = setup->softpipe; +   const struct sp_fragment_shader *spfs = softpipe->fs; +   const struct vertex_info *vinfo = softpipe_get_vertex_info(softpipe); +   uint fragSlot; + +   /* z and w are done by linear interpolation: +    */ +   tri_linear_coeff(setup, &setup->posCoef, 0, 2); +   tri_linear_coeff(setup, &setup->posCoef, 0, 3); + +   /* setup interpolation for all the remaining attributes: +    */ +   for (fragSlot = 0; fragSlot < spfs->info.num_inputs; fragSlot++) { +      const uint vertSlot = vinfo->src_index[fragSlot]; +      uint j; + +      switch (vinfo->interp_mode[fragSlot]) { +      case INTERP_CONSTANT: +         for (j = 0; j < NUM_CHANNELS; j++) +            const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_LINEAR: +         for (j = 0; j < NUM_CHANNELS; j++) +            tri_linear_coeff(setup, &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_PERSPECTIVE: +         for (j = 0; j < NUM_CHANNELS; j++) +            tri_persp_coeff(setup, &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_POS: +         setup_fragcoord_coeff(setup, fragSlot); +         break; +      default: +         assert(0); +      } + +      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) { +         /* FOG.y = front/back facing  XXX fix this */ +         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.facing; +         setup->coef[fragSlot].dadx[1] = 0.0; +         setup->coef[fragSlot].dady[1] = 0.0; +      } +   } +} + + + +static void setup_tri_edges( struct setup_context *setup ) +{ +   float vmin_x = setup->vmin[0][0] + 0.5f; +   float vmid_x = setup->vmid[0][0] + 0.5f; + +   float vmin_y = setup->vmin[0][1] - 0.5f; +   float vmid_y = setup->vmid[0][1] - 0.5f; +   float vmax_y = setup->vmax[0][1] - 0.5f; + +   setup->emaj.sy = CEILF(vmin_y); +   setup->emaj.lines = (int) CEILF(vmax_y - setup->emaj.sy); +   setup->emaj.dxdy = setup->emaj.dx / setup->emaj.dy; +   setup->emaj.sx = vmin_x + (setup->emaj.sy - vmin_y) * setup->emaj.dxdy; + +   setup->etop.sy = CEILF(vmid_y); +   setup->etop.lines = (int) CEILF(vmax_y - setup->etop.sy); +   setup->etop.dxdy = setup->etop.dx / setup->etop.dy; +   setup->etop.sx = vmid_x + (setup->etop.sy - vmid_y) * setup->etop.dxdy; + +   setup->ebot.sy = CEILF(vmin_y); +   setup->ebot.lines = (int) CEILF(vmid_y - setup->ebot.sy); +   setup->ebot.dxdy = setup->ebot.dx / setup->ebot.dy; +   setup->ebot.sx = vmin_x + (setup->ebot.sy - vmin_y) * setup->ebot.dxdy; +} + + +/** + * Render the upper or lower half of a triangle. + * Scissoring/cliprect is applied here too. + */ +static void subtriangle( struct setup_context *setup, +			 struct edge *eleft, +			 struct edge *eright, +			 unsigned lines ) +{ +   const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect; +   const int minx = (int) cliprect->minx; +   const int maxx = (int) cliprect->maxx; +   const int miny = (int) cliprect->miny; +   const int maxy = (int) cliprect->maxy; +   int y, start_y, finish_y; +   int sy = (int)eleft->sy; + +   assert((int)eleft->sy == (int) eright->sy); + +   /* clip top/bottom */ +   start_y = sy; +   finish_y = sy + lines; + +   if (start_y < miny) +      start_y = miny; + +   if (finish_y > maxy) +      finish_y = maxy; + +   start_y -= sy; +   finish_y -= sy; + +   /* +   debug_printf("%s %d %d\n", __FUNCTION__, start_y, finish_y); +   */ + +   for (y = start_y; y < finish_y; y++) { + +      /* avoid accumulating adds as floats don't have the precision to +       * accurately iterate large triangle edges that way.  luckily we +       * can just multiply these days. +       * +       * this is all drowned out by the attribute interpolation anyway. +       */ +      int left = (int)(eleft->sx + y * eleft->dxdy); +      int right = (int)(eright->sx + y * eright->dxdy); + +      /* clip left/right */ +      if (left < minx) +         left = minx; +      if (right > maxx) +         right = maxx; + +      if (left < right) { +         int _y = sy + y; +         if (block(_y) != setup->span.y) { +            flush_spans(setup); +            setup->span.y = block(_y); +         } + +         setup->span.left[_y&1] = left; +         setup->span.right[_y&1] = right; +         setup->span.y_flags |= 1<<(_y&1); +      } +   } + + +   /* save the values so that emaj can be restarted: +    */ +   eleft->sx += lines * eleft->dxdy; +   eright->sx += lines * eright->dxdy; +   eleft->sy += lines; +   eright->sy += lines; +} + + +/** + * Recalculate prim's determinant.  This is needed as we don't have + * get this information through the vbuf_render interface & we must + * calculate it here. + */ +static float +calc_det( const float (*v0)[4], +          const float (*v1)[4], +          const float (*v2)[4] ) +{ +   /* edge vectors e = v0 - v2, f = v1 - v2 */ +   const float ex = v0[0][0] - v2[0][0]; +   const float ey = v0[0][1] - v2[0][1]; +   const float fx = v1[0][0] - v2[0][0]; +   const float fy = v1[0][1] - v2[0][1]; + +   /* det = cross(e,f).z */ +   return ex * fy - ey * fx; +} + + +/** + * Do setup for triangle rasterization, then render the triangle. + */ +void setup_tri( struct setup_context *setup, +                const float (*v0)[4], +                const float (*v1)[4], +                const float (*v2)[4] ) +{ +   float det; + +#if DEBUG_VERTS +   debug_printf("Setup triangle:\n"); +   print_vertex(setup, v0); +   print_vertex(setup, v1); +   print_vertex(setup, v2); +#endif + +   if (setup->softpipe->no_rast) +      return; +    +   det = calc_det(v0, v1, v2); +   /* +   debug_printf("%s\n", __FUNCTION__ ); +   */ + +#if DEBUG_FRAGS +   setup->numFragsEmitted = 0; +   setup->numFragsWritten = 0; +#endif + +   if (cull_tri( setup, det )) +      return; + +   setup_sort_vertices( setup, det, v0, v1, v2 ); +   setup_tri_coefficients( setup ); +   setup_tri_edges( setup ); + +   setup->quad.prim = PRIM_TRI; + +   setup->span.y = 0; +   setup->span.y_flags = 0; +   setup->span.right[0] = 0; +   setup->span.right[1] = 0; +   /*   setup->span.z_mode = tri_z_mode( setup->ctx ); */ + +   /*   init_constant_attribs( setup ); */ + +   if (setup->oneoverarea < 0.0) { +      /* emaj on left: +       */ +      subtriangle( setup, &setup->emaj, &setup->ebot, setup->ebot.lines ); +      subtriangle( setup, &setup->emaj, &setup->etop, setup->etop.lines ); +   } +   else { +      /* emaj on right: +       */ +      subtriangle( setup, &setup->ebot, &setup->emaj, setup->ebot.lines ); +      subtriangle( setup, &setup->etop, &setup->emaj, setup->etop.lines ); +   } + +   flush_spans( setup ); + +#if DEBUG_FRAGS +   printf("Tri: %u frags emitted, %u written\n", +          setup->numFragsEmitted, +          setup->numFragsWritten); +#endif +} + + + +/** + * Compute a0, dadx and dady for a linearly interpolated coefficient, + * for a line. + */ +static void +line_linear_coeff(struct setup_context *setup, +                  struct tgsi_interp_coef *coef, +                  uint vertSlot, uint i) +{ +   const float da = setup->vmax[vertSlot][i] - setup->vmin[vertSlot][i]; +   const float dadx = da * setup->emaj.dx * setup->oneoverarea; +   const float dady = da * setup->emaj.dy * setup->oneoverarea; +   coef->dadx[i] = dadx; +   coef->dady[i] = dady; +   coef->a0[i] = (setup->vmin[vertSlot][i] - +                  (dadx * (setup->vmin[0][0] - 0.5f) + +                   dady * (setup->vmin[0][1] - 0.5f))); +} + + +/** + * Compute a0, dadx and dady for a perspective-corrected interpolant, + * for a line. + */ +static void +line_persp_coeff(struct setup_context *setup, +                  struct tgsi_interp_coef *coef, +                  uint vertSlot, uint i) +{ +   /* XXX double-check/verify this arithmetic */ +   const float a0 = setup->vmin[vertSlot][i] * setup->vmin[0][3]; +   const float a1 = setup->vmax[vertSlot][i] * setup->vmax[0][3]; +   const float da = a1 - a0; +   const float dadx = da * setup->emaj.dx * setup->oneoverarea; +   const float dady = da * setup->emaj.dy * setup->oneoverarea; +   coef->dadx[i] = dadx; +   coef->dady[i] = dady; +   coef->a0[i] = (setup->vmin[vertSlot][i] - +                  (dadx * (setup->vmin[0][0] - 0.5f) + +                   dady * (setup->vmin[0][1] - 0.5f))); +} + + +/** + * Compute the setup->coef[] array dadx, dady, a0 values. + * Must be called after setup->vmin,vmax are initialized. + */ +static INLINE void +setup_line_coefficients(struct setup_context *setup, +                        const float (*v0)[4], +                        const float (*v1)[4]) +{ +   struct softpipe_context *softpipe = setup->softpipe; +   const struct sp_fragment_shader *spfs = softpipe->fs; +   const struct vertex_info *vinfo = softpipe_get_vertex_info(softpipe); +   uint fragSlot; + +   /* use setup->vmin, vmax to point to vertices */ +   setup->vprovoke = v1; +   setup->vmin = v0; +   setup->vmax = v1; + +   setup->emaj.dx = setup->vmax[0][0] - setup->vmin[0][0]; +   setup->emaj.dy = setup->vmax[0][1] - setup->vmin[0][1]; +   /* NOTE: this is not really 1/area */ +   setup->oneoverarea = 1.0f / (setup->emaj.dx * setup->emaj.dx + +                                setup->emaj.dy * setup->emaj.dy); + +   /* z and w are done by linear interpolation: +    */ +   line_linear_coeff(setup, &setup->posCoef, 0, 2); +   line_linear_coeff(setup, &setup->posCoef, 0, 3); + +   /* setup interpolation for all the remaining attributes: +    */ +   for (fragSlot = 0; fragSlot < spfs->info.num_inputs; fragSlot++) { +      const uint vertSlot = vinfo->src_index[fragSlot]; +      uint j; + +      switch (vinfo->interp_mode[fragSlot]) { +      case INTERP_CONSTANT: +         for (j = 0; j < NUM_CHANNELS; j++) +            const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_LINEAR: +         for (j = 0; j < NUM_CHANNELS; j++) +            line_linear_coeff(setup, &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_PERSPECTIVE: +         for (j = 0; j < NUM_CHANNELS; j++) +            line_persp_coeff(setup, &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_POS: +         setup_fragcoord_coeff(setup, fragSlot); +         break; +      default: +         assert(0); +      } + +      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) { +         /* FOG.y = front/back facing  XXX fix this */ +         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.facing; +         setup->coef[fragSlot].dadx[1] = 0.0; +         setup->coef[fragSlot].dady[1] = 0.0; +      } +   } +} + + +/** + * Plot a pixel in a line segment. + */ +static INLINE void +plot(struct setup_context *setup, int x, int y) +{ +   const int iy = y & 1; +   const int ix = x & 1; +   const int quadX = x - ix; +   const int quadY = y - iy; +   const int mask = (1 << ix) << (2 * iy); + +   if (quadX != setup->quad.x0 || +       quadY != setup->quad.y0) +   { +      /* flush prev quad, start new quad */ + +      if (setup->quad.x0 != -1) +         clip_emit_quad(setup); + +      setup->quad.x0 = quadX; +      setup->quad.y0 = quadY; +      setup->quad.mask = 0x0; +   } + +   setup->quad.mask |= mask; +} + + +/** + * Do setup for line rasterization, then render the line. + * Single-pixel width, no stipple, etc.  We rely on the 'draw' module + * to handle stippling and wide lines. + */ +void +setup_line(struct setup_context *setup, +           const float (*v0)[4], +           const float (*v1)[4]) +{ +   int x0 = (int) v0[0][0]; +   int x1 = (int) v1[0][0]; +   int y0 = (int) v0[0][1]; +   int y1 = (int) v1[0][1]; +   int dx = x1 - x0; +   int dy = y1 - y0; +   int xstep, ystep; + +#if DEBUG_VERTS +   debug_printf("Setup line:\n"); +   print_vertex(setup, v0); +   print_vertex(setup, v1); +#endif + +   if (setup->softpipe->no_rast) +      return; + +   if (dx == 0 && dy == 0) +      return; + +   setup_line_coefficients(setup, v0, v1); + +   if (dx < 0) { +      dx = -dx;   /* make positive */ +      xstep = -1; +   } +   else { +      xstep = 1; +   } + +   if (dy < 0) { +      dy = -dy;   /* make positive */ +      ystep = -1; +   } +   else { +      ystep = 1; +   } + +   assert(dx >= 0); +   assert(dy >= 0); + +   setup->quad.x0 = setup->quad.y0 = -1; +   setup->quad.mask = 0x0; +   setup->quad.prim = PRIM_LINE; +   /* XXX temporary: set coverage to 1.0 so the line appears +    * if AA mode happens to be enabled. +    */ +   setup->quad.coverage[0] = +   setup->quad.coverage[1] = +   setup->quad.coverage[2] = +   setup->quad.coverage[3] = 1.0; + +   if (dx > dy) { +      /*** X-major line ***/ +      int i; +      const int errorInc = dy + dy; +      int error = errorInc - dx; +      const int errorDec = error - dx; + +      for (i = 0; i < dx; i++) { +         plot(setup, x0, y0); + +         x0 += xstep; +         if (error < 0) { +            error += errorInc; +         } +         else { +            error += errorDec; +            y0 += ystep; +         } +      } +   } +   else { +      /*** Y-major line ***/ +      int i; +      const int errorInc = dx + dx; +      int error = errorInc - dy; +      const int errorDec = error - dy; + +      for (i = 0; i < dy; i++) { +         plot(setup, x0, y0); + +         y0 += ystep; +         if (error < 0) { +            error += errorInc; +         } +         else { +            error += errorDec; +            x0 += xstep; +         } +      } +   } + +   /* draw final quad */ +   if (setup->quad.mask) { +      clip_emit_quad(setup); +   } +} + + +static void +point_persp_coeff(struct setup_context *setup, +                  const float (*vert)[4], +                  struct tgsi_interp_coef *coef, +                  uint vertSlot, uint i) +{ +   assert(i <= 3); +   coef->dadx[i] = 0.0F; +   coef->dady[i] = 0.0F; +   coef->a0[i] = vert[vertSlot][i] * vert[0][3]; +} + + +/** + * Do setup for point rasterization, then render the point. + * Round or square points... + * XXX could optimize a lot for 1-pixel points. + */ +void +setup_point( struct setup_context *setup, +             const float (*v0)[4] ) +{ +   struct softpipe_context *softpipe = setup->softpipe; +   const struct sp_fragment_shader *spfs = softpipe->fs; +   const int sizeAttr = setup->softpipe->psize_slot; +   const float size +      = sizeAttr > 0 ? v0[sizeAttr][0] +      : setup->softpipe->rasterizer->point_size; +   const float halfSize = 0.5F * size; +   const boolean round = (boolean) setup->softpipe->rasterizer->point_smooth; +   const float x = v0[0][0];  /* Note: data[0] is always position */ +   const float y = v0[0][1]; +   const struct vertex_info *vinfo = softpipe_get_vertex_info(softpipe); +   uint fragSlot; + +#if DEBUG_VERTS +   debug_printf("Setup point:\n"); +   print_vertex(setup, v0); +#endif + +   if (softpipe->no_rast) +      return; + +   /* For points, all interpolants are constant-valued. +    * However, for point sprites, we'll need to setup texcoords appropriately. +    * XXX: which coefficients are the texcoords??? +    * We may do point sprites as textured quads... +    * +    * KW: We don't know which coefficients are texcoords - ultimately +    * the choice of what interpolation mode to use for each attribute +    * should be determined by the fragment program, using +    * per-attribute declaration statements that include interpolation +    * mode as a parameter.  So either the fragment program will have +    * to be adjusted for pointsprite vs normal point behaviour, or +    * otherwise a special interpolation mode will have to be defined +    * which matches the required behaviour for point sprites.  But - +    * the latter is not a feature of normal hardware, and as such +    * probably should be ruled out on that basis. +    */ +   setup->vprovoke = v0; + +   /* setup Z, W */ +   const_coeff(setup, &setup->posCoef, 0, 2); +   const_coeff(setup, &setup->posCoef, 0, 3); + +   for (fragSlot = 0; fragSlot < spfs->info.num_inputs; fragSlot++) { +      const uint vertSlot = vinfo->src_index[fragSlot]; +      uint j; + +      switch (vinfo->interp_mode[fragSlot]) { +      case INTERP_CONSTANT: +         /* fall-through */ +      case INTERP_LINEAR: +         for (j = 0; j < NUM_CHANNELS; j++) +            const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_PERSPECTIVE: +         for (j = 0; j < NUM_CHANNELS; j++) +            point_persp_coeff(setup, setup->vprovoke, +                              &setup->coef[fragSlot], vertSlot, j); +         break; +      case INTERP_POS: +         setup_fragcoord_coeff(setup, fragSlot); +         break; +      default: +         assert(0); +      } + +      if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) { +         /* FOG.y = front/back facing  XXX fix this */ +         setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.facing; +         setup->coef[fragSlot].dadx[1] = 0.0; +         setup->coef[fragSlot].dady[1] = 0.0; +      } +   } + +   setup->quad.prim = PRIM_POINT; + +   if (halfSize <= 0.5 && !round) { +      /* special case for 1-pixel points */ +      const int ix = ((int) x) & 1; +      const int iy = ((int) y) & 1; +      setup->quad.x0 = (int) x - ix; +      setup->quad.y0 = (int) y - iy; +      setup->quad.mask = (1 << ix) << (2 * iy); +      clip_emit_quad(setup); +   } +   else { +      if (round) { +         /* rounded points */ +         const int ixmin = block((int) (x - halfSize)); +         const int ixmax = block((int) (x + halfSize)); +         const int iymin = block((int) (y - halfSize)); +         const int iymax = block((int) (y + halfSize)); +         const float rmin = halfSize - 0.7071F;  /* 0.7071 = sqrt(2)/2 */ +         const float rmax = halfSize + 0.7071F; +         const float rmin2 = MAX2(0.0F, rmin * rmin); +         const float rmax2 = rmax * rmax; +         const float cscale = 1.0F / (rmax2 - rmin2); +         int ix, iy; + +         for (iy = iymin; iy <= iymax; iy += 2) { +            for (ix = ixmin; ix <= ixmax; ix += 2) { +               float dx, dy, dist2, cover; + +               setup->quad.mask = 0x0; + +               dx = (ix + 0.5f) - x; +               dy = (iy + 0.5f) - y; +               dist2 = dx * dx + dy * dy; +               if (dist2 <= rmax2) { +                  cover = 1.0F - (dist2 - rmin2) * cscale; +                  setup->quad.coverage[QUAD_TOP_LEFT] = MIN2(cover, 1.0f); +                  setup->quad.mask |= MASK_TOP_LEFT; +               } + +               dx = (ix + 1.5f) - x; +               dy = (iy + 0.5f) - y; +               dist2 = dx * dx + dy * dy; +               if (dist2 <= rmax2) { +                  cover = 1.0F - (dist2 - rmin2) * cscale; +                  setup->quad.coverage[QUAD_TOP_RIGHT] = MIN2(cover, 1.0f); +                  setup->quad.mask |= MASK_TOP_RIGHT; +               } + +               dx = (ix + 0.5f) - x; +               dy = (iy + 1.5f) - y; +               dist2 = dx * dx + dy * dy; +               if (dist2 <= rmax2) { +                  cover = 1.0F - (dist2 - rmin2) * cscale; +                  setup->quad.coverage[QUAD_BOTTOM_LEFT] = MIN2(cover, 1.0f); +                  setup->quad.mask |= MASK_BOTTOM_LEFT; +               } + +               dx = (ix + 1.5f) - x; +               dy = (iy + 1.5f) - y; +               dist2 = dx * dx + dy * dy; +               if (dist2 <= rmax2) { +                  cover = 1.0F - (dist2 - rmin2) * cscale; +                  setup->quad.coverage[QUAD_BOTTOM_RIGHT] = MIN2(cover, 1.0f); +                  setup->quad.mask |= MASK_BOTTOM_RIGHT; +               } + +               if (setup->quad.mask) { +                  setup->quad.x0 = ix; +                  setup->quad.y0 = iy; +                  clip_emit_quad(setup); +               } +            } +         } +      } +      else { +         /* square points */ +         const int xmin = (int) (x + 0.75 - halfSize); +         const int ymin = (int) (y + 0.25 - halfSize); +         const int xmax = xmin + (int) size; +         const int ymax = ymin + (int) size; +         /* XXX could apply scissor to xmin,ymin,xmax,ymax now */ +         const int ixmin = block(xmin); +         const int ixmax = block(xmax - 1); +         const int iymin = block(ymin); +         const int iymax = block(ymax - 1); +         int ix, iy; + +         /* +         debug_printf("(%f, %f) -> X:%d..%d Y:%d..%d\n", x, y, xmin, xmax,ymin,ymax); +         */ +         for (iy = iymin; iy <= iymax; iy += 2) { +            uint rowMask = 0xf; +            if (iy < ymin) { +               /* above the top edge */ +               rowMask &= (MASK_BOTTOM_LEFT | MASK_BOTTOM_RIGHT); +            } +            if (iy + 1 >= ymax) { +               /* below the bottom edge */ +               rowMask &= (MASK_TOP_LEFT | MASK_TOP_RIGHT); +            } + +            for (ix = ixmin; ix <= ixmax; ix += 2) { +               uint mask = rowMask; + +               if (ix < xmin) { +                  /* fragment is past left edge of point, turn off left bits */ +                  mask &= (MASK_BOTTOM_RIGHT | MASK_TOP_RIGHT); +               } +               if (ix + 1 >= xmax) { +                  /* past the right edge */ +                  mask &= (MASK_BOTTOM_LEFT | MASK_TOP_LEFT); +               } + +               setup->quad.mask = mask; +               setup->quad.x0 = ix; +               setup->quad.y0 = iy; +               clip_emit_quad(setup); +            } +         } +      } +   } +} + +void setup_prepare( struct setup_context *setup ) +{ +   struct softpipe_context *sp = setup->softpipe; +   unsigned i; + +   if (sp->dirty) { +      softpipe_update_derived(sp); +   } + +   /* Mark surfaces as defined now */ +   for (i = 0; i < sp->framebuffer.num_cbufs; i++){ +      if (sp->framebuffer.cbufs[i]) { +         sp->framebuffer.cbufs[i]->status = PIPE_SURFACE_STATUS_DEFINED; +      } +   } +   if (sp->framebuffer.zsbuf) { +      sp->framebuffer.zsbuf->status = PIPE_SURFACE_STATUS_DEFINED; +   } + +   { +      const struct sp_fragment_shader *fs = setup->softpipe->fs; +      setup->quad.nr_attrs = fs->info.num_inputs; +      sp->quad.first->begin(sp->quad.first); +   } + +   if (sp->reduced_api_prim == PIPE_PRIM_TRIANGLES && +       sp->rasterizer->fill_cw == PIPE_POLYGON_MODE_FILL && +       sp->rasterizer->fill_ccw == PIPE_POLYGON_MODE_FILL) { +      /* we'll do culling */ +      setup->winding = sp->rasterizer->cull_mode; +   } +   else { +      /* 'draw' will do culling */ +      setup->winding = PIPE_WINDING_NONE; +   } +} + + + +void setup_destroy_context( struct setup_context *setup ) +{ +   FREE( setup ); +} + + +/** + * Create a new primitive setup/render stage. + */ +struct setup_context *setup_create_context( struct softpipe_context *softpipe ) +{ +   struct setup_context *setup = CALLOC_STRUCT(setup_context); + +   setup->softpipe = softpipe; + +   setup->quad.coef = setup->coef; +   setup->quad.posCoef = &setup->posCoef; + +   return setup; +} diff --git a/src/gallium/drivers/softpipe/sp_setup.h b/src/gallium/drivers/softpipe/sp_setup.h new file mode 100644 index 0000000000..d54f334428 --- /dev/null +++ b/src/gallium/drivers/softpipe/sp_setup.h @@ -0,0 +1,53 @@ +/************************************************************************** + * + * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + * + **************************************************************************/ +#ifndef SP_SETUP_H +#define SP_SETUP_H + +struct setup_context; +struct softpipe_context; + +void  +setup_tri( struct setup_context *setup, +	   const float (*v0)[4], +	   const float (*v1)[4], +	   const float (*v2)[4] ); + +void +setup_line(struct setup_context *setup, +           const float (*v0)[4], +           const float (*v1)[4]); + +void +setup_point( struct setup_context *setup, +             const float (*v0)[4] ); + + +struct setup_context *setup_create_context( struct softpipe_context *softpipe ); +void setup_prepare( struct setup_context *setup ); +void setup_destroy_context( struct setup_context *setup ); + +#endif diff --git a/src/gallium/drivers/softpipe/sp_state.h b/src/gallium/drivers/softpipe/sp_state.h index 6e6501f5bc..452e51fa79 100644 --- a/src/gallium/drivers/softpipe/sp_state.h +++ b/src/gallium/drivers/softpipe/sp_state.h @@ -54,9 +54,11 @@  struct tgsi_sampler;  struct tgsi_exec_machine; +struct vertex_info; -/** Subclass of pipe_shader_state (though it doesn't really need to be). +/** + * Subclass of pipe_shader_state (though it doesn't really need to be).   *   * This is starting to look an awful lot like a quad pipeline stage...   */ @@ -80,11 +82,10 @@ struct sp_fragment_shader {     void (*delete)( struct sp_fragment_shader * );  }; -struct vertex_info;  /** Subclass of pipe_shader_state */  struct sp_vertex_shader { -   struct pipe_shader_state shader; +   struct pipe_shader_state shader;  /* Note: this field not actually used */     struct draw_vertex_shader *draw_data;  }; @@ -171,6 +172,9 @@ boolean softpipe_draw_elements(struct pipe_context *pipe,  			       unsigned indexSize,  			       unsigned mode, unsigned start, unsigned count); +void +softpipe_set_edgeflags(struct pipe_context *pipe, const unsigned *edgeflags); +  void  softpipe_map_surfaces(struct softpipe_context *sp); diff --git a/src/gallium/drivers/softpipe/sp_state_derived.c b/src/gallium/drivers/softpipe/sp_state_derived.c index 14abb20eeb..f10a1fa471 100644 --- a/src/gallium/drivers/softpipe/sp_state_derived.c +++ b/src/gallium/drivers/softpipe/sp_state_derived.c @@ -71,25 +71,16 @@ softpipe_get_vertex_info(struct softpipe_context *softpipe)            * simply emit the whole post-xform vertex as-is:            */           struct vertex_info *vinfo_vbuf = &softpipe->vertex_info_vbuf; -#if 0 -         vinfo_vbuf->num_attribs = 0; -         /* special-case to allow memcpy of whole vertex */ -         draw_emit_vertex_attr(vinfo_vbuf, EMIT_ALL, INTERP_NONE, 0); -         /* size in dwords or floats */ -         vinfo_vbuf->size = 4 * draw_num_vs_outputs(softpipe->draw) -                          + sizeof(struct vertex_header) / 4; -#else -         /* for pass-through mode, we need a more explicit list of attribs */           const uint num = draw_num_vs_outputs(softpipe->draw);           uint i; +         /* No longer any need to try and emit draw vertex_header info. +          */           vinfo_vbuf->num_attribs = 0; -         draw_emit_vertex_attr(vinfo_vbuf, EMIT_HEADER, INTERP_NONE, 0);           for (i = 0; i < num; i++) {              draw_emit_vertex_attr(vinfo_vbuf, EMIT_4F, INTERP_PERSPECTIVE, i);           }           draw_compute_vertex_size(vinfo_vbuf); -#endif        }        /* diff --git a/src/gallium/drivers/softpipe/sp_state_fs.c b/src/gallium/drivers/softpipe/sp_state_fs.c index 4eefd1d61f..24b91fbc79 100644 --- a/src/gallium/drivers/softpipe/sp_state_fs.c +++ b/src/gallium/drivers/softpipe/sp_state_fs.c @@ -83,6 +83,8 @@ void  softpipe_delete_fs_state(struct pipe_context *pipe, void *fs)  {     struct sp_fragment_shader *state = fs; + +   assert(fs != softpipe_context(pipe)->fs);     state->delete( state );  } @@ -100,10 +102,7 @@ softpipe_create_vs_state(struct pipe_context *pipe,        return NULL;     } -   state->shader = *templ; - -   state->draw_data = draw_create_vertex_shader(softpipe->draw, -                                                &state->shader); +   state->draw_data = draw_create_vertex_shader(softpipe->draw, templ);     if (state->draw_data == NULL) {        FREE( state );        return NULL; diff --git a/src/gallium/drivers/softpipe/sp_state_vertex.c b/src/gallium/drivers/softpipe/sp_state_vertex.c index e0230e16a4..46b6991195 100644 --- a/src/gallium/drivers/softpipe/sp_state_vertex.c +++ b/src/gallium/drivers/softpipe/sp_state_vertex.c @@ -47,6 +47,7 @@ softpipe_set_vertex_elements(struct pipe_context *pipe,     memcpy(softpipe->vertex_element, attribs,            count * sizeof(struct pipe_vertex_element)); +   softpipe->num_vertex_elements = count;     softpipe->dirty |= SP_NEW_VERTEX; @@ -64,6 +65,7 @@ softpipe_set_vertex_buffers(struct pipe_context *pipe,     assert(count <= PIPE_MAX_ATTRIBS);     memcpy(softpipe->vertex_buffer, buffers, count * sizeof(buffers[0])); +   softpipe->num_vertex_buffers = count;     softpipe->dirty |= SP_NEW_VERTEX; diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index 34da6356d7..be0b57d9fa 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.c +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c @@ -651,7 +651,9 @@ shadow_compare(uint compare_func,        k = 0;        break;     default: +      k = 0;        assert(0); +      break;     }     rgba[0][j] = rgba[1][j] = rgba[2][j] = (float) k; @@ -1049,5 +1051,19 @@ sp_get_samples(struct tgsi_sampler *sampler,     default:        assert(0);     } + +#if 0 /* DEBUG */ +   { +      int i; +      printf("Sampled at %f, %f, %f:\n", s[0], t[0], p[0]); +      for (i = 0; i < 4; i++) { +         printf("Frag %d: %f %f %f %f\n", i, +                rgba[0][i], +                rgba[1][i], +                rgba[2][i], +                rgba[3][i]); +      } +   } +#endif  } diff --git a/src/gallium/drivers/softpipe/sp_tile_cache.c b/src/gallium/drivers/softpipe/sp_tile_cache.c index 19f71887e7..1117c0ad4c 100644 --- a/src/gallium/drivers/softpipe/sp_tile_cache.c +++ b/src/gallium/drivers/softpipe/sp_tile_cache.c @@ -39,7 +39,7 @@  #include "sp_surface.h"  #include "sp_tile_cache.h" -#define NUM_ENTRIES 30 +#define NUM_ENTRIES 32  /** XXX move these */ @@ -131,7 +131,7 @@ sp_destroy_tile_cache(struct softpipe_tile_cache *tc)     uint pos;     for (pos = 0; pos < NUM_ENTRIES; pos++) { -      //assert(tc->entries[pos].x < 0); +      /*assert(tc->entries[pos].x < 0);*/     }     if (tc->surface) {        pipe_surface_reference(&tc->surface, NULL); @@ -168,7 +168,7 @@ sp_tile_cache_set_surface(struct softpipe_tile_cache *tc,        tc->depth_stencil = (ps->format == PIPE_FORMAT_S8Z24_UNORM ||                             ps->format == PIPE_FORMAT_Z16_UNORM ||                             ps->format == PIPE_FORMAT_Z32_UNORM || -                           ps->format == PIPE_FORMAT_U_S8); +                           ps->format == PIPE_FORMAT_S8_UNORM);     }  } @@ -332,8 +332,8 @@ sp_tile_cache_flush_clear(struct pipe_context *pipe,        for (x = 0; x < w; x += TILE_SIZE) {           if (is_clear_flag_set(tc->clear_flags, x, y)) {              pipe_put_tile_raw(pipe, ps, -                           x, y, TILE_SIZE, TILE_SIZE, -                           tc->tile.data.color32, 0/*STRIDE*/); +                              x, y, TILE_SIZE, TILE_SIZE, +                              tc->tile.data.color32, 0/*STRIDE*/);              /* do this? */              clear_clear_flag(tc->clear_flags, x, y); @@ -367,8 +367,8 @@ sp_flush_tile_cache(struct softpipe_context *softpipe,           if (tile->x >= 0) {              if (tc->depth_stencil) {                 pipe_put_tile_raw(pipe, ps, -                              tile->x, tile->y, TILE_SIZE, TILE_SIZE, -                              tile->data.depth32, 0/*STRIDE*/); +                                 tile->x, tile->y, TILE_SIZE, TILE_SIZE, +                                 tile->data.depth32, 0/*STRIDE*/);              }              else {                 pipe_put_tile_rgba(pipe, ps, @@ -385,7 +385,7 @@ sp_flush_tile_cache(struct softpipe_context *softpipe,  #endif     }     else if (tc->texture) { -      /* caching a texture, mark all entries as embpy */ +      /* caching a texture, mark all entries as empty */        for (pos = 0; pos < NUM_ENTRIES; pos++) {           tc->entries[pos].x = -1;        } diff --git a/src/gallium/drivers/softpipe/sp_winsys.h b/src/gallium/drivers/softpipe/sp_winsys.h index 291825dfe2..4ab666486c 100644 --- a/src/gallium/drivers/softpipe/sp_winsys.h +++ b/src/gallium/drivers/softpipe/sp_winsys.h @@ -59,7 +59,7 @@ struct pipe_context;  struct pipe_context *softpipe_create( struct pipe_screen *,                                        struct pipe_winsys *, -				      struct softpipe_winsys * ); +				      void *unused );  struct pipe_screen * diff --git a/src/gallium/include/pipe/p_compiler.h b/src/gallium/include/pipe/p_compiler.h index 91f3d2ac2d..a4b772bc4f 100644 --- a/src/gallium/include/pipe/p_compiler.h +++ b/src/gallium/include/pipe/p_compiler.h @@ -29,6 +29,8 @@  #define P_COMPILER_H +#include "p_config.h" +  #include <stdlib.h>  #include <string.h> diff --git a/src/gallium/include/pipe/p_config.h b/src/gallium/include/pipe/p_config.h new file mode 100644 index 0000000000..5c030bdfff --- /dev/null +++ b/src/gallium/include/pipe/p_config.h @@ -0,0 +1,121 @@ +/************************************************************************** + *  + * Copyright 2008 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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. + *  + **************************************************************************/ + +/** + * @file + * Gallium configuration defines. + *  + * This header file sets several defines based on the compiler, processor  + * architecture, and operating system being used. These defines should be used  + * throughout the code to facilitate porting to new platforms. It is likely that  + * this file is auto-generated by an autoconf-like tool at some point, as some  + * things cannot be determined by existing defines alone.  + *  + * @author José Fonseca <jrfonseca@tungstengraphics.com> + */ + +#ifndef P_CONFIG_H_ +#define P_CONFIG_H_ + + +/* + * Compiler + */ + +#if defined(__GNUC__) +#define PIPE_CC_GCC +#endif + +#if defined(_MSC_VER) || defined(__MSC__) +#define PIPE_CC_MSVC +#endif + +#if defined(__ICL) +#define PIPE_CC_ICL +#endif + + +/* + * Processor architecture + */ + +#if defined(_X86_) || defined(__i386__) || defined(__386__) || defined(i386) +#define PIPE_ARCH_X86 +#endif + +#if 0 /* FIXME */ +#define PIPE_ARCH_X86_64 +#endif + +#if 0 /* FIXME */ +#define PIPE_ARCH_PPC +#endif + + +/* + * Operating system + */ + +#if defined(__linux__) +#define PIPE_OS_LINUX +#endif + +#if defined(_WIN32) || defined(WIN32) +#define PIPE_OS_WINDOWS +#endif + + +/* + * Subsystem + *  + * XXX: There is no way to autodetect this. + */ + +#if defined(PIPE_OS_LINUX) +#define PIPE_SUBSYSTEM_DRI +#endif + +#if defined(PIPE_OS_WINDOWS) +#if !defined(PIPE_SUBSYSTEM_USER) && !defined(PIPE_SUBSYSTEM_KERNEL) +#error Neither PIPE_SUBSYSTEM_USER or PIPE_SUBSYSTEM_KERNEL defined. +#endif +#if defined(PIPE_SUBSYSTEM_KERNEL) +#define PIPE_SUBSYSTEM_WINDOWS_DISPLAY +#endif +#if 0 /* FIXME */ +#define PIPE_SUBSYSTEM_WINDOWS_MINIPORT +#endif +#if 0 /* FIXME */ +#define PIPE_SUBSYSTEM_WINDOWS_CE +#endif +#if defined(PIPE_SUBSYSTEM_USER) +#define PIPE_SUBSYSTEM_WINDOWS_USER +#endif +#endif /* PIPE_OS_WINDOWS */ + + +#endif /* P_CONFIG_H_ */ diff --git a/src/gallium/include/pipe/p_debug.h b/src/gallium/include/pipe/p_debug.h index 9e52ad9a37..7a7312ea12 100644 --- a/src/gallium/include/pipe/p_debug.h +++ b/src/gallium/include/pipe/p_debug.h @@ -59,7 +59,6 @@ extern "C" {  #endif  #endif -  void _debug_vprintf(const char *format, va_list ap); @@ -103,16 +102,19 @@ debug_printf(const char *format, ...)  #endif +#ifdef DEBUG  /**   * Dump a blob in hex to the same place that debug_printf sends its   * messages.   */ -#ifdef DEBUG -void debug_print_blob( const char *name, -                       const void *blob, -                       unsigned size ); +void debug_print_blob( const char *name, const void *blob, unsigned size ); + +/* Print a message along with a prettified format string + */ +void debug_print_format(const char *msg, unsigned fmt );  #else  #define debug_print_blob(_name, _blob, _size) ((void)0) +#define debug_print_format(_msg, _fmt) ((void)0)  #endif @@ -304,11 +306,11 @@ void *  debug_realloc(const char *file, unsigned line, const char *function,                void *old_ptr, size_t old_size, size_t new_size ); -void  -debug_memory_reset(void); +unsigned long +debug_memory_begin(void);  void  -debug_memory_report(void); +debug_memory_end(unsigned long beginning);  #ifdef	__cplusplus diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 586951d956..46a355daa2 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -192,7 +192,7 @@ enum pipe_texture_target {  #define PIPE_BUFFER_USAGE_VERTEX    (1 << 5)  #define PIPE_BUFFER_USAGE_INDEX     (1 << 6)  #define PIPE_BUFFER_USAGE_CONSTANT  (1 << 7) -/** Pipe driver custam usage flags should be greater or equal to this value */ +/** Pipe driver custom usage flags should be greater or equal to this value */  #define PIPE_BUFFER_USAGE_CUSTOM    (1 << 16) @@ -268,7 +268,7 @@ enum pipe_texture_target {  #define PIPE_CAP_MAX_POINT_WIDTH_AA      17  #define PIPE_CAP_MAX_TEXTURE_ANISOTROPY  18  #define PIPE_CAP_MAX_TEXTURE_LOD_BIAS    19 -#define PIPE_CAP_BITMAP_TEXCOORD_BIAS    20 +  #ifdef __cplusplus  } diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h index 9e0f91f202..a4bd23c302 100644 --- a/src/gallium/include/pipe/p_format.h +++ b/src/gallium/include/pipe/p_format.h @@ -28,7 +28,7 @@  #ifndef PIPE_FORMAT_H  #define PIPE_FORMAT_H -#include <stdio.h> /* for sprintf */ +#include "util/u_string.h"  #include "p_compiler.h"  #include "p_debug.h" @@ -163,18 +163,21 @@ static INLINE uint pf_get(pipe_format_rgbazs_t f, uint shift, uint mask)  /**   * Shorthand macro for common format swizzles.   */ -#define _PIPE_FORMAT_R000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 ) -#define _PIPE_FORMAT_RG00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 ) -#define _PIPE_FORMAT_RGB0 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_0 ) +#define _PIPE_FORMAT_R001 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_1 ) +#define _PIPE_FORMAT_RG01 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_1 ) +#define _PIPE_FORMAT_RGB1 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_1 )  #define _PIPE_FORMAT_RGBA _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_A )  #define _PIPE_FORMAT_ARGB _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_A, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B )  #define _PIPE_FORMAT_BGRA _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_A ) +#define _PIPE_FORMAT_1RGB _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_1, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B ) +#define _PIPE_FORMAT_BGR1 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_1 )  #define _PIPE_FORMAT_0000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )  #define _PIPE_FORMAT_000R _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_R )  #define _PIPE_FORMAT_RRR1 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_1 )  #define _PIPE_FORMAT_RRRR _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R )  #define _PIPE_FORMAT_RRRG _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G )  #define _PIPE_FORMAT_Z000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 ) +#define _PIPE_FORMAT_0Z00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )  #define _PIPE_FORMAT_SZ00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )  #define _PIPE_FORMAT_ZS00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )  #define _PIPE_FORMAT_S000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 ) @@ -229,14 +232,16 @@ static INLINE uint pf_rev(pipe_format_ycbcr_t f)  enum pipe_format {     PIPE_FORMAT_NONE                  = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_0000, 0, 0, 0, 0, PIPE_FORMAT_TYPE_UNKNOWN ),     PIPE_FORMAT_A8R8G8B8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_ARGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_X8R8G8B8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_1RGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_B8G8R8A8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGRA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_B8G8R8X8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGR1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_A1R5G5B5_UNORM        = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_ARGB, 1, 5, 5, 5, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_A4R4G4B4_UNORM        = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_ARGB, 4, 4, 4, 4, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R5G6B5_UNORM          = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_RGB0, 5, 6, 5, 0, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_U_L8                  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte luminance */ -   PIPE_FORMAT_U_A8                  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_000R, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte alpha */ -   PIPE_FORMAT_U_I8                  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRR, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte intensity */ -   PIPE_FORMAT_U_A8_L8               = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRG, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte alpha, luminance */ +   PIPE_FORMAT_R5G6B5_UNORM          = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_RGB1, 5, 6, 5, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_L8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte luminance */ +   PIPE_FORMAT_A8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_000R, 0, 0, 0, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte alpha */ +   PIPE_FORMAT_I8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRR, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte intensity */ +   PIPE_FORMAT_A8L8_UNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRG, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte alpha, luminance */     PIPE_FORMAT_YCBCR                 = _PIPE_FORMAT_YCBCR( 0 ),     PIPE_FORMAT_YCBCR_REV             = _PIPE_FORMAT_YCBCR( 1 ),     PIPE_FORMAT_Z16_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 2, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), @@ -244,68 +249,75 @@ enum pipe_format {     PIPE_FORMAT_Z32_FLOAT             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ),     PIPE_FORMAT_S8Z24_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_SZ00, 1, 3, 0, 0, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_Z24S8_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_ZS00, 3, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_X8Z24_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_0Z00, 1, 3, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_Z24X8_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 3, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_S8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_S000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte stencil */ -   PIPE_FORMAT_R64_FLOAT             = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_R000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), -   PIPE_FORMAT_R64G64_FLOAT          = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RG00, 1, 1, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), -   PIPE_FORMAT_R64G64B64_FLOAT       = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RGB0, 1, 1, 1, 0, PIPE_FORMAT_TYPE_FLOAT ), +   PIPE_FORMAT_R64_FLOAT             = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), +   PIPE_FORMAT_R64G64_FLOAT          = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), +   PIPE_FORMAT_R64G64B64_FLOAT       = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_FLOAT ),     PIPE_FORMAT_R64G64B64A64_FLOAT    = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_FLOAT ), -   PIPE_FORMAT_R32_FLOAT             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), -   PIPE_FORMAT_R32G32_FLOAT          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 4, 4, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), -   PIPE_FORMAT_R32G32B32_FLOAT       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 4, 4, 4, 0, PIPE_FORMAT_TYPE_FLOAT ), +   PIPE_FORMAT_R32_FLOAT             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), +   PIPE_FORMAT_R32G32_FLOAT          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_FLOAT ), +   PIPE_FORMAT_R32G32B32_FLOAT       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_FLOAT ),     PIPE_FORMAT_R32G32B32A32_FLOAT    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_FLOAT ), -   PIPE_FORMAT_R32_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R32G32_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 4, 4, 0, 0, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R32G32B32_UNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 4, 4, 4, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R32_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R32G32_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R32G32B32_UNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_R32G32B32A32_UNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R32_USCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R32G32_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 4, 4, 0, 0, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R32G32B32_USCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 4, 4, 4, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R32_USCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R32G32_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R32G32B32_USCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_USCALED ),     PIPE_FORMAT_R32G32B32A32_USCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R32_SNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R32G32_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R32G32B32_SNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R32_SNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R32G32_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R32G32B32_SNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SNORM ),     PIPE_FORMAT_R32G32B32A32_SNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R32_SSCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R32G32_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R32G32B32_SSCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R32_SSCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R32G32_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R32G32B32_SSCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SSCALED ),     PIPE_FORMAT_R32G32B32A32_SSCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R16_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 2, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R16G16_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 2, 2, 0, 0, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R16G16B16_UNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 2, 2, 2, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R16_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R16G16_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R16G16B16_UNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_R16G16B16A16_UNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R16_USCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 2, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R16G16_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 2, 2, 0, 0, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R16G16B16_USCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 2, 2, 2, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R16_USCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R16G16_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R16G16B16_USCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_USCALED ),     PIPE_FORMAT_R16G16B16A16_USCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R16_SNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R16G16_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R16G16B16_SNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R16_SNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R16G16_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R16G16B16_SNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SNORM ),     PIPE_FORMAT_R16G16B16A16_SNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R16_SSCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R16G16_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R16G16B16_SSCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R16_SSCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R16G16_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R16G16B16_SSCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SSCALED ),     PIPE_FORMAT_R16G16B16A16_SSCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R8G8_UNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 1, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R8G8B8_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 1, 1, 1, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R8G8_UNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R8G8B8_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_UNORM ),     PIPE_FORMAT_R8G8B8A8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), -   PIPE_FORMAT_R8_USCALED            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R8G8_USCALED          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 1, 1, 0, 0, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R8G8B8_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 1, 1, 1, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R8G8B8X8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), +   PIPE_FORMAT_R8_USCALED            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R8G8_USCALED          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R8G8B8_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_USCALED ),     PIPE_FORMAT_R8G8B8A8_USCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_USCALED ), -   PIPE_FORMAT_R8_SNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R8G8_SNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R8G8B8_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R8G8B8X8_USCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_USCALED ), +   PIPE_FORMAT_R8_SNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R8G8_SNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R8G8B8_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SNORM ),     PIPE_FORMAT_R8G8B8A8_SNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM ), -   PIPE_FORMAT_R8_SSCALED            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R8G8_SSCALED          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG00, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), -   PIPE_FORMAT_R8G8B8_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R8G8B8X8_SNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM ), +   PIPE_FORMAT_R8_SSCALED            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R8G8_SSCALED          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R8G8B8_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SSCALED ),     PIPE_FORMAT_R8G8B8A8_SSCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SSCALED ), +   PIPE_FORMAT_R8G8B8X8_SSCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SSCALED ),     /* sRGB formats */ -   PIPE_FORMAT_L8_SRGB               = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ), +   PIPE_FORMAT_L8_SRGB               = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SRGB ),     PIPE_FORMAT_A8_L8_SRGB            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRG, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ), -   PIPE_FORMAT_R8G8B8_SRGB           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB0, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SRGB ), +   PIPE_FORMAT_R8G8B8_SRGB           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SRGB ),     PIPE_FORMAT_R8G8B8A8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ), +   PIPE_FORMAT_R8G8B8X8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),     /* compressed formats */     PIPE_FORMAT_DXT1_RGB              = _PIPE_FORMAT_DXT( 1, 8, 8, 8, 0 ), @@ -316,97 +328,9 @@ enum pipe_format {  /** - * Unsigned 8-bit stencil format. - * XXX should remove this, but S8_UNORM is a poor name - */ -#define PIPE_FORMAT_U_S8                  PIPE_FORMAT_S8_UNORM - - -/**   * Builds pipe format name from format token.   */ -static INLINE char *pf_sprint_name( char *str, enum pipe_format format ) -{ -   strcpy( str, "PIPE_FORMAT_" ); -   switch (pf_layout( format )) { -   case PIPE_FORMAT_LAYOUT_RGBAZS: -      { -         pipe_format_rgbazs_t rgbazs = (pipe_format_rgbazs_t) format; -         uint                 i; -         uint                 scale = 1 << (pf_exp8( rgbazs ) * 3); - -         for (i = 0; i < 4; i++) { -            uint  size = pf_size_xyzw( rgbazs, i ); - -            if (size == 0) { -               break; -            } -            switch (pf_swizzle_xyzw( rgbazs, i )) { -            case PIPE_FORMAT_COMP_R: -               strcat( str, "R" ); -               break; -            case PIPE_FORMAT_COMP_G: -               strcat( str, "G" ); -               break; -            case PIPE_FORMAT_COMP_B: -               strcat( str, "B" ); -               break; -            case PIPE_FORMAT_COMP_A: -               strcat( str, "A" ); -               break; -            case PIPE_FORMAT_COMP_0: -               strcat( str, "0" ); -               break; -            case PIPE_FORMAT_COMP_1: -               strcat( str, "1" ); -               break; -            case PIPE_FORMAT_COMP_Z: -               strcat( str, "Z" ); -               break; -            case PIPE_FORMAT_COMP_S: -               strcat( str, "S" ); -               break; -            } -            sprintf( &str[strlen( str )], "%u", size * scale ); -         } -         if (i != 0) { -            strcat( str, "_" ); -         } -         switch (pf_type( rgbazs )) { -         case PIPE_FORMAT_TYPE_UNKNOWN: -            strcat( str, "NONE" ); -            break; -         case PIPE_FORMAT_TYPE_FLOAT: -            strcat( str, "FLOAT" ); -            break; -         case PIPE_FORMAT_TYPE_UNORM: -            strcat( str, "UNORM" ); -            break; -         case PIPE_FORMAT_TYPE_SNORM: -            strcat( str, "SNORM" ); -            break; -         case PIPE_FORMAT_TYPE_USCALED: -            strcat( str, "USCALED" ); -            break; -         case PIPE_FORMAT_TYPE_SSCALED: -            strcat( str, "SSCALED" ); -            break; -         } -      } -      break; -   case PIPE_FORMAT_LAYOUT_YCBCR: -      { -         pipe_format_ycbcr_t  ycbcr = (pipe_format_ycbcr_t) format; - -         strcat( str, "YCBCR" ); -         if (pf_rev( ycbcr )) { -            strcat( str, "_REV" ); -         } -      } -      break; -   } -   return str; -} +extern char *pf_sprint_name( char *str, enum pipe_format format );  /**   * Return bits for a particular component. @@ -442,6 +366,8 @@ static INLINE uint pf_get_bits( enum pipe_format format )     switch (pf_layout(format)) {     case PIPE_FORMAT_LAYOUT_RGBAZS:        return +         pf_get_component_bits( format, PIPE_FORMAT_COMP_0 ) + +         pf_get_component_bits( format, PIPE_FORMAT_COMP_1 ) +           pf_get_component_bits( format, PIPE_FORMAT_COMP_R ) +           pf_get_component_bits( format, PIPE_FORMAT_COMP_G ) +           pf_get_component_bits( format, PIPE_FORMAT_COMP_B ) + diff --git a/src/gallium/include/pipe/p_inlines.h b/src/gallium/include/pipe/p_inlines.h index 274f76a383..8eb604e73f 100644 --- a/src/gallium/include/pipe/p_inlines.h +++ b/src/gallium/include/pipe/p_inlines.h @@ -129,6 +129,56 @@ pipe_texture_release(struct pipe_texture **ptr)  } +/** + * Convenience wrappers for winsys buffer functions. + */ + +static INLINE struct pipe_buffer * +pipe_buffer_create( struct pipe_context *pipe, +                    unsigned alignment, unsigned usage, unsigned size ) +{ +   return pipe->winsys->buffer_create(pipe->winsys, alignment, usage, size); +} + +static INLINE struct pipe_buffer * +pipe_user_buffer_create( struct pipe_context *pipe, void *ptr, unsigned size ) +{ +   return pipe->winsys->user_buffer_create(pipe->winsys, ptr, size); +} + +static INLINE void +pipe_buffer_destroy( struct pipe_context *pipe, struct pipe_buffer *buf ) +{ +   pipe->winsys->buffer_destroy(pipe->winsys, buf); +} + +static INLINE void * +pipe_buffer_map(struct pipe_context *pipe, +                struct pipe_buffer *buf, +                unsigned usage) +{ +   return pipe->winsys->buffer_map(pipe->winsys, buf, usage); +} + +static INLINE void +pipe_buffer_unmap(struct pipe_context *pipe, +                  struct pipe_buffer *buf) +{ +   pipe->winsys->buffer_unmap(pipe->winsys, buf); +} + +/* XXX when we're using this everywhere, get rid of + * pipe_buffer_reference() above. + */ +static INLINE void +pipe_reference_buffer(struct pipe_context *pipe, +		      struct pipe_buffer **ptr, +		      struct pipe_buffer *buf) +{ +   pipe_buffer_reference(pipe->winsys, ptr, buf); +} + +  #ifdef __cplusplus  }  #endif diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 35bd46d691..26ac99d287 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -58,25 +58,33 @@ struct pipe_screen {     void (*destroy)( struct pipe_screen * ); -   /*  -    * Capability queries -    */     const char *(*get_name)( struct pipe_screen * );     const char *(*get_vendor)( struct pipe_screen * ); +   /** +    * Query an integer-valued capability/parameter/limit +    * \param param  one of PIPE_CAP_x +    */     int (*get_param)( struct pipe_screen *, int param ); +   /** +    * Query a float-valued capability/parameter/limit +    * \param param  one of PIPE_CAP_x +    */     float (*get_paramf)( struct pipe_screen *, int param ); -   /**< type is one of PIPE_TEXTURE, PIPE_SURFACE */ +   /** +    * Check if the given pipe_format is supported as a texture or +    * drawing surface. +    * \param type  one of PIPE_TEXTURE, PIPE_SURFACE +    */     boolean (*is_format_supported)( struct pipe_screen *,                                     enum pipe_format format,                                      uint type ); - -   /* -    * Texture functions +   /** +    * Create a new texture object, using the given template info.      */     struct pipe_texture * (*texture_create)(struct pipe_screen *,                                             const struct pipe_texture *templat); diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 2dc9a92186..912d84e7b9 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -51,16 +51,14 @@ extern "C" {  /**   * Implementation limits   */ -#define PIPE_MAX_SAMPLERS     16 -#define PIPE_MAX_CLIP_PLANES  6 -#define PIPE_MAX_CONSTANT    32 -#define PIPE_MAX_ATTRIBS     32 -#define PIPE_ATTRIB_MAX      32 /* XXX obsolete - remove */ -#define PIPE_MAX_COLOR_BUFS   8 -#define PIPE_MAX_TEXTURE_LEVELS  16 -#define PIPE_MAX_FEEDBACK_ATTRIBS 16 -#define PIPE_MAX_SHADER_INPUTS 16 -#define PIPE_MAX_SHADER_OUTPUTS 16 +#define PIPE_MAX_ATTRIBS          32 +#define PIPE_MAX_CLIP_PLANES       6 +#define PIPE_MAX_COLOR_BUFS        8 +#define PIPE_MAX_CONSTANT         32 +#define PIPE_MAX_SAMPLERS         16 +#define PIPE_MAX_SHADER_INPUTS    16 +#define PIPE_MAX_SHADER_OUTPUTS   16 +#define PIPE_MAX_TEXTURE_LEVELS   16  /* fwd decls */ diff --git a/src/gallium/include/pipe/p_thread.h b/src/gallium/include/pipe/p_thread.h index 4325abc951..af9150aafb 100644 --- a/src/gallium/include/pipe/p_thread.h +++ b/src/gallium/include/pipe/p_thread.h @@ -114,6 +114,26 @@ typedef pthread_mutex_t _glthread_Mutex;  #define _glthread_UNLOCK_MUTEX(name) \     (void) pthread_mutex_unlock(&(name)) +typedef pthread_cond_t _glthread_Cond; + +#define _glthread_DECLARE_STATIC_COND(name) \ +   static _glthread_Cond name = PTHREAD_COND_INITIALIZER + +#define _glthread_INIT_COND(cond)			\ +   pthread_cond_init(&(cond), NULL) + +#define _glthread_DESTROY_COND(name) \ +   pthread_cond_destroy(&(name)) + +#define _glthread_COND_WAIT(cond, mutex) \ +  pthread_cond_wait(&(cond), &(mutex)) + +#define _glthread_COND_SIGNAL(cond) \ +  pthread_cond_signal(&(cond)) + +#define _glthread_COND_BROADCAST(cond) \ +  pthread_cond_broadcast(&(cond)) +  #endif /* PTHREADS */ @@ -273,6 +293,20 @@ typedef unsigned _glthread_Mutex;  #define _glthread_UNLOCK_MUTEX(name)  (void) name +typedef unsigned _glthread_Cond; + +#define _glthread_DECLARE_STATIC_COND(name) static _glthread_Cond name = 0 + +#define _glthread_INIT_COND(name)  (void) name + +#define _glthread_DESTROY_COND(name)  (void) name + +#define _glthread_COND_WAIT(name, mutex)  (void) name + +#define _glthread_COND_SIGNAL(name)  (void) name + +#define _glthread_COND_BROADCAST(name)  (void) name +  #endif /* THREADS */ diff --git a/src/gallium/include/pipe/p_util.h b/src/gallium/include/pipe/p_util.h index 1bc00ac7a0..a66ab765f7 100644 --- a/src/gallium/include/pipe/p_util.h +++ b/src/gallium/include/pipe/p_util.h @@ -28,6 +28,7 @@  #ifndef P_UTIL_H  #define P_UTIL_H +#include "p_config.h"  #include "p_compiler.h"  #include "p_debug.h"  #include "p_pointer.h" @@ -40,7 +41,9 @@ extern "C" {  #endif -#if defined(WIN32) && defined(DEBUG) /* memory debugging */ +#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) && defined(DEBUG)  + +/* memory debugging */  #include "p_debug.h" @@ -53,9 +56,7 @@ extern "C" {  #define REALLOC( _ptr, _old_size, _size ) \     debug_realloc( __FILE__, __LINE__, __FUNCTION__,  _ptr, _old_size, _size ) -#else -    -#ifdef WIN32 +#elif defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)  void * __stdcall  EngAllocMem( @@ -67,17 +68,33 @@ void __stdcall  EngFreeMem(      void *Mem ); -static INLINE void * -MALLOC( unsigned size ) -{ -#ifdef WINCE -   /* TODO: Need to abstract this */ -   return malloc( size ); +#define MALLOC( _size ) EngAllocMem( 0, _size, 'D3AG' ) +#define _FREE( _ptr ) EngFreeMem( _ptr ) + +#elif defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT) + +void * +ExAllocatePool( +    unsigned long PoolType,  +    size_t NumberOfBytes); + +void  +ExFreePool(void *P); + +#define MALLOC(_size) ExAllocatePool(0, _size) +#define _FREE(_ptr) ExFreePool(_ptr) +  #else -   return EngAllocMem( 0, size, 'D3AG' ); + +#define MALLOC( SIZE )  malloc( SIZE ) +#define CALLOC( COUNT, SIZE )   calloc( COUNT, SIZE ) +#define FREE( PTR )  free( PTR ) +#define REALLOC( OLDPTR, OLDSIZE, NEWSIZE )  realloc( OLDPTR, NEWSIZE ) +  #endif -} + +#ifndef CALLOC  static INLINE void *  CALLOC( unsigned count, unsigned size )  { @@ -87,20 +104,19 @@ CALLOC( unsigned count, unsigned size )     }     return ptr;  } +#endif /* !CALLOC */ +#ifndef FREE  static INLINE void  FREE( void *ptr )  {     if( ptr ) { -#ifdef WINCE -      /* TODO: Need to abstract this */ -      free( ptr ); -#else -      EngFreeMem( ptr ); -#endif +      _FREE( ptr );     }  } +#endif /* !FREE */ +#ifndef REALLOC  static INLINE void *  REALLOC( void *old_ptr, unsigned old_size, unsigned new_size )  { @@ -117,19 +133,8 @@ REALLOC( void *old_ptr, unsigned old_size, unsigned new_size )     FREE( old_ptr );     return new_ptr;  } +#endif /* !REALLOC */ -#else /* !WIN32 */ - -#define MALLOC( SIZE )  malloc( SIZE ) - -#define CALLOC( COUNT, SIZE )   calloc( COUNT, SIZE ) - -#define FREE( PTR )  free( PTR ) - -#define REALLOC( OLDPTR, OLDSIZE, NEWSIZE )  realloc( OLDPTR, NEWSIZE ) - -#endif /* !WIN32 */ -#endif /* !DEBUG */  #define MALLOC_STRUCT(T)   (struct T *) MALLOC(sizeof(struct T)) @@ -138,14 +143,6 @@ REALLOC( void *old_ptr, unsigned old_size, unsigned new_size )  #define GETENV( X ) debug_get_option( X, NULL ) -#ifdef WIN32 -int rpl_vsnprintf(char *, size_t, const char *, va_list); -int rpl_snprintf(char *str, size_t size, const char *format, ...); -#define vsnprintf rpl_vsnprintf -#define snprintf rpl_snprintf -#endif - -  /**   * Return memory on given byte alignment   */ @@ -413,6 +410,54 @@ extern void pipe_copy_rect(ubyte * dst, unsigned cpp, unsigned dst_pitch,                             int src_pitch, unsigned src_x, int src_y); + +#ifdef WIN32 + +#if !defined(_INC_MATH) || !defined(__cplusplus) + +static INLINE float cosf( float f )  +{ +   return (float) cos( (double) f ); +} + +static INLINE float sinf( float f )  +{ +   return (float) sin( (double) f ); +} + +static INLINE float ceilf( float f )  +{ +   return (float) ceil( (double) f ); +} + +static INLINE float floorf( float f )  +{ +   return (float) floor( (double) f ); +} + +static INLINE float powf( float f, float g )  +{ +   return (float) pow( (double) f, (double) g ); +} + +static INLINE float sqrtf( float f )  +{ +   return (float) sqrt( (double) f ); +} + +static INLINE float fabsf( float f )  +{ +   return (float) fabs( (double) f ); +} + +static INLINE float logf( float f )  +{ +   return (float) cos( (double) f ); +} +#endif  /* _INC_MATH */ +#endif + +  #ifdef __cplusplus  }  #endif diff --git a/src/gallium/include/pipe/p_winsys.h b/src/gallium/include/pipe/p_winsys.h index 8569cdcf12..3005ec2d94 100644 --- a/src/gallium/include/pipe/p_winsys.h +++ b/src/gallium/include/pipe/p_winsys.h @@ -63,13 +63,13 @@ struct pipe_surface;  struct pipe_winsys  {     /** Returns name of this winsys interface */ -   const char *(*get_name)( struct pipe_winsys *sws ); +   const char *(*get_name)( struct pipe_winsys *ws );     /**      * Do any special operations to ensure frontbuffer contents are      * displayed, eg copy fake frontbuffer.      */ -   void (*flush_frontbuffer)( struct pipe_winsys *sws, +   void (*flush_frontbuffer)( struct pipe_winsys *ws,                                struct pipe_surface *surf,                                void *context_private ); @@ -79,7 +79,8 @@ struct pipe_winsys     /**      * Allocate storage for a pipe_surface. -    * Returns 0 if succeeds. +    * \param flags XXX unused, remove someday +    * \return  0 if succeeds.      */     int (*surface_alloc_storage)(struct pipe_winsys *ws,                                  struct pipe_surface *surf, @@ -104,7 +105,7 @@ struct pipe_winsys      * alignment indicates the client's alignment requirements, eg for      * SSE instructions.      */ -   struct pipe_buffer *(*buffer_create)( struct pipe_winsys *sws,  +   struct pipe_buffer *(*buffer_create)( struct pipe_winsys *ws,                                            unsigned alignment,                                            unsigned usage,                                           unsigned size ); @@ -130,7 +131,7 @@ struct pipe_winsys      * Note that ptr may be accessed at any time upto the time when the      * buffer is destroyed, so the data must not be freed before then.      */ -   struct pipe_buffer *(*user_buffer_create)(struct pipe_winsys *sws,  +   struct pipe_buffer *(*user_buffer_create)(struct pipe_winsys *ws,                                                       void *ptr,                                                      unsigned bytes); @@ -138,45 +139,40 @@ struct pipe_winsys      * Map the entire data store of a buffer object into the client's address.      * flags is bitmask of PIPE_BUFFER_USAGE_CPU_READ/WRITE flags.       */ -   void *(*buffer_map)( struct pipe_winsys *sws,  +   void *(*buffer_map)( struct pipe_winsys *ws,   			struct pipe_buffer *buf,  			unsigned usage ); -   void (*buffer_unmap)( struct pipe_winsys *sws,  +   void (*buffer_unmap)( struct pipe_winsys *ws,   			 struct pipe_buffer *buf ); -   void (*buffer_destroy)( struct pipe_winsys *sws, +   void (*buffer_destroy)( struct pipe_winsys *ws,  			   struct pipe_buffer *buf );     /** Set ptr = fence, with reference counting */ -   void (*fence_reference)( struct pipe_winsys *sws, +   void (*fence_reference)( struct pipe_winsys *ws,                              struct pipe_fence_handle **ptr,                              struct pipe_fence_handle *fence );     /**      * Checks whether the fence has been signalled. -    *   -    * The meaning of flag is pipe-driver specific. -    * -    * Returns zero if it has. +    * \param flags  driver-specific meaning +    * \return zero on success.      */ -   int (*fence_signalled)( struct pipe_winsys *sws, +   int (*fence_signalled)( struct pipe_winsys *ws,                             struct pipe_fence_handle *fence,                             unsigned flag );     /**      * Wait for the fence to finish. -    *  -    * The meaning of flag is pipe-driver specific. -    *  -    * Returns zero on success. +    * \param flags  driver-specific meaning +    * \return zero on success.      */ -   int (*fence_finish)( struct pipe_winsys *sws, +   int (*fence_finish)( struct pipe_winsys *ws,                          struct pipe_fence_handle *fence,                          unsigned flag ); -  }; diff --git a/src/gallium/winsys/xlib/fakeglx.c b/src/gallium/winsys/xlib/fakeglx.c index 902a755075..2c0075e934 100644 --- a/src/gallium/winsys/xlib/fakeglx.c +++ b/src/gallium/winsys/xlib/fakeglx.c @@ -1459,6 +1459,13 @@ Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,                              GLXDrawable read, GLXContext ctx )  {     struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx; +   static boolean firsttime = 1, no_rast = 0; + +   if (firsttime) { +      no_rast = getenv("SP_NO_RAST") != NULL; +      firsttime = 0; +   } +     if (ctx && draw && read) {        XMesaBuffer drawBuffer, readBuffer; @@ -1504,6 +1511,14 @@ Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,  #endif        } +      if (no_rast && +          MakeCurrent_PrevContext == ctx && +          MakeCurrent_PrevDrawable == draw && +          MakeCurrent_PrevReadable == read && +          MakeCurrent_PrevDrawBuffer == drawBuffer && +          MakeCurrent_PrevReadBuffer == readBuffer) +         return True; +                  MakeCurrent_PrevContext = ctx;        MakeCurrent_PrevDrawable = draw;        MakeCurrent_PrevReadable = read; @@ -1674,6 +1689,15 @@ static void  Fake_glXSwapBuffers( Display *dpy, GLXDrawable drawable )  {     XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable ); +   static boolean firsttime = 1, no_rast = 0; + +   if (firsttime) { +      no_rast = getenv("SP_NO_RAST") != NULL; +      firsttime = 0; +   } + +   if (no_rast) +      return;     if (buffer) {        XMesaSwapBuffers(buffer); diff --git a/src/gallium/winsys/xlib/xm_api.c b/src/gallium/winsys/xlib/xm_api.c index a82d3c990e..26b722f343 100644 --- a/src/gallium/winsys/xlib/xm_api.c +++ b/src/gallium/winsys/xlib/xm_api.c @@ -110,6 +110,9 @@ int xmesa_check_for_xshm( XMesaDisplay *display )     int major, minor, ignore;     Bool pixmaps; +   if (getenv("SP_NO_RAST"))  +      return 0; +     if (getenv("MESA_NOSHM")) {        return 0;     } @@ -814,9 +817,6 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )     mesaCtx->Const.CheckArrayBounds = GL_TRUE;  #endif -   /* finish up xmesa context initializations */ -   c->st->haveFramebufferSurfaces = GL_TRUE; -     return c;  } diff --git a/src/gallium/winsys/xlib/xm_winsys.c b/src/gallium/winsys/xlib/xm_winsys.c index 9a20bdfb69..14c3892559 100644 --- a/src/gallium/winsys/xlib/xm_winsys.c +++ b/src/gallium/winsys/xlib/xm_winsys.c @@ -37,6 +37,7 @@  #include "xmesaP.h"  #undef ASSERT +#undef Elements  #include "pipe/p_winsys.h"  #include "pipe/p_format.h" @@ -57,6 +58,7 @@  /** + * Subclass of pipe_buffer for Xlib winsys.   * Low-level OS/window system memory buffer   */  struct xm_buffer @@ -73,32 +75,22 @@ struct xm_buffer  #endif  }; -#if defined(USE_XSHM) && !defined(XFree86Server) -# define XSHM_ENABLED(b) ((b)->shm) -#else -# define XSHM_ENABLED(b) 0 -#endif +/** + * Subclass of pipe_surface for Xlib winsys + */  struct xmesa_surface  {     struct pipe_surface surface;     int tileSize; +   boolean no_swap;  };  /** - * Derived from softpipe_winsys. - * We just need one extra field which indicates the pixel format to use for - * drawing surfaces so that we're compatible with the XVisual/window format. + * Subclass of pipe_winsys for Xlib winsys   */ -struct xmesa_softpipe_winsys -{ -   struct softpipe_winsys spws; -   enum pipe_format pixelformat; -}; - -  struct xmesa_pipe_winsys  {     struct pipe_winsys base; @@ -107,35 +99,147 @@ struct xmesa_pipe_winsys  }; -static void alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb, -    unsigned width, unsigned height);  /** Cast wrapper */  static INLINE struct xmesa_surface *  xmesa_surface(struct pipe_surface *ps)  { -//   assert(0);     return (struct xmesa_surface *) ps;  } -/** cast wrapper */ -static INLINE struct xmesa_softpipe_winsys * -xmesa_softpipe_winsys(struct softpipe_winsys *spws) + +/** Cast wrapper */ +static INLINE struct xm_buffer * +xm_buffer( struct pipe_buffer *buf )  { -   return (struct xmesa_softpipe_winsys *) spws; +   return (struct xm_buffer *)buf;  } +  /** - * Turn the softpipe opaque buffer pointer into a dri_bufmgr opaque - * buffer pointer... + * X Shared Memory Image extension code   */ -static INLINE struct xm_buffer * -xm_buffer( struct pipe_buffer *buf ) +#if defined(USE_XSHM) && !defined(XFree86Server) + +#define XSHM_ENABLED(b) ((b)->shm) + +static volatile int mesaXErrorFlag = 0; + +/** + * Catches potential Xlib errors. + */ +static int +mesaHandleXError(XMesaDisplay *dpy, XErrorEvent *event)  { -   return (struct xm_buffer *)buf; +   (void) dpy; +   (void) event; +   mesaXErrorFlag = 1; +   return 0; +} + + +static GLboolean alloc_shm(struct xm_buffer *buf, unsigned size) +{ +   XShmSegmentInfo *const shminfo = & buf->shminfo; + +   shminfo->shmid = shmget(IPC_PRIVATE, size, IPC_CREAT|0777); +   if (shminfo->shmid < 0) { +      return GL_FALSE; +   } + +   shminfo->shmaddr = (char *) shmat(shminfo->shmid, 0, 0); +   if (shminfo->shmaddr == (char *) -1) { +      shmctl(shminfo->shmid, IPC_RMID, 0); +      return GL_FALSE; +   } + +   shminfo->readOnly = False; +   return GL_TRUE;  } +/** + * Allocate a shared memory XImage back buffer for the given XMesaBuffer. + */ +static void +alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb, +                 unsigned width, unsigned height) +{ +   /* +    * We have to do a _lot_ of error checking here to be sure we can +    * really use the XSHM extension.  It seems different servers trigger +    * errors at different points if the extension won't work.  Therefore +    * we have to be very careful... +    */ +#if 0 +   GC gc; +#endif +   int (*old_handler)(XMesaDisplay *, XErrorEvent *); + +   b->tempImage = XShmCreateImage(xmb->xm_visual->display, +                                  xmb->xm_visual->visinfo->visual, +                                  xmb->xm_visual->visinfo->depth, +                                  ZPixmap, +                                  NULL, +                                  &b->shminfo, +                                  width, height); +   if (b->tempImage == NULL) { +      b->shm = 0; +      return; +   } + + +   mesaXErrorFlag = 0; +   old_handler = XSetErrorHandler(mesaHandleXError); +   /* This may trigger the X protocol error we're ready to catch: */ +   XShmAttach(xmb->xm_visual->display, &b->shminfo); +   XSync(xmb->xm_visual->display, False); + +   if (mesaXErrorFlag) { +      /* we are on a remote display, this error is normal, don't print it */ +      XFlush(xmb->xm_visual->display); +      mesaXErrorFlag = 0; +      XDestroyImage(b->tempImage); +      b->tempImage = NULL; +      b->shm = 0; +      (void) XSetErrorHandler(old_handler); +      return; +   } + + +   /* Finally, try an XShmPutImage to be really sure the extension works */ +#if 0 +   gc = XCreateGC(xmb->xm_visual->display, xmb->drawable, 0, NULL); +   XShmPutImage(xmb->xm_visual->display, xmb->drawable, gc, +                b->tempImage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False); +   XSync(xmb->xm_visual->display, False); +   XFreeGC(xmb->xm_visual->display, gc); +   (void) XSetErrorHandler(old_handler); +   if (mesaXErrorFlag) { +      XFlush(xmb->xm_visual->display); +      mesaXErrorFlag = 0; +      XDestroyImage(b->tempImage); +      b->tempImage = NULL; +      b->shm = 0; +      return; +   } +#endif +} + +#else + +#define XSHM_ENABLED(b) 0 + +static void +alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb, +                 unsigned width, unsigned height) +{ +   b->shm = 0; +} +#endif /* USE_XSHM */ + + +  /* Most callbacks map direcly onto dri_bufmgr operations:   */ @@ -252,6 +356,9 @@ xmesa_display_surface(XMesaBuffer b, const struct pipe_surface *surf)     const struct xmesa_surface *xm_surf        = xmesa_surface((struct pipe_surface *) surf); +   if (xm_surf->no_swap) +      return; +     if (xm_surf->tileSize) {        xmesa_display_surface_tiled(b, surf);        return; @@ -292,10 +399,9 @@ xm_flush_frontbuffer(struct pipe_winsys *pws,                       struct pipe_surface *surf,                       void *context_private)  { -   /* The Xlib driver's front color surfaces are actually X Windows so -    * this flush is a no-op. -    * If we instead did front buffer rendering to a temporary XImage, -    * this would be the place to copy the Ximage to the on-screen Window. +   /* +    * The front color buffer is actually just another XImage buffer. +    * This function copies that XImage to the actual X Window.      */     XMesaContext xmctx = (XMesaContext) context_private;     xmesa_display_surface(xmctx->xm_buffer, surf); @@ -310,119 +416,6 @@ xm_get_name(struct pipe_winsys *pws)  } -#if defined(USE_XSHM) && !defined(XFree86Server) -static volatile int mesaXErrorFlag = 0; - -/** - * Catches potential Xlib errors. - */ -static int -mesaHandleXError(XMesaDisplay *dpy, XErrorEvent *event) -{ -   (void) dpy; -   (void) event; -   mesaXErrorFlag = 1; -   return 0; -} - - -static GLboolean alloc_shm(struct xm_buffer *buf, unsigned size) -{ -   XShmSegmentInfo *const shminfo = & buf->shminfo; - -   shminfo->shmid = shmget(IPC_PRIVATE, size, IPC_CREAT|0777); -   if (shminfo->shmid < 0) { -      return GL_FALSE; -   } - -   shminfo->shmaddr = (char *) shmat(shminfo->shmid, 0, 0); -   if (shminfo->shmaddr == (char *) -1) { -      shmctl(shminfo->shmid, IPC_RMID, 0); -      return GL_FALSE; -   } - -   shminfo->readOnly = False; -   return GL_TRUE; -} - - -/** - * Allocate a shared memory XImage back buffer for the given XMesaBuffer. - */ -static void -alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb, -                 unsigned width, unsigned height) -{ -   /* -    * We have to do a _lot_ of error checking here to be sure we can -    * really use the XSHM extension.  It seems different servers trigger -    * errors at different points if the extension won't work.  Therefore -    * we have to be very careful... -    */ -#if 0 -   GC gc; -#endif -   int (*old_handler)(XMesaDisplay *, XErrorEvent *); - -   b->tempImage = XShmCreateImage(xmb->xm_visual->display, -                                  xmb->xm_visual->visinfo->visual, -                                  xmb->xm_visual->visinfo->depth, -                                  ZPixmap, -                                  NULL, -                                  &b->shminfo, -                                  width, height); -   if (b->tempImage == NULL) { -      b->shm = 0; -      return; -   } - - -   mesaXErrorFlag = 0; -   old_handler = XSetErrorHandler(mesaHandleXError); -   /* This may trigger the X protocol error we're ready to catch: */ -   XShmAttach(xmb->xm_visual->display, &b->shminfo); -   XSync(xmb->xm_visual->display, False); - -   if (mesaXErrorFlag) { -      /* we are on a remote display, this error is normal, don't print it */ -      XFlush(xmb->xm_visual->display); -      mesaXErrorFlag = 0; -      XDestroyImage(b->tempImage); -      b->tempImage = NULL; -      b->shm = 0; -      (void) XSetErrorHandler(old_handler); -      return; -   } - - -   /* Finally, try an XShmPutImage to be really sure the extension works */ -#if 0 -   gc = XCreateGC(xmb->xm_visual->display, xmb->drawable, 0, NULL); -   XShmPutImage(xmb->xm_visual->display, xmb->drawable, gc, -                b->tempImage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False); -   XSync(xmb->xm_visual->display, False); -   XFreeGC(xmb->xm_visual->display, gc); -   (void) XSetErrorHandler(old_handler); -   if (mesaXErrorFlag) { -      XFlush(xmb->xm_visual->display); -      mesaXErrorFlag = 0; -      XDestroyImage(b->tempImage); -      b->tempImage = NULL; -      b->shm = 0; -      return; -   } -#endif -} -#else -static void -alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb, -                 unsigned width, unsigned height) -{ -   b->shm = 0; -} -#endif - -  static struct pipe_buffer *  xm_buffer_create(struct pipe_winsys *pws,                    unsigned alignment,  @@ -522,13 +515,19 @@ xm_surface_alloc_storage(struct pipe_winsys *winsys,  /** - * Called via pipe->surface_alloc() to create new surfaces (textures, - * renderbuffers, etc. + * Called via winsys->surface_alloc() to create new surfaces.   */  static struct pipe_surface *  xm_surface_alloc(struct pipe_winsys *ws)  {     struct xmesa_surface *xms = CALLOC_STRUCT(xmesa_surface); +   static boolean no_swap = 0; +   static boolean firsttime = 1; + +   if (firsttime) { +      no_swap = getenv("SP_NO_RAST") != NULL; +      firsttime = 0; +   }     assert(ws); @@ -540,7 +539,9 @@ xm_surface_alloc(struct pipe_winsys *ws)        xms->tileSize = 32; /** probably temporary */     }  #endif - +    +   xms->no_swap = no_swap; +        return &xms->surface;  } @@ -598,10 +599,19 @@ xmesa_get_pipe_winsys_aub(struct xmesa_visual *xm_vis)  {     static struct xmesa_pipe_winsys *ws = NULL; -   if (!ws && getenv("XM_AUB")) { +   if (!ws) {        ws = (struct xmesa_pipe_winsys *) xmesa_create_pipe_winsys_aub();     } -   else if (!ws) { +   return &ws->base; +} + + +static struct pipe_winsys * +xmesa_get_pipe_winsys(struct xmesa_visual *xm_vis) +{ +   static struct xmesa_pipe_winsys *ws = NULL; + +   if (!ws) {        ws = CALLOC_STRUCT(xmesa_pipe_winsys);        ws->xm_visual = xm_vis; @@ -632,45 +642,19 @@ xmesa_get_pipe_winsys_aub(struct xmesa_visual *xm_vis)  } -/** - * Called via softpipe_winsys->is_format_supported(). - * This function is only called to test formats for front/back color surfaces. - * The winsys being queried will have been created at glXCreateContext - * time, with a pixel format corresponding to the context's visual. - */ -static boolean -xmesa_is_format_supported(struct softpipe_winsys *sws, -                          enum pipe_format format) -{ -   struct xmesa_softpipe_winsys *xmws = xmesa_softpipe_winsys(sws); -   return (format == xmws->pixelformat); -} - - -/** - * Return pointer to a softpipe_winsys object. - */ -static struct softpipe_winsys * -xmesa_get_softpipe_winsys(uint pixelformat) -{ -   struct xmesa_softpipe_winsys *xmws -      = CALLOC_STRUCT(xmesa_softpipe_winsys); -   if (!xmws) -      return NULL; - -   xmws->spws.is_format_supported = xmesa_is_format_supported; -   xmws->pixelformat = pixelformat; - -   return &xmws->spws; -} - -  struct pipe_context *  xmesa_create_pipe_context(XMesaContext xmesa, uint pixelformat)  { -   struct pipe_winsys *pws = xmesa_get_pipe_winsys_aub(xmesa->xm_visual); +   struct pipe_winsys *pws;     struct pipe_context *pipe; +   if (getenv("XM_AUB")) { +      pws = xmesa_get_pipe_winsys_aub(xmesa->xm_visual); +   } +   else { +      pws = xmesa_get_pipe_winsys(xmesa->xm_visual); +   } +  #ifdef GALLIUM_CELL     if (!getenv("GALLIUM_NOCELL")) {        struct cell_winsys *cws = cell_get_winsys(pixelformat); @@ -681,10 +665,9 @@ xmesa_create_pipe_context(XMesaContext xmesa, uint pixelformat)     else  #endif     { -      struct softpipe_winsys *spws = xmesa_get_softpipe_winsys(pixelformat);        struct pipe_screen *screen = softpipe_create_screen(pws); -      pipe = softpipe_create(screen, pws, spws); +      pipe = softpipe_create(screen, pws, NULL);     }     if (pipe) diff --git a/src/glx/x11/indirect.c b/src/glx/x11/indirect.c index 87c523383b..fbb2a91956 100644 --- a/src/glx/x11/indirect.c +++ b/src/glx/x11/indirect.c @@ -7470,26 +7470,6 @@ __indirect_glGetProgramivARB(GLenum target, GLenum pname, GLint * params)  #define X_GLrop_ProgramEnvParameter4dvARB 4185  void -__indirect_glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, -                                      GLdouble y, GLdouble z, GLdouble w) -{ -    __GLXcontext *const gc = __glXGetCurrentContext(); -    const GLuint cmdlen = 44; -    emit_header(gc->pc, X_GLrop_ProgramEnvParameter4dvARB, cmdlen); -    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4); -    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4); -    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 8); -    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 8); -    (void) memcpy((void *) (gc->pc + 28), (void *) (&z), 8); -    (void) memcpy((void *) (gc->pc + 36), (void *) (&w), 8); -    gc->pc += cmdlen; -    if (__builtin_expect(gc->pc > gc->limit, 0)) { -        (void) __glXFlushRenderBuffer(gc, gc->pc); -    } -} - -#define X_GLrop_ProgramEnvParameter4dvARB 4185 -void  __indirect_glProgramEnvParameter4dvARB(GLenum target, GLuint index,                                         const GLdouble * params)  { @@ -7507,26 +7487,6 @@ __indirect_glProgramEnvParameter4dvARB(GLenum target, GLuint index,  #define X_GLrop_ProgramEnvParameter4fvARB 4184  void -__indirect_glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, -                                      GLfloat y, GLfloat z, GLfloat w) -{ -    __GLXcontext *const gc = __glXGetCurrentContext(); -    const GLuint cmdlen = 28; -    emit_header(gc->pc, X_GLrop_ProgramEnvParameter4fvARB, cmdlen); -    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4); -    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4); -    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4); -    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4); -    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 4); -    (void) memcpy((void *) (gc->pc + 24), (void *) (&w), 4); -    gc->pc += cmdlen; -    if (__builtin_expect(gc->pc > gc->limit, 0)) { -        (void) __glXFlushRenderBuffer(gc, gc->pc); -    } -} - -#define X_GLrop_ProgramEnvParameter4fvARB 4184 -void  __indirect_glProgramEnvParameter4fvARB(GLenum target, GLuint index,                                         const GLfloat * params)  { @@ -9104,80 +9064,6 @@ __indirect_glLoadProgramNV(GLenum target, GLuint id, GLsizei len,      }  } -#define X_GLrop_ProgramParameter4dvNV 4185 -void -__indirect_glProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, -                                  GLdouble y, GLdouble z, GLdouble w) -{ -    __GLXcontext *const gc = __glXGetCurrentContext(); -    const GLuint cmdlen = 44; -    emit_header(gc->pc, X_GLrop_ProgramParameter4dvNV, cmdlen); -    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4); -    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4); -    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 8); -    (void) memcpy((void *) (gc->pc + 20), (void *) (&y), 8); -    (void) memcpy((void *) (gc->pc + 28), (void *) (&z), 8); -    (void) memcpy((void *) (gc->pc + 36), (void *) (&w), 8); -    gc->pc += cmdlen; -    if (__builtin_expect(gc->pc > gc->limit, 0)) { -        (void) __glXFlushRenderBuffer(gc, gc->pc); -    } -} - -#define X_GLrop_ProgramParameter4dvNV 4185 -void -__indirect_glProgramParameter4dvNV(GLenum target, GLuint index, -                                   const GLdouble * params) -{ -    __GLXcontext *const gc = __glXGetCurrentContext(); -    const GLuint cmdlen = 44; -    emit_header(gc->pc, X_GLrop_ProgramParameter4dvNV, cmdlen); -    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4); -    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4); -    (void) memcpy((void *) (gc->pc + 12), (void *) (params), 32); -    gc->pc += cmdlen; -    if (__builtin_expect(gc->pc > gc->limit, 0)) { -        (void) __glXFlushRenderBuffer(gc, gc->pc); -    } -} - -#define X_GLrop_ProgramParameter4fvNV 4184 -void -__indirect_glProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, -                                  GLfloat y, GLfloat z, GLfloat w) -{ -    __GLXcontext *const gc = __glXGetCurrentContext(); -    const GLuint cmdlen = 28; -    emit_header(gc->pc, X_GLrop_ProgramParameter4fvNV, cmdlen); -    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4); -    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4); -    (void) memcpy((void *) (gc->pc + 12), (void *) (&x), 4); -    (void) memcpy((void *) (gc->pc + 16), (void *) (&y), 4); -    (void) memcpy((void *) (gc->pc + 20), (void *) (&z), 4); -    (void) memcpy((void *) (gc->pc + 24), (void *) (&w), 4); -    gc->pc += cmdlen; -    if (__builtin_expect(gc->pc > gc->limit, 0)) { -        (void) __glXFlushRenderBuffer(gc, gc->pc); -    } -} - -#define X_GLrop_ProgramParameter4fvNV 4184 -void -__indirect_glProgramParameter4fvNV(GLenum target, GLuint index, -                                   const GLfloat * params) -{ -    __GLXcontext *const gc = __glXGetCurrentContext(); -    const GLuint cmdlen = 28; -    emit_header(gc->pc, X_GLrop_ProgramParameter4fvNV, cmdlen); -    (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4); -    (void) memcpy((void *) (gc->pc + 8), (void *) (&index), 4); -    (void) memcpy((void *) (gc->pc + 12), (void *) (params), 16); -    gc->pc += cmdlen; -    if (__builtin_expect(gc->pc > gc->limit, 0)) { -        (void) __glXFlushRenderBuffer(gc, gc->pc); -    } -} -  #define X_GLrop_ProgramParameters4dvNV 4187  void  __indirect_glProgramParameters4dvNV(GLenum target, GLuint index, GLuint num, diff --git a/src/glx/x11/indirect.h b/src/glx/x11/indirect.h index 630062e233..f8c88b36bb 100644 --- a/src/glx/x11/indirect.h +++ b/src/glx/x11/indirect.h @@ -517,9 +517,7 @@ extern HIDDEN void __indirect_glGetProgramivARB(GLenum target, GLenum pname, GLi  extern HIDDEN void __indirect_glGetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble * params);  extern HIDDEN void __indirect_glGetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat * params);  extern HIDDEN void __indirect_glGetVertexAttribivARB(GLuint index, GLenum pname, GLint * params); -extern HIDDEN void __indirect_glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);  extern HIDDEN void __indirect_glProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble * params); -extern HIDDEN void __indirect_glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);  extern HIDDEN void __indirect_glProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat * params);  extern HIDDEN void __indirect_glProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);  extern HIDDEN void __indirect_glProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble * params); @@ -639,10 +637,6 @@ extern HIDDEN void __indirect_glGetVertexAttribfvNV(GLuint index, GLenum pname,  extern HIDDEN void __indirect_glGetVertexAttribivNV(GLuint index, GLenum pname, GLint * params);  extern HIDDEN GLboolean __indirect_glIsProgramNV(GLuint program);  extern HIDDEN void __indirect_glLoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte * program); -extern HIDDEN void __indirect_glProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -extern HIDDEN void __indirect_glProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble * params); -extern HIDDEN void __indirect_glProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -extern HIDDEN void __indirect_glProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat * params);  extern HIDDEN void __indirect_glProgramParameters4dvNV(GLenum target, GLuint index, GLuint num, const GLdouble * params);  extern HIDDEN void __indirect_glProgramParameters4fvNV(GLenum target, GLuint index, GLuint num, const GLfloat * params);  extern HIDDEN void __indirect_glRequestResidentProgramsNV(GLsizei n, const GLuint * ids); diff --git a/src/glx/x11/indirect_init.c b/src/glx/x11/indirect_init.c index aaa70c8796..479184337c 100644 --- a/src/glx/x11/indirect_init.c +++ b/src/glx/x11/indirect_init.c @@ -526,9 +526,7 @@ __GLapi * __glXNewIndirectAPI( void )      glAPI->GetVertexAttribdvARB = __indirect_glGetVertexAttribdvARB;      glAPI->GetVertexAttribfvARB = __indirect_glGetVertexAttribfvARB;      glAPI->GetVertexAttribivARB = __indirect_glGetVertexAttribivARB; -    glAPI->ProgramEnvParameter4dARB = __indirect_glProgramEnvParameter4dARB;      glAPI->ProgramEnvParameter4dvARB = __indirect_glProgramEnvParameter4dvARB; -    glAPI->ProgramEnvParameter4fARB = __indirect_glProgramEnvParameter4fARB;      glAPI->ProgramEnvParameter4fvARB = __indirect_glProgramEnvParameter4fvARB;      glAPI->ProgramLocalParameter4dARB = __indirect_glProgramLocalParameter4dARB;      glAPI->ProgramLocalParameter4dvARB = __indirect_glProgramLocalParameter4dvARB; @@ -681,10 +679,6 @@ __GLapi * __glXNewIndirectAPI( void )      glAPI->GetVertexAttribivNV = __indirect_glGetVertexAttribivNV;      glAPI->IsProgramNV = __indirect_glIsProgramNV;      glAPI->LoadProgramNV = __indirect_glLoadProgramNV; -    glAPI->ProgramParameter4dNV = __indirect_glProgramParameter4dNV; -    glAPI->ProgramParameter4dvNV = __indirect_glProgramParameter4dvNV; -    glAPI->ProgramParameter4fNV = __indirect_glProgramParameter4fNV; -    glAPI->ProgramParameter4fvNV = __indirect_glProgramParameter4fvNV;      glAPI->ProgramParameters4dvNV = __indirect_glProgramParameters4dvNV;      glAPI->ProgramParameters4fvNV = __indirect_glProgramParameters4fvNV;      glAPI->RequestResidentProgramsNV = __indirect_glRequestResidentProgramsNV; diff --git a/src/mesa/SConscript b/src/mesa/SConscript index b816a21b38..6b99dacf2a 100644 --- a/src/mesa/SConscript +++ b/src/mesa/SConscript @@ -12,9 +12,19 @@ env.Append(CPPPATH = [  	'#/src/mesa/main',  ]) -env.Append(CFLAGS = [ -	'-std=c99', -]) +if gcc: +	env.Append(CFLAGS = [ +		'-std=c99', +	]) + +# x86 assembly +if x86 and gcc: +	env.Append(CPPDEFINES = [ +		'USE_X86_ASM',  +		'USE_MMX_ASM', +		'USE_3DNOW_ASM', +		'USE_SSE_ASM', +	])  ####################################################################### @@ -184,6 +194,7 @@ SHADER_SOURCES = [  	'shader/prog_parameter.c',  	'shader/prog_print.c',  	'shader/prog_statevars.c', +	'shader/prog_uniform.c',  	'shader/programopt.c',  	'shader/shader_api.c',  ] @@ -221,7 +232,6 @@ ASM_C_SOURCES = [  	'x86/x86.c',  	'x86/3dnow.c',  	'x86/sse.c', -	'x86/rtasm/x86sse.c',  	'sparc/sparc.c',  	'ppc/common_ppc.c',  	'x86-64/x86-64.c', @@ -269,7 +279,7 @@ SPARC_API = [  	'sparc/glapi_sparc.S',  ] -if x86: +if x86 and gcc:  	ASM_SOURCES = ASM_C_SOURCES + X86_SOURCES   	API_SOURCES = X86_API  else: diff --git a/src/mesa/drivers/dri/common/extension_helper.h b/src/mesa/drivers/dri/common/extension_helper.h index 065c5d8dae..65e96657b8 100644 --- a/src/mesa/drivers/dri/common/extension_helper.h +++ b/src/mesa/drivers/dri/common/extension_helper.h @@ -40,13 +40,6 @@ static const char UniformMatrix3fvARB_names[] =      "";  #endif -#if defined(need_GL_NV_vertex_program) -static const char ProgramParameter4fNV_names[] =  -    "iiffff\0" /* Parameter signature */ -    "glProgramParameter4fNV\0" -    ""; -#endif -  #if defined(need_GL_VERSION_1_3) || defined(need_GL_ARB_multisample)  static const char SampleCoverageARB_names[] =       "fi\0" /* Parameter signature */ @@ -572,13 +565,6 @@ static const char MatrixIndexusvARB_names[] =      "";  #endif -#if defined(need_GL_NV_vertex_program) -static const char ProgramParameter4dvNV_names[] =  -    "iip\0" /* Parameter signature */ -    "glProgramParameter4dvNV\0" -    ""; -#endif -  #if defined(need_GL_VERSION_2_0) || defined(need_GL_ARB_vertex_program)  static const char DisableVertexAttribArrayARB_names[] =       "i\0" /* Parameter signature */ @@ -967,13 +953,6 @@ static const char GenerateMipmapEXT_names[] =      "";  #endif -#if defined(need_GL_NV_vertex_program) -static const char ProgramParameter4dNV_names[] =  -    "iidddd\0" /* Parameter signature */ -    "glProgramParameter4dNV\0" -    ""; -#endif -  #if defined(need_GL_ATI_fragment_shader)  static const char SetFragmentShaderConstantATI_names[] =       "ip\0" /* Parameter signature */ @@ -1311,10 +1290,11 @@ static const char Color3fVertex3fSUN_names[] =      "";  #endif -#if defined(need_GL_ARB_vertex_program) +#if defined(need_GL_ARB_vertex_program) || defined(need_GL_NV_vertex_program)  static const char ProgramEnvParameter4fvARB_names[] =       "iip\0" /* Parameter signature */      "glProgramEnvParameter4fvARB\0" +    "glProgramParameter4fvNV\0"      "";  #endif @@ -2035,13 +2015,6 @@ static const char WeightfvARB_names[] =      "";  #endif -#if defined(need_GL_NV_vertex_program) -static const char ProgramParameter4fvNV_names[] =  -    "iip\0" /* Parameter signature */ -    "glProgramParameter4fvNV\0" -    ""; -#endif -  #if defined(need_GL_MESA_window_pos)  static const char WindowPos4fMESA_names[] =       "ffff\0" /* Parameter signature */ @@ -2432,10 +2405,11 @@ static const char GetBufferPointervARB_names[] =      "";  #endif -#if defined(need_GL_ARB_vertex_program) +#if defined(need_GL_ARB_vertex_program) || defined(need_GL_NV_vertex_program)  static const char ProgramEnvParameter4fARB_names[] =       "iiffff\0" /* Parameter signature */      "glProgramEnvParameter4fARB\0" +    "glProgramParameter4fNV\0"      "";  #endif @@ -2803,10 +2777,11 @@ static const char ReplacementCodePointerSUN_names[] =      "";  #endif -#if defined(need_GL_ARB_vertex_program) +#if defined(need_GL_ARB_vertex_program) || defined(need_GL_NV_vertex_program)  static const char ProgramEnvParameter4dARB_names[] =       "iidddd\0" /* Parameter signature */      "glProgramEnvParameter4dARB\0" +    "glProgramParameter4dNV\0"      "";  #endif @@ -3660,10 +3635,11 @@ static const char GetColorTableParameteriv_names[] =      "";  #endif -#if defined(need_GL_ARB_vertex_program) +#if defined(need_GL_ARB_vertex_program) || defined(need_GL_NV_vertex_program)  static const char ProgramEnvParameter4dvARB_names[] =       "iip\0" /* Parameter signature */      "glProgramEnvParameter4dvARB\0" +    "glProgramParameter4dvNV\0"      "";  #endif @@ -5748,12 +5724,10 @@ static const struct dri_extension_function GL_NV_vertex_array_range_functions[]  #if defined(need_GL_NV_vertex_program)  static const struct dri_extension_function GL_NV_vertex_program_functions[] = { -    { ProgramParameter4fNV_names, ProgramParameter4fNV_remap_index, -1 },      { VertexAttrib4ubvNV_names, VertexAttrib4ubvNV_remap_index, -1 },      { VertexAttrib4svNV_names, VertexAttrib4svNV_remap_index, -1 },      { VertexAttribs1dvNV_names, VertexAttribs1dvNV_remap_index, -1 },      { VertexAttrib1fvNV_names, VertexAttrib1fvNV_remap_index, -1 }, -    { ProgramParameter4dvNV_names, ProgramParameter4dvNV_remap_index, -1 },      { VertexAttrib4fNV_names, VertexAttrib4fNV_remap_index, -1 },      { VertexAttrib2dNV_names, VertexAttrib2dNV_remap_index, -1 },      { VertexAttrib4ubNV_names, VertexAttrib4ubNV_remap_index, -1 }, @@ -5761,7 +5735,7 @@ static const struct dri_extension_function GL_NV_vertex_program_functions[] = {      { VertexAttribs4fvNV_names, VertexAttribs4fvNV_remap_index, -1 },      { VertexAttrib2sNV_names, VertexAttrib2sNV_remap_index, -1 },      { VertexAttribs3fvNV_names, VertexAttribs3fvNV_remap_index, -1 }, -    { ProgramParameter4dNV_names, ProgramParameter4dNV_remap_index, -1 }, +    { ProgramEnvParameter4fvARB_names, ProgramEnvParameter4fvARB_remap_index, -1 },      { LoadProgramNV_names, LoadProgramNV_remap_index, -1 },      { VertexAttrib4fvNV_names, VertexAttrib4fvNV_remap_index, -1 },      { VertexAttrib3fNV_names, VertexAttrib3fNV_remap_index, -1 }, @@ -5771,14 +5745,15 @@ static const struct dri_extension_function GL_NV_vertex_program_functions[] = {      { VertexAttrib2fvNV_names, VertexAttrib2fvNV_remap_index, -1 },      { VertexAttrib2dvNV_names, VertexAttrib2dvNV_remap_index, -1 },      { VertexAttrib1dvNV_names, VertexAttrib1dvNV_remap_index, -1 }, -    { ProgramParameter4fvNV_names, ProgramParameter4fvNV_remap_index, -1 },      { VertexAttrib1svNV_names, VertexAttrib1svNV_remap_index, -1 }, +    { ProgramEnvParameter4fARB_names, ProgramEnvParameter4fARB_remap_index, -1 },      { VertexAttribs2svNV_names, VertexAttribs2svNV_remap_index, -1 },      { GetVertexAttribivNV_names, GetVertexAttribivNV_remap_index, -1 },      { GetVertexAttribfvNV_names, GetVertexAttribfvNV_remap_index, -1 },      { VertexAttrib2svNV_names, VertexAttrib2svNV_remap_index, -1 },      { VertexAttribs1fvNV_names, VertexAttribs1fvNV_remap_index, -1 },      { IsProgramNV_names, IsProgramNV_remap_index, -1 }, +    { ProgramEnvParameter4dARB_names, ProgramEnvParameter4dARB_remap_index, -1 },      { VertexAttrib2fNV_names, VertexAttrib2fNV_remap_index, -1 },      { RequestResidentProgramsNV_names, RequestResidentProgramsNV_remap_index, -1 },      { ExecuteProgramNV_names, ExecuteProgramNV_remap_index, -1 }, @@ -5791,6 +5766,7 @@ static const struct dri_extension_function GL_NV_vertex_program_functions[] = {      { GetProgramivNV_names, GetProgramivNV_remap_index, -1 },      { GetVertexAttribdvNV_names, GetVertexAttribdvNV_remap_index, -1 },      { VertexAttrib3fvNV_names, VertexAttrib3fvNV_remap_index, -1 }, +    { ProgramEnvParameter4dvARB_names, ProgramEnvParameter4dvARB_remap_index, -1 },      { VertexAttribs2fvNV_names, VertexAttribs2fvNV_remap_index, -1 },      { DeleteProgramsNV_names, DeleteProgramsNV_remap_index, -1 },      { GetVertexAttribPointervNV_names, GetVertexAttribPointervNV_remap_index, -1 }, diff --git a/src/mesa/glapi/dispatch.h b/src/mesa/glapi/dispatch.h index db23e44396..7123156085 100644 --- a/src/mesa/glapi/dispatch.h +++ b/src/mesa/glapi/dispatch.h @@ -2077,18 +2077,6 @@  #define CALL_LoadProgramNV(disp, parameters) (*((disp)->LoadProgramNV)) parameters  #define GET_LoadProgramNV(disp) ((disp)->LoadProgramNV)  #define SET_LoadProgramNV(disp, fn) ((disp)->LoadProgramNV = fn) -#define CALL_ProgramParameter4dNV(disp, parameters) (*((disp)->ProgramParameter4dNV)) parameters -#define GET_ProgramParameter4dNV(disp) ((disp)->ProgramParameter4dNV) -#define SET_ProgramParameter4dNV(disp, fn) ((disp)->ProgramParameter4dNV = fn) -#define CALL_ProgramParameter4dvNV(disp, parameters) (*((disp)->ProgramParameter4dvNV)) parameters -#define GET_ProgramParameter4dvNV(disp) ((disp)->ProgramParameter4dvNV) -#define SET_ProgramParameter4dvNV(disp, fn) ((disp)->ProgramParameter4dvNV = fn) -#define CALL_ProgramParameter4fNV(disp, parameters) (*((disp)->ProgramParameter4fNV)) parameters -#define GET_ProgramParameter4fNV(disp) ((disp)->ProgramParameter4fNV) -#define SET_ProgramParameter4fNV(disp, fn) ((disp)->ProgramParameter4fNV = fn) -#define CALL_ProgramParameter4fvNV(disp, parameters) (*((disp)->ProgramParameter4fvNV)) parameters -#define GET_ProgramParameter4fvNV(disp) ((disp)->ProgramParameter4fvNV) -#define SET_ProgramParameter4fvNV(disp, fn) ((disp)->ProgramParameter4fvNV = fn)  #define CALL_ProgramParameters4dvNV(disp, parameters) (*((disp)->ProgramParameters4dvNV)) parameters  #define GET_ProgramParameters4dvNV(disp) ((disp)->ProgramParameters4dvNV)  #define SET_ProgramParameters4dvNV(disp, fn) ((disp)->ProgramParameters4dvNV = fn) @@ -2383,7 +2371,7 @@  #else -#define driDispatchRemapTable_size 366 +#define driDispatchRemapTable_size 362  extern int driDispatchRemapTable[ driDispatchRemapTable_size ];  #define AttachShader_remap_index 0 @@ -2651,107 +2639,103 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];  #define GetVertexAttribivNV_remap_index 262  #define IsProgramNV_remap_index 263  #define LoadProgramNV_remap_index 264 -#define ProgramParameter4dNV_remap_index 265 -#define ProgramParameter4dvNV_remap_index 266 -#define ProgramParameter4fNV_remap_index 267 -#define ProgramParameter4fvNV_remap_index 268 -#define ProgramParameters4dvNV_remap_index 269 -#define ProgramParameters4fvNV_remap_index 270 -#define RequestResidentProgramsNV_remap_index 271 -#define TrackMatrixNV_remap_index 272 -#define VertexAttrib1dNV_remap_index 273 -#define VertexAttrib1dvNV_remap_index 274 -#define VertexAttrib1fNV_remap_index 275 -#define VertexAttrib1fvNV_remap_index 276 -#define VertexAttrib1sNV_remap_index 277 -#define VertexAttrib1svNV_remap_index 278 -#define VertexAttrib2dNV_remap_index 279 -#define VertexAttrib2dvNV_remap_index 280 -#define VertexAttrib2fNV_remap_index 281 -#define VertexAttrib2fvNV_remap_index 282 -#define VertexAttrib2sNV_remap_index 283 -#define VertexAttrib2svNV_remap_index 284 -#define VertexAttrib3dNV_remap_index 285 -#define VertexAttrib3dvNV_remap_index 286 -#define VertexAttrib3fNV_remap_index 287 -#define VertexAttrib3fvNV_remap_index 288 -#define VertexAttrib3sNV_remap_index 289 -#define VertexAttrib3svNV_remap_index 290 -#define VertexAttrib4dNV_remap_index 291 -#define VertexAttrib4dvNV_remap_index 292 -#define VertexAttrib4fNV_remap_index 293 -#define VertexAttrib4fvNV_remap_index 294 -#define VertexAttrib4sNV_remap_index 295 -#define VertexAttrib4svNV_remap_index 296 -#define VertexAttrib4ubNV_remap_index 297 -#define VertexAttrib4ubvNV_remap_index 298 -#define VertexAttribPointerNV_remap_index 299 -#define VertexAttribs1dvNV_remap_index 300 -#define VertexAttribs1fvNV_remap_index 301 -#define VertexAttribs1svNV_remap_index 302 -#define VertexAttribs2dvNV_remap_index 303 -#define VertexAttribs2fvNV_remap_index 304 -#define VertexAttribs2svNV_remap_index 305 -#define VertexAttribs3dvNV_remap_index 306 -#define VertexAttribs3fvNV_remap_index 307 -#define VertexAttribs3svNV_remap_index 308 -#define VertexAttribs4dvNV_remap_index 309 -#define VertexAttribs4fvNV_remap_index 310 -#define VertexAttribs4svNV_remap_index 311 -#define VertexAttribs4ubvNV_remap_index 312 -#define AlphaFragmentOp1ATI_remap_index 313 -#define AlphaFragmentOp2ATI_remap_index 314 -#define AlphaFragmentOp3ATI_remap_index 315 -#define BeginFragmentShaderATI_remap_index 316 -#define BindFragmentShaderATI_remap_index 317 -#define ColorFragmentOp1ATI_remap_index 318 -#define ColorFragmentOp2ATI_remap_index 319 -#define ColorFragmentOp3ATI_remap_index 320 -#define DeleteFragmentShaderATI_remap_index 321 -#define EndFragmentShaderATI_remap_index 322 -#define GenFragmentShadersATI_remap_index 323 -#define PassTexCoordATI_remap_index 324 -#define SampleMapATI_remap_index 325 -#define SetFragmentShaderConstantATI_remap_index 326 -#define PointParameteriNV_remap_index 327 -#define PointParameterivNV_remap_index 328 -#define ActiveStencilFaceEXT_remap_index 329 -#define BindVertexArrayAPPLE_remap_index 330 -#define DeleteVertexArraysAPPLE_remap_index 331 -#define GenVertexArraysAPPLE_remap_index 332 -#define IsVertexArrayAPPLE_remap_index 333 -#define GetProgramNamedParameterdvNV_remap_index 334 -#define GetProgramNamedParameterfvNV_remap_index 335 -#define ProgramNamedParameter4dNV_remap_index 336 -#define ProgramNamedParameter4dvNV_remap_index 337 -#define ProgramNamedParameter4fNV_remap_index 338 -#define ProgramNamedParameter4fvNV_remap_index 339 -#define DepthBoundsEXT_remap_index 340 -#define BlendEquationSeparateEXT_remap_index 341 -#define BindFramebufferEXT_remap_index 342 -#define BindRenderbufferEXT_remap_index 343 -#define CheckFramebufferStatusEXT_remap_index 344 -#define DeleteFramebuffersEXT_remap_index 345 -#define DeleteRenderbuffersEXT_remap_index 346 -#define FramebufferRenderbufferEXT_remap_index 347 -#define FramebufferTexture1DEXT_remap_index 348 -#define FramebufferTexture2DEXT_remap_index 349 -#define FramebufferTexture3DEXT_remap_index 350 -#define GenFramebuffersEXT_remap_index 351 -#define GenRenderbuffersEXT_remap_index 352 -#define GenerateMipmapEXT_remap_index 353 -#define GetFramebufferAttachmentParameterivEXT_remap_index 354 -#define GetRenderbufferParameterivEXT_remap_index 355 -#define IsFramebufferEXT_remap_index 356 -#define IsRenderbufferEXT_remap_index 357 -#define RenderbufferStorageEXT_remap_index 358 -#define BlitFramebufferEXT_remap_index 359 -#define FramebufferTextureLayerEXT_remap_index 360 -#define StencilFuncSeparateATI_remap_index 361 -#define ProgramEnvParameters4fvEXT_remap_index 362 -#define ProgramLocalParameters4fvEXT_remap_index 363 -#define GetQueryObjecti64vEXT_remap_index 364 -#define GetQueryObjectui64vEXT_remap_index 365 +#define ProgramParameters4dvNV_remap_index 265 +#define ProgramParameters4fvNV_remap_index 266 +#define RequestResidentProgramsNV_remap_index 267 +#define TrackMatrixNV_remap_index 268 +#define VertexAttrib1dNV_remap_index 269 +#define VertexAttrib1dvNV_remap_index 270 +#define VertexAttrib1fNV_remap_index 271 +#define VertexAttrib1fvNV_remap_index 272 +#define VertexAttrib1sNV_remap_index 273 +#define VertexAttrib1svNV_remap_index 274 +#define VertexAttrib2dNV_remap_index 275 +#define VertexAttrib2dvNV_remap_index 276 +#define VertexAttrib2fNV_remap_index 277 +#define VertexAttrib2fvNV_remap_index 278 +#define VertexAttrib2sNV_remap_index 279 +#define VertexAttrib2svNV_remap_index 280 +#define VertexAttrib3dNV_remap_index 281 +#define VertexAttrib3dvNV_remap_index 282 +#define VertexAttrib3fNV_remap_index 283 +#define VertexAttrib3fvNV_remap_index 284 +#define VertexAttrib3sNV_remap_index 285 +#define VertexAttrib3svNV_remap_index 286 +#define VertexAttrib4dNV_remap_index 287 +#define VertexAttrib4dvNV_remap_index 288 +#define VertexAttrib4fNV_remap_index 289 +#define VertexAttrib4fvNV_remap_index 290 +#define VertexAttrib4sNV_remap_index 291 +#define VertexAttrib4svNV_remap_index 292 +#define VertexAttrib4ubNV_remap_index 293 +#define VertexAttrib4ubvNV_remap_index 294 +#define VertexAttribPointerNV_remap_index 295 +#define VertexAttribs1dvNV_remap_index 296 +#define VertexAttribs1fvNV_remap_index 297 +#define VertexAttribs1svNV_remap_index 298 +#define VertexAttribs2dvNV_remap_index 299 +#define VertexAttribs2fvNV_remap_index 300 +#define VertexAttribs2svNV_remap_index 301 +#define VertexAttribs3dvNV_remap_index 302 +#define VertexAttribs3fvNV_remap_index 303 +#define VertexAttribs3svNV_remap_index 304 +#define VertexAttribs4dvNV_remap_index 305 +#define VertexAttribs4fvNV_remap_index 306 +#define VertexAttribs4svNV_remap_index 307 +#define VertexAttribs4ubvNV_remap_index 308 +#define AlphaFragmentOp1ATI_remap_index 309 +#define AlphaFragmentOp2ATI_remap_index 310 +#define AlphaFragmentOp3ATI_remap_index 311 +#define BeginFragmentShaderATI_remap_index 312 +#define BindFragmentShaderATI_remap_index 313 +#define ColorFragmentOp1ATI_remap_index 314 +#define ColorFragmentOp2ATI_remap_index 315 +#define ColorFragmentOp3ATI_remap_index 316 +#define DeleteFragmentShaderATI_remap_index 317 +#define EndFragmentShaderATI_remap_index 318 +#define GenFragmentShadersATI_remap_index 319 +#define PassTexCoordATI_remap_index 320 +#define SampleMapATI_remap_index 321 +#define SetFragmentShaderConstantATI_remap_index 322 +#define PointParameteriNV_remap_index 323 +#define PointParameterivNV_remap_index 324 +#define ActiveStencilFaceEXT_remap_index 325 +#define BindVertexArrayAPPLE_remap_index 326 +#define DeleteVertexArraysAPPLE_remap_index 327 +#define GenVertexArraysAPPLE_remap_index 328 +#define IsVertexArrayAPPLE_remap_index 329 +#define GetProgramNamedParameterdvNV_remap_index 330 +#define GetProgramNamedParameterfvNV_remap_index 331 +#define ProgramNamedParameter4dNV_remap_index 332 +#define ProgramNamedParameter4dvNV_remap_index 333 +#define ProgramNamedParameter4fNV_remap_index 334 +#define ProgramNamedParameter4fvNV_remap_index 335 +#define DepthBoundsEXT_remap_index 336 +#define BlendEquationSeparateEXT_remap_index 337 +#define BindFramebufferEXT_remap_index 338 +#define BindRenderbufferEXT_remap_index 339 +#define CheckFramebufferStatusEXT_remap_index 340 +#define DeleteFramebuffersEXT_remap_index 341 +#define DeleteRenderbuffersEXT_remap_index 342 +#define FramebufferRenderbufferEXT_remap_index 343 +#define FramebufferTexture1DEXT_remap_index 344 +#define FramebufferTexture2DEXT_remap_index 345 +#define FramebufferTexture3DEXT_remap_index 346 +#define GenFramebuffersEXT_remap_index 347 +#define GenRenderbuffersEXT_remap_index 348 +#define GenerateMipmapEXT_remap_index 349 +#define GetFramebufferAttachmentParameterivEXT_remap_index 350 +#define GetRenderbufferParameterivEXT_remap_index 351 +#define IsFramebufferEXT_remap_index 352 +#define IsRenderbufferEXT_remap_index 353 +#define RenderbufferStorageEXT_remap_index 354 +#define BlitFramebufferEXT_remap_index 355 +#define FramebufferTextureLayerEXT_remap_index 356 +#define StencilFuncSeparateATI_remap_index 357 +#define ProgramEnvParameters4fvEXT_remap_index 358 +#define ProgramLocalParameters4fvEXT_remap_index 359 +#define GetQueryObjecti64vEXT_remap_index 360 +#define GetQueryObjectui64vEXT_remap_index 361  #define CALL_AttachShader(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint, GLuint)), driDispatchRemapTable[AttachShader_remap_index], parameters)  #define GET_AttachShader(disp) GET_by_offset(disp, driDispatchRemapTable[AttachShader_remap_index]) @@ -3548,18 +3532,6 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];  #define CALL_LoadProgramNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLsizei, const GLubyte *)), driDispatchRemapTable[LoadProgramNV_remap_index], parameters)  #define GET_LoadProgramNV(disp) GET_by_offset(disp, driDispatchRemapTable[LoadProgramNV_remap_index])  #define SET_LoadProgramNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[LoadProgramNV_remap_index], fn) -#define CALL_ProgramParameter4dNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble)), driDispatchRemapTable[ProgramParameter4dNV_remap_index], parameters) -#define GET_ProgramParameter4dNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramParameter4dNV_remap_index]) -#define SET_ProgramParameter4dNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramParameter4dNV_remap_index], fn) -#define CALL_ProgramParameter4dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, const GLdouble *)), driDispatchRemapTable[ProgramParameter4dvNV_remap_index], parameters) -#define GET_ProgramParameter4dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramParameter4dvNV_remap_index]) -#define SET_ProgramParameter4dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramParameter4dvNV_remap_index], fn) -#define CALL_ProgramParameter4fNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat)), driDispatchRemapTable[ProgramParameter4fNV_remap_index], parameters) -#define GET_ProgramParameter4fNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramParameter4fNV_remap_index]) -#define SET_ProgramParameter4fNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramParameter4fNV_remap_index], fn) -#define CALL_ProgramParameter4fvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, const GLfloat *)), driDispatchRemapTable[ProgramParameter4fvNV_remap_index], parameters) -#define GET_ProgramParameter4fvNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramParameter4fvNV_remap_index]) -#define SET_ProgramParameter4fvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramParameter4fvNV_remap_index], fn)  #define CALL_ProgramParameters4dvNV(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLuint, GLuint, const GLdouble *)), driDispatchRemapTable[ProgramParameters4dvNV_remap_index], parameters)  #define GET_ProgramParameters4dvNV(disp) GET_by_offset(disp, driDispatchRemapTable[ProgramParameters4dvNV_remap_index])  #define SET_ProgramParameters4dvNV(disp, fn) SET_by_offset(disp, driDispatchRemapTable[ProgramParameters4dvNV_remap_index], fn) diff --git a/src/mesa/glapi/gl_API.xml b/src/mesa/glapi/gl_API.xml index 3d47e6f2ce..ef4a309cd6 100644 --- a/src/mesa/glapi/gl_API.xml +++ b/src/mesa/glapi/gl_API.xml @@ -11275,7 +11275,7 @@          <glx rop="4183"/>      </function> -    <function name="ProgramParameter4dNV" offset="assign" vectorequiv="ProgramParameter4dvNV"> +    <function name="ProgramParameter4dNV" alias="ProgramEnvParameter4dARB">          <param name="target" type="GLenum"/>          <param name="index" type="GLuint"/>          <param name="x" type="GLdouble"/> @@ -11284,14 +11284,13 @@          <param name="w" type="GLdouble"/>      </function> -    <function name="ProgramParameter4dvNV" offset="assign"> +    <function name="ProgramParameter4dvNV" alias="ProgramEnvParameter4dvARB">          <param name="target" type="GLenum"/>          <param name="index" type="GLuint"/> -        <param name="params" type="const GLdouble *" count="4"/> -        <glx rop="4185" doubles_in_order="true"/> +        <param name="params" type="const GLdouble *"/>      </function> -    <function name="ProgramParameter4fNV" offset="assign" vectorequiv="ProgramParameter4fvNV"> +    <function name="ProgramParameter4fNV" alias="ProgramEnvParameter4fARB">          <param name="target" type="GLenum"/>          <param name="index" type="GLuint"/>          <param name="x" type="GLfloat"/> @@ -11300,11 +11299,10 @@          <param name="w" type="GLfloat"/>      </function> -    <function name="ProgramParameter4fvNV" offset="assign"> +    <function name="ProgramParameter4fvNV" alias="ProgramEnvParameter4fvARB">          <param name="target" type="GLenum"/>          <param name="index" type="GLuint"/> -        <param name="params" type="const GLfloat *" count="4"/> -        <glx rop="4184"/> +        <param name="params" type="const GLfloat *"/>      </function>      <function name="ProgramParameters4dvNV" offset="assign"> diff --git a/src/mesa/glapi/gl_x86_asm.py b/src/mesa/glapi/gl_x86_asm.py index 403e87261b..651cb03f14 100644 --- a/src/mesa/glapi/gl_x86_asm.py +++ b/src/mesa/glapi/gl_x86_asm.py @@ -51,7 +51,7 @@ class PrintGenericStubs(gl_XML.gl_print_base):  	def printRealHeader(self):  		print '#include "assyntax.h"' -		print '#include "glapioffsets.h"' +		print '#include "glapi/glapioffsets.h"'  		print ''  		print '#if defined(STDCALL_API)'  		print '# if defined(USE_MGL_NAMESPACE)' diff --git a/src/mesa/glapi/glapioffsets.h b/src/mesa/glapi/glapioffsets.h index 4799fd3076..43c265924b 100644 --- a/src/mesa/glapi/glapioffsets.h +++ b/src/mesa/glapi/glapioffsets.h @@ -705,108 +705,104 @@  #define _gloffset_GetVertexAttribivNV 670  #define _gloffset_IsProgramNV 671  #define _gloffset_LoadProgramNV 672 -#define _gloffset_ProgramParameter4dNV 673 -#define _gloffset_ProgramParameter4dvNV 674 -#define _gloffset_ProgramParameter4fNV 675 -#define _gloffset_ProgramParameter4fvNV 676 -#define _gloffset_ProgramParameters4dvNV 677 -#define _gloffset_ProgramParameters4fvNV 678 -#define _gloffset_RequestResidentProgramsNV 679 -#define _gloffset_TrackMatrixNV 680 -#define _gloffset_VertexAttrib1dNV 681 -#define _gloffset_VertexAttrib1dvNV 682 -#define _gloffset_VertexAttrib1fNV 683 -#define _gloffset_VertexAttrib1fvNV 684 -#define _gloffset_VertexAttrib1sNV 685 -#define _gloffset_VertexAttrib1svNV 686 -#define _gloffset_VertexAttrib2dNV 687 -#define _gloffset_VertexAttrib2dvNV 688 -#define _gloffset_VertexAttrib2fNV 689 -#define _gloffset_VertexAttrib2fvNV 690 -#define _gloffset_VertexAttrib2sNV 691 -#define _gloffset_VertexAttrib2svNV 692 -#define _gloffset_VertexAttrib3dNV 693 -#define _gloffset_VertexAttrib3dvNV 694 -#define _gloffset_VertexAttrib3fNV 695 -#define _gloffset_VertexAttrib3fvNV 696 -#define _gloffset_VertexAttrib3sNV 697 -#define _gloffset_VertexAttrib3svNV 698 -#define _gloffset_VertexAttrib4dNV 699 -#define _gloffset_VertexAttrib4dvNV 700 -#define _gloffset_VertexAttrib4fNV 701 -#define _gloffset_VertexAttrib4fvNV 702 -#define _gloffset_VertexAttrib4sNV 703 -#define _gloffset_VertexAttrib4svNV 704 -#define _gloffset_VertexAttrib4ubNV 705 -#define _gloffset_VertexAttrib4ubvNV 706 -#define _gloffset_VertexAttribPointerNV 707 -#define _gloffset_VertexAttribs1dvNV 708 -#define _gloffset_VertexAttribs1fvNV 709 -#define _gloffset_VertexAttribs1svNV 710 -#define _gloffset_VertexAttribs2dvNV 711 -#define _gloffset_VertexAttribs2fvNV 712 -#define _gloffset_VertexAttribs2svNV 713 -#define _gloffset_VertexAttribs3dvNV 714 -#define _gloffset_VertexAttribs3fvNV 715 -#define _gloffset_VertexAttribs3svNV 716 -#define _gloffset_VertexAttribs4dvNV 717 -#define _gloffset_VertexAttribs4fvNV 718 -#define _gloffset_VertexAttribs4svNV 719 -#define _gloffset_VertexAttribs4ubvNV 720 -#define _gloffset_AlphaFragmentOp1ATI 721 -#define _gloffset_AlphaFragmentOp2ATI 722 -#define _gloffset_AlphaFragmentOp3ATI 723 -#define _gloffset_BeginFragmentShaderATI 724 -#define _gloffset_BindFragmentShaderATI 725 -#define _gloffset_ColorFragmentOp1ATI 726 -#define _gloffset_ColorFragmentOp2ATI 727 -#define _gloffset_ColorFragmentOp3ATI 728 -#define _gloffset_DeleteFragmentShaderATI 729 -#define _gloffset_EndFragmentShaderATI 730 -#define _gloffset_GenFragmentShadersATI 731 -#define _gloffset_PassTexCoordATI 732 -#define _gloffset_SampleMapATI 733 -#define _gloffset_SetFragmentShaderConstantATI 734 -#define _gloffset_PointParameteriNV 735 -#define _gloffset_PointParameterivNV 736 -#define _gloffset_ActiveStencilFaceEXT 737 -#define _gloffset_BindVertexArrayAPPLE 738 -#define _gloffset_DeleteVertexArraysAPPLE 739 -#define _gloffset_GenVertexArraysAPPLE 740 -#define _gloffset_IsVertexArrayAPPLE 741 -#define _gloffset_GetProgramNamedParameterdvNV 742 -#define _gloffset_GetProgramNamedParameterfvNV 743 -#define _gloffset_ProgramNamedParameter4dNV 744 -#define _gloffset_ProgramNamedParameter4dvNV 745 -#define _gloffset_ProgramNamedParameter4fNV 746 -#define _gloffset_ProgramNamedParameter4fvNV 747 -#define _gloffset_DepthBoundsEXT 748 -#define _gloffset_BlendEquationSeparateEXT 749 -#define _gloffset_BindFramebufferEXT 750 -#define _gloffset_BindRenderbufferEXT 751 -#define _gloffset_CheckFramebufferStatusEXT 752 -#define _gloffset_DeleteFramebuffersEXT 753 -#define _gloffset_DeleteRenderbuffersEXT 754 -#define _gloffset_FramebufferRenderbufferEXT 755 -#define _gloffset_FramebufferTexture1DEXT 756 -#define _gloffset_FramebufferTexture2DEXT 757 -#define _gloffset_FramebufferTexture3DEXT 758 -#define _gloffset_GenFramebuffersEXT 759 -#define _gloffset_GenRenderbuffersEXT 760 -#define _gloffset_GenerateMipmapEXT 761 -#define _gloffset_GetFramebufferAttachmentParameterivEXT 762 -#define _gloffset_GetRenderbufferParameterivEXT 763 -#define _gloffset_IsFramebufferEXT 764 -#define _gloffset_IsRenderbufferEXT 765 -#define _gloffset_RenderbufferStorageEXT 766 -#define _gloffset_BlitFramebufferEXT 767 -#define _gloffset_FramebufferTextureLayerEXT 768 -#define _gloffset_StencilFuncSeparateATI 769 -#define _gloffset_ProgramEnvParameters4fvEXT 770 -#define _gloffset_ProgramLocalParameters4fvEXT 771 -#define _gloffset_GetQueryObjecti64vEXT 772 -#define _gloffset_GetQueryObjectui64vEXT 773 -#define _gloffset_FIRST_DYNAMIC 774 +#define _gloffset_ProgramParameters4dvNV 673 +#define _gloffset_ProgramParameters4fvNV 674 +#define _gloffset_RequestResidentProgramsNV 675 +#define _gloffset_TrackMatrixNV 676 +#define _gloffset_VertexAttrib1dNV 677 +#define _gloffset_VertexAttrib1dvNV 678 +#define _gloffset_VertexAttrib1fNV 679 +#define _gloffset_VertexAttrib1fvNV 680 +#define _gloffset_VertexAttrib1sNV 681 +#define _gloffset_VertexAttrib1svNV 682 +#define _gloffset_VertexAttrib2dNV 683 +#define _gloffset_VertexAttrib2dvNV 684 +#define _gloffset_VertexAttrib2fNV 685 +#define _gloffset_VertexAttrib2fvNV 686 +#define _gloffset_VertexAttrib2sNV 687 +#define _gloffset_VertexAttrib2svNV 688 +#define _gloffset_VertexAttrib3dNV 689 +#define _gloffset_VertexAttrib3dvNV 690 +#define _gloffset_VertexAttrib3fNV 691 +#define _gloffset_VertexAttrib3fvNV 692 +#define _gloffset_VertexAttrib3sNV 693 +#define _gloffset_VertexAttrib3svNV 694 +#define _gloffset_VertexAttrib4dNV 695 +#define _gloffset_VertexAttrib4dvNV 696 +#define _gloffset_VertexAttrib4fNV 697 +#define _gloffset_VertexAttrib4fvNV 698 +#define _gloffset_VertexAttrib4sNV 699 +#define _gloffset_VertexAttrib4svNV 700 +#define _gloffset_VertexAttrib4ubNV 701 +#define _gloffset_VertexAttrib4ubvNV 702 +#define _gloffset_VertexAttribPointerNV 703 +#define _gloffset_VertexAttribs1dvNV 704 +#define _gloffset_VertexAttribs1fvNV 705 +#define _gloffset_VertexAttribs1svNV 706 +#define _gloffset_VertexAttribs2dvNV 707 +#define _gloffset_VertexAttribs2fvNV 708 +#define _gloffset_VertexAttribs2svNV 709 +#define _gloffset_VertexAttribs3dvNV 710 +#define _gloffset_VertexAttribs3fvNV 711 +#define _gloffset_VertexAttribs3svNV 712 +#define _gloffset_VertexAttribs4dvNV 713 +#define _gloffset_VertexAttribs4fvNV 714 +#define _gloffset_VertexAttribs4svNV 715 +#define _gloffset_VertexAttribs4ubvNV 716 +#define _gloffset_AlphaFragmentOp1ATI 717 +#define _gloffset_AlphaFragmentOp2ATI 718 +#define _gloffset_AlphaFragmentOp3ATI 719 +#define _gloffset_BeginFragmentShaderATI 720 +#define _gloffset_BindFragmentShaderATI 721 +#define _gloffset_ColorFragmentOp1ATI 722 +#define _gloffset_ColorFragmentOp2ATI 723 +#define _gloffset_ColorFragmentOp3ATI 724 +#define _gloffset_DeleteFragmentShaderATI 725 +#define _gloffset_EndFragmentShaderATI 726 +#define _gloffset_GenFragmentShadersATI 727 +#define _gloffset_PassTexCoordATI 728 +#define _gloffset_SampleMapATI 729 +#define _gloffset_SetFragmentShaderConstantATI 730 +#define _gloffset_PointParameteriNV 731 +#define _gloffset_PointParameterivNV 732 +#define _gloffset_ActiveStencilFaceEXT 733 +#define _gloffset_BindVertexArrayAPPLE 734 +#define _gloffset_DeleteVertexArraysAPPLE 735 +#define _gloffset_GenVertexArraysAPPLE 736 +#define _gloffset_IsVertexArrayAPPLE 737 +#define _gloffset_GetProgramNamedParameterdvNV 738 +#define _gloffset_GetProgramNamedParameterfvNV 739 +#define _gloffset_ProgramNamedParameter4dNV 740 +#define _gloffset_ProgramNamedParameter4dvNV 741 +#define _gloffset_ProgramNamedParameter4fNV 742 +#define _gloffset_ProgramNamedParameter4fvNV 743 +#define _gloffset_DepthBoundsEXT 744 +#define _gloffset_BlendEquationSeparateEXT 745 +#define _gloffset_BindFramebufferEXT 746 +#define _gloffset_BindRenderbufferEXT 747 +#define _gloffset_CheckFramebufferStatusEXT 748 +#define _gloffset_DeleteFramebuffersEXT 749 +#define _gloffset_DeleteRenderbuffersEXT 750 +#define _gloffset_FramebufferRenderbufferEXT 751 +#define _gloffset_FramebufferTexture1DEXT 752 +#define _gloffset_FramebufferTexture2DEXT 753 +#define _gloffset_FramebufferTexture3DEXT 754 +#define _gloffset_GenFramebuffersEXT 755 +#define _gloffset_GenRenderbuffersEXT 756 +#define _gloffset_GenerateMipmapEXT 757 +#define _gloffset_GetFramebufferAttachmentParameterivEXT 758 +#define _gloffset_GetRenderbufferParameterivEXT 759 +#define _gloffset_IsFramebufferEXT 760 +#define _gloffset_IsRenderbufferEXT 761 +#define _gloffset_RenderbufferStorageEXT 762 +#define _gloffset_BlitFramebufferEXT 763 +#define _gloffset_FramebufferTextureLayerEXT 764 +#define _gloffset_StencilFuncSeparateATI 765 +#define _gloffset_ProgramEnvParameters4fvEXT 766 +#define _gloffset_ProgramLocalParameters4fvEXT 767 +#define _gloffset_GetQueryObjecti64vEXT 768 +#define _gloffset_GetQueryObjectui64vEXT 769 +#define _gloffset_FIRST_DYNAMIC 770  #else @@ -1075,10 +1071,6 @@  #define _gloffset_GetVertexAttribivNV driDispatchRemapTable[GetVertexAttribivNV_remap_index]  #define _gloffset_IsProgramNV driDispatchRemapTable[IsProgramNV_remap_index]  #define _gloffset_LoadProgramNV driDispatchRemapTable[LoadProgramNV_remap_index] -#define _gloffset_ProgramParameter4dNV driDispatchRemapTable[ProgramParameter4dNV_remap_index] -#define _gloffset_ProgramParameter4dvNV driDispatchRemapTable[ProgramParameter4dvNV_remap_index] -#define _gloffset_ProgramParameter4fNV driDispatchRemapTable[ProgramParameter4fNV_remap_index] -#define _gloffset_ProgramParameter4fvNV driDispatchRemapTable[ProgramParameter4fvNV_remap_index]  #define _gloffset_ProgramParameters4dvNV driDispatchRemapTable[ProgramParameters4dvNV_remap_index]  #define _gloffset_ProgramParameters4fvNV driDispatchRemapTable[ProgramParameters4fvNV_remap_index]  #define _gloffset_RequestResidentProgramsNV driDispatchRemapTable[RequestResidentProgramsNV_remap_index] diff --git a/src/mesa/glapi/glapitable.h b/src/mesa/glapi/glapitable.h index 22c2dc2f69..48941f5590 100644 --- a/src/mesa/glapi/glapitable.h +++ b/src/mesa/glapi/glapitable.h @@ -714,107 +714,103 @@ struct _glapi_table     void (GLAPIENTRYP GetVertexAttribivNV)(GLuint index, GLenum pname, GLint * params); /* 670 */     GLboolean (GLAPIENTRYP IsProgramNV)(GLuint program); /* 671 */     void (GLAPIENTRYP LoadProgramNV)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); /* 672 */ -   void (GLAPIENTRYP ProgramParameter4dNV)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 673 */ -   void (GLAPIENTRYP ProgramParameter4dvNV)(GLenum target, GLuint index, const GLdouble * params); /* 674 */ -   void (GLAPIENTRYP ProgramParameter4fNV)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 675 */ -   void (GLAPIENTRYP ProgramParameter4fvNV)(GLenum target, GLuint index, const GLfloat * params); /* 676 */ -   void (GLAPIENTRYP ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params); /* 677 */ -   void (GLAPIENTRYP ProgramParameters4fvNV)(GLenum target, GLuint index, GLuint num, const GLfloat * params); /* 678 */ -   void (GLAPIENTRYP RequestResidentProgramsNV)(GLsizei n, const GLuint * ids); /* 679 */ -   void (GLAPIENTRYP TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform); /* 680 */ -   void (GLAPIENTRYP VertexAttrib1dNV)(GLuint index, GLdouble x); /* 681 */ -   void (GLAPIENTRYP VertexAttrib1dvNV)(GLuint index, const GLdouble * v); /* 682 */ -   void (GLAPIENTRYP VertexAttrib1fNV)(GLuint index, GLfloat x); /* 683 */ -   void (GLAPIENTRYP VertexAttrib1fvNV)(GLuint index, const GLfloat * v); /* 684 */ -   void (GLAPIENTRYP VertexAttrib1sNV)(GLuint index, GLshort x); /* 685 */ -   void (GLAPIENTRYP VertexAttrib1svNV)(GLuint index, const GLshort * v); /* 686 */ -   void (GLAPIENTRYP VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y); /* 687 */ -   void (GLAPIENTRYP VertexAttrib2dvNV)(GLuint index, const GLdouble * v); /* 688 */ -   void (GLAPIENTRYP VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y); /* 689 */ -   void (GLAPIENTRYP VertexAttrib2fvNV)(GLuint index, const GLfloat * v); /* 690 */ -   void (GLAPIENTRYP VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y); /* 691 */ -   void (GLAPIENTRYP VertexAttrib2svNV)(GLuint index, const GLshort * v); /* 692 */ -   void (GLAPIENTRYP VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 693 */ -   void (GLAPIENTRYP VertexAttrib3dvNV)(GLuint index, const GLdouble * v); /* 694 */ -   void (GLAPIENTRYP VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 695 */ -   void (GLAPIENTRYP VertexAttrib3fvNV)(GLuint index, const GLfloat * v); /* 696 */ -   void (GLAPIENTRYP VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z); /* 697 */ -   void (GLAPIENTRYP VertexAttrib3svNV)(GLuint index, const GLshort * v); /* 698 */ -   void (GLAPIENTRYP VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 699 */ -   void (GLAPIENTRYP VertexAttrib4dvNV)(GLuint index, const GLdouble * v); /* 700 */ -   void (GLAPIENTRYP VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 701 */ -   void (GLAPIENTRYP VertexAttrib4fvNV)(GLuint index, const GLfloat * v); /* 702 */ -   void (GLAPIENTRYP VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 703 */ -   void (GLAPIENTRYP VertexAttrib4svNV)(GLuint index, const GLshort * v); /* 704 */ -   void (GLAPIENTRYP VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 705 */ -   void (GLAPIENTRYP VertexAttrib4ubvNV)(GLuint index, const GLubyte * v); /* 706 */ -   void (GLAPIENTRYP VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 707 */ -   void (GLAPIENTRYP VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 708 */ -   void (GLAPIENTRYP VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 709 */ -   void (GLAPIENTRYP VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v); /* 710 */ -   void (GLAPIENTRYP VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 711 */ -   void (GLAPIENTRYP VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 712 */ -   void (GLAPIENTRYP VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v); /* 713 */ -   void (GLAPIENTRYP VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 714 */ -   void (GLAPIENTRYP VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 715 */ -   void (GLAPIENTRYP VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v); /* 716 */ -   void (GLAPIENTRYP VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 717 */ -   void (GLAPIENTRYP VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 718 */ -   void (GLAPIENTRYP VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v); /* 719 */ -   void (GLAPIENTRYP VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 720 */ -   void (GLAPIENTRYP AlphaFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 721 */ -   void (GLAPIENTRYP AlphaFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 722 */ -   void (GLAPIENTRYP AlphaFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 723 */ -   void (GLAPIENTRYP BeginFragmentShaderATI)(void); /* 724 */ -   void (GLAPIENTRYP BindFragmentShaderATI)(GLuint id); /* 725 */ -   void (GLAPIENTRYP ColorFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 726 */ -   void (GLAPIENTRYP ColorFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 727 */ -   void (GLAPIENTRYP ColorFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 728 */ -   void (GLAPIENTRYP DeleteFragmentShaderATI)(GLuint id); /* 729 */ -   void (GLAPIENTRYP EndFragmentShaderATI)(void); /* 730 */ -   GLuint (GLAPIENTRYP GenFragmentShadersATI)(GLuint range); /* 731 */ -   void (GLAPIENTRYP PassTexCoordATI)(GLuint dst, GLuint coord, GLenum swizzle); /* 732 */ -   void (GLAPIENTRYP SampleMapATI)(GLuint dst, GLuint interp, GLenum swizzle); /* 733 */ -   void (GLAPIENTRYP SetFragmentShaderConstantATI)(GLuint dst, const GLfloat * value); /* 734 */ -   void (GLAPIENTRYP PointParameteriNV)(GLenum pname, GLint param); /* 735 */ -   void (GLAPIENTRYP PointParameterivNV)(GLenum pname, const GLint * params); /* 736 */ -   void (GLAPIENTRYP ActiveStencilFaceEXT)(GLenum face); /* 737 */ -   void (GLAPIENTRYP BindVertexArrayAPPLE)(GLuint array); /* 738 */ -   void (GLAPIENTRYP DeleteVertexArraysAPPLE)(GLsizei n, const GLuint * arrays); /* 739 */ -   void (GLAPIENTRYP GenVertexArraysAPPLE)(GLsizei n, GLuint * arrays); /* 740 */ -   GLboolean (GLAPIENTRYP IsVertexArrayAPPLE)(GLuint array); /* 741 */ -   void (GLAPIENTRYP GetProgramNamedParameterdvNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); /* 742 */ -   void (GLAPIENTRYP GetProgramNamedParameterfvNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); /* 743 */ -   void (GLAPIENTRYP ProgramNamedParameter4dNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 744 */ -   void (GLAPIENTRYP ProgramNamedParameter4dvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); /* 745 */ -   void (GLAPIENTRYP ProgramNamedParameter4fNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 746 */ -   void (GLAPIENTRYP ProgramNamedParameter4fvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); /* 747 */ -   void (GLAPIENTRYP DepthBoundsEXT)(GLclampd zmin, GLclampd zmax); /* 748 */ -   void (GLAPIENTRYP BlendEquationSeparateEXT)(GLenum modeRGB, GLenum modeA); /* 749 */ -   void (GLAPIENTRYP BindFramebufferEXT)(GLenum target, GLuint framebuffer); /* 750 */ -   void (GLAPIENTRYP BindRenderbufferEXT)(GLenum target, GLuint renderbuffer); /* 751 */ -   GLenum (GLAPIENTRYP CheckFramebufferStatusEXT)(GLenum target); /* 752 */ -   void (GLAPIENTRYP DeleteFramebuffersEXT)(GLsizei n, const GLuint * framebuffers); /* 753 */ -   void (GLAPIENTRYP DeleteRenderbuffersEXT)(GLsizei n, const GLuint * renderbuffers); /* 754 */ -   void (GLAPIENTRYP FramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); /* 755 */ -   void (GLAPIENTRYP FramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 756 */ -   void (GLAPIENTRYP FramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 757 */ -   void (GLAPIENTRYP FramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); /* 758 */ -   void (GLAPIENTRYP GenFramebuffersEXT)(GLsizei n, GLuint * framebuffers); /* 759 */ -   void (GLAPIENTRYP GenRenderbuffersEXT)(GLsizei n, GLuint * renderbuffers); /* 760 */ -   void (GLAPIENTRYP GenerateMipmapEXT)(GLenum target); /* 761 */ -   void (GLAPIENTRYP GetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint * params); /* 762 */ -   void (GLAPIENTRYP GetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 763 */ -   GLboolean (GLAPIENTRYP IsFramebufferEXT)(GLuint framebuffer); /* 764 */ -   GLboolean (GLAPIENTRYP IsRenderbufferEXT)(GLuint renderbuffer); /* 765 */ -   void (GLAPIENTRYP RenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); /* 766 */ -   void (GLAPIENTRYP BlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); /* 767 */ -   void (GLAPIENTRYP FramebufferTextureLayerEXT)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); /* 768 */ -   void (GLAPIENTRYP StencilFuncSeparateATI)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); /* 769 */ -   void (GLAPIENTRYP ProgramEnvParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 770 */ -   void (GLAPIENTRYP ProgramLocalParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 771 */ -   void (GLAPIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT * params); /* 772 */ -   void (GLAPIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT * params); /* 773 */ +   void (GLAPIENTRYP ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params); /* 673 */ +   void (GLAPIENTRYP ProgramParameters4fvNV)(GLenum target, GLuint index, GLuint num, const GLfloat * params); /* 674 */ +   void (GLAPIENTRYP RequestResidentProgramsNV)(GLsizei n, const GLuint * ids); /* 675 */ +   void (GLAPIENTRYP TrackMatrixNV)(GLenum target, GLuint address, GLenum matrix, GLenum transform); /* 676 */ +   void (GLAPIENTRYP VertexAttrib1dNV)(GLuint index, GLdouble x); /* 677 */ +   void (GLAPIENTRYP VertexAttrib1dvNV)(GLuint index, const GLdouble * v); /* 678 */ +   void (GLAPIENTRYP VertexAttrib1fNV)(GLuint index, GLfloat x); /* 679 */ +   void (GLAPIENTRYP VertexAttrib1fvNV)(GLuint index, const GLfloat * v); /* 680 */ +   void (GLAPIENTRYP VertexAttrib1sNV)(GLuint index, GLshort x); /* 681 */ +   void (GLAPIENTRYP VertexAttrib1svNV)(GLuint index, const GLshort * v); /* 682 */ +   void (GLAPIENTRYP VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y); /* 683 */ +   void (GLAPIENTRYP VertexAttrib2dvNV)(GLuint index, const GLdouble * v); /* 684 */ +   void (GLAPIENTRYP VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y); /* 685 */ +   void (GLAPIENTRYP VertexAttrib2fvNV)(GLuint index, const GLfloat * v); /* 686 */ +   void (GLAPIENTRYP VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y); /* 687 */ +   void (GLAPIENTRYP VertexAttrib2svNV)(GLuint index, const GLshort * v); /* 688 */ +   void (GLAPIENTRYP VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z); /* 689 */ +   void (GLAPIENTRYP VertexAttrib3dvNV)(GLuint index, const GLdouble * v); /* 690 */ +   void (GLAPIENTRYP VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z); /* 691 */ +   void (GLAPIENTRYP VertexAttrib3fvNV)(GLuint index, const GLfloat * v); /* 692 */ +   void (GLAPIENTRYP VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z); /* 693 */ +   void (GLAPIENTRYP VertexAttrib3svNV)(GLuint index, const GLshort * v); /* 694 */ +   void (GLAPIENTRYP VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 695 */ +   void (GLAPIENTRYP VertexAttrib4dvNV)(GLuint index, const GLdouble * v); /* 696 */ +   void (GLAPIENTRYP VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 697 */ +   void (GLAPIENTRYP VertexAttrib4fvNV)(GLuint index, const GLfloat * v); /* 698 */ +   void (GLAPIENTRYP VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); /* 699 */ +   void (GLAPIENTRYP VertexAttrib4svNV)(GLuint index, const GLshort * v); /* 700 */ +   void (GLAPIENTRYP VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); /* 701 */ +   void (GLAPIENTRYP VertexAttrib4ubvNV)(GLuint index, const GLubyte * v); /* 702 */ +   void (GLAPIENTRYP VertexAttribPointerNV)(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer); /* 703 */ +   void (GLAPIENTRYP VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 704 */ +   void (GLAPIENTRYP VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 705 */ +   void (GLAPIENTRYP VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort * v); /* 706 */ +   void (GLAPIENTRYP VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 707 */ +   void (GLAPIENTRYP VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 708 */ +   void (GLAPIENTRYP VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort * v); /* 709 */ +   void (GLAPIENTRYP VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 710 */ +   void (GLAPIENTRYP VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 711 */ +   void (GLAPIENTRYP VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort * v); /* 712 */ +   void (GLAPIENTRYP VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble * v); /* 713 */ +   void (GLAPIENTRYP VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat * v); /* 714 */ +   void (GLAPIENTRYP VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort * v); /* 715 */ +   void (GLAPIENTRYP VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte * v); /* 716 */ +   void (GLAPIENTRYP AlphaFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 717 */ +   void (GLAPIENTRYP AlphaFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 718 */ +   void (GLAPIENTRYP AlphaFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 719 */ +   void (GLAPIENTRYP BeginFragmentShaderATI)(void); /* 720 */ +   void (GLAPIENTRYP BindFragmentShaderATI)(GLuint id); /* 721 */ +   void (GLAPIENTRYP ColorFragmentOp1ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); /* 722 */ +   void (GLAPIENTRYP ColorFragmentOp2ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); /* 723 */ +   void (GLAPIENTRYP ColorFragmentOp3ATI)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); /* 724 */ +   void (GLAPIENTRYP DeleteFragmentShaderATI)(GLuint id); /* 725 */ +   void (GLAPIENTRYP EndFragmentShaderATI)(void); /* 726 */ +   GLuint (GLAPIENTRYP GenFragmentShadersATI)(GLuint range); /* 727 */ +   void (GLAPIENTRYP PassTexCoordATI)(GLuint dst, GLuint coord, GLenum swizzle); /* 728 */ +   void (GLAPIENTRYP SampleMapATI)(GLuint dst, GLuint interp, GLenum swizzle); /* 729 */ +   void (GLAPIENTRYP SetFragmentShaderConstantATI)(GLuint dst, const GLfloat * value); /* 730 */ +   void (GLAPIENTRYP PointParameteriNV)(GLenum pname, GLint param); /* 731 */ +   void (GLAPIENTRYP PointParameterivNV)(GLenum pname, const GLint * params); /* 732 */ +   void (GLAPIENTRYP ActiveStencilFaceEXT)(GLenum face); /* 733 */ +   void (GLAPIENTRYP BindVertexArrayAPPLE)(GLuint array); /* 734 */ +   void (GLAPIENTRYP DeleteVertexArraysAPPLE)(GLsizei n, const GLuint * arrays); /* 735 */ +   void (GLAPIENTRYP GenVertexArraysAPPLE)(GLsizei n, GLuint * arrays); /* 736 */ +   GLboolean (GLAPIENTRYP IsVertexArrayAPPLE)(GLuint array); /* 737 */ +   void (GLAPIENTRYP GetProgramNamedParameterdvNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); /* 738 */ +   void (GLAPIENTRYP GetProgramNamedParameterfvNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); /* 739 */ +   void (GLAPIENTRYP ProgramNamedParameter4dNV)(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); /* 740 */ +   void (GLAPIENTRYP ProgramNamedParameter4dvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); /* 741 */ +   void (GLAPIENTRYP ProgramNamedParameter4fNV)(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); /* 742 */ +   void (GLAPIENTRYP ProgramNamedParameter4fvNV)(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); /* 743 */ +   void (GLAPIENTRYP DepthBoundsEXT)(GLclampd zmin, GLclampd zmax); /* 744 */ +   void (GLAPIENTRYP BlendEquationSeparateEXT)(GLenum modeRGB, GLenum modeA); /* 745 */ +   void (GLAPIENTRYP BindFramebufferEXT)(GLenum target, GLuint framebuffer); /* 746 */ +   void (GLAPIENTRYP BindRenderbufferEXT)(GLenum target, GLuint renderbuffer); /* 747 */ +   GLenum (GLAPIENTRYP CheckFramebufferStatusEXT)(GLenum target); /* 748 */ +   void (GLAPIENTRYP DeleteFramebuffersEXT)(GLsizei n, const GLuint * framebuffers); /* 749 */ +   void (GLAPIENTRYP DeleteRenderbuffersEXT)(GLsizei n, const GLuint * renderbuffers); /* 750 */ +   void (GLAPIENTRYP FramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); /* 751 */ +   void (GLAPIENTRYP FramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 752 */ +   void (GLAPIENTRYP FramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); /* 753 */ +   void (GLAPIENTRYP FramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); /* 754 */ +   void (GLAPIENTRYP GenFramebuffersEXT)(GLsizei n, GLuint * framebuffers); /* 755 */ +   void (GLAPIENTRYP GenRenderbuffersEXT)(GLsizei n, GLuint * renderbuffers); /* 756 */ +   void (GLAPIENTRYP GenerateMipmapEXT)(GLenum target); /* 757 */ +   void (GLAPIENTRYP GetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint * params); /* 758 */ +   void (GLAPIENTRYP GetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint * params); /* 759 */ +   GLboolean (GLAPIENTRYP IsFramebufferEXT)(GLuint framebuffer); /* 760 */ +   GLboolean (GLAPIENTRYP IsRenderbufferEXT)(GLuint renderbuffer); /* 761 */ +   void (GLAPIENTRYP RenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); /* 762 */ +   void (GLAPIENTRYP BlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); /* 763 */ +   void (GLAPIENTRYP FramebufferTextureLayerEXT)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); /* 764 */ +   void (GLAPIENTRYP StencilFuncSeparateATI)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); /* 765 */ +   void (GLAPIENTRYP ProgramEnvParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 766 */ +   void (GLAPIENTRYP ProgramLocalParameters4fvEXT)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); /* 767 */ +   void (GLAPIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT * params); /* 768 */ +   void (GLAPIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT * params); /* 769 */  };  #endif /* !defined( _GLAPI_TABLE_H_ ) */ diff --git a/src/mesa/glapi/glapitemp.h b/src/mesa/glapi/glapitemp.h index 6ded362c0e..09259f4704 100644 --- a/src/mesa/glapi/glapitemp.h +++ b/src/mesa/glapi/glapitemp.h @@ -3001,21 +3001,41 @@ KEYWORD1 void KEYWORD2 NAME(ProgramEnvParameter4dARB)(GLenum target, GLuint inde     DISPATCH(ProgramEnvParameter4dARB, (target, index, x, y, z, w), (F, "glProgramEnvParameter4dARB(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w));  } +KEYWORD1 void KEYWORD2 NAME(ProgramParameter4dNV)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) +{ +   DISPATCH(ProgramEnvParameter4dARB, (target, index, x, y, z, w), (F, "glProgramParameter4dNV(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w)); +} +  KEYWORD1 void KEYWORD2 NAME(ProgramEnvParameter4dvARB)(GLenum target, GLuint index, const GLdouble * params)  {     DISPATCH(ProgramEnvParameter4dvARB, (target, index, params), (F, "glProgramEnvParameter4dvARB(0x%x, %d, %p);\n", target, index, (const void *) params));  } +KEYWORD1 void KEYWORD2 NAME(ProgramParameter4dvNV)(GLenum target, GLuint index, const GLdouble * params) +{ +   DISPATCH(ProgramEnvParameter4dvARB, (target, index, params), (F, "glProgramParameter4dvNV(0x%x, %d, %p);\n", target, index, (const void *) params)); +} +  KEYWORD1 void KEYWORD2 NAME(ProgramEnvParameter4fARB)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {     DISPATCH(ProgramEnvParameter4fARB, (target, index, x, y, z, w), (F, "glProgramEnvParameter4fARB(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w));  } +KEYWORD1 void KEYWORD2 NAME(ProgramParameter4fNV)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ +   DISPATCH(ProgramEnvParameter4fARB, (target, index, x, y, z, w), (F, "glProgramParameter4fNV(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w)); +} +  KEYWORD1 void KEYWORD2 NAME(ProgramEnvParameter4fvARB)(GLenum target, GLuint index, const GLfloat * params)  {     DISPATCH(ProgramEnvParameter4fvARB, (target, index, params), (F, "glProgramEnvParameter4fvARB(0x%x, %d, %p);\n", target, index, (const void *) params));  } +KEYWORD1 void KEYWORD2 NAME(ProgramParameter4fvNV)(GLenum target, GLuint index, const GLfloat * params) +{ +   DISPATCH(ProgramEnvParameter4fvARB, (target, index, params), (F, "glProgramParameter4fvNV(0x%x, %d, %p);\n", target, index, (const void *) params)); +} +  KEYWORD1 void KEYWORD2 NAME(ProgramLocalParameter4dARB)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {     DISPATCH(ProgramLocalParameter4dARB, (target, index, x, y, z, w), (F, "glProgramLocalParameter4dARB(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w)); @@ -4942,26 +4962,6 @@ KEYWORD1 void KEYWORD2 NAME(LoadProgramNV)(GLenum target, GLuint id, GLsizei len     DISPATCH(LoadProgramNV, (target, id, len, program), (F, "glLoadProgramNV(0x%x, %d, %d, %p);\n", target, id, len, (const void *) program));  } -KEYWORD1 void KEYWORD2 NAME(ProgramParameter4dNV)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ -   DISPATCH(ProgramParameter4dNV, (target, index, x, y, z, w), (F, "glProgramParameter4dNV(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w)); -} - -KEYWORD1 void KEYWORD2 NAME(ProgramParameter4dvNV)(GLenum target, GLuint index, const GLdouble * params) -{ -   DISPATCH(ProgramParameter4dvNV, (target, index, params), (F, "glProgramParameter4dvNV(0x%x, %d, %p);\n", target, index, (const void *) params)); -} - -KEYWORD1 void KEYWORD2 NAME(ProgramParameter4fNV)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ -   DISPATCH(ProgramParameter4fNV, (target, index, x, y, z, w), (F, "glProgramParameter4fNV(0x%x, %d, %f, %f, %f, %f);\n", target, index, x, y, z, w)); -} - -KEYWORD1 void KEYWORD2 NAME(ProgramParameter4fvNV)(GLenum target, GLuint index, const GLfloat * params) -{ -   DISPATCH(ProgramParameter4fvNV, (target, index, params), (F, "glProgramParameter4fvNV(0x%x, %d, %p);\n", target, index, (const void *) params)); -} -  KEYWORD1 void KEYWORD2 NAME(ProgramParameters4dvNV)(GLenum target, GLuint index, GLuint num, const GLdouble * params)  {     DISPATCH(ProgramParameters4dvNV, (target, index, num, params), (F, "glProgramParameters4dvNV(0x%x, %d, %d, %p);\n", target, index, num, (const void *) params)); @@ -5272,37 +5272,37 @@ KEYWORD1 void KEYWORD2 NAME(PointParameterivNV)(GLenum pname, const GLint * para     DISPATCH(PointParameterivNV, (pname, params), (F, "glPointParameterivNV(0x%x, %p);\n", pname, (const void *) params));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_737)(GLenum face); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_733)(GLenum face); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_737)(GLenum face) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_733)(GLenum face)  {     DISPATCH(ActiveStencilFaceEXT, (face), (F, "glActiveStencilFaceEXT(0x%x);\n", face));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_738)(GLuint array); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_734)(GLuint array); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_738)(GLuint array) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_734)(GLuint array)  {     DISPATCH(BindVertexArrayAPPLE, (array), (F, "glBindVertexArrayAPPLE(%d);\n", array));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_739)(GLsizei n, const GLuint * arrays); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_735)(GLsizei n, const GLuint * arrays); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_739)(GLsizei n, const GLuint * arrays) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_735)(GLsizei n, const GLuint * arrays)  {     DISPATCH(DeleteVertexArraysAPPLE, (n, arrays), (F, "glDeleteVertexArraysAPPLE(%d, %p);\n", n, (const void *) arrays));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_740)(GLsizei n, GLuint * arrays); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_736)(GLsizei n, GLuint * arrays); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_740)(GLsizei n, GLuint * arrays) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_736)(GLsizei n, GLuint * arrays)  {     DISPATCH(GenVertexArraysAPPLE, (n, arrays), (F, "glGenVertexArraysAPPLE(%d, %p);\n", n, (const void *) arrays));  } -KEYWORD1_ALT GLboolean KEYWORD2 NAME(_dispatch_stub_741)(GLuint array); +KEYWORD1_ALT GLboolean KEYWORD2 NAME(_dispatch_stub_737)(GLuint array); -KEYWORD1_ALT GLboolean KEYWORD2 NAME(_dispatch_stub_741)(GLuint array) +KEYWORD1_ALT GLboolean KEYWORD2 NAME(_dispatch_stub_737)(GLuint array)  {     RETURN_DISPATCH(IsVertexArrayAPPLE, (array), (F, "glIsVertexArrayAPPLE(%d);\n", array));  } @@ -5337,9 +5337,9 @@ KEYWORD1 void KEYWORD2 NAME(ProgramNamedParameter4fvNV)(GLuint id, GLsizei len,     DISPATCH(ProgramNamedParameter4fvNV, (id, len, name, v), (F, "glProgramNamedParameter4fvNV(%d, %d, %p, %p);\n", id, len, (const void *) name, (const void *) v));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_748)(GLclampd zmin, GLclampd zmax); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_744)(GLclampd zmin, GLclampd zmax); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_748)(GLclampd zmin, GLclampd zmax) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_744)(GLclampd zmin, GLclampd zmax)  {     DISPATCH(DepthBoundsEXT, (zmin, zmax), (F, "glDepthBoundsEXT(%f, %f);\n", zmin, zmax));  } @@ -5349,9 +5349,9 @@ KEYWORD1 void KEYWORD2 NAME(BlendEquationSeparate)(GLenum modeRGB, GLenum modeA)     DISPATCH(BlendEquationSeparateEXT, (modeRGB, modeA), (F, "glBlendEquationSeparate(0x%x, 0x%x);\n", modeRGB, modeA));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_749)(GLenum modeRGB, GLenum modeA); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_745)(GLenum modeRGB, GLenum modeA); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_749)(GLenum modeRGB, GLenum modeA) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_745)(GLenum modeRGB, GLenum modeA)  {     DISPATCH(BlendEquationSeparateEXT, (modeRGB, modeA), (F, "glBlendEquationSeparateEXT(0x%x, 0x%x);\n", modeRGB, modeA));  } @@ -5441,9 +5441,9 @@ KEYWORD1 void KEYWORD2 NAME(RenderbufferStorageEXT)(GLenum target, GLenum intern     DISPATCH(RenderbufferStorageEXT, (target, internalformat, width, height), (F, "glRenderbufferStorageEXT(0x%x, 0x%x, %d, %d);\n", target, internalformat, width, height));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_767)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_763)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_767)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_763)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)  {     DISPATCH(BlitFramebufferEXT, (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter), (F, "glBlitFramebufferEXT(%d, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x);\n", srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter));  } @@ -5453,37 +5453,37 @@ KEYWORD1 void KEYWORD2 NAME(FramebufferTextureLayerEXT)(GLenum target, GLenum at     DISPATCH(FramebufferTextureLayerEXT, (target, attachment, texture, level, layer), (F, "glFramebufferTextureLayerEXT(0x%x, 0x%x, %d, %d, %d);\n", target, attachment, texture, level, layer));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_769)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_765)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_769)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_765)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)  {     DISPATCH(StencilFuncSeparateATI, (frontfunc, backfunc, ref, mask), (F, "glStencilFuncSeparateATI(0x%x, 0x%x, %d, %d);\n", frontfunc, backfunc, ref, mask));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_770)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_766)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_770)(GLenum target, GLuint index, GLsizei count, const GLfloat * params) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_766)(GLenum target, GLuint index, GLsizei count, const GLfloat * params)  {     DISPATCH(ProgramEnvParameters4fvEXT, (target, index, count, params), (F, "glProgramEnvParameters4fvEXT(0x%x, %d, %d, %p);\n", target, index, count, (const void *) params));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_771)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_767)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_771)(GLenum target, GLuint index, GLsizei count, const GLfloat * params) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_767)(GLenum target, GLuint index, GLsizei count, const GLfloat * params)  {     DISPATCH(ProgramLocalParameters4fvEXT, (target, index, count, params), (F, "glProgramLocalParameters4fvEXT(0x%x, %d, %d, %p);\n", target, index, count, (const void *) params));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_772)(GLuint id, GLenum pname, GLint64EXT * params); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_768)(GLuint id, GLenum pname, GLint64EXT * params); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_772)(GLuint id, GLenum pname, GLint64EXT * params) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_768)(GLuint id, GLenum pname, GLint64EXT * params)  {     DISPATCH(GetQueryObjecti64vEXT, (id, pname, params), (F, "glGetQueryObjecti64vEXT(%d, 0x%x, %p);\n", id, pname, (const void *) params));  } -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_773)(GLuint id, GLenum pname, GLuint64EXT * params); +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_769)(GLuint id, GLenum pname, GLuint64EXT * params); -KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_773)(GLuint id, GLenum pname, GLuint64EXT * params) +KEYWORD1_ALT void KEYWORD2 NAME(_dispatch_stub_769)(GLuint id, GLenum pname, GLuint64EXT * params)  {     DISPATCH(GetQueryObjectui64vEXT, (id, pname, params), (F, "glGetQueryObjectui64vEXT(%d, 0x%x, %p);\n", id, pname, (const void *) params));  } @@ -6175,10 +6175,6 @@ static _glapi_proc DISPATCH_TABLE_NAME[] = {     TABLE_ENTRY(GetVertexAttribivNV),     TABLE_ENTRY(IsProgramNV),     TABLE_ENTRY(LoadProgramNV), -   TABLE_ENTRY(ProgramParameter4dNV), -   TABLE_ENTRY(ProgramParameter4dvNV), -   TABLE_ENTRY(ProgramParameter4fNV), -   TABLE_ENTRY(ProgramParameter4fvNV),     TABLE_ENTRY(ProgramParameters4dvNV),     TABLE_ENTRY(ProgramParameters4fvNV),     TABLE_ENTRY(RequestResidentProgramsNV), @@ -6239,19 +6235,19 @@ static _glapi_proc DISPATCH_TABLE_NAME[] = {     TABLE_ENTRY(SetFragmentShaderConstantATI),     TABLE_ENTRY(PointParameteriNV),     TABLE_ENTRY(PointParameterivNV), +   TABLE_ENTRY(_dispatch_stub_733), +   TABLE_ENTRY(_dispatch_stub_734), +   TABLE_ENTRY(_dispatch_stub_735), +   TABLE_ENTRY(_dispatch_stub_736),     TABLE_ENTRY(_dispatch_stub_737), -   TABLE_ENTRY(_dispatch_stub_738), -   TABLE_ENTRY(_dispatch_stub_739), -   TABLE_ENTRY(_dispatch_stub_740), -   TABLE_ENTRY(_dispatch_stub_741),     TABLE_ENTRY(GetProgramNamedParameterdvNV),     TABLE_ENTRY(GetProgramNamedParameterfvNV),     TABLE_ENTRY(ProgramNamedParameter4dNV),     TABLE_ENTRY(ProgramNamedParameter4dvNV),     TABLE_ENTRY(ProgramNamedParameter4fNV),     TABLE_ENTRY(ProgramNamedParameter4fvNV), -   TABLE_ENTRY(_dispatch_stub_748), -   TABLE_ENTRY(_dispatch_stub_749), +   TABLE_ENTRY(_dispatch_stub_744), +   TABLE_ENTRY(_dispatch_stub_745),     TABLE_ENTRY(BindFramebufferEXT),     TABLE_ENTRY(BindRenderbufferEXT),     TABLE_ENTRY(CheckFramebufferStatusEXT), @@ -6269,13 +6265,13 @@ static _glapi_proc DISPATCH_TABLE_NAME[] = {     TABLE_ENTRY(IsFramebufferEXT),     TABLE_ENTRY(IsRenderbufferEXT),     TABLE_ENTRY(RenderbufferStorageEXT), -   TABLE_ENTRY(_dispatch_stub_767), +   TABLE_ENTRY(_dispatch_stub_763),     TABLE_ENTRY(FramebufferTextureLayerEXT), +   TABLE_ENTRY(_dispatch_stub_765), +   TABLE_ENTRY(_dispatch_stub_766), +   TABLE_ENTRY(_dispatch_stub_767), +   TABLE_ENTRY(_dispatch_stub_768),     TABLE_ENTRY(_dispatch_stub_769), -   TABLE_ENTRY(_dispatch_stub_770), -   TABLE_ENTRY(_dispatch_stub_771), -   TABLE_ENTRY(_dispatch_stub_772), -   TABLE_ENTRY(_dispatch_stub_773),     /* A whole bunch of no-op functions.  These might be called      * when someone tries to call a dynamically-registered      * extension function without a current rendering context. @@ -6479,6 +6475,10 @@ static _glapi_proc UNUSED_TABLE_NAME[] = {     TABLE_ENTRY(GetVertexAttribdv),     TABLE_ENTRY(GetVertexAttribfv),     TABLE_ENTRY(GetVertexAttribiv), +   TABLE_ENTRY(ProgramParameter4dNV), +   TABLE_ENTRY(ProgramParameter4dvNV), +   TABLE_ENTRY(ProgramParameter4fNV), +   TABLE_ENTRY(ProgramParameter4fvNV),     TABLE_ENTRY(VertexAttrib1d),     TABLE_ENTRY(VertexAttrib1dv),     TABLE_ENTRY(VertexAttrib1f), diff --git a/src/mesa/glapi/glprocs.h b/src/mesa/glapi/glprocs.h index abc22a9a04..5a99d505ec 100644 --- a/src/mesa/glapi/glprocs.h +++ b/src/mesa/glapi/glprocs.h @@ -725,10 +725,6 @@ static const char gl_string_table[] =      "glGetVertexAttribivNV\0"      "glIsProgramNV\0"      "glLoadProgramNV\0" -    "glProgramParameter4dNV\0" -    "glProgramParameter4dvNV\0" -    "glProgramParameter4fNV\0" -    "glProgramParameter4fvNV\0"      "glProgramParameters4dvNV\0"      "glProgramParameters4fvNV\0"      "glRequestResidentProgramsNV\0" @@ -935,6 +931,10 @@ static const char gl_string_table[] =      "glGetVertexAttribdv\0"      "glGetVertexAttribfv\0"      "glGetVertexAttribiv\0" +    "glProgramParameter4dNV\0" +    "glProgramParameter4dvNV\0" +    "glProgramParameter4fNV\0" +    "glProgramParameter4fvNV\0"      "glVertexAttrib1d\0"      "glVertexAttrib1dv\0"      "glVertexAttrib1f\0" @@ -1138,19 +1138,19 @@ static const char gl_string_table[] =  #define gl_dispatch_stub_654 mgl_dispatch_stub_654  #define gl_dispatch_stub_655 mgl_dispatch_stub_655  #define gl_dispatch_stub_656 mgl_dispatch_stub_656 +#define gl_dispatch_stub_733 mgl_dispatch_stub_733 +#define gl_dispatch_stub_734 mgl_dispatch_stub_734 +#define gl_dispatch_stub_735 mgl_dispatch_stub_735 +#define gl_dispatch_stub_736 mgl_dispatch_stub_736  #define gl_dispatch_stub_737 mgl_dispatch_stub_737 -#define gl_dispatch_stub_738 mgl_dispatch_stub_738 -#define gl_dispatch_stub_739 mgl_dispatch_stub_739 -#define gl_dispatch_stub_740 mgl_dispatch_stub_740 -#define gl_dispatch_stub_741 mgl_dispatch_stub_741 -#define gl_dispatch_stub_748 mgl_dispatch_stub_748 -#define gl_dispatch_stub_749 mgl_dispatch_stub_749 +#define gl_dispatch_stub_744 mgl_dispatch_stub_744 +#define gl_dispatch_stub_745 mgl_dispatch_stub_745 +#define gl_dispatch_stub_763 mgl_dispatch_stub_763 +#define gl_dispatch_stub_765 mgl_dispatch_stub_765 +#define gl_dispatch_stub_766 mgl_dispatch_stub_766  #define gl_dispatch_stub_767 mgl_dispatch_stub_767 +#define gl_dispatch_stub_768 mgl_dispatch_stub_768  #define gl_dispatch_stub_769 mgl_dispatch_stub_769 -#define gl_dispatch_stub_770 mgl_dispatch_stub_770 -#define gl_dispatch_stub_771 mgl_dispatch_stub_771 -#define gl_dispatch_stub_772 mgl_dispatch_stub_772 -#define gl_dispatch_stub_773 mgl_dispatch_stub_773  #endif /* USE_MGL_NAMESPACE */ @@ -1189,19 +1189,19 @@ extern void gl_dispatch_stub_653(void);  extern void gl_dispatch_stub_654(void);  extern void gl_dispatch_stub_655(void);  extern void gl_dispatch_stub_656(void); +extern void gl_dispatch_stub_733(void); +extern void gl_dispatch_stub_734(void); +extern void gl_dispatch_stub_735(void); +extern void gl_dispatch_stub_736(void);  extern void gl_dispatch_stub_737(void); -extern void gl_dispatch_stub_738(void); -extern void gl_dispatch_stub_739(void); -extern void gl_dispatch_stub_740(void); -extern void gl_dispatch_stub_741(void); -extern void gl_dispatch_stub_748(void); -extern void gl_dispatch_stub_749(void); +extern void gl_dispatch_stub_744(void); +extern void gl_dispatch_stub_745(void); +extern void gl_dispatch_stub_763(void); +extern void gl_dispatch_stub_765(void); +extern void gl_dispatch_stub_766(void);  extern void gl_dispatch_stub_767(void); +extern void gl_dispatch_stub_768(void);  extern void gl_dispatch_stub_769(void); -extern void gl_dispatch_stub_770(void); -extern void gl_dispatch_stub_771(void); -extern void gl_dispatch_stub_772(void); -extern void gl_dispatch_stub_773(void);  #endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */  static const glprocs_table_t static_functions[] = { @@ -1878,216 +1878,216 @@ static const glprocs_table_t static_functions[] = {      NAME_FUNC_OFFSET(11280, glGetVertexAttribivNV, glGetVertexAttribivNV, NULL, _gloffset_GetVertexAttribivNV),      NAME_FUNC_OFFSET(11302, glIsProgramNV, glIsProgramNV, NULL, _gloffset_IsProgramNV),      NAME_FUNC_OFFSET(11316, glLoadProgramNV, glLoadProgramNV, NULL, _gloffset_LoadProgramNV), -    NAME_FUNC_OFFSET(11332, glProgramParameter4dNV, glProgramParameter4dNV, NULL, _gloffset_ProgramParameter4dNV), -    NAME_FUNC_OFFSET(11355, glProgramParameter4dvNV, glProgramParameter4dvNV, NULL, _gloffset_ProgramParameter4dvNV), -    NAME_FUNC_OFFSET(11379, glProgramParameter4fNV, glProgramParameter4fNV, NULL, _gloffset_ProgramParameter4fNV), -    NAME_FUNC_OFFSET(11402, glProgramParameter4fvNV, glProgramParameter4fvNV, NULL, _gloffset_ProgramParameter4fvNV), -    NAME_FUNC_OFFSET(11426, glProgramParameters4dvNV, glProgramParameters4dvNV, NULL, _gloffset_ProgramParameters4dvNV), -    NAME_FUNC_OFFSET(11451, glProgramParameters4fvNV, glProgramParameters4fvNV, NULL, _gloffset_ProgramParameters4fvNV), -    NAME_FUNC_OFFSET(11476, glRequestResidentProgramsNV, glRequestResidentProgramsNV, NULL, _gloffset_RequestResidentProgramsNV), -    NAME_FUNC_OFFSET(11504, glTrackMatrixNV, glTrackMatrixNV, NULL, _gloffset_TrackMatrixNV), -    NAME_FUNC_OFFSET(11520, glVertexAttrib1dNV, glVertexAttrib1dNV, NULL, _gloffset_VertexAttrib1dNV), -    NAME_FUNC_OFFSET(11539, glVertexAttrib1dvNV, glVertexAttrib1dvNV, NULL, _gloffset_VertexAttrib1dvNV), -    NAME_FUNC_OFFSET(11559, glVertexAttrib1fNV, glVertexAttrib1fNV, NULL, _gloffset_VertexAttrib1fNV), -    NAME_FUNC_OFFSET(11578, glVertexAttrib1fvNV, glVertexAttrib1fvNV, NULL, _gloffset_VertexAttrib1fvNV), -    NAME_FUNC_OFFSET(11598, glVertexAttrib1sNV, glVertexAttrib1sNV, NULL, _gloffset_VertexAttrib1sNV), -    NAME_FUNC_OFFSET(11617, glVertexAttrib1svNV, glVertexAttrib1svNV, NULL, _gloffset_VertexAttrib1svNV), -    NAME_FUNC_OFFSET(11637, glVertexAttrib2dNV, glVertexAttrib2dNV, NULL, _gloffset_VertexAttrib2dNV), -    NAME_FUNC_OFFSET(11656, glVertexAttrib2dvNV, glVertexAttrib2dvNV, NULL, _gloffset_VertexAttrib2dvNV), -    NAME_FUNC_OFFSET(11676, glVertexAttrib2fNV, glVertexAttrib2fNV, NULL, _gloffset_VertexAttrib2fNV), -    NAME_FUNC_OFFSET(11695, glVertexAttrib2fvNV, glVertexAttrib2fvNV, NULL, _gloffset_VertexAttrib2fvNV), -    NAME_FUNC_OFFSET(11715, glVertexAttrib2sNV, glVertexAttrib2sNV, NULL, _gloffset_VertexAttrib2sNV), -    NAME_FUNC_OFFSET(11734, glVertexAttrib2svNV, glVertexAttrib2svNV, NULL, _gloffset_VertexAttrib2svNV), -    NAME_FUNC_OFFSET(11754, glVertexAttrib3dNV, glVertexAttrib3dNV, NULL, _gloffset_VertexAttrib3dNV), -    NAME_FUNC_OFFSET(11773, glVertexAttrib3dvNV, glVertexAttrib3dvNV, NULL, _gloffset_VertexAttrib3dvNV), -    NAME_FUNC_OFFSET(11793, glVertexAttrib3fNV, glVertexAttrib3fNV, NULL, _gloffset_VertexAttrib3fNV), -    NAME_FUNC_OFFSET(11812, glVertexAttrib3fvNV, glVertexAttrib3fvNV, NULL, _gloffset_VertexAttrib3fvNV), -    NAME_FUNC_OFFSET(11832, glVertexAttrib3sNV, glVertexAttrib3sNV, NULL, _gloffset_VertexAttrib3sNV), -    NAME_FUNC_OFFSET(11851, glVertexAttrib3svNV, glVertexAttrib3svNV, NULL, _gloffset_VertexAttrib3svNV), -    NAME_FUNC_OFFSET(11871, glVertexAttrib4dNV, glVertexAttrib4dNV, NULL, _gloffset_VertexAttrib4dNV), -    NAME_FUNC_OFFSET(11890, glVertexAttrib4dvNV, glVertexAttrib4dvNV, NULL, _gloffset_VertexAttrib4dvNV), -    NAME_FUNC_OFFSET(11910, glVertexAttrib4fNV, glVertexAttrib4fNV, NULL, _gloffset_VertexAttrib4fNV), -    NAME_FUNC_OFFSET(11929, glVertexAttrib4fvNV, glVertexAttrib4fvNV, NULL, _gloffset_VertexAttrib4fvNV), -    NAME_FUNC_OFFSET(11949, glVertexAttrib4sNV, glVertexAttrib4sNV, NULL, _gloffset_VertexAttrib4sNV), -    NAME_FUNC_OFFSET(11968, glVertexAttrib4svNV, glVertexAttrib4svNV, NULL, _gloffset_VertexAttrib4svNV), -    NAME_FUNC_OFFSET(11988, glVertexAttrib4ubNV, glVertexAttrib4ubNV, NULL, _gloffset_VertexAttrib4ubNV), -    NAME_FUNC_OFFSET(12008, glVertexAttrib4ubvNV, glVertexAttrib4ubvNV, NULL, _gloffset_VertexAttrib4ubvNV), -    NAME_FUNC_OFFSET(12029, glVertexAttribPointerNV, glVertexAttribPointerNV, NULL, _gloffset_VertexAttribPointerNV), -    NAME_FUNC_OFFSET(12053, glVertexAttribs1dvNV, glVertexAttribs1dvNV, NULL, _gloffset_VertexAttribs1dvNV), -    NAME_FUNC_OFFSET(12074, glVertexAttribs1fvNV, glVertexAttribs1fvNV, NULL, _gloffset_VertexAttribs1fvNV), -    NAME_FUNC_OFFSET(12095, glVertexAttribs1svNV, glVertexAttribs1svNV, NULL, _gloffset_VertexAttribs1svNV), -    NAME_FUNC_OFFSET(12116, glVertexAttribs2dvNV, glVertexAttribs2dvNV, NULL, _gloffset_VertexAttribs2dvNV), -    NAME_FUNC_OFFSET(12137, glVertexAttribs2fvNV, glVertexAttribs2fvNV, NULL, _gloffset_VertexAttribs2fvNV), -    NAME_FUNC_OFFSET(12158, glVertexAttribs2svNV, glVertexAttribs2svNV, NULL, _gloffset_VertexAttribs2svNV), -    NAME_FUNC_OFFSET(12179, glVertexAttribs3dvNV, glVertexAttribs3dvNV, NULL, _gloffset_VertexAttribs3dvNV), -    NAME_FUNC_OFFSET(12200, glVertexAttribs3fvNV, glVertexAttribs3fvNV, NULL, _gloffset_VertexAttribs3fvNV), -    NAME_FUNC_OFFSET(12221, glVertexAttribs3svNV, glVertexAttribs3svNV, NULL, _gloffset_VertexAttribs3svNV), -    NAME_FUNC_OFFSET(12242, glVertexAttribs4dvNV, glVertexAttribs4dvNV, NULL, _gloffset_VertexAttribs4dvNV), -    NAME_FUNC_OFFSET(12263, glVertexAttribs4fvNV, glVertexAttribs4fvNV, NULL, _gloffset_VertexAttribs4fvNV), -    NAME_FUNC_OFFSET(12284, glVertexAttribs4svNV, glVertexAttribs4svNV, NULL, _gloffset_VertexAttribs4svNV), -    NAME_FUNC_OFFSET(12305, glVertexAttribs4ubvNV, glVertexAttribs4ubvNV, NULL, _gloffset_VertexAttribs4ubvNV), -    NAME_FUNC_OFFSET(12327, glAlphaFragmentOp1ATI, glAlphaFragmentOp1ATI, NULL, _gloffset_AlphaFragmentOp1ATI), -    NAME_FUNC_OFFSET(12349, glAlphaFragmentOp2ATI, glAlphaFragmentOp2ATI, NULL, _gloffset_AlphaFragmentOp2ATI), -    NAME_FUNC_OFFSET(12371, glAlphaFragmentOp3ATI, glAlphaFragmentOp3ATI, NULL, _gloffset_AlphaFragmentOp3ATI), -    NAME_FUNC_OFFSET(12393, glBeginFragmentShaderATI, glBeginFragmentShaderATI, NULL, _gloffset_BeginFragmentShaderATI), -    NAME_FUNC_OFFSET(12418, glBindFragmentShaderATI, glBindFragmentShaderATI, NULL, _gloffset_BindFragmentShaderATI), -    NAME_FUNC_OFFSET(12442, glColorFragmentOp1ATI, glColorFragmentOp1ATI, NULL, _gloffset_ColorFragmentOp1ATI), -    NAME_FUNC_OFFSET(12464, glColorFragmentOp2ATI, glColorFragmentOp2ATI, NULL, _gloffset_ColorFragmentOp2ATI), -    NAME_FUNC_OFFSET(12486, glColorFragmentOp3ATI, glColorFragmentOp3ATI, NULL, _gloffset_ColorFragmentOp3ATI), -    NAME_FUNC_OFFSET(12508, glDeleteFragmentShaderATI, glDeleteFragmentShaderATI, NULL, _gloffset_DeleteFragmentShaderATI), -    NAME_FUNC_OFFSET(12534, glEndFragmentShaderATI, glEndFragmentShaderATI, NULL, _gloffset_EndFragmentShaderATI), -    NAME_FUNC_OFFSET(12557, glGenFragmentShadersATI, glGenFragmentShadersATI, NULL, _gloffset_GenFragmentShadersATI), -    NAME_FUNC_OFFSET(12581, glPassTexCoordATI, glPassTexCoordATI, NULL, _gloffset_PassTexCoordATI), -    NAME_FUNC_OFFSET(12599, glSampleMapATI, glSampleMapATI, NULL, _gloffset_SampleMapATI), -    NAME_FUNC_OFFSET(12614, glSetFragmentShaderConstantATI, glSetFragmentShaderConstantATI, NULL, _gloffset_SetFragmentShaderConstantATI), -    NAME_FUNC_OFFSET(12645, glPointParameteriNV, glPointParameteriNV, NULL, _gloffset_PointParameteriNV), -    NAME_FUNC_OFFSET(12665, glPointParameterivNV, glPointParameterivNV, NULL, _gloffset_PointParameterivNV), -    NAME_FUNC_OFFSET(12686, gl_dispatch_stub_737, gl_dispatch_stub_737, NULL, _gloffset_ActiveStencilFaceEXT), -    NAME_FUNC_OFFSET(12709, gl_dispatch_stub_738, gl_dispatch_stub_738, NULL, _gloffset_BindVertexArrayAPPLE), -    NAME_FUNC_OFFSET(12732, gl_dispatch_stub_739, gl_dispatch_stub_739, NULL, _gloffset_DeleteVertexArraysAPPLE), -    NAME_FUNC_OFFSET(12758, gl_dispatch_stub_740, gl_dispatch_stub_740, NULL, _gloffset_GenVertexArraysAPPLE), -    NAME_FUNC_OFFSET(12781, gl_dispatch_stub_741, gl_dispatch_stub_741, NULL, _gloffset_IsVertexArrayAPPLE), -    NAME_FUNC_OFFSET(12802, glGetProgramNamedParameterdvNV, glGetProgramNamedParameterdvNV, NULL, _gloffset_GetProgramNamedParameterdvNV), -    NAME_FUNC_OFFSET(12833, glGetProgramNamedParameterfvNV, glGetProgramNamedParameterfvNV, NULL, _gloffset_GetProgramNamedParameterfvNV), -    NAME_FUNC_OFFSET(12864, glProgramNamedParameter4dNV, glProgramNamedParameter4dNV, NULL, _gloffset_ProgramNamedParameter4dNV), -    NAME_FUNC_OFFSET(12892, glProgramNamedParameter4dvNV, glProgramNamedParameter4dvNV, NULL, _gloffset_ProgramNamedParameter4dvNV), -    NAME_FUNC_OFFSET(12921, glProgramNamedParameter4fNV, glProgramNamedParameter4fNV, NULL, _gloffset_ProgramNamedParameter4fNV), -    NAME_FUNC_OFFSET(12949, glProgramNamedParameter4fvNV, glProgramNamedParameter4fvNV, NULL, _gloffset_ProgramNamedParameter4fvNV), -    NAME_FUNC_OFFSET(12978, gl_dispatch_stub_748, gl_dispatch_stub_748, NULL, _gloffset_DepthBoundsEXT), -    NAME_FUNC_OFFSET(12995, gl_dispatch_stub_749, gl_dispatch_stub_749, NULL, _gloffset_BlendEquationSeparateEXT), -    NAME_FUNC_OFFSET(13022, glBindFramebufferEXT, glBindFramebufferEXT, NULL, _gloffset_BindFramebufferEXT), -    NAME_FUNC_OFFSET(13043, glBindRenderbufferEXT, glBindRenderbufferEXT, NULL, _gloffset_BindRenderbufferEXT), -    NAME_FUNC_OFFSET(13065, glCheckFramebufferStatusEXT, glCheckFramebufferStatusEXT, NULL, _gloffset_CheckFramebufferStatusEXT), -    NAME_FUNC_OFFSET(13093, glDeleteFramebuffersEXT, glDeleteFramebuffersEXT, NULL, _gloffset_DeleteFramebuffersEXT), -    NAME_FUNC_OFFSET(13117, glDeleteRenderbuffersEXT, glDeleteRenderbuffersEXT, NULL, _gloffset_DeleteRenderbuffersEXT), -    NAME_FUNC_OFFSET(13142, glFramebufferRenderbufferEXT, glFramebufferRenderbufferEXT, NULL, _gloffset_FramebufferRenderbufferEXT), -    NAME_FUNC_OFFSET(13171, glFramebufferTexture1DEXT, glFramebufferTexture1DEXT, NULL, _gloffset_FramebufferTexture1DEXT), -    NAME_FUNC_OFFSET(13197, glFramebufferTexture2DEXT, glFramebufferTexture2DEXT, NULL, _gloffset_FramebufferTexture2DEXT), -    NAME_FUNC_OFFSET(13223, glFramebufferTexture3DEXT, glFramebufferTexture3DEXT, NULL, _gloffset_FramebufferTexture3DEXT), -    NAME_FUNC_OFFSET(13249, glGenFramebuffersEXT, glGenFramebuffersEXT, NULL, _gloffset_GenFramebuffersEXT), -    NAME_FUNC_OFFSET(13270, glGenRenderbuffersEXT, glGenRenderbuffersEXT, NULL, _gloffset_GenRenderbuffersEXT), -    NAME_FUNC_OFFSET(13292, glGenerateMipmapEXT, glGenerateMipmapEXT, NULL, _gloffset_GenerateMipmapEXT), -    NAME_FUNC_OFFSET(13312, glGetFramebufferAttachmentParameterivEXT, glGetFramebufferAttachmentParameterivEXT, NULL, _gloffset_GetFramebufferAttachmentParameterivEXT), -    NAME_FUNC_OFFSET(13353, glGetRenderbufferParameterivEXT, glGetRenderbufferParameterivEXT, NULL, _gloffset_GetRenderbufferParameterivEXT), -    NAME_FUNC_OFFSET(13385, glIsFramebufferEXT, glIsFramebufferEXT, NULL, _gloffset_IsFramebufferEXT), -    NAME_FUNC_OFFSET(13404, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, _gloffset_IsRenderbufferEXT), -    NAME_FUNC_OFFSET(13424, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, _gloffset_RenderbufferStorageEXT), -    NAME_FUNC_OFFSET(13449, gl_dispatch_stub_767, gl_dispatch_stub_767, NULL, _gloffset_BlitFramebufferEXT), -    NAME_FUNC_OFFSET(13470, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, _gloffset_FramebufferTextureLayerEXT), -    NAME_FUNC_OFFSET(13499, gl_dispatch_stub_769, gl_dispatch_stub_769, NULL, _gloffset_StencilFuncSeparateATI), -    NAME_FUNC_OFFSET(13524, gl_dispatch_stub_770, gl_dispatch_stub_770, NULL, _gloffset_ProgramEnvParameters4fvEXT), -    NAME_FUNC_OFFSET(13553, gl_dispatch_stub_771, gl_dispatch_stub_771, NULL, _gloffset_ProgramLocalParameters4fvEXT), -    NAME_FUNC_OFFSET(13584, gl_dispatch_stub_772, gl_dispatch_stub_772, NULL, _gloffset_GetQueryObjecti64vEXT), -    NAME_FUNC_OFFSET(13608, gl_dispatch_stub_773, gl_dispatch_stub_773, NULL, _gloffset_GetQueryObjectui64vEXT), -    NAME_FUNC_OFFSET(13633, glArrayElement, glArrayElement, NULL, _gloffset_ArrayElement), -    NAME_FUNC_OFFSET(13651, glBindTexture, glBindTexture, NULL, _gloffset_BindTexture), -    NAME_FUNC_OFFSET(13668, glDrawArrays, glDrawArrays, NULL, _gloffset_DrawArrays), -    NAME_FUNC_OFFSET(13684, glAreTexturesResident, glAreTexturesResidentEXT, glAreTexturesResidentEXT, _gloffset_AreTexturesResident), -    NAME_FUNC_OFFSET(13709, glCopyTexImage1D, glCopyTexImage1D, NULL, _gloffset_CopyTexImage1D), -    NAME_FUNC_OFFSET(13729, glCopyTexImage2D, glCopyTexImage2D, NULL, _gloffset_CopyTexImage2D), -    NAME_FUNC_OFFSET(13749, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, _gloffset_CopyTexSubImage1D), -    NAME_FUNC_OFFSET(13772, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, _gloffset_CopyTexSubImage2D), -    NAME_FUNC_OFFSET(13795, glDeleteTextures, glDeleteTexturesEXT, glDeleteTexturesEXT, _gloffset_DeleteTextures), -    NAME_FUNC_OFFSET(13815, glGenTextures, glGenTexturesEXT, glGenTexturesEXT, _gloffset_GenTextures), -    NAME_FUNC_OFFSET(13832, glGetPointerv, glGetPointerv, NULL, _gloffset_GetPointerv), -    NAME_FUNC_OFFSET(13849, glIsTexture, glIsTextureEXT, glIsTextureEXT, _gloffset_IsTexture), -    NAME_FUNC_OFFSET(13864, glPrioritizeTextures, glPrioritizeTextures, NULL, _gloffset_PrioritizeTextures), -    NAME_FUNC_OFFSET(13888, glTexSubImage1D, glTexSubImage1D, NULL, _gloffset_TexSubImage1D), -    NAME_FUNC_OFFSET(13907, glTexSubImage2D, glTexSubImage2D, NULL, _gloffset_TexSubImage2D), -    NAME_FUNC_OFFSET(13926, glBlendColor, glBlendColor, NULL, _gloffset_BlendColor), -    NAME_FUNC_OFFSET(13942, glBlendEquation, glBlendEquation, NULL, _gloffset_BlendEquation), -    NAME_FUNC_OFFSET(13961, glDrawRangeElements, glDrawRangeElements, NULL, _gloffset_DrawRangeElements), -    NAME_FUNC_OFFSET(13984, glColorTable, glColorTable, NULL, _gloffset_ColorTable), -    NAME_FUNC_OFFSET(14000, glColorTable, glColorTable, NULL, _gloffset_ColorTable), -    NAME_FUNC_OFFSET(14016, glColorTableParameterfv, glColorTableParameterfv, NULL, _gloffset_ColorTableParameterfv), -    NAME_FUNC_OFFSET(14043, glColorTableParameteriv, glColorTableParameteriv, NULL, _gloffset_ColorTableParameteriv), -    NAME_FUNC_OFFSET(14070, glCopyColorTable, glCopyColorTable, NULL, _gloffset_CopyColorTable), -    NAME_FUNC_OFFSET(14090, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable), -    NAME_FUNC_OFFSET(14109, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable), -    NAME_FUNC_OFFSET(14128, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv), -    NAME_FUNC_OFFSET(14158, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv), -    NAME_FUNC_OFFSET(14188, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv), -    NAME_FUNC_OFFSET(14218, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv), -    NAME_FUNC_OFFSET(14248, glColorSubTable, glColorSubTable, NULL, _gloffset_ColorSubTable), -    NAME_FUNC_OFFSET(14267, glCopyColorSubTable, glCopyColorSubTable, NULL, _gloffset_CopyColorSubTable), -    NAME_FUNC_OFFSET(14290, glConvolutionFilter1D, glConvolutionFilter1D, NULL, _gloffset_ConvolutionFilter1D), -    NAME_FUNC_OFFSET(14315, glConvolutionFilter2D, glConvolutionFilter2D, NULL, _gloffset_ConvolutionFilter2D), -    NAME_FUNC_OFFSET(14340, glConvolutionParameterf, glConvolutionParameterf, NULL, _gloffset_ConvolutionParameterf), -    NAME_FUNC_OFFSET(14367, glConvolutionParameterfv, glConvolutionParameterfv, NULL, _gloffset_ConvolutionParameterfv), -    NAME_FUNC_OFFSET(14395, glConvolutionParameteri, glConvolutionParameteri, NULL, _gloffset_ConvolutionParameteri), -    NAME_FUNC_OFFSET(14422, glConvolutionParameteriv, glConvolutionParameteriv, NULL, _gloffset_ConvolutionParameteriv), -    NAME_FUNC_OFFSET(14450, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, _gloffset_CopyConvolutionFilter1D), -    NAME_FUNC_OFFSET(14479, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, _gloffset_CopyConvolutionFilter2D), -    NAME_FUNC_OFFSET(14508, glGetConvolutionFilter, gl_dispatch_stub_356, gl_dispatch_stub_356, _gloffset_GetConvolutionFilter), -    NAME_FUNC_OFFSET(14534, glGetConvolutionParameterfv, gl_dispatch_stub_357, gl_dispatch_stub_357, _gloffset_GetConvolutionParameterfv), -    NAME_FUNC_OFFSET(14565, glGetConvolutionParameteriv, gl_dispatch_stub_358, gl_dispatch_stub_358, _gloffset_GetConvolutionParameteriv), -    NAME_FUNC_OFFSET(14596, glGetSeparableFilter, gl_dispatch_stub_359, gl_dispatch_stub_359, _gloffset_GetSeparableFilter), -    NAME_FUNC_OFFSET(14620, glSeparableFilter2D, glSeparableFilter2D, NULL, _gloffset_SeparableFilter2D), -    NAME_FUNC_OFFSET(14643, glGetHistogram, gl_dispatch_stub_361, gl_dispatch_stub_361, _gloffset_GetHistogram), -    NAME_FUNC_OFFSET(14661, glGetHistogramParameterfv, gl_dispatch_stub_362, gl_dispatch_stub_362, _gloffset_GetHistogramParameterfv), -    NAME_FUNC_OFFSET(14690, glGetHistogramParameteriv, gl_dispatch_stub_363, gl_dispatch_stub_363, _gloffset_GetHistogramParameteriv), -    NAME_FUNC_OFFSET(14719, glGetMinmax, gl_dispatch_stub_364, gl_dispatch_stub_364, _gloffset_GetMinmax), -    NAME_FUNC_OFFSET(14734, glGetMinmaxParameterfv, gl_dispatch_stub_365, gl_dispatch_stub_365, _gloffset_GetMinmaxParameterfv), -    NAME_FUNC_OFFSET(14760, glGetMinmaxParameteriv, gl_dispatch_stub_366, gl_dispatch_stub_366, _gloffset_GetMinmaxParameteriv), -    NAME_FUNC_OFFSET(14786, glHistogram, glHistogram, NULL, _gloffset_Histogram), -    NAME_FUNC_OFFSET(14801, glMinmax, glMinmax, NULL, _gloffset_Minmax), -    NAME_FUNC_OFFSET(14813, glResetHistogram, glResetHistogram, NULL, _gloffset_ResetHistogram), -    NAME_FUNC_OFFSET(14833, glResetMinmax, glResetMinmax, NULL, _gloffset_ResetMinmax), -    NAME_FUNC_OFFSET(14850, glTexImage3D, glTexImage3D, NULL, _gloffset_TexImage3D), -    NAME_FUNC_OFFSET(14866, glTexSubImage3D, glTexSubImage3D, NULL, _gloffset_TexSubImage3D), -    NAME_FUNC_OFFSET(14885, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, _gloffset_CopyTexSubImage3D), -    NAME_FUNC_OFFSET(14908, glActiveTextureARB, glActiveTextureARB, NULL, _gloffset_ActiveTextureARB), -    NAME_FUNC_OFFSET(14924, glClientActiveTextureARB, glClientActiveTextureARB, NULL, _gloffset_ClientActiveTextureARB), -    NAME_FUNC_OFFSET(14946, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, _gloffset_MultiTexCoord1dARB), -    NAME_FUNC_OFFSET(14964, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, _gloffset_MultiTexCoord1dvARB), -    NAME_FUNC_OFFSET(14983, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, _gloffset_MultiTexCoord1fARB), -    NAME_FUNC_OFFSET(15001, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, _gloffset_MultiTexCoord1fvARB), -    NAME_FUNC_OFFSET(15020, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, _gloffset_MultiTexCoord1iARB), -    NAME_FUNC_OFFSET(15038, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, _gloffset_MultiTexCoord1ivARB), -    NAME_FUNC_OFFSET(15057, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, _gloffset_MultiTexCoord1sARB), -    NAME_FUNC_OFFSET(15075, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, _gloffset_MultiTexCoord1svARB), -    NAME_FUNC_OFFSET(15094, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, _gloffset_MultiTexCoord2dARB), -    NAME_FUNC_OFFSET(15112, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, _gloffset_MultiTexCoord2dvARB), -    NAME_FUNC_OFFSET(15131, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, _gloffset_MultiTexCoord2fARB), -    NAME_FUNC_OFFSET(15149, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, _gloffset_MultiTexCoord2fvARB), -    NAME_FUNC_OFFSET(15168, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, _gloffset_MultiTexCoord2iARB), -    NAME_FUNC_OFFSET(15186, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, _gloffset_MultiTexCoord2ivARB), -    NAME_FUNC_OFFSET(15205, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, _gloffset_MultiTexCoord2sARB), -    NAME_FUNC_OFFSET(15223, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, _gloffset_MultiTexCoord2svARB), -    NAME_FUNC_OFFSET(15242, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, _gloffset_MultiTexCoord3dARB), -    NAME_FUNC_OFFSET(15260, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, _gloffset_MultiTexCoord3dvARB), -    NAME_FUNC_OFFSET(15279, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, _gloffset_MultiTexCoord3fARB), -    NAME_FUNC_OFFSET(15297, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, _gloffset_MultiTexCoord3fvARB), -    NAME_FUNC_OFFSET(15316, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, _gloffset_MultiTexCoord3iARB), -    NAME_FUNC_OFFSET(15334, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, _gloffset_MultiTexCoord3ivARB), -    NAME_FUNC_OFFSET(15353, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, _gloffset_MultiTexCoord3sARB), -    NAME_FUNC_OFFSET(15371, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, _gloffset_MultiTexCoord3svARB), -    NAME_FUNC_OFFSET(15390, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, _gloffset_MultiTexCoord4dARB), -    NAME_FUNC_OFFSET(15408, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, _gloffset_MultiTexCoord4dvARB), -    NAME_FUNC_OFFSET(15427, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, _gloffset_MultiTexCoord4fARB), -    NAME_FUNC_OFFSET(15445, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, _gloffset_MultiTexCoord4fvARB), -    NAME_FUNC_OFFSET(15464, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, _gloffset_MultiTexCoord4iARB), -    NAME_FUNC_OFFSET(15482, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, _gloffset_MultiTexCoord4ivARB), -    NAME_FUNC_OFFSET(15501, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, _gloffset_MultiTexCoord4sARB), -    NAME_FUNC_OFFSET(15519, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, _gloffset_MultiTexCoord4svARB), -    NAME_FUNC_OFFSET(15538, glStencilOpSeparate, glStencilOpSeparate, NULL, _gloffset_StencilOpSeparate), -    NAME_FUNC_OFFSET(15561, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, _gloffset_LoadTransposeMatrixdARB), -    NAME_FUNC_OFFSET(15584, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, _gloffset_LoadTransposeMatrixfARB), -    NAME_FUNC_OFFSET(15607, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, _gloffset_MultTransposeMatrixdARB), -    NAME_FUNC_OFFSET(15630, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, _gloffset_MultTransposeMatrixfARB), -    NAME_FUNC_OFFSET(15653, glSampleCoverageARB, glSampleCoverageARB, NULL, _gloffset_SampleCoverageARB), -    NAME_FUNC_OFFSET(15670, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, _gloffset_CompressedTexImage1DARB), -    NAME_FUNC_OFFSET(15693, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, _gloffset_CompressedTexImage2DARB), -    NAME_FUNC_OFFSET(15716, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, _gloffset_CompressedTexImage3DARB), -    NAME_FUNC_OFFSET(15739, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, _gloffset_CompressedTexSubImage1DARB), -    NAME_FUNC_OFFSET(15765, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, _gloffset_CompressedTexSubImage2DARB), -    NAME_FUNC_OFFSET(15791, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, _gloffset_CompressedTexSubImage3DARB), -    NAME_FUNC_OFFSET(15817, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, _gloffset_GetCompressedTexImageARB), -    NAME_FUNC_OFFSET(15841, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, _gloffset_DisableVertexAttribArrayARB), -    NAME_FUNC_OFFSET(15868, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, _gloffset_EnableVertexAttribArrayARB), -    NAME_FUNC_OFFSET(15894, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, _gloffset_GetVertexAttribdvARB), -    NAME_FUNC_OFFSET(15914, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, _gloffset_GetVertexAttribfvARB), -    NAME_FUNC_OFFSET(15934, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, _gloffset_GetVertexAttribivARB), +    NAME_FUNC_OFFSET(11332, glProgramParameters4dvNV, glProgramParameters4dvNV, NULL, _gloffset_ProgramParameters4dvNV), +    NAME_FUNC_OFFSET(11357, glProgramParameters4fvNV, glProgramParameters4fvNV, NULL, _gloffset_ProgramParameters4fvNV), +    NAME_FUNC_OFFSET(11382, glRequestResidentProgramsNV, glRequestResidentProgramsNV, NULL, _gloffset_RequestResidentProgramsNV), +    NAME_FUNC_OFFSET(11410, glTrackMatrixNV, glTrackMatrixNV, NULL, _gloffset_TrackMatrixNV), +    NAME_FUNC_OFFSET(11426, glVertexAttrib1dNV, glVertexAttrib1dNV, NULL, _gloffset_VertexAttrib1dNV), +    NAME_FUNC_OFFSET(11445, glVertexAttrib1dvNV, glVertexAttrib1dvNV, NULL, _gloffset_VertexAttrib1dvNV), +    NAME_FUNC_OFFSET(11465, glVertexAttrib1fNV, glVertexAttrib1fNV, NULL, _gloffset_VertexAttrib1fNV), +    NAME_FUNC_OFFSET(11484, glVertexAttrib1fvNV, glVertexAttrib1fvNV, NULL, _gloffset_VertexAttrib1fvNV), +    NAME_FUNC_OFFSET(11504, glVertexAttrib1sNV, glVertexAttrib1sNV, NULL, _gloffset_VertexAttrib1sNV), +    NAME_FUNC_OFFSET(11523, glVertexAttrib1svNV, glVertexAttrib1svNV, NULL, _gloffset_VertexAttrib1svNV), +    NAME_FUNC_OFFSET(11543, glVertexAttrib2dNV, glVertexAttrib2dNV, NULL, _gloffset_VertexAttrib2dNV), +    NAME_FUNC_OFFSET(11562, glVertexAttrib2dvNV, glVertexAttrib2dvNV, NULL, _gloffset_VertexAttrib2dvNV), +    NAME_FUNC_OFFSET(11582, glVertexAttrib2fNV, glVertexAttrib2fNV, NULL, _gloffset_VertexAttrib2fNV), +    NAME_FUNC_OFFSET(11601, glVertexAttrib2fvNV, glVertexAttrib2fvNV, NULL, _gloffset_VertexAttrib2fvNV), +    NAME_FUNC_OFFSET(11621, glVertexAttrib2sNV, glVertexAttrib2sNV, NULL, _gloffset_VertexAttrib2sNV), +    NAME_FUNC_OFFSET(11640, glVertexAttrib2svNV, glVertexAttrib2svNV, NULL, _gloffset_VertexAttrib2svNV), +    NAME_FUNC_OFFSET(11660, glVertexAttrib3dNV, glVertexAttrib3dNV, NULL, _gloffset_VertexAttrib3dNV), +    NAME_FUNC_OFFSET(11679, glVertexAttrib3dvNV, glVertexAttrib3dvNV, NULL, _gloffset_VertexAttrib3dvNV), +    NAME_FUNC_OFFSET(11699, glVertexAttrib3fNV, glVertexAttrib3fNV, NULL, _gloffset_VertexAttrib3fNV), +    NAME_FUNC_OFFSET(11718, glVertexAttrib3fvNV, glVertexAttrib3fvNV, NULL, _gloffset_VertexAttrib3fvNV), +    NAME_FUNC_OFFSET(11738, glVertexAttrib3sNV, glVertexAttrib3sNV, NULL, _gloffset_VertexAttrib3sNV), +    NAME_FUNC_OFFSET(11757, glVertexAttrib3svNV, glVertexAttrib3svNV, NULL, _gloffset_VertexAttrib3svNV), +    NAME_FUNC_OFFSET(11777, glVertexAttrib4dNV, glVertexAttrib4dNV, NULL, _gloffset_VertexAttrib4dNV), +    NAME_FUNC_OFFSET(11796, glVertexAttrib4dvNV, glVertexAttrib4dvNV, NULL, _gloffset_VertexAttrib4dvNV), +    NAME_FUNC_OFFSET(11816, glVertexAttrib4fNV, glVertexAttrib4fNV, NULL, _gloffset_VertexAttrib4fNV), +    NAME_FUNC_OFFSET(11835, glVertexAttrib4fvNV, glVertexAttrib4fvNV, NULL, _gloffset_VertexAttrib4fvNV), +    NAME_FUNC_OFFSET(11855, glVertexAttrib4sNV, glVertexAttrib4sNV, NULL, _gloffset_VertexAttrib4sNV), +    NAME_FUNC_OFFSET(11874, glVertexAttrib4svNV, glVertexAttrib4svNV, NULL, _gloffset_VertexAttrib4svNV), +    NAME_FUNC_OFFSET(11894, glVertexAttrib4ubNV, glVertexAttrib4ubNV, NULL, _gloffset_VertexAttrib4ubNV), +    NAME_FUNC_OFFSET(11914, glVertexAttrib4ubvNV, glVertexAttrib4ubvNV, NULL, _gloffset_VertexAttrib4ubvNV), +    NAME_FUNC_OFFSET(11935, glVertexAttribPointerNV, glVertexAttribPointerNV, NULL, _gloffset_VertexAttribPointerNV), +    NAME_FUNC_OFFSET(11959, glVertexAttribs1dvNV, glVertexAttribs1dvNV, NULL, _gloffset_VertexAttribs1dvNV), +    NAME_FUNC_OFFSET(11980, glVertexAttribs1fvNV, glVertexAttribs1fvNV, NULL, _gloffset_VertexAttribs1fvNV), +    NAME_FUNC_OFFSET(12001, glVertexAttribs1svNV, glVertexAttribs1svNV, NULL, _gloffset_VertexAttribs1svNV), +    NAME_FUNC_OFFSET(12022, glVertexAttribs2dvNV, glVertexAttribs2dvNV, NULL, _gloffset_VertexAttribs2dvNV), +    NAME_FUNC_OFFSET(12043, glVertexAttribs2fvNV, glVertexAttribs2fvNV, NULL, _gloffset_VertexAttribs2fvNV), +    NAME_FUNC_OFFSET(12064, glVertexAttribs2svNV, glVertexAttribs2svNV, NULL, _gloffset_VertexAttribs2svNV), +    NAME_FUNC_OFFSET(12085, glVertexAttribs3dvNV, glVertexAttribs3dvNV, NULL, _gloffset_VertexAttribs3dvNV), +    NAME_FUNC_OFFSET(12106, glVertexAttribs3fvNV, glVertexAttribs3fvNV, NULL, _gloffset_VertexAttribs3fvNV), +    NAME_FUNC_OFFSET(12127, glVertexAttribs3svNV, glVertexAttribs3svNV, NULL, _gloffset_VertexAttribs3svNV), +    NAME_FUNC_OFFSET(12148, glVertexAttribs4dvNV, glVertexAttribs4dvNV, NULL, _gloffset_VertexAttribs4dvNV), +    NAME_FUNC_OFFSET(12169, glVertexAttribs4fvNV, glVertexAttribs4fvNV, NULL, _gloffset_VertexAttribs4fvNV), +    NAME_FUNC_OFFSET(12190, glVertexAttribs4svNV, glVertexAttribs4svNV, NULL, _gloffset_VertexAttribs4svNV), +    NAME_FUNC_OFFSET(12211, glVertexAttribs4ubvNV, glVertexAttribs4ubvNV, NULL, _gloffset_VertexAttribs4ubvNV), +    NAME_FUNC_OFFSET(12233, glAlphaFragmentOp1ATI, glAlphaFragmentOp1ATI, NULL, _gloffset_AlphaFragmentOp1ATI), +    NAME_FUNC_OFFSET(12255, glAlphaFragmentOp2ATI, glAlphaFragmentOp2ATI, NULL, _gloffset_AlphaFragmentOp2ATI), +    NAME_FUNC_OFFSET(12277, glAlphaFragmentOp3ATI, glAlphaFragmentOp3ATI, NULL, _gloffset_AlphaFragmentOp3ATI), +    NAME_FUNC_OFFSET(12299, glBeginFragmentShaderATI, glBeginFragmentShaderATI, NULL, _gloffset_BeginFragmentShaderATI), +    NAME_FUNC_OFFSET(12324, glBindFragmentShaderATI, glBindFragmentShaderATI, NULL, _gloffset_BindFragmentShaderATI), +    NAME_FUNC_OFFSET(12348, glColorFragmentOp1ATI, glColorFragmentOp1ATI, NULL, _gloffset_ColorFragmentOp1ATI), +    NAME_FUNC_OFFSET(12370, glColorFragmentOp2ATI, glColorFragmentOp2ATI, NULL, _gloffset_ColorFragmentOp2ATI), +    NAME_FUNC_OFFSET(12392, glColorFragmentOp3ATI, glColorFragmentOp3ATI, NULL, _gloffset_ColorFragmentOp3ATI), +    NAME_FUNC_OFFSET(12414, glDeleteFragmentShaderATI, glDeleteFragmentShaderATI, NULL, _gloffset_DeleteFragmentShaderATI), +    NAME_FUNC_OFFSET(12440, glEndFragmentShaderATI, glEndFragmentShaderATI, NULL, _gloffset_EndFragmentShaderATI), +    NAME_FUNC_OFFSET(12463, glGenFragmentShadersATI, glGenFragmentShadersATI, NULL, _gloffset_GenFragmentShadersATI), +    NAME_FUNC_OFFSET(12487, glPassTexCoordATI, glPassTexCoordATI, NULL, _gloffset_PassTexCoordATI), +    NAME_FUNC_OFFSET(12505, glSampleMapATI, glSampleMapATI, NULL, _gloffset_SampleMapATI), +    NAME_FUNC_OFFSET(12520, glSetFragmentShaderConstantATI, glSetFragmentShaderConstantATI, NULL, _gloffset_SetFragmentShaderConstantATI), +    NAME_FUNC_OFFSET(12551, glPointParameteriNV, glPointParameteriNV, NULL, _gloffset_PointParameteriNV), +    NAME_FUNC_OFFSET(12571, glPointParameterivNV, glPointParameterivNV, NULL, _gloffset_PointParameterivNV), +    NAME_FUNC_OFFSET(12592, gl_dispatch_stub_733, gl_dispatch_stub_733, NULL, _gloffset_ActiveStencilFaceEXT), +    NAME_FUNC_OFFSET(12615, gl_dispatch_stub_734, gl_dispatch_stub_734, NULL, _gloffset_BindVertexArrayAPPLE), +    NAME_FUNC_OFFSET(12638, gl_dispatch_stub_735, gl_dispatch_stub_735, NULL, _gloffset_DeleteVertexArraysAPPLE), +    NAME_FUNC_OFFSET(12664, gl_dispatch_stub_736, gl_dispatch_stub_736, NULL, _gloffset_GenVertexArraysAPPLE), +    NAME_FUNC_OFFSET(12687, gl_dispatch_stub_737, gl_dispatch_stub_737, NULL, _gloffset_IsVertexArrayAPPLE), +    NAME_FUNC_OFFSET(12708, glGetProgramNamedParameterdvNV, glGetProgramNamedParameterdvNV, NULL, _gloffset_GetProgramNamedParameterdvNV), +    NAME_FUNC_OFFSET(12739, glGetProgramNamedParameterfvNV, glGetProgramNamedParameterfvNV, NULL, _gloffset_GetProgramNamedParameterfvNV), +    NAME_FUNC_OFFSET(12770, glProgramNamedParameter4dNV, glProgramNamedParameter4dNV, NULL, _gloffset_ProgramNamedParameter4dNV), +    NAME_FUNC_OFFSET(12798, glProgramNamedParameter4dvNV, glProgramNamedParameter4dvNV, NULL, _gloffset_ProgramNamedParameter4dvNV), +    NAME_FUNC_OFFSET(12827, glProgramNamedParameter4fNV, glProgramNamedParameter4fNV, NULL, _gloffset_ProgramNamedParameter4fNV), +    NAME_FUNC_OFFSET(12855, glProgramNamedParameter4fvNV, glProgramNamedParameter4fvNV, NULL, _gloffset_ProgramNamedParameter4fvNV), +    NAME_FUNC_OFFSET(12884, gl_dispatch_stub_744, gl_dispatch_stub_744, NULL, _gloffset_DepthBoundsEXT), +    NAME_FUNC_OFFSET(12901, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_BlendEquationSeparateEXT), +    NAME_FUNC_OFFSET(12928, glBindFramebufferEXT, glBindFramebufferEXT, NULL, _gloffset_BindFramebufferEXT), +    NAME_FUNC_OFFSET(12949, glBindRenderbufferEXT, glBindRenderbufferEXT, NULL, _gloffset_BindRenderbufferEXT), +    NAME_FUNC_OFFSET(12971, glCheckFramebufferStatusEXT, glCheckFramebufferStatusEXT, NULL, _gloffset_CheckFramebufferStatusEXT), +    NAME_FUNC_OFFSET(12999, glDeleteFramebuffersEXT, glDeleteFramebuffersEXT, NULL, _gloffset_DeleteFramebuffersEXT), +    NAME_FUNC_OFFSET(13023, glDeleteRenderbuffersEXT, glDeleteRenderbuffersEXT, NULL, _gloffset_DeleteRenderbuffersEXT), +    NAME_FUNC_OFFSET(13048, glFramebufferRenderbufferEXT, glFramebufferRenderbufferEXT, NULL, _gloffset_FramebufferRenderbufferEXT), +    NAME_FUNC_OFFSET(13077, glFramebufferTexture1DEXT, glFramebufferTexture1DEXT, NULL, _gloffset_FramebufferTexture1DEXT), +    NAME_FUNC_OFFSET(13103, glFramebufferTexture2DEXT, glFramebufferTexture2DEXT, NULL, _gloffset_FramebufferTexture2DEXT), +    NAME_FUNC_OFFSET(13129, glFramebufferTexture3DEXT, glFramebufferTexture3DEXT, NULL, _gloffset_FramebufferTexture3DEXT), +    NAME_FUNC_OFFSET(13155, glGenFramebuffersEXT, glGenFramebuffersEXT, NULL, _gloffset_GenFramebuffersEXT), +    NAME_FUNC_OFFSET(13176, glGenRenderbuffersEXT, glGenRenderbuffersEXT, NULL, _gloffset_GenRenderbuffersEXT), +    NAME_FUNC_OFFSET(13198, glGenerateMipmapEXT, glGenerateMipmapEXT, NULL, _gloffset_GenerateMipmapEXT), +    NAME_FUNC_OFFSET(13218, glGetFramebufferAttachmentParameterivEXT, glGetFramebufferAttachmentParameterivEXT, NULL, _gloffset_GetFramebufferAttachmentParameterivEXT), +    NAME_FUNC_OFFSET(13259, glGetRenderbufferParameterivEXT, glGetRenderbufferParameterivEXT, NULL, _gloffset_GetRenderbufferParameterivEXT), +    NAME_FUNC_OFFSET(13291, glIsFramebufferEXT, glIsFramebufferEXT, NULL, _gloffset_IsFramebufferEXT), +    NAME_FUNC_OFFSET(13310, glIsRenderbufferEXT, glIsRenderbufferEXT, NULL, _gloffset_IsRenderbufferEXT), +    NAME_FUNC_OFFSET(13330, glRenderbufferStorageEXT, glRenderbufferStorageEXT, NULL, _gloffset_RenderbufferStorageEXT), +    NAME_FUNC_OFFSET(13355, gl_dispatch_stub_763, gl_dispatch_stub_763, NULL, _gloffset_BlitFramebufferEXT), +    NAME_FUNC_OFFSET(13376, glFramebufferTextureLayerEXT, glFramebufferTextureLayerEXT, NULL, _gloffset_FramebufferTextureLayerEXT), +    NAME_FUNC_OFFSET(13405, gl_dispatch_stub_765, gl_dispatch_stub_765, NULL, _gloffset_StencilFuncSeparateATI), +    NAME_FUNC_OFFSET(13430, gl_dispatch_stub_766, gl_dispatch_stub_766, NULL, _gloffset_ProgramEnvParameters4fvEXT), +    NAME_FUNC_OFFSET(13459, gl_dispatch_stub_767, gl_dispatch_stub_767, NULL, _gloffset_ProgramLocalParameters4fvEXT), +    NAME_FUNC_OFFSET(13490, gl_dispatch_stub_768, gl_dispatch_stub_768, NULL, _gloffset_GetQueryObjecti64vEXT), +    NAME_FUNC_OFFSET(13514, gl_dispatch_stub_769, gl_dispatch_stub_769, NULL, _gloffset_GetQueryObjectui64vEXT), +    NAME_FUNC_OFFSET(13539, glArrayElement, glArrayElement, NULL, _gloffset_ArrayElement), +    NAME_FUNC_OFFSET(13557, glBindTexture, glBindTexture, NULL, _gloffset_BindTexture), +    NAME_FUNC_OFFSET(13574, glDrawArrays, glDrawArrays, NULL, _gloffset_DrawArrays), +    NAME_FUNC_OFFSET(13590, glAreTexturesResident, glAreTexturesResidentEXT, glAreTexturesResidentEXT, _gloffset_AreTexturesResident), +    NAME_FUNC_OFFSET(13615, glCopyTexImage1D, glCopyTexImage1D, NULL, _gloffset_CopyTexImage1D), +    NAME_FUNC_OFFSET(13635, glCopyTexImage2D, glCopyTexImage2D, NULL, _gloffset_CopyTexImage2D), +    NAME_FUNC_OFFSET(13655, glCopyTexSubImage1D, glCopyTexSubImage1D, NULL, _gloffset_CopyTexSubImage1D), +    NAME_FUNC_OFFSET(13678, glCopyTexSubImage2D, glCopyTexSubImage2D, NULL, _gloffset_CopyTexSubImage2D), +    NAME_FUNC_OFFSET(13701, glDeleteTextures, glDeleteTexturesEXT, glDeleteTexturesEXT, _gloffset_DeleteTextures), +    NAME_FUNC_OFFSET(13721, glGenTextures, glGenTexturesEXT, glGenTexturesEXT, _gloffset_GenTextures), +    NAME_FUNC_OFFSET(13738, glGetPointerv, glGetPointerv, NULL, _gloffset_GetPointerv), +    NAME_FUNC_OFFSET(13755, glIsTexture, glIsTextureEXT, glIsTextureEXT, _gloffset_IsTexture), +    NAME_FUNC_OFFSET(13770, glPrioritizeTextures, glPrioritizeTextures, NULL, _gloffset_PrioritizeTextures), +    NAME_FUNC_OFFSET(13794, glTexSubImage1D, glTexSubImage1D, NULL, _gloffset_TexSubImage1D), +    NAME_FUNC_OFFSET(13813, glTexSubImage2D, glTexSubImage2D, NULL, _gloffset_TexSubImage2D), +    NAME_FUNC_OFFSET(13832, glBlendColor, glBlendColor, NULL, _gloffset_BlendColor), +    NAME_FUNC_OFFSET(13848, glBlendEquation, glBlendEquation, NULL, _gloffset_BlendEquation), +    NAME_FUNC_OFFSET(13867, glDrawRangeElements, glDrawRangeElements, NULL, _gloffset_DrawRangeElements), +    NAME_FUNC_OFFSET(13890, glColorTable, glColorTable, NULL, _gloffset_ColorTable), +    NAME_FUNC_OFFSET(13906, glColorTable, glColorTable, NULL, _gloffset_ColorTable), +    NAME_FUNC_OFFSET(13922, glColorTableParameterfv, glColorTableParameterfv, NULL, _gloffset_ColorTableParameterfv), +    NAME_FUNC_OFFSET(13949, glColorTableParameteriv, glColorTableParameteriv, NULL, _gloffset_ColorTableParameteriv), +    NAME_FUNC_OFFSET(13976, glCopyColorTable, glCopyColorTable, NULL, _gloffset_CopyColorTable), +    NAME_FUNC_OFFSET(13996, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable), +    NAME_FUNC_OFFSET(14015, glGetColorTable, glGetColorTableEXT, glGetColorTableEXT, _gloffset_GetColorTable), +    NAME_FUNC_OFFSET(14034, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv), +    NAME_FUNC_OFFSET(14064, glGetColorTableParameterfv, glGetColorTableParameterfvEXT, glGetColorTableParameterfvEXT, _gloffset_GetColorTableParameterfv), +    NAME_FUNC_OFFSET(14094, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv), +    NAME_FUNC_OFFSET(14124, glGetColorTableParameteriv, glGetColorTableParameterivEXT, glGetColorTableParameterivEXT, _gloffset_GetColorTableParameteriv), +    NAME_FUNC_OFFSET(14154, glColorSubTable, glColorSubTable, NULL, _gloffset_ColorSubTable), +    NAME_FUNC_OFFSET(14173, glCopyColorSubTable, glCopyColorSubTable, NULL, _gloffset_CopyColorSubTable), +    NAME_FUNC_OFFSET(14196, glConvolutionFilter1D, glConvolutionFilter1D, NULL, _gloffset_ConvolutionFilter1D), +    NAME_FUNC_OFFSET(14221, glConvolutionFilter2D, glConvolutionFilter2D, NULL, _gloffset_ConvolutionFilter2D), +    NAME_FUNC_OFFSET(14246, glConvolutionParameterf, glConvolutionParameterf, NULL, _gloffset_ConvolutionParameterf), +    NAME_FUNC_OFFSET(14273, glConvolutionParameterfv, glConvolutionParameterfv, NULL, _gloffset_ConvolutionParameterfv), +    NAME_FUNC_OFFSET(14301, glConvolutionParameteri, glConvolutionParameteri, NULL, _gloffset_ConvolutionParameteri), +    NAME_FUNC_OFFSET(14328, glConvolutionParameteriv, glConvolutionParameteriv, NULL, _gloffset_ConvolutionParameteriv), +    NAME_FUNC_OFFSET(14356, glCopyConvolutionFilter1D, glCopyConvolutionFilter1D, NULL, _gloffset_CopyConvolutionFilter1D), +    NAME_FUNC_OFFSET(14385, glCopyConvolutionFilter2D, glCopyConvolutionFilter2D, NULL, _gloffset_CopyConvolutionFilter2D), +    NAME_FUNC_OFFSET(14414, glGetConvolutionFilter, gl_dispatch_stub_356, gl_dispatch_stub_356, _gloffset_GetConvolutionFilter), +    NAME_FUNC_OFFSET(14440, glGetConvolutionParameterfv, gl_dispatch_stub_357, gl_dispatch_stub_357, _gloffset_GetConvolutionParameterfv), +    NAME_FUNC_OFFSET(14471, glGetConvolutionParameteriv, gl_dispatch_stub_358, gl_dispatch_stub_358, _gloffset_GetConvolutionParameteriv), +    NAME_FUNC_OFFSET(14502, glGetSeparableFilter, gl_dispatch_stub_359, gl_dispatch_stub_359, _gloffset_GetSeparableFilter), +    NAME_FUNC_OFFSET(14526, glSeparableFilter2D, glSeparableFilter2D, NULL, _gloffset_SeparableFilter2D), +    NAME_FUNC_OFFSET(14549, glGetHistogram, gl_dispatch_stub_361, gl_dispatch_stub_361, _gloffset_GetHistogram), +    NAME_FUNC_OFFSET(14567, glGetHistogramParameterfv, gl_dispatch_stub_362, gl_dispatch_stub_362, _gloffset_GetHistogramParameterfv), +    NAME_FUNC_OFFSET(14596, glGetHistogramParameteriv, gl_dispatch_stub_363, gl_dispatch_stub_363, _gloffset_GetHistogramParameteriv), +    NAME_FUNC_OFFSET(14625, glGetMinmax, gl_dispatch_stub_364, gl_dispatch_stub_364, _gloffset_GetMinmax), +    NAME_FUNC_OFFSET(14640, glGetMinmaxParameterfv, gl_dispatch_stub_365, gl_dispatch_stub_365, _gloffset_GetMinmaxParameterfv), +    NAME_FUNC_OFFSET(14666, glGetMinmaxParameteriv, gl_dispatch_stub_366, gl_dispatch_stub_366, _gloffset_GetMinmaxParameteriv), +    NAME_FUNC_OFFSET(14692, glHistogram, glHistogram, NULL, _gloffset_Histogram), +    NAME_FUNC_OFFSET(14707, glMinmax, glMinmax, NULL, _gloffset_Minmax), +    NAME_FUNC_OFFSET(14719, glResetHistogram, glResetHistogram, NULL, _gloffset_ResetHistogram), +    NAME_FUNC_OFFSET(14739, glResetMinmax, glResetMinmax, NULL, _gloffset_ResetMinmax), +    NAME_FUNC_OFFSET(14756, glTexImage3D, glTexImage3D, NULL, _gloffset_TexImage3D), +    NAME_FUNC_OFFSET(14772, glTexSubImage3D, glTexSubImage3D, NULL, _gloffset_TexSubImage3D), +    NAME_FUNC_OFFSET(14791, glCopyTexSubImage3D, glCopyTexSubImage3D, NULL, _gloffset_CopyTexSubImage3D), +    NAME_FUNC_OFFSET(14814, glActiveTextureARB, glActiveTextureARB, NULL, _gloffset_ActiveTextureARB), +    NAME_FUNC_OFFSET(14830, glClientActiveTextureARB, glClientActiveTextureARB, NULL, _gloffset_ClientActiveTextureARB), +    NAME_FUNC_OFFSET(14852, glMultiTexCoord1dARB, glMultiTexCoord1dARB, NULL, _gloffset_MultiTexCoord1dARB), +    NAME_FUNC_OFFSET(14870, glMultiTexCoord1dvARB, glMultiTexCoord1dvARB, NULL, _gloffset_MultiTexCoord1dvARB), +    NAME_FUNC_OFFSET(14889, glMultiTexCoord1fARB, glMultiTexCoord1fARB, NULL, _gloffset_MultiTexCoord1fARB), +    NAME_FUNC_OFFSET(14907, glMultiTexCoord1fvARB, glMultiTexCoord1fvARB, NULL, _gloffset_MultiTexCoord1fvARB), +    NAME_FUNC_OFFSET(14926, glMultiTexCoord1iARB, glMultiTexCoord1iARB, NULL, _gloffset_MultiTexCoord1iARB), +    NAME_FUNC_OFFSET(14944, glMultiTexCoord1ivARB, glMultiTexCoord1ivARB, NULL, _gloffset_MultiTexCoord1ivARB), +    NAME_FUNC_OFFSET(14963, glMultiTexCoord1sARB, glMultiTexCoord1sARB, NULL, _gloffset_MultiTexCoord1sARB), +    NAME_FUNC_OFFSET(14981, glMultiTexCoord1svARB, glMultiTexCoord1svARB, NULL, _gloffset_MultiTexCoord1svARB), +    NAME_FUNC_OFFSET(15000, glMultiTexCoord2dARB, glMultiTexCoord2dARB, NULL, _gloffset_MultiTexCoord2dARB), +    NAME_FUNC_OFFSET(15018, glMultiTexCoord2dvARB, glMultiTexCoord2dvARB, NULL, _gloffset_MultiTexCoord2dvARB), +    NAME_FUNC_OFFSET(15037, glMultiTexCoord2fARB, glMultiTexCoord2fARB, NULL, _gloffset_MultiTexCoord2fARB), +    NAME_FUNC_OFFSET(15055, glMultiTexCoord2fvARB, glMultiTexCoord2fvARB, NULL, _gloffset_MultiTexCoord2fvARB), +    NAME_FUNC_OFFSET(15074, glMultiTexCoord2iARB, glMultiTexCoord2iARB, NULL, _gloffset_MultiTexCoord2iARB), +    NAME_FUNC_OFFSET(15092, glMultiTexCoord2ivARB, glMultiTexCoord2ivARB, NULL, _gloffset_MultiTexCoord2ivARB), +    NAME_FUNC_OFFSET(15111, glMultiTexCoord2sARB, glMultiTexCoord2sARB, NULL, _gloffset_MultiTexCoord2sARB), +    NAME_FUNC_OFFSET(15129, glMultiTexCoord2svARB, glMultiTexCoord2svARB, NULL, _gloffset_MultiTexCoord2svARB), +    NAME_FUNC_OFFSET(15148, glMultiTexCoord3dARB, glMultiTexCoord3dARB, NULL, _gloffset_MultiTexCoord3dARB), +    NAME_FUNC_OFFSET(15166, glMultiTexCoord3dvARB, glMultiTexCoord3dvARB, NULL, _gloffset_MultiTexCoord3dvARB), +    NAME_FUNC_OFFSET(15185, glMultiTexCoord3fARB, glMultiTexCoord3fARB, NULL, _gloffset_MultiTexCoord3fARB), +    NAME_FUNC_OFFSET(15203, glMultiTexCoord3fvARB, glMultiTexCoord3fvARB, NULL, _gloffset_MultiTexCoord3fvARB), +    NAME_FUNC_OFFSET(15222, glMultiTexCoord3iARB, glMultiTexCoord3iARB, NULL, _gloffset_MultiTexCoord3iARB), +    NAME_FUNC_OFFSET(15240, glMultiTexCoord3ivARB, glMultiTexCoord3ivARB, NULL, _gloffset_MultiTexCoord3ivARB), +    NAME_FUNC_OFFSET(15259, glMultiTexCoord3sARB, glMultiTexCoord3sARB, NULL, _gloffset_MultiTexCoord3sARB), +    NAME_FUNC_OFFSET(15277, glMultiTexCoord3svARB, glMultiTexCoord3svARB, NULL, _gloffset_MultiTexCoord3svARB), +    NAME_FUNC_OFFSET(15296, glMultiTexCoord4dARB, glMultiTexCoord4dARB, NULL, _gloffset_MultiTexCoord4dARB), +    NAME_FUNC_OFFSET(15314, glMultiTexCoord4dvARB, glMultiTexCoord4dvARB, NULL, _gloffset_MultiTexCoord4dvARB), +    NAME_FUNC_OFFSET(15333, glMultiTexCoord4fARB, glMultiTexCoord4fARB, NULL, _gloffset_MultiTexCoord4fARB), +    NAME_FUNC_OFFSET(15351, glMultiTexCoord4fvARB, glMultiTexCoord4fvARB, NULL, _gloffset_MultiTexCoord4fvARB), +    NAME_FUNC_OFFSET(15370, glMultiTexCoord4iARB, glMultiTexCoord4iARB, NULL, _gloffset_MultiTexCoord4iARB), +    NAME_FUNC_OFFSET(15388, glMultiTexCoord4ivARB, glMultiTexCoord4ivARB, NULL, _gloffset_MultiTexCoord4ivARB), +    NAME_FUNC_OFFSET(15407, glMultiTexCoord4sARB, glMultiTexCoord4sARB, NULL, _gloffset_MultiTexCoord4sARB), +    NAME_FUNC_OFFSET(15425, glMultiTexCoord4svARB, glMultiTexCoord4svARB, NULL, _gloffset_MultiTexCoord4svARB), +    NAME_FUNC_OFFSET(15444, glStencilOpSeparate, glStencilOpSeparate, NULL, _gloffset_StencilOpSeparate), +    NAME_FUNC_OFFSET(15467, glLoadTransposeMatrixdARB, glLoadTransposeMatrixdARB, NULL, _gloffset_LoadTransposeMatrixdARB), +    NAME_FUNC_OFFSET(15490, glLoadTransposeMatrixfARB, glLoadTransposeMatrixfARB, NULL, _gloffset_LoadTransposeMatrixfARB), +    NAME_FUNC_OFFSET(15513, glMultTransposeMatrixdARB, glMultTransposeMatrixdARB, NULL, _gloffset_MultTransposeMatrixdARB), +    NAME_FUNC_OFFSET(15536, glMultTransposeMatrixfARB, glMultTransposeMatrixfARB, NULL, _gloffset_MultTransposeMatrixfARB), +    NAME_FUNC_OFFSET(15559, glSampleCoverageARB, glSampleCoverageARB, NULL, _gloffset_SampleCoverageARB), +    NAME_FUNC_OFFSET(15576, glCompressedTexImage1DARB, glCompressedTexImage1DARB, NULL, _gloffset_CompressedTexImage1DARB), +    NAME_FUNC_OFFSET(15599, glCompressedTexImage2DARB, glCompressedTexImage2DARB, NULL, _gloffset_CompressedTexImage2DARB), +    NAME_FUNC_OFFSET(15622, glCompressedTexImage3DARB, glCompressedTexImage3DARB, NULL, _gloffset_CompressedTexImage3DARB), +    NAME_FUNC_OFFSET(15645, glCompressedTexSubImage1DARB, glCompressedTexSubImage1DARB, NULL, _gloffset_CompressedTexSubImage1DARB), +    NAME_FUNC_OFFSET(15671, glCompressedTexSubImage2DARB, glCompressedTexSubImage2DARB, NULL, _gloffset_CompressedTexSubImage2DARB), +    NAME_FUNC_OFFSET(15697, glCompressedTexSubImage3DARB, glCompressedTexSubImage3DARB, NULL, _gloffset_CompressedTexSubImage3DARB), +    NAME_FUNC_OFFSET(15723, glGetCompressedTexImageARB, glGetCompressedTexImageARB, NULL, _gloffset_GetCompressedTexImageARB), +    NAME_FUNC_OFFSET(15747, glDisableVertexAttribArrayARB, glDisableVertexAttribArrayARB, NULL, _gloffset_DisableVertexAttribArrayARB), +    NAME_FUNC_OFFSET(15774, glEnableVertexAttribArrayARB, glEnableVertexAttribArrayARB, NULL, _gloffset_EnableVertexAttribArrayARB), +    NAME_FUNC_OFFSET(15800, glGetVertexAttribdvARB, glGetVertexAttribdvARB, NULL, _gloffset_GetVertexAttribdvARB), +    NAME_FUNC_OFFSET(15820, glGetVertexAttribfvARB, glGetVertexAttribfvARB, NULL, _gloffset_GetVertexAttribfvARB), +    NAME_FUNC_OFFSET(15840, glGetVertexAttribivARB, glGetVertexAttribivARB, NULL, _gloffset_GetVertexAttribivARB), +    NAME_FUNC_OFFSET(15860, glProgramEnvParameter4dARB, glProgramEnvParameter4dARB, NULL, _gloffset_ProgramEnvParameter4dARB), +    NAME_FUNC_OFFSET(15883, glProgramEnvParameter4dvARB, glProgramEnvParameter4dvARB, NULL, _gloffset_ProgramEnvParameter4dvARB), +    NAME_FUNC_OFFSET(15907, glProgramEnvParameter4fARB, glProgramEnvParameter4fARB, NULL, _gloffset_ProgramEnvParameter4fARB), +    NAME_FUNC_OFFSET(15930, glProgramEnvParameter4fvARB, glProgramEnvParameter4fvARB, NULL, _gloffset_ProgramEnvParameter4fvARB),      NAME_FUNC_OFFSET(15954, glVertexAttrib1dARB, glVertexAttrib1dARB, NULL, _gloffset_VertexAttrib1dARB),      NAME_FUNC_OFFSET(15971, glVertexAttrib1dvARB, glVertexAttrib1dvARB, NULL, _gloffset_VertexAttrib1dvARB),      NAME_FUNC_OFFSET(15989, glVertexAttrib1fARB, glVertexAttrib1fARB, NULL, _gloffset_VertexAttrib1fARB), @@ -2252,8 +2252,8 @@ static const glprocs_table_t static_functions[] = {      NAME_FUNC_OFFSET(18694, glIsProgramNV, glIsProgramNV, NULL, _gloffset_IsProgramNV),      NAME_FUNC_OFFSET(18709, glPointParameteriNV, glPointParameteriNV, NULL, _gloffset_PointParameteriNV),      NAME_FUNC_OFFSET(18727, glPointParameterivNV, glPointParameterivNV, NULL, _gloffset_PointParameterivNV), -    NAME_FUNC_OFFSET(18746, gl_dispatch_stub_749, gl_dispatch_stub_749, NULL, _gloffset_BlendEquationSeparateEXT), -    NAME_FUNC_OFFSET(18770, gl_dispatch_stub_749, gl_dispatch_stub_749, NULL, _gloffset_BlendEquationSeparateEXT), +    NAME_FUNC_OFFSET(18746, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_BlendEquationSeparateEXT), +    NAME_FUNC_OFFSET(18770, gl_dispatch_stub_745, gl_dispatch_stub_745, NULL, _gloffset_BlendEquationSeparateEXT),      NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)  }; diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index e762eb3b63..dc0307feb5 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -551,8 +551,8 @@ _mesa_map_drawpix_pbo(GLcontext *ctx,   * \sa _mesa_unmap_bitmap_pbo   */  void -_mesa_unmap_drapix_pbo(GLcontext *ctx, -                       const struct gl_pixelstore_attrib *unpack) +_mesa_unmap_drawpix_pbo(GLcontext *ctx, +                        const struct gl_pixelstore_attrib *unpack)  {     if (unpack->BufferObj->Name) {        ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h index 46525f08ae..024e5a8c3c 100644 --- a/src/mesa/main/bufferobj.h +++ b/src/mesa/main/bufferobj.h @@ -101,8 +101,8 @@ _mesa_map_drawpix_pbo(GLcontext *ctx,                        const GLvoid *pixels);  extern void -_mesa_unmap_drapix_pbo(GLcontext *ctx, -                       const struct gl_pixelstore_attrib *unpack); +_mesa_unmap_drawpix_pbo(GLcontext *ctx, +                        const struct gl_pixelstore_attrib *unpack);  extern void * diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h index 8c64248845..232e698f50 100644 --- a/src/mesa/main/config.h +++ b/src/mesa/main/config.h @@ -163,25 +163,6 @@  /** For GL_EXT_texture_lod_bias (typically MAX_TEXTURE_LEVELS - 1) */  #define MAX_TEXTURE_LOD_BIAS 11.0 -/** For GL_NV_vertex_program */ -/*@{*/ -#define MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS 128 -#define MAX_NV_VERTEX_PROGRAM_TEMPS         12 -#define MAX_NV_VERTEX_PROGRAM_PARAMS        128	/* KW: power of two */ -#define MAX_NV_VERTEX_PROGRAM_INPUTS        16 -#define MAX_NV_VERTEX_PROGRAM_OUTPUTS       15 -/*@}*/ - -/** For GL_NV_fragment_program */ -/*@{*/ -#define MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS 1024 /* 72 for GL_ARB_f_p */ -#define MAX_NV_FRAGMENT_PROGRAM_TEMPS         96 -#define MAX_NV_FRAGMENT_PROGRAM_PARAMS        64 -#define MAX_NV_FRAGMENT_PROGRAM_INPUTS        12 -#define MAX_NV_FRAGMENT_PROGRAM_OUTPUTS        3 -#define MAX_NV_FRAGMENT_PROGRAM_WRITE_ONLYS    2 -/*@}*/ -  /** For GL_ARB_vertex_program */  /*@{*/  #define MAX_VERTEX_PROGRAM_ADDRESS_REGS 1 @@ -210,6 +191,26 @@  #define MAX_SAMPLERS 8  /*@}*/ +/** For GL_NV_vertex_program */ +/*@{*/ +#define MAX_NV_VERTEX_PROGRAM_INSTRUCTIONS 128 +#define MAX_NV_VERTEX_PROGRAM_TEMPS         12 +#define MAX_NV_VERTEX_PROGRAM_PARAMS        MAX_PROGRAM_ENV_PARAMS +#define MAX_NV_VERTEX_PROGRAM_INPUTS        16 +#define MAX_NV_VERTEX_PROGRAM_OUTPUTS       15 +/*@}*/ + +/** For GL_NV_fragment_program */ +/*@{*/ +#define MAX_NV_FRAGMENT_PROGRAM_INSTRUCTIONS 1024 /* 72 for GL_ARB_f_p */ +#define MAX_NV_FRAGMENT_PROGRAM_TEMPS         96 +#define MAX_NV_FRAGMENT_PROGRAM_PARAMS        64 +#define MAX_NV_FRAGMENT_PROGRAM_INPUTS        12 +#define MAX_NV_FRAGMENT_PROGRAM_OUTPUTS        3 +#define MAX_NV_FRAGMENT_PROGRAM_WRITE_ONLYS    2 +/*@}*/ + +  /** For GL_ARB_vertex_shader */  /*@{*/  #define MAX_VERTEX_ATTRIBS 16 diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index d06644f65d..2158eb6873 100644..100755 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -150,8 +150,6 @@ int MESA_DEBUG_FLAGS = 0;  /* ubyte -> float conversion */  GLfloat _mesa_ubyte_to_float_color_tab[256]; -static void -free_shared_state( GLcontext *ctx, struct gl_shared_state *ss );  /** @@ -423,12 +421,14 @@ alloc_shared_state( GLcontext *ctx )  #endif  #if FEATURE_ARB_vertex_program -   ss->DefaultVertexProgram = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0); +   ss->DefaultVertexProgram = (struct gl_vertex_program *) +      ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);     if (!ss->DefaultVertexProgram)        goto cleanup;  #endif  #if FEATURE_ARB_fragment_program -   ss->DefaultFragmentProgram = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0); +   ss->DefaultFragmentProgram = (struct gl_fragment_program *) +      ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);     if (!ss->DefaultFragmentProgram)        goto cleanup;  #endif @@ -513,12 +513,10 @@ alloc_shared_state( GLcontext *ctx )        _mesa_DeleteHashTable(ss->Programs);  #endif  #if FEATURE_ARB_vertex_program -   if (ss->DefaultVertexProgram) -      ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram); +   _mesa_reference_vertprog(ctx, &ss->DefaultVertexProgram, NULL);  #endif  #if FEATURE_ARB_fragment_program -   if (ss->DefaultFragmentProgram) -      ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram); +   _mesa_reference_fragprog(ctx, &ss->DefaultFragmentProgram, NULL);  #endif  #if FEATURE_ATI_fragment_shader     if (ss->DefaultFragmentShader) @@ -595,6 +593,8 @@ delete_program_cb(GLuint id, void *data, void *userData)  {     struct gl_program *prog = (struct gl_program *) data;     GLcontext *ctx = (GLcontext *) userData; +   ASSERT(prog->RefCount == 1); /* should only be referenced by hash table */ +   prog->RefCount = 0;  /* now going away */     ctx->Driver.DeleteProgram(ctx, prog);  } @@ -633,6 +633,21 @@ delete_arrayobj_cb(GLuint id, void *data, void *userData)  }  /** + * Callback for freeing shader program data. Call it before delete_shader_cb + * to avoid memory access error. + */ +static void +free_shader_program_data_cb(GLuint id, void *data, void *userData) +{ +   GLcontext *ctx = (GLcontext *) userData; +   struct gl_shader_program *shProg = (struct gl_shader_program *) data; + +   if (shProg->Type == GL_SHADER_PROGRAM_MESA) { +       _mesa_free_shader_program_data(ctx, shProg); +   } +} + +/**   * Callback for deleting shader and shader programs objects.   * Called by _mesa_HashDeleteAll().   */ @@ -673,32 +688,21 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )     _mesa_HashDeleteAll(ss->DisplayList, delete_displaylist_cb, ctx);     _mesa_DeleteHashTable(ss->DisplayList); -   /* -    * Free texture objects -    */ -   ASSERT(ctx->Driver.DeleteTexture); -   /* the default textures */ -   ctx->Driver.DeleteTexture(ctx, ss->Default1D); -   ctx->Driver.DeleteTexture(ctx, ss->Default2D); -   ctx->Driver.DeleteTexture(ctx, ss->Default3D); -   ctx->Driver.DeleteTexture(ctx, ss->DefaultCubeMap); -   ctx->Driver.DeleteTexture(ctx, ss->DefaultRect); -   ctx->Driver.DeleteTexture(ctx, ss->Default1DArray); -   ctx->Driver.DeleteTexture(ctx, ss->Default2DArray); - -   /* all other textures */ -   _mesa_HashDeleteAll(ss->TexObjects, delete_texture_cb, ctx); -   _mesa_DeleteHashTable(ss->TexObjects); +#if FEATURE_ARB_shader_objects +   _mesa_HashWalk(ss->ShaderObjects, free_shader_program_data_cb, ctx); +   _mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx); +   _mesa_DeleteHashTable(ss->ShaderObjects); +#endif  #if defined(FEATURE_NV_vertex_program) || defined(FEATURE_NV_fragment_program)     _mesa_HashDeleteAll(ss->Programs, delete_program_cb, ctx);     _mesa_DeleteHashTable(ss->Programs);  #endif  #if FEATURE_ARB_vertex_program -   ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram); +   _mesa_reference_vertprog(ctx, &ss->DefaultVertexProgram, NULL);  #endif  #if FEATURE_ARB_fragment_program -   ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram); +   _mesa_reference_fragprog(ctx, &ss->DefaultFragmentProgram, NULL);  #endif  #if FEATURE_ATI_fragment_shader @@ -715,16 +719,28 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )     _mesa_HashDeleteAll(ss->ArrayObjects, delete_arrayobj_cb, ctx);     _mesa_DeleteHashTable(ss->ArrayObjects); -#if FEATURE_ARB_shader_objects -   _mesa_HashDeleteAll(ss->ShaderObjects, delete_shader_cb, ctx); -   _mesa_DeleteHashTable(ss->ShaderObjects); -#endif -  #if FEATURE_EXT_framebuffer_object     _mesa_DeleteHashTable(ss->FrameBuffers);     _mesa_DeleteHashTable(ss->RenderBuffers);  #endif +   /* +    * Free texture objects (after FBOs since some textures might have +    * been bound to FBOs). +    */ +   ASSERT(ctx->Driver.DeleteTexture); +   /* the default textures */ +   ctx->Driver.DeleteTexture(ctx, ss->Default1D); +   ctx->Driver.DeleteTexture(ctx, ss->Default2D); +   ctx->Driver.DeleteTexture(ctx, ss->Default3D); +   ctx->Driver.DeleteTexture(ctx, ss->DefaultCubeMap); +   ctx->Driver.DeleteTexture(ctx, ss->DefaultRect); +   ctx->Driver.DeleteTexture(ctx, ss->Default1DArray); +   ctx->Driver.DeleteTexture(ctx, ss->Default2DArray); +   /* all other textures */ +   _mesa_HashDeleteAll(ss->TexObjects, delete_texture_cb, ctx); +   _mesa_DeleteHashTable(ss->TexObjects); +     _glthread_DESTROY_MUTEX(ss->Mutex);     _mesa_free(ss); @@ -1190,6 +1206,14 @@ _mesa_free_context_data( GLcontext *ctx )        _mesa_unreference_framebuffer(&ctx->ReadBuffer);     } +   _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, NULL); +   _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL); +   _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, NULL); + +   _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL); +   _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL); +   _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL); +     _mesa_free_lighting_data( ctx );     _mesa_free_eval_data( ctx );     _mesa_free_texture_data( ctx ); @@ -1504,15 +1528,19 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,            * or not bound to a user-created FBO.            */           if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) { -            _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);           /* fix up the fb fields - these will end up wrong otherwise -            if the DRIdrawable changes, and everything relies on them. -            This is a bit messy (same as needed in _mesa_BindFramebufferEXT) */ +          * if the DRIdrawable changes, and everything relies on them. +          * This is a bit messy (same as needed in _mesa_BindFramebufferEXT) +	  */              int i;              GLenum buffers[MAX_DRAW_BUFFERS]; + +            _mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer); +              for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {                 buffers[i] = newCtx->Color.DrawBuffer[i];              } +              _mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);           }           if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) { diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 293ee5fa34..13ebd4dd0d 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -303,7 +303,6 @@ typedef enum     OPCODE_EXECUTE_PROGRAM_NV,     OPCODE_REQUEST_RESIDENT_PROGRAMS_NV,     OPCODE_LOAD_PROGRAM_NV, -   OPCODE_PROGRAM_PARAMETER4F_NV,     OPCODE_TRACK_MATRIX_NV,     /* GL_NV_fragment_program */     OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, @@ -4248,77 +4247,111 @@ save_BindProgramNV(GLenum target, GLuint id)        CALL_BindProgramNV(ctx->Exec, (target, id));     }  } -#endif /* FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program */ -#if FEATURE_NV_vertex_program  static void GLAPIENTRY -save_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) +save_ProgramEnvParameter4fARB(GLenum target, GLuint index, +                              GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {     GET_CURRENT_CONTEXT(ctx);     Node *n;     ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); -   n = ALLOC_INSTRUCTION(ctx, OPCODE_EXECUTE_PROGRAM_NV, 6); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6);     if (n) {        n[1].e = target; -      n[2].ui = id; -      n[3].f = params[0]; -      n[4].f = params[1]; -      n[5].f = params[2]; -      n[6].f = params[3]; +      n[2].ui = index; +      n[3].f = x; +      n[4].f = y; +      n[5].f = z; +      n[6].f = w;     }     if (ctx->ExecuteFlag) { -      CALL_ExecuteProgramNV(ctx->Exec, (target, id, params)); +      CALL_ProgramEnvParameter4fARB(ctx->Exec, (target, index, x, y, z, w));     }  }  static void GLAPIENTRY -save_ProgramParameter4fNV(GLenum target, GLuint index, -                          GLfloat x, GLfloat y, GLfloat z, GLfloat w) +save_ProgramEnvParameter4fvARB(GLenum target, GLuint index, +                               const GLfloat *params) +{ +   save_ProgramEnvParameter4fARB(target, index, params[0], params[1], +                                 params[2], params[3]); +} + + +static void GLAPIENTRY +save_ProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, +				const GLfloat * params)  {     GET_CURRENT_CONTEXT(ctx);     Node *n;     ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); -   n = ALLOC_INSTRUCTION(ctx, OPCODE_PROGRAM_PARAMETER4F_NV, 6); -   if (n) { -      n[1].e = target; -      n[2].ui = index; -      n[3].f = x; -      n[4].f = y; -      n[5].f = z; -      n[6].f = w; + +   if (count > 0) { +      GLint i; +      const GLfloat * p = params; + +      for (i = 0 ; i < count ; i++) { +	 n = ALLOC_INSTRUCTION(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6); +	 if (n) { +	    n[1].e = target; +	    n[2].ui = index; +	    n[3].f = p[0]; +	    n[4].f = p[1]; +	    n[5].f = p[2]; +	    n[6].f = p[3]; +	    p += 4; +	 } +      }     } +     if (ctx->ExecuteFlag) { -      CALL_ProgramParameter4fNV(ctx->Exec, (target, index, x, y, z, w)); +      CALL_ProgramEnvParameters4fvEXT(ctx->Exec, (target, index, count, params));     }  }  static void GLAPIENTRY -save_ProgramParameter4fvNV(GLenum target, GLuint index, -                           const GLfloat *params) +save_ProgramEnvParameter4dARB(GLenum target, GLuint index, +                              GLdouble x, GLdouble y, GLdouble z, GLdouble w)  { -   save_ProgramParameter4fNV(target, index, params[0], params[1], -                             params[2], params[3]); +   save_ProgramEnvParameter4fARB(target, index, +                                 (GLfloat) x, +                                 (GLfloat) y, (GLfloat) z, (GLfloat) w);  }  static void GLAPIENTRY -save_ProgramParameter4dNV(GLenum target, GLuint index, -                          GLdouble x, GLdouble y, GLdouble z, GLdouble w) +save_ProgramEnvParameter4dvARB(GLenum target, GLuint index, +                               const GLdouble *params)  { -   save_ProgramParameter4fNV(target, index, (GLfloat) x, (GLfloat) y, -                             (GLfloat) z, (GLfloat) w); +   save_ProgramEnvParameter4fARB(target, index, +                                 (GLfloat) params[0], +                                 (GLfloat) params[1], +                                 (GLfloat) params[2], (GLfloat) params[3]);  } +#endif /* FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program || FEATURE_NV_vertex_program */ +#if FEATURE_NV_vertex_program  static void GLAPIENTRY -save_ProgramParameter4dvNV(GLenum target, GLuint index, -                           const GLdouble *params) +save_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params)  { -   save_ProgramParameter4fNV(target, index, (GLfloat) params[0], -                             (GLfloat) params[1], (GLfloat) params[2], -                             (GLfloat) params[3]); +   GET_CURRENT_CONTEXT(ctx); +   Node *n; +   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); +   n = ALLOC_INSTRUCTION(ctx, OPCODE_EXECUTE_PROGRAM_NV, 6); +   if (n) { +      n[1].e = target; +      n[2].ui = id; +      n[3].f = params[0]; +      n[4].f = params[1]; +      n[5].f = params[2]; +      n[6].f = params[3]; +   } +   if (ctx->ExecuteFlag) { +      CALL_ExecuteProgramNV(ctx->Exec, (target, id, params)); +   }  } @@ -4328,7 +4361,7 @@ save_ProgramParameters4dvNV(GLenum target, GLuint index,  {     GLuint i;     for (i = 0; i < num; i++) { -      save_ProgramParameter4dvNV(target, index + i, params + 4 * i); +      save_ProgramEnvParameter4dvARB(target, index + i, params + 4 * i);     }  } @@ -4339,7 +4372,7 @@ save_ProgramParameters4fvNV(GLenum target, GLuint index,  {     GLuint i;     for (i = 0; i < num; i++) { -      save_ProgramParameter4fvNV(target, index + i, params + 4 * i); +      save_ProgramEnvParameter4fvARB(target, index + i, params + 4 * i);     }  } @@ -4667,90 +4700,6 @@ save_ProgramStringARB(GLenum target, GLenum format, GLsizei len,     }  } - -static void GLAPIENTRY -save_ProgramEnvParameter4fARB(GLenum target, GLuint index, -                              GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ -   GET_CURRENT_CONTEXT(ctx); -   Node *n; -   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); -   n = ALLOC_INSTRUCTION(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6); -   if (n) { -      n[1].e = target; -      n[2].ui = index; -      n[3].f = x; -      n[4].f = y; -      n[5].f = z; -      n[6].f = w; -   } -   if (ctx->ExecuteFlag) { -      CALL_ProgramEnvParameter4fARB(ctx->Exec, (target, index, x, y, z, w)); -   } -} - - -static void GLAPIENTRY -save_ProgramEnvParameter4fvARB(GLenum target, GLuint index, -                               const GLfloat *params) -{ -   save_ProgramEnvParameter4fARB(target, index, params[0], params[1], -                                 params[2], params[3]); -} - - -static void GLAPIENTRY -save_ProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, -				const GLfloat * params) -{ -   GET_CURRENT_CONTEXT(ctx); -   Node *n; -   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); - -   if (count > 0) { -      GLint i; -      const GLfloat * p = params; - -      for (i = 0 ; i < count ; i++) { -	 n = ALLOC_INSTRUCTION(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6); -	 if (n) { -	    n[1].e = target; -	    n[2].ui = index; -	    n[3].f = p[0]; -	    n[4].f = p[1]; -	    n[5].f = p[2]; -	    n[6].f = p[3]; -	    p += 4; -	 } -      } -   } - -   if (ctx->ExecuteFlag) { -      CALL_ProgramEnvParameters4fvEXT(ctx->Exec, (target, index, count, params)); -   } -} - - -static void GLAPIENTRY -save_ProgramEnvParameter4dARB(GLenum target, GLuint index, -                              GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ -   save_ProgramEnvParameter4fARB(target, index, -                                 (GLfloat) x, -                                 (GLfloat) y, (GLfloat) z, (GLfloat) w); -} - - -static void GLAPIENTRY -save_ProgramEnvParameter4dvARB(GLenum target, GLuint index, -                               const GLdouble *params) -{ -   save_ProgramEnvParameter4fARB(target, index, -                                 (GLfloat) params[0], -                                 (GLfloat) params[1], -                                 (GLfloat) params[2], (GLfloat) params[3]); -} -  #endif /* FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program */ @@ -6425,10 +6374,6 @@ execute_list(GLcontext *ctx, GLuint list)              CALL_LoadProgramNV(ctx->Exec, (n[1].e, n[2].ui, n[3].i,                                             (const GLubyte *) n[4].data));              break; -         case OPCODE_PROGRAM_PARAMETER4F_NV: -            CALL_ProgramParameter4fNV(ctx->Exec, (n[1].e, n[2].ui, n[3].f, -                                                  n[4].f, n[5].f, n[6].f)); -            break;           case OPCODE_TRACK_MATRIX_NV:              CALL_TrackMatrixNV(ctx->Exec, (n[1].e, n[2].ui, n[3].e, n[4].e));              break; @@ -6459,6 +6404,8 @@ execute_list(GLcontext *ctx, GLuint list)              CALL_ProgramStringARB(ctx->Exec,                                    (n[1].e, n[2].e, n[3].i, n[4].data));              break; +#endif +#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program || FEATURE_NV_vertex_program           case OPCODE_PROGRAM_ENV_PARAMETER_ARB:              CALL_ProgramEnvParameter4fARB(ctx->Exec, (n[1].e, n[2].ui, n[3].f,                                                        n[4].f, n[5].f, @@ -8014,10 +7961,10 @@ _mesa_init_dlist_table(struct _glapi_table *table)     SET_GetVertexAttribPointervNV(table, _mesa_GetVertexAttribPointervNV);     SET_IsProgramNV(table, _mesa_IsProgramARB);     SET_LoadProgramNV(table, save_LoadProgramNV); -   SET_ProgramParameter4dNV(table, save_ProgramParameter4dNV); -   SET_ProgramParameter4dvNV(table, save_ProgramParameter4dvNV); -   SET_ProgramParameter4fNV(table, save_ProgramParameter4fNV); -   SET_ProgramParameter4fvNV(table, save_ProgramParameter4fvNV); +   SET_ProgramEnvParameter4dARB(table, save_ProgramEnvParameter4dARB); +   SET_ProgramEnvParameter4dvARB(table, save_ProgramEnvParameter4dvARB); +   SET_ProgramEnvParameter4fARB(table, save_ProgramEnvParameter4fARB); +   SET_ProgramEnvParameter4fvARB(table, save_ProgramEnvParameter4fvARB);     SET_ProgramParameters4dvNV(table, save_ProgramParameters4dvNV);     SET_ProgramParameters4fvNV(table, save_ProgramParameters4fvNV);     SET_TrackMatrixNV(table, save_TrackMatrixNV); diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c index 0f64f1c1c0..fa422bb3c7 100644 --- a/src/mesa/main/drawpix.c +++ b/src/mesa/main/drawpix.c @@ -377,8 +377,9 @@ _mesa_Bitmap( GLsizei width, GLsizei height,     if (ctx->RenderMode == GL_RENDER) {        /* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */ -      GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig); -      GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig); +      const GLfloat epsilon = 0.0001; +      GLint x = IFLOOR(ctx->Current.RasterPos[0] + epsilon - xorig); +      GLint y = IFLOOR(ctx->Current.RasterPos[1] + epsilon - yorig);        if (ctx->Unpack.BufferObj->Name) {           /* unpack from PBO */ diff --git a/src/mesa/main/ffvertex_prog.c b/src/mesa/main/ffvertex_prog.c index f648d081c0..810af9e33e 100644 --- a/src/mesa/main/ffvertex_prog.c +++ b/src/mesa/main/ffvertex_prog.c @@ -946,35 +946,33 @@ static void build_lighting( struct tnl_program *p )  	 _bfc1 = _bfc0;     } -     /* If no lights, still need to emit the scenecolor.      */ -      { -	 struct ureg res0 = register_output( p, VERT_RESULT_COL0 ); -	 emit_op1(p, OPCODE_MOV, res0, 0, _col0); -      } +   { +      struct ureg res0 = register_output( p, VERT_RESULT_COL0 ); +      emit_op1(p, OPCODE_MOV, res0, 0, _col0); +   } -      if (separate) { -	 struct ureg res1 = register_output( p, VERT_RESULT_COL1 ); -	 emit_op1(p, OPCODE_MOV, res1, 0, _col1); -      } +   if (separate) { +      struct ureg res1 = register_output( p, VERT_RESULT_COL1 ); +      emit_op1(p, OPCODE_MOV, res1, 0, _col1); +   } -      if (twoside) { -	 struct ureg res0 = register_output( p, VERT_RESULT_BFC0 ); -	 emit_op1(p, OPCODE_MOV, res0, 0, _bfc0); -      } +   if (twoside) { +      struct ureg res0 = register_output( p, VERT_RESULT_BFC0 ); +      emit_op1(p, OPCODE_MOV, res0, 0, _bfc0); +   } -      if (twoside && separate) { -	 struct ureg res1 = register_output( p, VERT_RESULT_BFC1 ); -	 emit_op1(p, OPCODE_MOV, res1, 0, _bfc1); -      } +   if (twoside && separate) { +      struct ureg res1 = register_output( p, VERT_RESULT_BFC1 ); +      emit_op1(p, OPCODE_MOV, res1, 0, _bfc1); +   }     if (nr_lights == 0) {        release_temps(p);        return;     } -     for (i = 0; i < MAX_LIGHTS; i++) {        if (p->state->unit[i].light_enabled) {  	 struct ureg half = undef; @@ -1006,7 +1004,7 @@ static void build_lighting( struct tnl_program *p )  	    VPpli = get_temp(p);   	    half = get_temp(p); -	    /* Calulate VPpli vector +	    /* Calculate VPpli vector  	     */  	    emit_op2(p, OPCODE_SUB, VPpli, 0, Ppli, V);  @@ -1017,15 +1015,13 @@ static void build_lighting( struct tnl_program *p )  	    emit_op1(p, OPCODE_RSQ, dist, 0, dist);  	    emit_op2(p, OPCODE_MUL, VPpli, 0, VPpli, dist); - -	    /* Calculate  attenuation: +	    /* Calculate attenuation:  	     */   	    if (!p->state->unit[i].light_spotcutoff_is_180 ||  		p->state->unit[i].light_attenuated) {  	       att = calculate_light_attenuation(p, i, VPpli, dist);  	    } -	  -       +  	    /* Calculate viewer direction, or use infinite viewer:  	     */  	    if (p->state->light_local_viewer) { @@ -1047,7 +1043,6 @@ static void build_lighting( struct tnl_program *p )  	 emit_op2(p, OPCODE_DP3, dots, WRITEMASK_X, normal, VPpli);  	 emit_op2(p, OPCODE_DP3, dots, WRITEMASK_Y, normal, half); -	  	 /* Front face lighting:  	  */  	 { diff --git a/src/mesa/main/imports.c b/src/mesa/main/imports.c index d8d35af15e..d798f80e25 100644 --- a/src/mesa/main/imports.c +++ b/src/mesa/main/imports.c @@ -542,26 +542,24 @@ int  _mesa_ffs(int i)  {  #if (defined(_WIN32) && !defined(__MINGW32__) ) || defined(__IBMC__) || defined(__IBMCPP__) -   register int bit = 0; -   if (i != 0) { -      if ((i & 0xffff) == 0) { -         bit += 16; -         i >>= 16; -      } -      if ((i & 0xff) == 0) { -         bit += 8; -         i >>= 8; -      } -      if ((i & 0xf) == 0) { -         bit += 4; -         i >>= 4; -      } -      while ((i & 1) == 0) { -         bit++; -         i >>= 1; -      } +   register int bit = 1; +   if ((i & 0xffff) == 0) { +      bit += 16; +      i >>= 16; +   } +   if ((i & 0xff) == 0) { +      bit += 8; +      i >>= 8; +   } +   if ((i & 0xf) == 0) { +      bit += 4; +      i >>= 4; +   } +   if ((i & 0x3) == 0) { +      bit += 2; +      i >>= 2;     } -   return bit; +   return (i) ? (bit + ((i + 1) & 0x01)) : 0;  #else     return ffs(i);  #endif diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 50b22d25bf..463142fe39 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2203,10 +2203,10 @@ struct gl_shared_state     /*@{*/     struct _mesa_HashTable *Programs; /**< All vertex/fragment programs */  #if FEATURE_ARB_vertex_program -   struct gl_program *DefaultVertexProgram; +   struct gl_vertex_program *DefaultVertexProgram;  #endif  #if FEATURE_ARB_fragment_program -   struct gl_program *DefaultFragmentProgram; +   struct gl_fragment_program *DefaultFragmentProgram;  #endif     /*@}*/ diff --git a/src/mesa/main/pixel.c b/src/mesa/main/pixel.c index eb4fd6e7c9..0e9915dd38 100644 --- a/src/mesa/main/pixel.c +++ b/src/mesa/main/pixel.c @@ -1341,6 +1341,21 @@ _mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n,  } +void +_mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n, +                                GLuint depthValues[]) +{ +   const GLdouble max = (double) 0xffffffff; +   const GLdouble scale = ctx->Pixel.DepthScale; +   const GLdouble bias = ctx->Pixel.DepthBias * max; +   GLuint i; +   for (i = 0; i < n; i++) { +      GLdouble d = (GLdouble) depthValues[i] * scale + bias; +      d = CLAMP(d, 0.0, max); +      depthValues[i] = (GLuint) d; +   } +} +  /**********************************************************************/  /*****                    State Management                        *****/ diff --git a/src/mesa/main/pixel.h b/src/mesa/main/pixel.h index 09155cfd70..3ba5b6689a 100644 --- a/src/mesa/main/pixel.h +++ b/src/mesa/main/pixel.h @@ -116,6 +116,9 @@ extern void  _mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n,                             GLfloat depthValues[]); +extern void +_mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n, +                                GLuint depthValues[]);  extern void   _mesa_update_pixel( GLcontext *ctx, GLuint newstate ); diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 0b1c56fdd5..f8cb943e64 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -536,10 +536,10 @@ _mesa_init_exec_table(struct _glapi_table *exec)     SET_GetVertexAttribPointervNV(exec, _mesa_GetVertexAttribPointervNV);     SET_IsProgramNV(exec, _mesa_IsProgramARB);     SET_LoadProgramNV(exec, _mesa_LoadProgramNV); -   SET_ProgramParameter4dNV(exec, _mesa_ProgramParameter4dNV); -   SET_ProgramParameter4dvNV(exec, _mesa_ProgramParameter4dvNV); -   SET_ProgramParameter4fNV(exec, _mesa_ProgramParameter4fNV); -   SET_ProgramParameter4fvNV(exec, _mesa_ProgramParameter4fvNV); +   SET_ProgramEnvParameter4dARB(exec, _mesa_ProgramEnvParameter4dARB); /* alias to ProgramParameter4dNV */ +   SET_ProgramEnvParameter4dvARB(exec, _mesa_ProgramEnvParameter4dvARB);  /* alias to ProgramParameter4dvNV */ +   SET_ProgramEnvParameter4fARB(exec, _mesa_ProgramEnvParameter4fARB);  /* alias to ProgramParameter4fNV */ +   SET_ProgramEnvParameter4fvARB(exec, _mesa_ProgramEnvParameter4fvARB);  /* alias to ProgramParameter4fvNV */     SET_ProgramParameters4dvNV(exec, _mesa_ProgramParameters4dvNV);     SET_ProgramParameters4fvNV(exec, _mesa_ProgramParameters4fvNV);     SET_TrackMatrixNV(exec, _mesa_TrackMatrixNV); @@ -982,16 +982,20 @@ update_program(GLcontext *ctx)  #endif     if (shProg && shProg->LinkStatus && shProg->FragmentProgram) {        /* user-defined fragment shader */ -      ctx->FragmentProgram._Current = shProg->FragmentProgram; +      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, +                               shProg->FragmentProgram);     }     else if (ctx->FragmentProgram._Enabled) {        /* use user-defined fragment program */ -      ctx->FragmentProgram._Current = ctx->FragmentProgram.Current; +      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, +                               ctx->FragmentProgram.Current);     }     else if (ctx->FragmentProgram._MaintainTexEnvProgram) {        /* fragment program generated from fixed-function state */ -      ctx->FragmentProgram._Current = _mesa_get_fixed_func_fragment_program(ctx); -      ctx->FragmentProgram._TexEnvProgram = ctx->FragmentProgram._Current; +      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, +                               _mesa_get_fixed_func_fragment_program(ctx)); +      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, +                               ctx->FragmentProgram._Current);        /* XXX get rid of this confusing stuff someday? */        ctx->FragmentProgram._Active = ctx->FragmentProgram._Enabled; @@ -1000,7 +1004,7 @@ update_program(GLcontext *ctx)     }     else {        /* no fragment program */ -      ctx->FragmentProgram._Current = NULL; +      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);     }     if (ctx->FragmentProgram._Current != prevFP && ctx->Driver.BindProgram) { @@ -1013,29 +1017,33 @@ update_program(GLcontext *ctx)      **/  #if 1     /* XXX get rid of this someday? */ -   ctx->VertexProgram._TnlProgram = NULL; +   _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, NULL);  #endif     if (shProg && shProg->LinkStatus && shProg->VertexProgram) {        /* user-defined vertex shader */ -      ctx->VertexProgram._Current = shProg->VertexProgram; +      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, +                               shProg->VertexProgram);     }     else if (ctx->VertexProgram._Enabled) {        /* use user-defined vertex program */ -      ctx->VertexProgram._Current = ctx->VertexProgram.Current; +      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, +                               ctx->VertexProgram.Current);     }     else if (ctx->VertexProgram._MaintainTnlProgram) {        /* vertex program generated from fixed-function state */ -      ctx->VertexProgram._Current = _mesa_get_fixed_func_vertex_program(ctx); -      ctx->VertexProgram._TnlProgram = ctx->VertexProgram._Current; +      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, +                               _mesa_get_fixed_func_vertex_program(ctx)); +      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram, +                               ctx->VertexProgram._Current);     }     else {        /* no vertex program / used fixed-function code */ -      ctx->VertexProgram._Current = NULL; +      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL);     }     if (ctx->VertexProgram._Current != prevVP && ctx->Driver.BindProgram) {        ctx->Driver.BindProgram(ctx, GL_VERTEX_PROGRAM_ARB, -                              (struct gl_program *) ctx->VertexProgram._Current); +                           (struct gl_program *) ctx->VertexProgram._Current);     }  } diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index cb7da39b51..84acfbd92c 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -238,6 +238,9 @@ calculate_derived_texenv( struct gl_tex_env_combine_state *state,        return;     } +   if (mode == GL_REPLACE_EXT) +      mode = GL_REPLACE; +     switch (mode) {     case GL_REPLACE:     case GL_MODULATE: @@ -340,7 +343,9 @@ _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )        switch (pname) {        case GL_TEXTURE_ENV_MODE:           { -            const GLenum mode = (GLenum) (GLint) *param; +            GLenum mode = (GLenum) (GLint) *param; +            if (mode == GL_REPLACE_EXT) +               mode = GL_REPLACE;  	    if (texUnit->EnvMode == mode)  	       return;              if (mode == GL_MODULATE || diff --git a/src/mesa/shader/arbprogram.c b/src/mesa/shader/arbprogram.c index 4b5f63ef92..1656dc9450 100644 --- a/src/mesa/shader/arbprogram.c +++ b/src/mesa/shader/arbprogram.c @@ -229,7 +229,7 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,        struct gl_vertex_program *prog = ctx->VertexProgram.Current;        _mesa_parse_arb_vertex_program(ctx, target, string, len, prog); -      if (ctx->Driver.ProgramStringNotify) +      if (ctx->Program.ErrorPos == -1 && ctx->Driver.ProgramStringNotify)  	 ctx->Driver.ProgramStringNotify( ctx, target, &prog->Base );     }     else if (target == GL_FRAGMENT_PROGRAM_ARB @@ -237,7 +237,7 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,        struct gl_fragment_program *prog = ctx->FragmentProgram.Current;        _mesa_parse_arb_fragment_program(ctx, target, string, len, prog); -      if (ctx->Driver.ProgramStringNotify) +      if (ctx->Program.ErrorPos == -1 && ctx->Driver.ProgramStringNotify)  	 ctx->Driver.ProgramStringNotify( ctx, target, &prog->Base );     }     else { @@ -247,6 +247,12 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,  } +/** + * Set a program env parameter register. + * \note Called from the GL API dispatcher. + * Note, this function is also used by the GL_NV_vertex_program extension + * (alias to ProgramParameterdNV) + */  void GLAPIENTRY  _mesa_ProgramEnvParameter4dARB(GLenum target, GLuint index,                                 GLdouble x, GLdouble y, GLdouble z, GLdouble w) @@ -256,6 +262,12 @@ _mesa_ProgramEnvParameter4dARB(GLenum target, GLuint index,  } +/** + * Set a program env parameter register. + * \note Called from the GL API dispatcher. + * Note, this function is also used by the GL_NV_vertex_program extension + * (alias to ProgramParameterdvNV) + */  void GLAPIENTRY  _mesa_ProgramEnvParameter4dvARB(GLenum target, GLuint index,                                  const GLdouble *params) @@ -266,6 +278,12 @@ _mesa_ProgramEnvParameter4dvARB(GLenum target, GLuint index,  } +/** + * Set a program env parameter register. + * \note Called from the GL API dispatcher. + * Note, this function is also used by the GL_NV_vertex_program extension + * (alias to ProgramParameterfNV) + */  void GLAPIENTRY  _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,                                 GLfloat x, GLfloat y, GLfloat z, GLfloat w) @@ -283,8 +301,8 @@ _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,        }        ASSIGN_4V(ctx->FragmentProgram.Parameters[index], x, y, z, w);     } -   else if (target == GL_VERTEX_PROGRAM_ARB -       && ctx->Extensions.ARB_vertex_program) { +   else if (target == GL_VERTEX_PROGRAM_ARB /* == GL_VERTEX_PROGRAM_NV */ +       && (ctx->Extensions.ARB_vertex_program || ctx->Extensions.NV_vertex_program)) {        if (index >= ctx->Const.VertexProgram.MaxEnvParams) {           _mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter(index)");           return; @@ -297,7 +315,12 @@ _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,     }  } - +/** + * Set a program env parameter register. + * \note Called from the GL API dispatcher. + * Note, this function is also used by the GL_NV_vertex_program extension + * (alias to ProgramParameterfvNV) + */  void GLAPIENTRY  _mesa_ProgramEnvParameter4fvARB(GLenum target, GLuint index,                                     const GLfloat *params) diff --git a/src/mesa/shader/arbprogram.syn b/src/mesa/shader/arbprogram.syn index ba17d638a3..b12c6a0eda 100644 --- a/src/mesa/shader/arbprogram.syn +++ b/src/mesa/shader/arbprogram.syn @@ -1942,10 +1942,10 @@ stateTexEnvProperty  fragment program      <optLegacyTexUnitNum>  ::= ""                               | "[" <legacyTexUnitNum> "]" - -NOTE: <optLegaceTexUnitNum> is not optional.  */  optLegacyTexUnitNum +    optLegacyTexUnitNum_1 .or .true .emit 0x00; +optLegacyTexUnitNum_1      lbracket_ne .and legacyTexUnitNum .and rbracket;  /* diff --git a/src/mesa/shader/arbprogram_syn.h b/src/mesa/shader/arbprogram_syn.h index e0c901ea8c..d95a5dede4 100644 --- a/src/mesa/shader/arbprogram_syn.h +++ b/src/mesa/shader/arbprogram_syn.h @@ -926,6 +926,8 @@  "stateTexEnvProperty\n"  " \"color\" .emit TEX_ENV_COLOR;\n"  "optLegacyTexUnitNum\n" +" optLegacyTexUnitNum_1 .or .true .emit 0x00;\n" +"optLegacyTexUnitNum_1\n"  " lbracket_ne .and legacyTexUnitNum .and rbracket;\n"  "legacyTexUnitNum\n"  " integer;\n" diff --git a/src/mesa/shader/atifragshader.c b/src/mesa/shader/atifragshader.c index 4727c1a436..854c911874 100644 --- a/src/mesa/shader/atifragshader.c +++ b/src/mesa/shader/atifragshader.c @@ -440,7 +440,7 @@ _mesa_PassTexCoordATI(GLuint dst, GLuint coord, GLenum swizzle)        _mesa_error(ctx, GL_INVALID_OPERATION, "glPassTexCoordATI(coord)");        return;     } -   if ((swizzle < GL_SWIZZLE_STR_ATI) && (swizzle > GL_SWIZZLE_STQ_DQ_ATI)) { +   if (!(swizzle >= GL_SWIZZLE_STR_ATI) && (swizzle <= GL_SWIZZLE_STQ_DQ_ATI)) {        _mesa_error(ctx, GL_INVALID_ENUM, "glPassTexCoordATI(swizzle)");        return;     } @@ -513,7 +513,7 @@ _mesa_SampleMapATI(GLuint dst, GLuint interp, GLenum swizzle)        _mesa_error(ctx, GL_INVALID_OPERATION, "glSampleMapATI(interp)");        return;     } -   if ((swizzle < GL_SWIZZLE_STR_ATI) && (swizzle > GL_SWIZZLE_STQ_DQ_ATI)) { +   if (!(swizzle >= GL_SWIZZLE_STR_ATI) && (swizzle <= GL_SWIZZLE_STQ_DQ_ATI)) {        _mesa_error(ctx, GL_INVALID_ENUM, "glSampleMapATI(swizzle)");        return;     } diff --git a/src/mesa/shader/nvprogram.c b/src/mesa/shader/nvprogram.c index 337784bfe2..409c61cdc1 100644 --- a/src/mesa/shader/nvprogram.c +++ b/src/mesa/shader/nvprogram.c @@ -576,75 +576,6 @@ _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,  /** - * Set a program parameter register. - * \note Called from the GL API dispatcher. - */ -void GLAPIENTRY -_mesa_ProgramParameter4dNV(GLenum target, GLuint index, -                           GLdouble x, GLdouble y, GLdouble z, GLdouble w) -{ -   _mesa_ProgramParameter4fNV(target, index,  -		   	      (GLfloat)x, (GLfloat)y, (GLfloat)z, (GLfloat)w); -} - - -/** - * Set a program parameter register. - * \note Called from the GL API dispatcher. - */ -void GLAPIENTRY -_mesa_ProgramParameter4dvNV(GLenum target, GLuint index, -                            const GLdouble *params) -{ -   _mesa_ProgramParameter4fNV(target, index, -                              (GLfloat)params[0], (GLfloat)params[1],  -			      (GLfloat)params[2], (GLfloat)params[3]); -} - - -/** - * Set a program parameter register. - * \note Called from the GL API dispatcher. - */ -void GLAPIENTRY -_mesa_ProgramParameter4fNV(GLenum target, GLuint index, -                           GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ -   GET_CURRENT_CONTEXT(ctx); -   ASSERT_OUTSIDE_BEGIN_END(ctx); - -   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) { -      if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) { -         FLUSH_VERTICES(ctx, _NEW_PROGRAM); -         ASSIGN_4V(ctx->VertexProgram.Parameters[index], x, y, z, w); -      } -      else { -         _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameterNV(index)"); -         return; -      } -   } -   else { -      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameterNV"); -      return; -   } -} - - -/** - * Set a program parameter register. - * \note Called from the GL API dispatcher. - */ -void GLAPIENTRY -_mesa_ProgramParameter4fvNV(GLenum target, GLuint index, -                            const GLfloat *params) -{ -   _mesa_ProgramParameter4fNV(target, index, -                              params[0], params[1], params[2], params[3]); -} - - - -/**   * Set a sequence of program parameter registers.   * \note Called from the GL API dispatcher.   */ diff --git a/src/mesa/shader/nvprogram.h b/src/mesa/shader/nvprogram.h index dcea7727e0..bfac165b5e 100644 --- a/src/mesa/shader/nvprogram.h +++ b/src/mesa/shader/nvprogram.h @@ -70,18 +70,6 @@ extern void GLAPIENTRY  _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte *program);  extern void GLAPIENTRY -_mesa_ProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); - -extern void GLAPIENTRY -_mesa_ProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble *params); - -extern void GLAPIENTRY -_mesa_ProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - -extern void GLAPIENTRY -_mesa_ProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat *params); - -extern void GLAPIENTRY  _mesa_ProgramParameters4dvNV(GLenum target, GLuint index, GLuint num, const GLdouble *params);  extern void GLAPIENTRY diff --git a/src/mesa/shader/prog_cache.c b/src/mesa/shader/prog_cache.c index dd0241ef24..36a25377c5 100644 --- a/src/mesa/shader/prog_cache.c +++ b/src/mesa/shader/prog_cache.c @@ -30,6 +30,7 @@  #include "main/mtypes.h"  #include "main/imports.h"  #include "shader/prog_cache.h" +#include "shader/program.h"  struct cache_item @@ -109,7 +110,7 @@ clear_cache(GLcontext *ctx, struct gl_program_cache *cache)        for (c = cache->items[i]; c; c = next) {  	 next = c->next;  	 _mesa_free(c->key); -	 ctx->Driver.DeleteProgram(ctx, c->program); +         _mesa_reference_program(ctx, &c->program, NULL);  	 _mesa_free(c);        }        cache->items[i] = NULL; @@ -177,7 +178,7 @@ _mesa_program_cache_insert(GLcontext *ctx,     c->key = _mesa_malloc(keysize);     memcpy(c->key, key, keysize); -   c->program = program; +   c->program = program;  /* no refcount change */     if (cache->n_items > cache->size * 1.5) {        if (cache->size < 1000) diff --git a/src/mesa/shader/prog_execute.c b/src/mesa/shader/prog_execute.c index bd64b57eb9..8ce2ca3964 100644 --- a/src/mesa/shader/prog_execute.c +++ b/src/mesa/shader/prog_execute.c @@ -1,6 +1,6 @@  /*   * Mesa 3-D graphics library - * Version:  6.5.3 + * Version:  7.0.3   *   * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.   * @@ -46,9 +46,6 @@  #include "shader/slang/slang_library_noise.h" -/* See comments below for info about this */ -#define LAMBDA_ZERO 1 -  /* debug predicate */  #define DEBUG_PROG 0 @@ -92,6 +89,7 @@ get_register_pointer(const struct prog_src_register *source,        else {           const struct gl_program_parameter_list *params;           ASSERT(source->File == PROGRAM_LOCAL_PARAM || +                source->File == PROGRAM_CONSTANT ||                  source->File == PROGRAM_STATE_VAR);           params = machine->CurProgram->Parameters;           if (reg < 0 || reg >= params->NumParameters) @@ -303,6 +301,36 @@ fetch_vector1(const struct prog_src_register *source,  /** + * Fetch texel from texture.  Use partial derivatives when possible. + */ +static INLINE void +fetch_texel(GLcontext *ctx, +            const struct gl_program_machine *machine, +            const struct prog_instruction *inst, +            const GLfloat texcoord[4], GLfloat lodBias, +            GLfloat color[4]) +{ +   const GLuint unit = machine->Samplers[inst->TexSrcUnit]; + +   /* Note: we only have the right derivatives for fragment input attribs. +    */ +   if (machine->NumDeriv > 0 && +       inst->SrcReg[0].File == PROGRAM_INPUT && +       inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit) { +      /* simple texture fetch for which we should have derivatives */ +      GLuint attr = inst->SrcReg[0].Index; +      machine->FetchTexelDeriv(ctx, texcoord, +                               machine->DerivX[attr], +                               machine->DerivY[attr], +                               lodBias, unit, color); +   } +   else { +      machine->FetchTexelLod(ctx, texcoord, lodBias, unit, color); +   } +} + + +/**   * Test value against zero and return GT, LT, EQ or UN if NaN.   */  static INLINE GLuint @@ -1306,33 +1334,18 @@ _mesa_execute_program(GLcontext * ctx,           }           break;        case OPCODE_TEX:         /* Both ARB and NV frag prog */ -         /* Texel lookup */ +         /* Simple texel lookup */           { -            /* Note: only use the precomputed lambda value when we're -             * sampling texture unit [K] with texcoord[K]. -             * Otherwise, the lambda value may have no relation to the -             * instruction's texcoord or texture image.  Using the wrong -             * lambda is usually bad news. -             * The rest of the time, just use zero (until we get a more -             * sophisticated way of computing lambda). -             */ -            const GLuint unit = machine->Samplers[inst->TexSrcUnit]; -            GLfloat coord[4], color[4], lambda; -#if 0 -            if (inst->SrcReg[0].File == PROGRAM_INPUT && -                inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + unit) -               lambda = span->array->lambda[unit][column]; -            else -#endif -               lambda = 0.0; -            fetch_vector4(&inst->SrcReg[0], machine, coord); -            machine->FetchTexelLod(ctx, coord, lambda, unit, color); +            GLfloat texcoord[4], color[4]; +            fetch_vector4(&inst->SrcReg[0], machine, texcoord); + +            fetch_texel(ctx, machine, inst, texcoord, 0.0, color); +              if (DEBUG_PROG) { -               printf("TEX (%g, %g, %g, %g) = texture[%d][%g, %g, %g, %g], " -                      "lod %f\n", +               printf("TEX (%g, %g, %g, %g) = texture[%d][%g, %g, %g, %g]\n",                        color[0], color[1], color[2], color[3], -                      unit, -                      coord[0], coord[1], coord[2], coord[3], lambda); +                      inst->TexSrcUnit, +                      texcoord[0], texcoord[1], texcoord[2], texcoord[3]);              }              store_vector4(inst, machine, color);           } @@ -1342,21 +1355,18 @@ _mesa_execute_program(GLcontext * ctx,           {              const struct gl_texture_unit *texUnit                 = &ctx->Texture.Unit[inst->TexSrcUnit]; -            GLfloat coord[4], color[4], lambda, bias; -#if 0 -            if (inst->SrcReg[0].File == PROGRAM_INPUT && -                inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit) -               lambda = span->array->lambda[inst->TexSrcUnit][column]; -            else -#endif -               lambda = 0.0; -            fetch_vector4(&inst->SrcReg[0], machine, coord); -            /* coord[3] is the bias to add to lambda */ -            bias = texUnit->LodBias + coord[3]; -            if (texUnit->_Current) -               bias += texUnit->_Current->LodBias; -            machine->FetchTexelLod(ctx, coord, lambda + bias, -                                   inst->TexSrcUnit, color); +            GLfloat texcoord[4], color[4], lodBias; + +            fetch_vector4(&inst->SrcReg[0], machine, texcoord); + +            /* texcoord[3] is the bias to add to lambda */ +            lodBias = texUnit->LodBias + texcoord[3]; +            if (texUnit->_Current) { +               lodBias += texUnit->_Current->LodBias; +            } + +            fetch_texel(ctx, machine, inst, texcoord, lodBias, color); +              store_vector4(inst, machine, color);           }           break; @@ -1368,6 +1378,7 @@ _mesa_execute_program(GLcontext * ctx,              fetch_vector4(&inst->SrcReg[1], machine, dtdx);              fetch_vector4(&inst->SrcReg[2], machine, dtdy);              machine->FetchTexelDeriv(ctx, texcoord, dtdx, dtdy, +                                     0.0, /* lodBias */                                       inst->TexSrcUnit, color);              store_vector4(inst, machine, color);           } @@ -1375,15 +1386,8 @@ _mesa_execute_program(GLcontext * ctx,        case OPCODE_TXP:         /* GL_ARB_fragment_program only */           /* Texture lookup w/ projective divide */           { -            const GLuint unit = machine->Samplers[inst->TexSrcUnit]; -            GLfloat texcoord[4], color[4], lambda; -#if 0 -            if (inst->SrcReg[0].File == PROGRAM_INPUT && -                inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit) -               lambda = span->array->lambda[unit][column]; -            else -#endif -               lambda = 0.0; +            GLfloat texcoord[4], color[4]; +              fetch_vector4(&inst->SrcReg[0], machine, texcoord);              /* Not so sure about this test - if texcoord[3] is               * zero, we'd probably be fine except for an ASSERT in @@ -1394,21 +1398,19 @@ _mesa_execute_program(GLcontext * ctx,                 texcoord[1] /= texcoord[3];                 texcoord[2] /= texcoord[3];              } -            machine->FetchTexelLod(ctx, texcoord, lambda, unit, color); + +            fetch_texel(ctx, machine, inst, texcoord, 0.0, color); +              store_vector4(inst, machine, color);           }           break;        case OPCODE_TXP_NV:      /* GL_NV_fragment_program only */ -         /* Texture lookup w/ projective divide */ +         /* Texture lookup w/ projective divide, as above, but do not +          * do the divide by w if sampling from a cube map. +          */           { -            GLfloat texcoord[4], color[4], lambda; -#if 0 -            if (inst->SrcReg[0].File == PROGRAM_INPUT && -                inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit) -               lambda = span->array->lambda[inst->TexSrcUnit][column]; -            else -#endif -               lambda = 0.0; +            GLfloat texcoord[4], color[4]; +              fetch_vector4(&inst->SrcReg[0], machine, texcoord);              if (inst->TexSrcTarget != TEXTURE_CUBE_INDEX &&                  texcoord[3] != 0.0) { @@ -1416,8 +1418,9 @@ _mesa_execute_program(GLcontext * ctx,                 texcoord[1] /= texcoord[3];                 texcoord[2] /= texcoord[3];              } -            machine->FetchTexelLod(ctx, texcoord, lambda, -                                   inst->TexSrcUnit, color); + +            fetch_texel(ctx, machine, inst, texcoord, 0.0, color); +              store_vector4(inst, machine, color);           }           break; @@ -1517,10 +1520,9 @@ _mesa_execute_program(GLcontext * ctx,        case OPCODE_END:           return GL_TRUE;        default: -         _mesa_problem(ctx, "Bad opcode %d in _mesa_exec_fragment_program", +         _mesa_problem(ctx, "Bad opcode %d in _mesa_execute_program",                         inst->Opcode);           return GL_TRUE;        /* return value doesn't matter */ -        }        numExec++; diff --git a/src/mesa/shader/prog_execute.h b/src/mesa/shader/prog_execute.h index af77d4278b..18b13e11a4 100644 --- a/src/mesa/shader/prog_execute.h +++ b/src/mesa/shader/prog_execute.h @@ -1,6 +1,6 @@  /*   * Mesa 3-D graphics library - * Version:  6.5.3 + * Version:  7.0.3   *   * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.   * @@ -32,6 +32,7 @@ typedef void (*FetchTexelLodFunc)(GLcontext *ctx, const GLfloat texcoord[4],  typedef void (*FetchTexelDerivFunc)(GLcontext *ctx, const GLfloat texcoord[4],                                      const GLfloat texdx[4],                                      const GLfloat texdy[4], +                                    GLfloat lodBias,                                      GLuint unit, GLfloat color[4]); diff --git a/src/mesa/shader/prog_instruction.c b/src/mesa/shader/prog_instruction.c index 066129037a..bea5d0551e 100644 --- a/src/mesa/shader/prog_instruction.c +++ b/src/mesa/shader/prog_instruction.c @@ -119,6 +119,23 @@ _mesa_copy_instructions(struct prog_instruction *dest,  /** + * Free an array of instructions + */ +void +_mesa_free_instructions(struct prog_instruction *inst, GLuint count) +{ +   GLuint i; +   for (i = 0; i < count; i++) { +      if (inst[i].Data) +         _mesa_free(inst[i].Data); +      if (inst[i].Comment) +         _mesa_free((char *) inst[i].Comment); +   } +   _mesa_free(inst); +} + + +/**   * Basic info about each instruction   */  struct instruction_info diff --git a/src/mesa/shader/prog_instruction.h b/src/mesa/shader/prog_instruction.h index e8a2407ea8..711166f9dd 100644 --- a/src/mesa/shader/prog_instruction.h +++ b/src/mesa/shader/prog_instruction.h @@ -439,6 +439,9 @@ extern struct prog_instruction *  _mesa_copy_instructions(struct prog_instruction *dest,                          const struct prog_instruction *src, GLuint n); +extern void +_mesa_free_instructions(struct prog_instruction *inst, GLuint count); +  extern GLuint  _mesa_num_inst_src_regs(gl_inst_opcode opcode); diff --git a/src/mesa/shader/prog_parameter.c b/src/mesa/shader/prog_parameter.c index 4eb7313bec..152bd79f69 100644 --- a/src/mesa/shader/prog_parameter.c +++ b/src/mesa/shader/prog_parameter.c @@ -40,8 +40,7 @@  struct gl_program_parameter_list *  _mesa_new_parameter_list(void)  { -   return (struct gl_program_parameter_list *) -      _mesa_calloc(sizeof(struct gl_program_parameter_list)); +   return CALLOC_STRUCT(gl_program_parameter_list);  } @@ -284,25 +283,31 @@ _mesa_add_uniform(struct gl_program_parameter_list *paramList,   * \param name  uniform's name   * \param datatype  GL_SAMPLER_2D, GL_SAMPLER_2D_RECT_ARB, etc.   * \param index  the sampler number (as seen in TEX instructions) + * \return  sampler index (starting at zero) or -1 if error   */  GLint  _mesa_add_sampler(struct gl_program_parameter_list *paramList, -                  const char *name, GLenum datatype, GLuint index) +                  const char *name, GLenum datatype)  {     GLint i = _mesa_lookup_parameter_index(paramList, -1, name);     if (i >= 0 && paramList->Parameters[i].Type == PROGRAM_SAMPLER) {        ASSERT(paramList->Parameters[i].Size == 1);        ASSERT(paramList->Parameters[i].DataType == datatype); -      ASSERT(paramList->ParameterValues[i][0] == index);        /* already in list */ -      return i; +      return (GLint) paramList->ParameterValues[i][0];     }     else { -      GLfloat indexf = index;        const GLint size = 1; /* a sampler is basically a texture unit number */ -      i = _mesa_add_parameter(paramList, PROGRAM_SAMPLER, name, -                              size, datatype, &indexf, NULL); -      return i; +      GLfloat value; +      GLint numSamplers = 0; +      for (i = 0; i < paramList->NumParameters; i++) { +         if (paramList->Parameters[i].Type == PROGRAM_SAMPLER) +            numSamplers++; +      } +      value = (GLfloat) numSamplers; +      (void) _mesa_add_parameter(paramList, PROGRAM_SAMPLER, name, +                                 size, datatype, &value, NULL); +      return numSamplers;     }  } @@ -603,6 +608,8 @@ _mesa_clone_parameter_list(const struct gl_program_parameter_list *list)        }     } +   clone->StateFlags = list->StateFlags; +     return clone;  } diff --git a/src/mesa/shader/prog_parameter.h b/src/mesa/shader/prog_parameter.h index d6cc03448c..105f6f24de 100644 --- a/src/mesa/shader/prog_parameter.h +++ b/src/mesa/shader/prog_parameter.h @@ -114,7 +114,7 @@ _mesa_add_uniform(struct gl_program_parameter_list *paramList,  extern GLint  _mesa_add_sampler(struct gl_program_parameter_list *paramList, -                  const char *name, GLenum datatype, GLuint index); +                  const char *name, GLenum datatype);  extern GLint  _mesa_add_varying(struct gl_program_parameter_list *paramList, diff --git a/src/mesa/shader/prog_print.c b/src/mesa/shader/prog_print.c index 1145f0c7a4..1c35ce3fec 100644 --- a/src/mesa/shader/prog_print.c +++ b/src/mesa/shader/prog_print.c @@ -99,7 +99,23 @@ arb_input_attrib_string(GLint index, GLenum progType)        "vertex.texcoord[4]",        "vertex.texcoord[5]",        "vertex.texcoord[6]", -      "vertex.texcoord[7]" +      "vertex.texcoord[7]", +      "vertex.attrib[0]", +      "vertex.attrib[1]", +      "vertex.attrib[2]", +      "vertex.attrib[3]", +      "vertex.attrib[4]", +      "vertex.attrib[5]", +      "vertex.attrib[6]", +      "vertex.attrib[7]", +      "vertex.attrib[8]", +      "vertex.attrib[9]", +      "vertex.attrib[10]", +      "vertex.attrib[11]", +      "vertex.attrib[12]", +      "vertex.attrib[13]", +      "vertex.attrib[14]", +      "vertex.attrib[15]"     };     const char *fragAttribs[] = {        "fragment.position", @@ -751,9 +767,9 @@ _mesa_print_program_parameters(GLcontext *ctx, const struct gl_program *prog)        _mesa_printf("%d ", prog->SamplerUnits[i]);     }     _mesa_printf("]\n"); -	 +     _mesa_load_state_parameters(ctx, prog->Parameters); -			 +  #if 0     _mesa_printf("Local Params:\n");     for (i = 0; i < MAX_PROGRAM_LOCAL_PARAMS; i++){ diff --git a/src/mesa/shader/prog_statevars.c b/src/mesa/shader/prog_statevars.c index 6cc490bc77..ba3c988445 100644 --- a/src/mesa/shader/prog_statevars.c +++ b/src/mesa/shader/prog_statevars.c @@ -1,6 +1,6 @@  /*   * Mesa 3-D graphics library - * Version:  7.0 + * Version:  7.1   *   * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.   * @@ -181,7 +181,7 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],                       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i];                 }                 /* [3] = material alpha */ -               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3]; +               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][3];                 return;              case STATE_DIFFUSE:                 for (i = 0; i < 3; i++) { @@ -197,7 +197,7 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],                       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i];                 }                 /* [3] = material alpha */ -               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3]; +               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][3];                 return;              default:                 _mesa_problem(ctx, "Invalid lightprod state in fetch_state"); @@ -253,7 +253,8 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],        value[0] = ctx->Fog.Density;        value[1] = ctx->Fog.Start;        value[2] = ctx->Fog.End; -      value[3] = 1.0F / (ctx->Fog.End - ctx->Fog.Start); +      value[3] = (ctx->Fog.End == ctx->Fog.Start) +         ? 1.0 : 1.0F / (ctx->Fog.End - ctx->Fog.Start);        return;     case STATE_CLIPPLANE:        { @@ -353,7 +354,7 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],        value[0] = ctx->Viewport.Near;                     /* near       */        value[1] = ctx->Viewport.Far;                      /* far        */        value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */ -      value[3] = 0; +      value[3] = 1.0;        return;     case STATE_FRAGMENT_PROGRAM:        { @@ -424,8 +425,9 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],            * exp: 2^-(density/ln(2) * fogcoord)            * exp2: 2^-((density/(ln(2)^2) * fogcoord)^2)            */ -         value[0] = -1.0F / (ctx->Fog.End - ctx->Fog.Start); -         value[1] = ctx->Fog.End / (ctx->Fog.End - ctx->Fog.Start); +         value[0] = (ctx->Fog.End == ctx->Fog.Start) +            ? 1.0 : -1.0F / (ctx->Fog.End - ctx->Fog.Start); +         value[1] = ctx->Fog.End * -value[0];           value[2] = ctx->Fog.Density * ONE_DIV_LN2;           value[3] = ctx->Fog.Density * ONE_DIV_SQRT_LN2;           return; @@ -450,6 +452,12 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],           value[2] = ctx->Pixel.BlueBias;           value[3] = ctx->Pixel.AlphaBias;           break; +      case STATE_PCM_SCALE: +         COPY_4V(value, ctx->Pixel.PostColorMatrixScale); +         break; +      case STATE_PCM_BIAS: +         COPY_4V(value, ctx->Pixel.PostColorMatrixBias); +         break;        default:           /* unknown state indexes are silently ignored            *  should be handled by the driver. @@ -697,6 +705,12 @@ append_token(char *dst, gl_state_index k)     case STATE_PT_BIAS:        append(dst, "PTbias");        break; +   case STATE_PCM_SCALE: +      append(dst, "PCMscale"); +      break; +   case STATE_PCM_BIAS: +      append(dst, "PCMbias"); +      break;     default:        ;     } diff --git a/src/mesa/shader/prog_statevars.h b/src/mesa/shader/prog_statevars.h index 9fedcfab8a..d12142055f 100644 --- a/src/mesa/shader/prog_statevars.h +++ b/src/mesa/shader/prog_statevars.h @@ -111,6 +111,8 @@ typedef enum gl_state_index_ {     STATE_SPOT_DIR_NORMALIZED,   /* pre-normalized spot dir */     STATE_PT_SCALE,              /**< Pixel transfer RGBA scale */     STATE_PT_BIAS,               /**< Pixel transfer RGBA bias */ +   STATE_PCM_SCALE,             /**< Post color matrix RGBA scale */ +   STATE_PCM_BIAS,              /**< Post color matrix RGBA bias */     STATE_INTERNAL_DRIVER	/* first available state index for drivers (must be last) */  } gl_state_index; diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index 3069b04836..a0817a91ec 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -60,9 +60,9 @@ _mesa_init_program(GLcontext *ctx)     ctx->VertexProgram.Enabled = GL_FALSE;     ctx->VertexProgram.PointSizeEnabled = GL_FALSE;     ctx->VertexProgram.TwoSideEnabled = GL_FALSE; -   ctx->VertexProgram.Current = (struct gl_vertex_program *) ctx->Shared->DefaultVertexProgram; +   _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, +                            ctx->Shared->DefaultVertexProgram);     assert(ctx->VertexProgram.Current); -   ctx->VertexProgram.Current->Base.RefCount++;     for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {        ctx->VertexProgram.TrackMatrix[i] = GL_NONE;        ctx->VertexProgram.TrackMatrixTransform[i] = GL_IDENTITY_NV; @@ -72,9 +72,9 @@ _mesa_init_program(GLcontext *ctx)  #if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program     ctx->FragmentProgram.Enabled = GL_FALSE; -   ctx->FragmentProgram.Current = (struct gl_fragment_program *) ctx->Shared->DefaultFragmentProgram; +   _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, +                            ctx->Shared->DefaultFragmentProgram);     assert(ctx->FragmentProgram.Current); -   ctx->FragmentProgram.Current->Base.RefCount++;     ctx->FragmentProgram.Cache = _mesa_new_program_cache();  #endif @@ -96,19 +96,11 @@ void  _mesa_free_program_data(GLcontext *ctx)  {  #if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program -   if (ctx->VertexProgram.Current) { -      ctx->VertexProgram.Current->Base.RefCount--; -      if (ctx->VertexProgram.Current->Base.RefCount <= 0) -         ctx->Driver.DeleteProgram(ctx, &(ctx->VertexProgram.Current->Base)); -   } +   _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, NULL);     _mesa_delete_program_cache(ctx, ctx->VertexProgram.Cache);  #endif  #if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program -   if (ctx->FragmentProgram.Current) { -      ctx->FragmentProgram.Current->Base.RefCount--; -      if (ctx->FragmentProgram.Current->Base.RefCount <= 0) -         ctx->Driver.DeleteProgram(ctx, &(ctx->FragmentProgram.Current->Base)); -   } +   _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL);     _mesa_delete_program_cache(ctx, ctx->FragmentProgram.Cache);  #endif     /* XXX probably move this stuff */ @@ -124,8 +116,6 @@ _mesa_free_program_data(GLcontext *ctx)  } - -  /**   * Set the vertex/fragment program error state (position and error string).   * This is generally called from within the parsers. @@ -280,6 +270,7 @@ _mesa_delete_program(GLcontext *ctx, struct gl_program *prog)  {     (void) ctx;     ASSERT(prog); +   ASSERT(prog->RefCount==0);     if (prog == &_mesa_DummyProgram)        return; @@ -287,16 +278,7 @@ _mesa_delete_program(GLcontext *ctx, struct gl_program *prog)     if (prog->String)        _mesa_free(prog->String); -   if (prog->Instructions) { -      GLuint i; -      for (i = 0; i < prog->NumInstructions; i++) { -         if (prog->Instructions[i].Data) -            _mesa_free(prog->Instructions[i].Data); -         if (prog->Instructions[i].Comment) -            _mesa_free((char *) prog->Instructions[i].Comment); -      } -      _mesa_free(prog->Instructions); -   } +   _mesa_free_instructions(prog->Instructions, prog->NumInstructions);     if (prog->Parameters) {        _mesa_free_parameter_list(prog->Parameters); @@ -335,6 +317,59 @@ _mesa_lookup_program(GLcontext *ctx, GLuint id)  /** + * Reference counting for vertex/fragment programs + */ +void +_mesa_reference_program(GLcontext *ctx, +                        struct gl_program **ptr, +                        struct gl_program *prog) +{ +   assert(ptr); +   if (*ptr && prog) { +      /* sanity check */ +      ASSERT((*ptr)->Target == prog->Target); +   } +   if (*ptr == prog) { +      return;  /* no change */ +   } +   if (*ptr) { +      GLboolean deleteFlag; + +      /*_glthread_LOCK_MUTEX((*ptr)->Mutex);*/ +#if 0 +      printf("Program %p %u 0x%x  Refcount-- to %d\n", +             *ptr, (*ptr)->Id, (*ptr)->Target, (*ptr)->RefCount - 1); +#endif +      ASSERT((*ptr)->RefCount > 0); +      (*ptr)->RefCount--; + +      deleteFlag = ((*ptr)->RefCount == 0); +      /*_glthread_UNLOCK_MUTEX((*ptr)->Mutex);*/ +       +      if (deleteFlag) { +         ASSERT(ctx); +         ctx->Driver.DeleteProgram(ctx, *ptr); +      } + +      *ptr = NULL; +   } + +   assert(!*ptr); +   if (prog) { +      /*_glthread_LOCK_MUTEX(prog->Mutex);*/ +      prog->RefCount++; +#if 0 +      printf("Program %p %u 0x%x  Refcount++ to %d\n", +             prog, prog->Id, prog->Target, prog->RefCount); +#endif +      /*_glthread_UNLOCK_MUTEX(prog->Mutex);*/ +   } + +   *ptr = prog; +} + + +/**   * Return a copy of a program.   * XXX Problem here if the program object is actually OO-derivation   * made by a device driver. @@ -349,12 +384,13 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)        return NULL;     assert(clone->Target == prog->Target); +   assert(clone->RefCount == 1); +     clone->String = (GLubyte *) _mesa_strdup((char *) prog->String); -   clone->RefCount = 1;     clone->Format = prog->Format;     clone->Instructions = _mesa_alloc_instructions(prog->NumInstructions);     if (!clone->Instructions) { -      ctx->Driver.DeleteProgram(ctx, clone); +      _mesa_reference_program(ctx, &clone, NULL);        return NULL;     }     _mesa_copy_instructions(clone->Instructions, prog->Instructions, @@ -415,6 +451,55 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)  } +/** + * Insert 'count' NOP instructions at 'start' in the given program. + * Adjust branch targets accordingly. + */ +GLboolean +_mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count) +{ +   const GLuint origLen = prog->NumInstructions; +   const GLuint newLen = origLen + count; +   struct prog_instruction *newInst; +   GLuint i; + +   /* adjust branches */ +   for (i = 0; i < prog->NumInstructions; i++) { +      struct prog_instruction *inst = prog->Instructions + i; +      if (inst->BranchTarget > 0) { +         if (inst->BranchTarget >= start) { +            inst->BranchTarget += count; +         } +      } +   } + +   /* Alloc storage for new instructions */ +   newInst = _mesa_alloc_instructions(newLen); +   if (!newInst) { +      return GL_FALSE; +   } + +   /* Copy 'start' instructions into new instruction buffer */ +   _mesa_copy_instructions(newInst, prog->Instructions, start); + +   /* init the new instructions */ +   _mesa_init_instructions(newInst + start, count); + +   /* Copy the remaining/tail instructions to new inst buffer */ +   _mesa_copy_instructions(newInst + start + count, +                           prog->Instructions + start, +                           origLen - start); + +   /* free old instructions */ +   _mesa_free_instructions(prog->Instructions, origLen); + +   /* install new instructions */ +   prog->Instructions = newInst; +   prog->NumInstructions = newLen; + +   return GL_TRUE; +} +  /**   * Search instructions for registers that match (oldFile, oldIndex), @@ -517,7 +602,7 @@ _mesa_combine_programs(GLcontext *ctx,        if ((progA->OutputsWritten & (1 << FRAG_RESULT_COLR)) &&            (progB->InputsRead & (1 << FRAG_ATTRIB_COL0))) {           GLint tempReg = _mesa_find_free_register(newProg, PROGRAM_TEMPORARY); -         if (!tempReg) { +         if (tempReg < 0) {              _mesa_problem(ctx, "No free temp regs found in "                            "_mesa_combine_programs(), using 31");              tempReg = 31; @@ -664,9 +749,9 @@ _mesa_BindProgram(GLenum target, GLuint id)        /* Bind a default program */        newProg = NULL;        if (target == GL_VERTEX_PROGRAM_ARB) /* == GL_VERTEX_PROGRAM_NV */ -         newProg = ctx->Shared->DefaultVertexProgram; +         newProg = &ctx->Shared->DefaultVertexProgram->Base;        else -         newProg = ctx->Shared->DefaultFragmentProgram; +         newProg = &ctx->Shared->DefaultFragmentProgram->Base;     }     else {        /* Bind a user program */ @@ -694,26 +779,16 @@ _mesa_BindProgram(GLenum target, GLuint id)        return;     } -   /* unbind/delete oldProg */ -   if (curProg->Id != 0) { -      /* decrement refcount on previously bound fragment program */ -      curProg->RefCount--; -      /* and delete if refcount goes below one */ -      if (curProg->RefCount <= 0) { -         /* the program ID was already removed from the hash table */ -         ctx->Driver.DeleteProgram(ctx, curProg); -      } -   } -     /* bind newProg */     if (target == GL_VERTEX_PROGRAM_ARB) { /* == GL_VERTEX_PROGRAM_NV */ -      ctx->VertexProgram.Current = (struct gl_vertex_program *) newProg; +      _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current, +                               (struct gl_vertex_program *) newProg);     }     else if (target == GL_FRAGMENT_PROGRAM_NV ||              target == GL_FRAGMENT_PROGRAM_ARB) { -      ctx->FragmentProgram.Current = (struct gl_fragment_program *) newProg; +      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, +                               (struct gl_fragment_program *) newProg);     } -   newProg->RefCount++;     /* Never null pointers */     ASSERT(ctx->VertexProgram.Current); @@ -771,10 +846,7 @@ _mesa_DeletePrograms(GLsizei n, const GLuint *ids)              }              /* The ID is immediately available for re-use now */              _mesa_HashRemove(ctx->Shared->Programs, ids[i]); -            prog->RefCount--; -            if (prog->RefCount <= 0) { -               ctx->Driver.DeleteProgram(ctx, prog); -            } +            _mesa_reference_program(ctx, &prog, NULL);           }        }     } diff --git a/src/mesa/shader/program.h b/src/mesa/shader/program.h index 4b7297e4c6..08fe576afc 100644 --- a/src/mesa/shader/program.h +++ b/src/mesa/shader/program.h @@ -83,10 +83,34 @@ _mesa_delete_program(GLcontext *ctx, struct gl_program *prog);  extern struct gl_program *  _mesa_lookup_program(GLcontext *ctx, GLuint id); +extern void +_mesa_reference_program(GLcontext *ctx, +                        struct gl_program **ptr, +                        struct gl_program *prog); + +static INLINE void +_mesa_reference_vertprog(GLcontext *ctx, +                         struct gl_vertex_program **ptr, +                         struct gl_vertex_program *prog) +{ +   _mesa_reference_program(ctx, (struct gl_program **) ptr, +                           (struct gl_program *) prog); +} + +static INLINE void +_mesa_reference_fragprog(GLcontext *ctx, +                         struct gl_fragment_program **ptr, +                         struct gl_fragment_program *prog) +{ +   _mesa_reference_program(ctx, (struct gl_program **) ptr, +                           (struct gl_program *) prog); +}  extern struct gl_program *  _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog); +extern  GLboolean +_mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count);  extern struct gl_program *  _mesa_combine_programs(GLcontext *ctx, diff --git a/src/mesa/shader/programopt.c b/src/mesa/shader/programopt.c index 9eeb71db1b..7d560c74a5 100644 --- a/src/mesa/shader/programopt.c +++ b/src/mesa/shader/programopt.c @@ -35,6 +35,7 @@  #include "context.h"  #include "prog_parameter.h"  #include "prog_statevars.h" +#include "program.h"  #include "programopt.h"  #include "prog_instruction.h" @@ -102,7 +103,7 @@ _mesa_insert_mvp_code(GLcontext *ctx, struct gl_vertex_program *vprog)     _mesa_copy_instructions (newInst + 4, vprog->Base.Instructions, origLen);     /* free old instructions */ -   _mesa_free(vprog->Base.Instructions); +   _mesa_free_instructions(vprog->Base.Instructions, origLen);     /* install new instructions */     vprog->Base.Instructions = newInst; @@ -274,7 +275,7 @@ _mesa_append_fog_code(GLcontext *ctx, struct gl_fragment_program *fprog)     inst++;     /* free old instructions */ -   _mesa_free(fprog->Base.Instructions); +   _mesa_free_instructions(fprog->Base.Instructions, origLen);     /* install new instructions */     fprog->Base.Instructions = newInst; @@ -364,3 +365,94 @@ _mesa_count_texture_instructions(struct gl_program *prog)     }  } + +/** + * Scan/rewrite program to remove reads of varying (output) registers. + * In GLSL vertex shaders, varying vars can be read and written. + * Normally, vertex varying vars are implemented as output registers. + * On some hardware, trying to read an output register causes trouble. + * So, rewrite the program to use a temporary register in this case. + */ +void +_mesa_remove_varying_reads(struct gl_program *prog) +{ +   GLuint i; +   GLint outputMap[VERT_RESULT_MAX]; +   GLuint numVaryingReads = 0; + +   assert(prog->Target == GL_VERTEX_PROGRAM_ARB); + +   for (i = 0; i < VERT_RESULT_MAX; i++) +      outputMap[i] = -1; + +   /* look for instructions which read from varying vars */ +   for (i = 0; i < prog->NumInstructions; i++) { +      struct prog_instruction *inst = prog->Instructions + i; +      const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode); +      GLuint j; +      for (j = 0; j < numSrc; j++) { +         if (inst->SrcReg[j].File == PROGRAM_VARYING) { +            /* replace the read with a temp reg */ +            const GLuint var = inst->SrcReg[j].Index; +            if (outputMap[var] == -1) { +               numVaryingReads++; +               outputMap[var] = _mesa_find_free_register(prog, +                                                         PROGRAM_TEMPORARY); +            } +            inst->SrcReg[j].File = PROGRAM_TEMPORARY; +            inst->SrcReg[j].Index = outputMap[var]; +         } +      } +   } + +   if (numVaryingReads == 0) +      return; /* nothing to be done */ + +   /* look for instructions which write to the varying vars identified above */ +   for (i = 0; i < prog->NumInstructions; i++) { +      struct prog_instruction *inst = prog->Instructions + i; +      const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode); +      GLuint j; +      for (j = 0; j < numSrc; j++) { +         if (inst->DstReg.File == PROGRAM_VARYING && +             outputMap[inst->DstReg.Index] >= 0) { +            /* change inst to write to the temp reg, instead of the varying */ +            inst->DstReg.File = PROGRAM_TEMPORARY; +            inst->DstReg.Index = outputMap[inst->DstReg.Index]; +         } +      } +   } + +   /* insert new instructions to copy the temp vars to the varying vars */ +   { +      struct prog_instruction *inst; +      GLint endPos, var; + +      /* Look for END instruction and insert the new varying writes */ +      endPos = -1; +      for (i = 0; i < prog->NumInstructions; i++) { +         struct prog_instruction *inst = prog->Instructions + i; +         if (inst->Opcode == OPCODE_END) { +            endPos = i; +            _mesa_insert_instructions(prog, i, numVaryingReads); +            break; +         } +      } + +      assert(endPos >= 0); + +      /* insert new MOV instructions here */ +      inst = prog->Instructions + endPos; +      for (var = 0; var < VERT_RESULT_MAX; var++) { +         if (outputMap[var] >= 0) { +            /* MOV VAR[var], TEMP[tmp]; */ +            inst->Opcode = OPCODE_MOV; +            inst->DstReg.File = PROGRAM_VARYING; +            inst->DstReg.Index = var; +            inst->SrcReg[0].File = PROGRAM_TEMPORARY; +            inst->SrcReg[0].Index = outputMap[var]; +            inst++; +         } +      } +   } +} diff --git a/src/mesa/shader/programopt.h b/src/mesa/shader/programopt.h index ce63644bbf..47ff2f0c7b 100644 --- a/src/mesa/shader/programopt.h +++ b/src/mesa/shader/programopt.h @@ -39,5 +39,7 @@ _mesa_count_texture_indirections(struct gl_program *prog);  extern void  _mesa_count_texture_instructions(struct gl_program *prog); +extern void +_mesa_remove_varying_reads(struct gl_program *prog);  #endif /* PROGRAMOPT_H */ diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 9c419c9903..24ab7568d6 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -75,23 +75,8 @@ void  _mesa_clear_shader_program_data(GLcontext *ctx,                                  struct gl_shader_program *shProg)  { -   if (shProg->VertexProgram) { -      /* Set ptr to NULL since the param list is shared with the -       * original/unlinked program. -       */ -      shProg->VertexProgram->Base.Parameters = NULL; -      ctx->Driver.DeleteProgram(ctx, &shProg->VertexProgram->Base); -      shProg->VertexProgram = NULL; -   } - -   if (shProg->FragmentProgram) { -      /* Set ptr to NULL since the param list is shared with the -       * original/unlinked program. -       */ -      shProg->FragmentProgram->Base.Parameters = NULL; -      ctx->Driver.DeleteProgram(ctx, &shProg->FragmentProgram->Base); -      shProg->FragmentProgram = NULL; -   } +   _mesa_reference_vertprog(ctx, &shProg->VertexProgram, NULL); +   _mesa_reference_fragprog(ctx, &shProg->FragmentProgram, NULL);     if (shProg->Uniforms) {        _mesa_free_uniform_list(shProg->Uniforms); @@ -128,10 +113,17 @@ _mesa_free_shader_program_data(GLcontext *ctx,     for (i = 0; i < shProg->NumShaders; i++) {        _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL);     } +   shProg->NumShaders = 0; +     if (shProg->Shaders) {        _mesa_free(shProg->Shaders);        shProg->Shaders = NULL;     } + +   if (shProg->InfoLog) { +      _mesa_free(shProg->InfoLog); +      shProg->InfoLog = NULL; +   }  } @@ -142,10 +134,7 @@ void  _mesa_free_shader_program(GLcontext *ctx, struct gl_shader_program *shProg)  {     _mesa_free_shader_program_data(ctx, shProg); -   if (shProg->Shaders) { -      _mesa_free(shProg->Shaders); -      shProg->Shaders = NULL; -   } +     _mesa_free(shProg);  } @@ -174,8 +163,10 @@ _mesa_reference_shader_program(GLcontext *ctx,        ASSERT(old->RefCount > 0);        old->RefCount--; -      /*printf("SHPROG DECR %p (%d) to %d\n", -        (void*) old, old->Name, old->RefCount);*/ +#if 0 +      printf("ShaderProgram %p ID=%u  RefCount-- to %d\n", +             (void *) old, old->Name, old->RefCount); +#endif        deleteFlag = (old->RefCount == 0);        if (deleteFlag) { @@ -189,8 +180,10 @@ _mesa_reference_shader_program(GLcontext *ctx,     if (shProg) {        shProg->RefCount++; -      /*printf("SHPROG INCR %p (%d) to %d\n", -        (void*) shProg, shProg->Name, shProg->RefCount);*/ +#if 0 +      printf("ShaderProgram %p ID=%u  RefCount++ to %d\n", +             (void *) shProg, shProg->Name, shProg->RefCount); +#endif        *ptr = shProg;     }  } @@ -245,10 +238,8 @@ _mesa_free_shader(GLcontext *ctx, struct gl_shader *sh)        _mesa_free((void *) sh->Source);     if (sh->InfoLog)        _mesa_free(sh->InfoLog); -   for (i = 0; i < sh->NumPrograms; i++) { -      assert(sh->Programs[i]); -      ctx->Driver.DeleteProgram(ctx, sh->Programs[i]); -   } +   for (i = 0; i < sh->NumPrograms; i++) +      _mesa_reference_program(ctx, &sh->Programs[i], NULL);     if (sh->Programs)        _mesa_free(sh->Programs);     _mesa_free(sh); @@ -378,7 +369,7 @@ _mesa_attach_shader(GLcontext *ctx, GLuint program, GLuint shader)     struct gl_shader_program *shProg        = _mesa_lookup_shader_program(ctx, program);     struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); -   const GLuint n = shProg->NumShaders; +   GLuint n;     GLuint i;     if (!shProg || !sh) { @@ -387,6 +378,8 @@ _mesa_attach_shader(GLcontext *ctx, GLuint program, GLuint shader)        return;     } +   n = shProg->NumShaders; +     for (i = 0; i < n; i++) {        if (shProg->Shaders[i] == sh) {           /* already attached */ @@ -579,7 +572,7 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader)  {     struct gl_shader_program *shProg        = _mesa_lookup_shader_program(ctx, program); -   const GLuint n = shProg->NumShaders; +   GLuint n;     GLuint i, j;     if (!shProg) { @@ -588,6 +581,8 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader)        return;     } +   n = shProg->NumShaders; +     for (i = 0; i < n; i++) {        if (shProg->Shaders[i]->Name == shader) {           /* found it */ @@ -899,7 +894,7 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location,     if (shProg) {        if (location < shProg->Uniforms->NumUniforms) {           GLint progPos, i; -         const struct gl_program *prog; +         const struct gl_program *prog = NULL;           progPos = shProg->Uniforms->Uniforms[location].VertPos;           if (progPos >= 0) { @@ -912,8 +907,11 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location,              }           } -         for (i = 0; i < prog->Parameters->Parameters[progPos].Size; i++) { -            params[i] = prog->Parameters->ParameterValues[progPos][i]; +         ASSERT(prog); +         if (prog) { +            for (i = 0; i < prog->Parameters->Parameters[progPos].Size; i++) { +               params[i] = prog->Parameters->ParameterValues[progPos][i]; +            }           }        }        else { @@ -1010,6 +1008,8 @@ _mesa_link_program(GLcontext *ctx, GLuint program)        return;     } +   FLUSH_VERTICES(ctx, _NEW_PROGRAM); +     _slang_link(ctx, program, shProg);  } @@ -1155,6 +1155,10 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,        return;     } +   if (location == -1) +      return;   /* The standard specifies this as a no-op */ + +     if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {        _mesa_error(ctx, GL_INVALID_VALUE, "glUniform(location)");        return; @@ -1250,11 +1254,16 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,                       GLboolean transpose, const GLfloat *values)  {     struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; +     if (!shProg || !shProg->LinkStatus) {        _mesa_error(ctx, GL_INVALID_OPERATION,           "glUniformMatrix(program not linked)");        return;     } + +   if (location == -1) +      return;   /* The standard specifies this as a no-op */ +     if (location < 0 || location >= shProg->Uniforms->NumUniforms) {        _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(location)");        return; diff --git a/src/mesa/shader/slang/library/Makefile b/src/mesa/shader/slang/library/Makefile index dc67b59088..0e03fac2ee 100644 --- a/src/mesa/shader/slang/library/Makefile +++ b/src/mesa/shader/slang/library/Makefile @@ -17,7 +17,7 @@ LIB_DEP = $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)  default: syntax builtin  clean: -	rm -f syn_to_c gc_to_bin *_syn.h *_gc.h +	-rm -f syn_to_c gc_to_bin *_syn.h *_gc.h  syntax: slang_pp_directives_syn.h slang_pp_expression_syn.h slang_shader_syn.h slang_pp_version_syn.h diff --git a/src/mesa/shader/slang/library/slang_common_builtin.gc b/src/mesa/shader/slang/library/slang_common_builtin.gc index 45cf1c6fd0..26080cf26c 100644 --- a/src/mesa/shader/slang/library/slang_common_builtin.gc +++ b/src/mesa/shader/slang/library/slang_common_builtin.gc @@ -343,6 +343,7 @@ vec4 asin(const vec4 v)     __retVal.x = asin(v.x);     __retVal.y = asin(v.y);     __retVal.z = asin(v.z); +   __retVal.w = asin(v.w);  }  float acos(const float x) diff --git a/src/mesa/shader/slang/library/slang_common_builtin_gc.h b/src/mesa/shader/slang/library/slang_common_builtin_gc.h index a896c5a287..c8d1ffc174 100644 --- a/src/mesa/shader/slang/library/slang_common_builtin_gc.h +++ b/src/mesa/shader/slang/library/slang_common_builtin_gc.h @@ -181,47 +181,48 @@  0,1,0,12,0,97,115,105,110,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,  115,105,110,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,115,105,  110,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,115,105,110,0, -18,118,0,59,122,0,0,0,20,0,0,1,0,9,0,97,99,111,115,0,1,1,0,9,120,0,0,0,1,3,2,1,9,1,104,97,108,102, -80,105,0,2,17,51,0,49,52,49,53,57,50,54,0,0,17,48,0,53,0,0,48,0,0,9,18,95,95,114,101,116,86,97,108, -0,18,104,97,108,102,80,105,0,58,97,115,105,110,0,18,120,0,0,0,47,20,0,0,1,0,10,0,97,99,111,115,0,1, -1,0,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120, -0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20, -0,0,1,0,11,0,97,99,111,115,0,1,1,0,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58, -97,99,111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99, -111,115,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,99,111,115, -0,18,118,0,59,122,0,0,0,20,0,0,1,0,12,0,97,99,111,115,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86, -97,108,0,59,121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0, -59,122,0,58,97,99,111,115,0,18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0, -58,97,99,111,115,0,18,118,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,120,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,58,97,115,105,110,0,18,120,0,58,105,110,118,101,114,115,101,115,113, -114,116,0,18,120,0,18,120,0,48,17,49,0,48,0,0,46,0,0,48,0,0,20,0,0,1,0,10,0,97,116,97,110,0,1,1,0, -10,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97, -110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59, -121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97, -110,0,1,1,0,11,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0, -58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86, -97,108,0,59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,9,18,95, -95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,122,0, -0,0,20,0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20, -0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120, -0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111, -118,101,114,95,120,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,116,97, -110,0,18,121,95,111,118,101,114,95,120,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,121,0, -0,1,1,0,9,120,0,0,0,1,10,18,120,0,17,48,0,48,0,0,38,0,8,17,48,0,48,0,0,0,9,14,0,3,2,0,9,1,122,0,2, -58,97,116,97,110,0,18,121,0,18,120,0,49,0,0,0,0,10,18,120,0,17,48,0,48,0,0,40,0,2,10,18,121,0,17, -48,0,48,0,0,40,0,8,18,122,0,17,51,0,49,52,49,53,57,51,0,0,47,0,9,14,0,8,18,122,0,17,51,0,49,52,49, -53,57,51,0,0,46,0,0,9,14,0,8,18,122,0,0,0,1,0,10,0,97,116,97,110,0,1,1,0,10,117,0,0,1,1,0,10,118,0, -0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0, -59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0, -0,18,118,0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97,110,0,1,1,0,11,117,0,0,1,1,0,11,118,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0, -0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0, -59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,117,0,59,122,0, -0,18,118,0,59,122,0,0,0,20,0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,117,0,0,1,1,0,12,118,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0, -0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0, +18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,115,105,110,0,18,118, +0,59,119,0,0,0,20,0,0,1,0,9,0,97,99,111,115,0,1,1,0,9,120,0,0,0,1,3,2,1,9,1,104,97,108,102,80,105, +0,2,17,51,0,49,52,49,53,57,50,54,0,0,17,48,0,53,0,0,48,0,0,9,18,95,95,114,101,116,86,97,108,0,18, +104,97,108,102,80,105,0,58,97,115,105,110,0,18,120,0,0,0,47,20,0,0,1,0,10,0,97,99,111,115,0,1,1,0, +10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120,0,0, +0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20,0,0, +1,0,11,0,97,99,111,115,0,1,1,0,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,99, +111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99,111,115, +0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,99,111,115,0,18,118, +0,59,122,0,0,0,20,0,0,1,0,12,0,97,99,111,115,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59, +121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58, +97,99,111,115,0,18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,99, +111,115,0,18,118,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,120,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,58,97,115,105,110,0,18,120,0,58,105,110,118,101,114,115,101,115,113,114,116,0, +18,120,0,18,120,0,48,17,49,0,48,0,0,46,0,0,48,0,0,20,0,0,1,0,10,0,97,116,97,110,0,1,1,0,10,121,95, +111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18, +121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58, +97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97,110,0,1, +1,0,11,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116, +97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0, +59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,9,18,95,95,114, +101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,122,0,0,0,20, +0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116, +86,97,108,0,59,120,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18, +95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59, +121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111,118, +101,114,95,120,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,116,97,110,0, +18,121,95,111,118,101,114,95,120,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,121,0,0,1,1, +0,9,120,0,0,0,1,10,18,120,0,17,48,0,48,0,0,38,0,8,17,48,0,48,0,0,0,9,14,0,3,2,0,9,1,122,0,2,58,97, +116,97,110,0,18,121,0,18,120,0,49,0,0,0,0,10,18,120,0,17,48,0,48,0,0,40,0,2,10,18,121,0,17,48,0,48, +0,0,40,0,8,18,122,0,17,51,0,49,52,49,53,57,51,0,0,47,0,9,14,0,8,18,122,0,17,51,0,49,52,49,53,57,51, +0,0,46,0,0,9,14,0,8,18,122,0,0,0,1,0,10,0,97,116,97,110,0,1,1,0,10,117,0,0,1,1,0,10,118,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0, +0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118, +0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97,110,0,1,1,0,11,117,0,0,1,1,0,11,118,0,0,0,1,9,18,95,95, +114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0,0,20,0, +9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0,59,121, +0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,117,0,59,122,0,0,18, +118,0,59,122,0,0,0,20,0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,117,0,0,1,1,0,12,118,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0,0, +20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0,  59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,117,0,59,122,0,  0,18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,116,97,110,0,18,117,  0,59,119,0,0,18,118,0,59,119,0,0,0,20,0,0,1,0,9,0,112,111,119,0,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1, diff --git a/src/mesa/shader/slang/library/slang_core.gc b/src/mesa/shader/slang/library/slang_core.gc index 2e7ebc347a..ffa57f74c2 100644 --- a/src/mesa/shader/slang/library/slang_core.gc +++ b/src/mesa/shader/slang/library/slang_core.gc @@ -1545,15 +1545,8 @@ mat2 __operator - (const mat2 m, const mat2 n)  mat2 __operator * (const mat2 m, const mat2 n)  { -   vec2 mRow0, mRow1; -   mRow0.x = m[0].x; -   mRow0.y = m[1].x; -   mRow1.x = m[0].y; -   mRow1.y = m[1].y; -   __retVal[0].x = dot(mRow0, n[0]); -   __retVal[1].x = dot(mRow0, n[1]); -   __retVal[0].y = dot(mRow1, n[0]); -   __retVal[1].y = dot(mRow1, n[1]); +   __retVal[0] = m[0] * n[0].xx + m[1] * n[0].yy; +   __retVal[1] = m[0] * n[1].xx + m[1] * n[1].yy;  }  mat2 __operator / (const mat2 m, const mat2 n) @@ -1581,34 +1574,9 @@ mat3 __operator - (const mat3 m, const mat3 n)  mat3 __operator * (const mat3 m, const mat3 n)  { -   // sub-blocks to reduce register usage -   { -      vec3 mRow0; -      mRow0.x = m[0].x; -      mRow0.y = m[1].x; -      mRow0.z = m[2].x; -      __retVal[0].x = dot(mRow0, n[0]); -      __retVal[1].x = dot(mRow0, n[1]); -      __retVal[2].x = dot(mRow0, n[2]); -   } -   { -      vec3 mRow1; -      mRow1.x = m[0].y; -      mRow1.y = m[1].y; -      mRow1.z = m[2].y; -      __retVal[0].y = dot(mRow1, n[0]); -      __retVal[1].y = dot(mRow1, n[1]); -      __retVal[2].y = dot(mRow1, n[2]); -   } -   { -      vec3 mRow2; -      mRow2.x = m[0].z; -      mRow2.y = m[1].z; -      mRow2.z = m[2].z; -      __retVal[0].z = dot(mRow2, n[0]); -      __retVal[1].z = dot(mRow2, n[1]); -      __retVal[2].z = dot(mRow2, n[2]); -   } +   __retVal[0] = m[0] * n[0].xxx + m[1] * n[0].yyy + m[2] * n[0].zzz; +   __retVal[1] = m[0] * n[1].xxx + m[1] * n[1].yyy + m[2] * n[1].zzz; +   __retVal[2] = m[0] * n[2].xxx + m[1] * n[2].yyy + m[2] * n[2].zzz;  }  mat3 __operator / (const mat3 m, const mat3 n) @@ -1639,51 +1607,10 @@ mat4 __operator - (const mat4 m, const mat4 n)  mat4 __operator * (const mat4 m, const mat4 n)  { -   // sub-blocks to reduce temporary usage -   { -      vec4 mRow0; -      mRow0.x = m[0].x; -      mRow0.y = m[1].x; -      mRow0.z = m[2].x; -      mRow0.w = m[3].x; -      __retVal[0].x = dot(mRow0, n[0]); -      __retVal[1].x = dot(mRow0, n[1]); -      __retVal[2].x = dot(mRow0, n[2]); -      __retVal[3].x = dot(mRow0, n[3]); -   } -   { -      vec4 mRow1; -      mRow1.x = m[0].y; -      mRow1.y = m[1].y; -      mRow1.z = m[2].y; -      mRow1.w = m[3].y; -      __retVal[0].y = dot(mRow1, n[0]); -      __retVal[1].y = dot(mRow1, n[1]); -      __retVal[2].y = dot(mRow1, n[2]); -      __retVal[3].y = dot(mRow1, n[3]); -   } -   { -      vec4 mRow2; -      mRow2.x = m[0].z; -      mRow2.y = m[1].z; -      mRow2.z = m[2].z; -      mRow2.w = m[3].z; -      __retVal[0].z = dot(mRow2, n[0]); -      __retVal[1].z = dot(mRow2, n[1]); -      __retVal[2].z = dot(mRow2, n[2]); -      __retVal[3].z = dot(mRow2, n[3]); -   } -   { -      vec4 mRow3; -      mRow3.x = m[0].w; -      mRow3.y = m[1].w; -      mRow3.z = m[2].w; -      mRow3.w = m[3].w; -      __retVal[0].w = dot(mRow3, n[0]); -      __retVal[1].w = dot(mRow3, n[1]); -      __retVal[2].w = dot(mRow3, n[2]); -      __retVal[3].w = dot(mRow3, n[3]); -   } +   __retVal[0] = m[0] * n[0].xxxx + m[1] * n[0].yyyy + m[2] * n[0].zzzz + m[3] * n[0].wwww; +   __retVal[1] = m[0] * n[1].xxxx + m[1] * n[1].yyyy + m[2] * n[1].zzzz + m[3] * n[1].wwww; +   __retVal[2] = m[0] * n[2].xxxx + m[1] * n[2].yyyy + m[2] * n[2].zzzz + m[3] * n[2].wwww; +   __retVal[3] = m[0] * n[3].xxxx + m[1] * n[3].yyyy + m[2] * n[3].zzzz + m[3] * n[3].wwww;  }  mat4 __operator / (const mat4 m, const mat4 n) @@ -1877,13 +1804,8 @@ mat4 __operator / (const mat4 m, const float b)  vec2 __operator * (const mat2 m, const vec2 v)  { -   vec2 r0, r1; -   r0.x = m[0].x; -   r0.y = m[1].x; -   r1.x = m[0].y; -   r1.y = m[1].y; -   __retVal.x = dot(r0, v); -   __retVal.y = dot(r1, v); +   __retVal = m[0] * v.xx +            + m[1] * v.yy;  }  vec2 __operator * (const vec2 v, const mat2 m) @@ -1894,27 +1816,9 @@ vec2 __operator * (const vec2 v, const mat2 m)  vec3 __operator * (const mat3 m, const vec3 v)  { -   { -      vec3 r0; -      r0.x = m[0].x; -      r0.y = m[1].x; -      r0.z = m[2].x; -      __asm vec3_dot __retVal.x, r0, v; -   } -   { -      vec3 r1; -      r1.x = m[0].y; -      r1.y = m[1].y; -      r1.z = m[2].y; -      __asm vec3_dot __retVal.y, r1, v; -   } -   { -      vec3 r2; -      r2.x = m[0].z; -      r2.y = m[1].z; -      r2.z = m[2].z; -      __asm vec3_dot __retVal.z, r2, v; -   } +   __retVal = m[0] * v.xxx +            + m[1] * v.yyy +            + m[2] * v.zzz;  }  vec3 __operator * (const vec3 v, const mat3 m) @@ -1926,44 +1830,14 @@ vec3 __operator * (const vec3 v, const mat3 m)  vec4 __operator * (const mat4 m, const vec4 v)  { -   // extract rows, then do dot product -   { -      vec4 r0; -      r0.x = m[0].x; -      r0.y = m[1].x; -      r0.z = m[2].x; -      r0.w = m[3].x; -      __asm vec4_dot __retVal.x, r0, v; -   } -   { -      vec4 r1; -      r1.x = m[0].y; -      r1.y = m[1].y; -      r1.z = m[2].y; -      r1.w = m[3].y; -      __asm vec4_dot __retVal.y, r1, v; -   } -   { -      vec4 r2; -      r2.x = m[0].z; -      r2.y = m[1].z; -      r2.z = m[2].z; -      r2.w = m[3].z; -      __asm vec4_dot __retVal.z, r2, v; -   } -   { -      vec4 r3; -      r3.x = m[0].w; -      r3.y = m[1].w; -      r3.z = m[2].w; -      r3.w = m[3].w; -      __asm vec4_dot __retVal.w, r3, v; -   } +   __retVal = m[0] * v.xxxx +            + m[1] * v.yyyy +            + m[2] * v.zzzz +            + m[3] * v.wwww;  }  vec4 __operator * (const vec4 v, const mat4 m)  { -   //mm     __retVal.x = dot(v, m[0]);     __retVal.y = dot(v, m[1]);     __retVal.z = dot(v, m[2]); diff --git a/src/mesa/shader/slang/library/slang_core_gc.h b/src/mesa/shader/slang/library/slang_core_gc.h index f2b4fd6464..1604d5a034 100644 --- a/src/mesa/shader/slang/library/slang_core_gc.h +++ b/src/mesa/shader/slang/library/slang_core_gc.h @@ -453,151 +453,113 @@  97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46,20,0,0,1,0,13,2,27,1,1,0,  13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,  57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10, -49,0,57,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13,2,21,1,1,0,13,109,0,0,1,1,0,13,110,0,0,0,1,3,2,0, -10,1,109,82,111,119,48,0,0,1,1,109,82,111,119,49,0,0,0,9,18,109,82,111,119,48,0,59,120,0,18,109,0, -16,8,48,0,57,59,120,0,20,0,9,18,109,82,111,119,48,0,59,121,0,18,109,0,16,10,49,0,57,59,120,0,20,0, -9,18,109,82,111,119,49,0,59,120,0,18,109,0,16,8,48,0,57,59,121,0,20,0,9,18,109,82,111,119,49,0,59, -121,0,18,109,0,16,10,49,0,57,59,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,120, -0,58,100,111,116,0,18,109,82,111,119,48,0,0,18,110,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,10,49,0,57,59,120,0,58,100,111,116,0,18,109,82,111,119,48,0,0,18,110,0,16,10,49,0, -57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121,0,58,100,111,116,0,18,109,82, -111,119,49,0,0,18,110,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59, -121,0,58,100,111,116,0,18,109,82,111,119,49,0,0,18,110,0,16,10,49,0,57,0,0,20,0,0,1,0,13,2,22,1,1, -0,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48, +49,0,57,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13,2,21,1,1,0,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,59,120,120,0, +48,18,109,0,16,10,49,0,57,18,110,0,16,8,48,0,57,59,121,121,0,48,46,20,0,9,18,95,95,114,101,116,86, +97,108,0,16,10,49,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,49,0,57,59,120,120,0,48,18,109,0,16,10, +49,0,57,18,110,0,16,10,49,0,57,59,121,121,0,48,46,20,0,0,1,0,13,2,22,1,1,0,13,109,0,0,1,1,0,13,110, +0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0, +57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10, +49,0,57,49,20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86, +97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101, +116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,46,20,0,0,1,0,14,2,27, +1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16, +8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0, +16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18, +109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,47,20,0,0,1,0,14,2,21,1,1,0,14,109,0,0,1,1,0,14,110,0,0, +0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,59, +120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,8,48,0,57,59,121,121,121,0,48,46,18,109,0,16, +10,50,0,57,18,110,0,16,8,48,0,57,59,122,122,122,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16, +10,49,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,49,0,57,59,120,120,120,0,48,18,109,0,16,10,49,0,57, +18,110,0,16,10,49,0,57,59,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,49,0,57,59,122, +122,122,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,8,48,0,57,18,110, +0,16,10,50,0,57,59,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,50,0,57,59,121,121,121,0, +48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,59,122,122,122,0,48,46,20,0,0,1,0,14,2,22,1,1, +0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,  0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10, -49,0,57,18,110,0,16,10,49,0,57,49,20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95, -95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,46,20,0,9,18, -95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,46, -20,0,0,1,0,14,2,27,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8, -48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108, -0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,47,20,0,0,1,0,14,2,21,1,1,0,14,109,0, -0,1,1,0,14,110,0,0,0,1,2,3,2,0,11,1,109,82,111,119,48,0,0,0,9,18,109,82,111,119,48,0,59,120,0,18, -109,0,16,8,48,0,57,59,120,0,20,0,9,18,109,82,111,119,48,0,59,121,0,18,109,0,16,10,49,0,57,59,120,0, -20,0,9,18,109,82,111,119,48,0,59,122,0,18,109,0,16,10,50,0,57,59,120,0,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,8,48,0,57,59,120,0,58,100,111,116,0,18,109,82,111,119,48,0,0,18,110,0,16,8,48,0,57, -0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,58,100,111,116,0,18,109,82,111, -119,48,0,0,18,110,0,16,10,49,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,120, -0,58,100,111,116,0,18,109,82,111,119,48,0,0,18,110,0,16,10,50,0,57,0,0,20,0,0,2,3,2,0,11,1,109,82, -111,119,49,0,0,0,9,18,109,82,111,119,49,0,59,120,0,18,109,0,16,8,48,0,57,59,121,0,20,0,9,18,109,82, -111,119,49,0,59,121,0,18,109,0,16,10,49,0,57,59,121,0,20,0,9,18,109,82,111,119,49,0,59,122,0,18, -109,0,16,10,50,0,57,59,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121,0,58,100, -111,116,0,18,109,82,111,119,49,0,0,18,110,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108, -0,16,10,49,0,57,59,121,0,58,100,111,116,0,18,109,82,111,119,49,0,0,18,110,0,16,10,49,0,57,0,0,20,0, -9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,121,0,58,100,111,116,0,18,109,82,111,119,49,0, -0,18,110,0,16,10,50,0,57,0,0,20,0,0,2,3,2,0,11,1,109,82,111,119,50,0,0,0,9,18,109,82,111,119,50,0, -59,120,0,18,109,0,16,8,48,0,57,59,122,0,20,0,9,18,109,82,111,119,50,0,59,121,0,18,109,0,16,10,49,0, -57,59,122,0,20,0,9,18,109,82,111,119,50,0,59,122,0,18,109,0,16,10,50,0,57,59,122,0,20,0,9,18,95,95, -114,101,116,86,97,108,0,16,8,48,0,57,59,122,0,58,100,111,116,0,18,109,82,111,119,50,0,0,18,110,0, -16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,122,0,58,100,111,116,0, -18,109,82,111,119,50,0,0,18,110,0,16,10,49,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, -50,0,57,59,122,0,58,100,111,116,0,18,109,82,111,119,50,0,0,18,110,0,16,10,50,0,57,0,0,20,0,0,0,1,0, -14,2,22,1,1,0,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18, -109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57, -18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50, -0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,49,20,0,0,1,0,15,2,26,1,1,0,15,109,0,0,1,1,0,15, -110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48, -0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16, -10,49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110, -0,16,10,50,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18, -110,0,16,10,51,0,57,46,20,0,0,1,0,15,2,27,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95, -114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,47,20,0,9,18, -95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,47,20,0, -0,1,0,15,2,21,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,2,3,2,0,12,1,109,82,111,119,48,0,0,0,9,18,109, -82,111,119,48,0,59,120,0,18,109,0,16,8,48,0,57,59,120,0,20,0,9,18,109,82,111,119,48,0,59,121,0,18, -109,0,16,10,49,0,57,59,120,0,20,0,9,18,109,82,111,119,48,0,59,122,0,18,109,0,16,10,50,0,57,59,120, -0,20,0,9,18,109,82,111,119,48,0,59,119,0,18,109,0,16,10,51,0,57,59,120,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,8,48,0,57,59,120,0,58,100,111,116,0,18,109,82,111,119,48,0,0,18,110,0,16,8,48,0, -57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,120,0,58,100,111,116,0,18,109,82, -111,119,48,0,0,18,110,0,16,10,49,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59, -120,0,58,100,111,116,0,18,109,82,111,119,48,0,0,18,110,0,16,10,50,0,57,0,0,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,51,0,57,59,120,0,58,100,111,116,0,18,109,82,111,119,48,0,0,18,110,0,16,10,51, -0,57,0,0,20,0,0,2,3,2,0,12,1,109,82,111,119,49,0,0,0,9,18,109,82,111,119,49,0,59,120,0,18,109,0,16, -8,48,0,57,59,121,0,20,0,9,18,109,82,111,119,49,0,59,121,0,18,109,0,16,10,49,0,57,59,121,0,20,0,9, -18,109,82,111,119,49,0,59,122,0,18,109,0,16,10,50,0,57,59,121,0,20,0,9,18,109,82,111,119,49,0,59, -119,0,18,109,0,16,10,51,0,57,59,121,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,121, -0,58,100,111,116,0,18,109,82,111,119,49,0,0,18,110,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,10,49,0,57,59,121,0,58,100,111,116,0,18,109,82,111,119,49,0,0,18,110,0,16,10,49,0, -57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,121,0,58,100,111,116,0,18,109,82, -111,119,49,0,0,18,110,0,16,10,50,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,59, -121,0,58,100,111,116,0,18,109,82,111,119,49,0,0,18,110,0,16,10,51,0,57,0,0,20,0,0,2,3,2,0,12,1,109, -82,111,119,50,0,0,0,9,18,109,82,111,119,50,0,59,120,0,18,109,0,16,8,48,0,57,59,122,0,20,0,9,18,109, -82,111,119,50,0,59,121,0,18,109,0,16,10,49,0,57,59,122,0,20,0,9,18,109,82,111,119,50,0,59,122,0,18, -109,0,16,10,50,0,57,59,122,0,20,0,9,18,109,82,111,119,50,0,59,119,0,18,109,0,16,10,51,0,57,59,122, -0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,59,122,0,58,100,111,116,0,18,109,82,111,119, -50,0,0,18,110,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,122,0,58, -100,111,116,0,18,109,82,111,119,50,0,0,18,110,0,16,10,49,0,57,0,0,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,10,50,0,57,59,122,0,58,100,111,116,0,18,109,82,111,119,50,0,0,18,110,0,16,10,50,0,57,0, -0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,59,122,0,58,100,111,116,0,18,109,82,111, -119,50,0,0,18,110,0,16,10,51,0,57,0,0,20,0,0,2,3,2,0,12,1,109,82,111,119,51,0,0,0,9,18,109,82,111, -119,51,0,59,120,0,18,109,0,16,8,48,0,57,59,119,0,20,0,9,18,109,82,111,119,51,0,59,121,0,18,109,0, -16,10,49,0,57,59,119,0,20,0,9,18,109,82,111,119,51,0,59,122,0,18,109,0,16,10,50,0,57,59,119,0,20,0, -9,18,109,82,111,119,51,0,59,119,0,18,109,0,16,10,51,0,57,59,119,0,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,8,48,0,57,59,119,0,58,100,111,116,0,18,109,82,111,119,51,0,0,18,110,0,16,8,48,0,57,0,0, -20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,59,119,0,58,100,111,116,0,18,109,82,111,119, -51,0,0,18,110,0,16,10,49,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,59,119,0, -58,100,111,116,0,18,109,82,111,119,51,0,0,18,110,0,16,10,50,0,57,0,0,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,10,51,0,57,59,119,0,58,100,111,116,0,18,109,82,111,119,51,0,0,18,110,0,16,10,51,0, -57,0,0,20,0,0,0,1,0,15,2,22,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108, -0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97, -108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,49,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,49,20,0,0,1,0,13,2,26, -1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110, -0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49, -0,57,46,20,0,0,1,0,13,2,26,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, -16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0, -57,18,109,0,16,10,49,0,57,18,98,0,46,20,0,0,1,0,13,2,27,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18, -95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13,2,27,1,1,0,13, -109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57, -18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,47, -20,0,0,1,0,13,2,21,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48, +49,0,57,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0, +16,10,50,0,57,18,110,0,16,10,50,0,57,49,20,0,0,1,0,15,2,26,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,46,20,0, +9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,46, +20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0, +57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10, +51,0,57,46,20,0,0,1,0,15,2,27,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86, +97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114,101, +116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,47,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,47,20,0,0,1,0,15,2, +21,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, +16,8,48,0,57,18,110,0,16,8,48,0,57,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,8,48, +0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,8,48,0,57,59,122,122,122,122,0, +48,46,18,109,0,16,10,51,0,57,18,110,0,16,8,48,0,57,59,119,119,119,119,0,48,46,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,49,0,57,59,120,120,120,120, +0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0, +57,18,110,0,16,10,49,0,57,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16,10,49,0,57, +59,119,119,119,119,0,48,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,8,48, +0,57,18,110,0,16,10,50,0,57,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,50,0,57, +59,121,121,121,121,0,48,46,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,59,122,122,122,122,0,48, +46,18,109,0,16,10,51,0,57,18,110,0,16,10,50,0,57,59,119,119,119,119,0,48,46,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,8,48,0,57,18,110,0,16,10,51,0,57,59,120,120,120,120, +0,48,18,109,0,16,10,49,0,57,18,110,0,16,10,51,0,57,59,121,121,121,121,0,48,46,18,109,0,16,10,50,0, +57,18,110,0,16,10,51,0,57,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57, +59,119,119,119,119,0,48,46,20,0,0,1,0,15,2,22,1,1,0,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,49,20,0,9,18, +95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,49,20,0, +9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,49, +20,0,0,1,0,13,2,26,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48, +0,57,18,97,0,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97, +0,18,110,0,16,10,49,0,57,46,20,0,0,1,0,13,2,26,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86, +97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,46,20,0,0,1,0,13,2,27,1,1,0,9,97,0,0,1,1,0, +13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,47,20, +0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,0,1,0,13, +2,27,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, +16,8,48,0,57,18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0, +57,18,98,0,47,20,0,0,1,0,13,2,21,1,1,0,9,97,0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, +49,0,57,18,97,0,18,110,0,16,10,49,0,57,48,20,0,0,1,0,13,2,21,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9, +18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114, +101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,48,20,0,0,1,0,13,2,22,1,1,0,9,97, +0,0,1,1,0,13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48, +0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,49,20, +0,0,1,0,13,2,22,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0, +57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0, +16,10,49,0,57,18,98,0,49,20,0,0,1,0,14,2,26,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16, +10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,46,20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0, +1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,46,20,0,9,18,95,95,114,101, +116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,46,20,0,0,1,0,14,2,27,1,1,0,9,97,0,0, +1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57, +47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,9, +18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,47,20,0,0,1,0,14,2, +27,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16, +8,48,0,57,18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57, +18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,47, +20,0,0,1,0,14,2,21,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,  0,57,18,97,0,18,110,0,16,8,48,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97, -0,18,110,0,16,10,49,0,57,48,20,0,0,1,0,13,2,21,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114, -101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86, -97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,48,20,0,0,1,0,13,2,22,1,1,0,9,97,0,0,1,1,0, -13,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,49,20, -0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,49,20,0,0,1,0,13, -2,22,1,1,0,13,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0, -16,8,48,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0, -57,18,98,0,49,20,0,0,1,0,14,2,26,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97, -108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10, -49,0,57,18,97,0,18,110,0,16,10,49,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18, -97,0,18,110,0,16,10,50,0,57,46,20,0,0,1,0,14,2,26,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95, -114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116, -86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108, -0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,46,20,0,0,1,0,14,2,27,1,1,0,9,97,0,0,1,1,0,14,110,0, -0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,47,20,0,9,18, -95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,47,20,0,9,18,95,95,114, -101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,47,20,0,0,1,0,14,2,27,1,1,0,14, -109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57, -18,98,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,47, -20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,47,20,0,0,1,0, -14,2,21,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97, -0,18,110,0,16,8,48,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0, -16,10,49,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0, -57,48,20,0,0,1,0,14,2,21,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16, -8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57, -18,109,0,16,10,49,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0, -16,10,50,0,57,18,98,0,48,20,0,0,1,0,14,2,22,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101,116,86,97, -108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16, -10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,49,20,0,0,1,0,14,2,22,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0, -1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9,18,95,95, -114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,49,20,0,9,18,95,95,114,101, -116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,49,20,0,0,1,0,15,2,26,1,1,0,9,97,0,0, -1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57, -46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,46,20,0,9, -18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,46,20,0,9,18,95,95, -114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57,46,20,0,0,1,0,15,2,26,1,1,0, -15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0, -57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0, -46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,46,20,0,9, -18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,46,20,0,0,1,0,15,2, +0,18,110,0,16,10,49,0,57,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0, +16,10,50,0,57,48,20,0,0,1,0,14,2,21,1,1,0,14,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86, +97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16, +10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,48,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57, +18,109,0,16,10,50,0,57,18,98,0,48,20,0,0,1,0,14,2,22,1,1,0,9,97,0,0,1,1,0,14,110,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8,48,0,57,49,20,0,9,18,95,95,114,101, +116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,49,20,0,9,18,95,95,114,101,116,86,97, +108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,49,20,0,0,1,0,14,2,22,1,1,0,14,109,0,0,1,1,0,9, +98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9, +18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,49,20,0,9,18,95,95, +114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,49,20,0,0,1,0,15,2,26,1,1,0,9, +97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,110,0,16,8, +48,0,57,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,49,0,57,46, +20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,46,20,0,9,18, +95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,97,0,18,110,0,16,10,51,0,57,46,20,0,0,1,0,15,2,26,1, +1,0,15,109,0,0,1,1,0,9,98,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,109,0,16,8,48, +0,57,18,98,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,109,0,16,10,49,0,57,18,98, +0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,109,0,16,10,50,0,57,18,98,0,46,20,0, +9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0,16,10,51,0,57,18,98,0,46,20,0,0,1,0,15,2,  27,1,1,0,9,97,0,0,1,1,0,15,110,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,16,8,48,0,57,18,97,0,18,  110,0,16,8,48,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,49,0,57,18,97,0,18,110,0,16,10,  49,0,57,47,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,18,97,0,18,110,0,16,10,50,0,57,47, @@ -622,244 +584,221 @@  97,108,0,16,8,48,0,57,18,109,0,16,8,48,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,  10,49,0,57,18,109,0,16,10,49,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,50,0,57,  18,109,0,16,10,50,0,57,18,98,0,49,20,0,9,18,95,95,114,101,116,86,97,108,0,16,10,51,0,57,18,109,0, -16,10,51,0,57,18,98,0,49,20,0,0,1,0,10,2,21,1,1,0,13,109,0,0,1,1,0,10,118,0,0,0,1,3,2,0,10,1,114, -48,0,0,1,1,114,49,0,0,0,9,18,114,48,0,59,120,0,18,109,0,16,8,48,0,57,59,120,0,20,0,9,18,114,48,0, -59,121,0,18,109,0,16,10,49,0,57,59,120,0,20,0,9,18,114,49,0,59,120,0,18,109,0,16,8,48,0,57,59,121, -0,20,0,9,18,114,49,0,59,121,0,18,109,0,16,10,49,0,57,59,121,0,20,0,9,18,95,95,114,101,116,86,97, -108,0,59,120,0,58,100,111,116,0,18,114,48,0,0,18,118,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0, -59,121,0,58,100,111,116,0,18,114,49,0,0,18,118,0,0,0,20,0,0,1,0,10,2,21,1,1,0,10,118,0,0,1,1,0,13, -109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8, -48,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0, -16,10,49,0,57,0,0,20,0,0,1,0,11,2,21,1,1,0,14,109,0,0,1,1,0,11,118,0,0,0,1,2,3,2,0,11,1,114,48,0,0, -0,9,18,114,48,0,59,120,0,18,109,0,16,8,48,0,57,59,120,0,20,0,9,18,114,48,0,59,121,0,18,109,0,16,10, -49,0,57,59,120,0,20,0,9,18,114,48,0,59,122,0,18,109,0,16,10,50,0,57,59,120,0,20,0,4,118,101,99,51, -95,100,111,116,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,114,48,0,0,18,118,0,0,0,0,2,3,2,0, -11,1,114,49,0,0,0,9,18,114,49,0,59,120,0,18,109,0,16,8,48,0,57,59,121,0,20,0,9,18,114,49,0,59,121, -0,18,109,0,16,10,49,0,57,59,121,0,20,0,9,18,114,49,0,59,122,0,18,109,0,16,10,50,0,57,59,121,0,20,0, -4,118,101,99,51,95,100,111,116,0,18,95,95,114,101,116,86,97,108,0,59,121,0,0,18,114,49,0,0,18,118, -0,0,0,0,2,3,2,0,11,1,114,50,0,0,0,9,18,114,50,0,59,120,0,18,109,0,16,8,48,0,57,59,122,0,20,0,9,18, -114,50,0,59,121,0,18,109,0,16,10,49,0,57,59,122,0,20,0,9,18,114,50,0,59,122,0,18,109,0,16,10,50,0, -57,59,122,0,20,0,4,118,101,99,51,95,100,111,116,0,18,95,95,114,101,116,86,97,108,0,59,122,0,0,18, -114,50,0,0,18,118,0,0,0,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1,0,14,109,0,0,0,1,9,18,95,95,114,101, -116,86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114, -101,116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0,20,0,9,18,95, -95,114,101,116,86,97,108,0,59,122,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,50,0,57,0,0,20,0,0, -1,0,12,2,21,1,1,0,15,109,0,0,1,1,0,12,118,0,0,0,1,2,3,2,0,12,1,114,48,0,0,0,9,18,114,48,0,59,120,0, -18,109,0,16,8,48,0,57,59,120,0,20,0,9,18,114,48,0,59,121,0,18,109,0,16,10,49,0,57,59,120,0,20,0,9, -18,114,48,0,59,122,0,18,109,0,16,10,50,0,57,59,120,0,20,0,9,18,114,48,0,59,119,0,18,109,0,16,10,51, -0,57,59,120,0,20,0,4,118,101,99,52,95,100,111,116,0,18,95,95,114,101,116,86,97,108,0,59,115,0,0,18, -114,48,0,0,18,118,0,0,0,0,2,3,2,0,12,1,114,49,0,0,0,9,18,114,49,0,59,120,0,18,109,0,16,8,48,0,57, -59,121,0,20,0,9,18,114,49,0,59,121,0,18,109,0,16,10,49,0,57,59,121,0,20,0,9,18,114,49,0,59,122,0, -18,109,0,16,10,50,0,57,59,121,0,20,0,9,18,114,49,0,59,119,0,18,109,0,16,10,51,0,57,59,121,0,20,0,4, -118,101,99,52,95,100,111,116,0,18,95,95,114,101,116,86,97,108,0,59,121,0,0,18,114,49,0,0,18,118,0, -0,0,0,2,3,2,0,12,1,114,50,0,0,0,9,18,114,50,0,59,120,0,18,109,0,16,8,48,0,57,59,122,0,20,0,9,18, -114,50,0,59,121,0,18,109,0,16,10,49,0,57,59,122,0,20,0,9,18,114,50,0,59,122,0,18,109,0,16,10,50,0, -57,59,122,0,20,0,9,18,114,50,0,59,119,0,18,109,0,16,10,51,0,57,59,122,0,20,0,4,118,101,99,52,95, -100,111,116,0,18,95,95,114,101,116,86,97,108,0,59,122,0,0,18,114,50,0,0,18,118,0,0,0,0,2,3,2,0,12, -1,114,51,0,0,0,9,18,114,51,0,59,120,0,18,109,0,16,8,48,0,57,59,119,0,20,0,9,18,114,51,0,59,121,0, -18,109,0,16,10,49,0,57,59,119,0,20,0,9,18,114,51,0,59,122,0,18,109,0,16,10,50,0,57,59,119,0,20,0,9, -18,114,51,0,59,119,0,18,109,0,16,10,51,0,57,59,119,0,20,0,4,118,101,99,52,95,100,111,116,0,18,95, -95,114,101,116,86,97,108,0,59,119,0,0,18,114,51,0,0,18,118,0,0,0,0,0,1,0,12,2,21,1,1,0,12,118,0,0, -1,1,0,15,109,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18, -109,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0, -0,18,109,0,16,10,49,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,100,111,116,0,18, -118,0,0,18,109,0,16,10,50,0,57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,100,111,116, -0,18,118,0,0,18,109,0,16,10,51,0,57,0,0,20,0,0,1,0,0,2,1,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9, -18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,21,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57, -21,0,0,1,0,0,2,2,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0, -57,22,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,13, -110,0,0,0,1,9,18,109,0,18,109,0,18,110,0,48,20,0,0,1,0,0,2,4,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1, -9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57, -24,0,0,1,0,0,2,1,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0, -57,21,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,21,0,9,18,109,0,16,10,50,0,57,18,110,0,16, -10,50,0,57,21,0,0,1,0,0,2,2,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0, -16,8,48,0,57,22,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,22,0,9,18,109,0,16,10,50,0,57,18, -110,0,16,10,50,0,57,22,0,0,1,0,0,2,3,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,18,109,0,18, -110,0,48,20,0,0,1,0,0,2,4,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0, -16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,9,18,109,0,16,10,50,0,57,18, -110,0,16,10,50,0,57,24,0,0,1,0,0,2,1,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57, -18,110,0,16,8,48,0,57,21,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,21,0,9,18,109,0,16,10, -50,0,57,18,110,0,16,10,50,0,57,21,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,21,0,0,1,0,0,2, -2,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18, +16,10,51,0,57,18,98,0,49,20,0,0,1,0,10,2,21,1,1,0,13,109,0,0,1,1,0,10,118,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,18,109,0,16,8,48,0,57,18,118,0,59,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0, +59,121,121,0,48,46,20,0,0,1,0,10,2,21,1,1,0,10,118,0,0,1,1,0,13,109,0,0,0,1,9,18,95,95,114,101,116, +86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0,9,18,95,95,114,101, +116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0,20,0,0,1,0,11,2,21, +1,1,0,14,109,0,0,1,1,0,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,16,8,48,0,57,18, +118,0,59,120,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0,59,121,121,121,0,48,46,18,109,0,16,10,50, +0,57,18,118,0,59,122,122,122,0,48,46,20,0,0,1,0,11,2,21,1,1,0,11,118,0,0,1,1,0,14,109,0,0,0,1,9,18, +95,95,114,101,116,86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0, +9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0, +20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,50,0, +57,0,0,20,0,0,1,0,12,2,21,1,1,0,15,109,0,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, +18,109,0,16,8,48,0,57,18,118,0,59,120,120,120,120,0,48,18,109,0,16,10,49,0,57,18,118,0,59,121,121, +121,121,0,48,46,18,109,0,16,10,50,0,57,18,118,0,59,122,122,122,122,0,48,46,18,109,0,16,10,51,0,57, +18,118,0,59,119,119,119,119,0,48,46,20,0,0,1,0,12,2,21,1,1,0,12,118,0,0,1,1,0,15,109,0,0,0,1,9,18, +95,95,114,101,116,86,97,108,0,59,120,0,58,100,111,116,0,18,118,0,0,18,109,0,16,8,48,0,57,0,0,20,0, +9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,49,0,57,0,0, +20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10,50,0, +57,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,100,111,116,0,18,118,0,0,18,109,0,16,10, +51,0,57,0,0,20,0,0,1,0,0,2,1,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110, +0,16,8,48,0,57,21,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,21,0,0,1,0,0,2,2,1,0,2,13,109, +0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,109,0,16,10,49,0, +57,18,110,0,16,10,49,0,57,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,18,109, +0,18,110,0,48,20,0,0,1,0,0,2,4,1,0,2,13,109,0,0,1,1,0,13,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18, +110,0,16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,0,1,0,0,2,1,1,0,2,14, +109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,21,0,9,18,109,0,16,10, +49,0,57,18,110,0,16,10,49,0,57,21,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,21,0,0,1,0,0,2, +2,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,  109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,22,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,22, -0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,22,0,0,1,0,0,2,3,1,0,2,15,109,0,0,1,1,0,15,110,0, -0,0,1,9,18,109,0,18,109,0,18,110,0,48,20,0,0,1,0,0,2,4,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18, -109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0, -9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,24,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0, -57,24,0,0,1,0,0,2,1,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18, -109,0,16,10,49,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8, -48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,9,97, -0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0, -2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18, -97,0,24,0,0,1,0,0,2,1,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9, -18,109,0,16,10,49,0,57,18,97,0,21,0,9,18,109,0,16,10,50,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,14,109, -0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0, -9,18,109,0,16,10,50,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0, -16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,9,18,109,0,16,10,50,0,57,18,97,0, -23,0,0,1,0,0,2,4,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109, -0,16,10,49,0,57,18,97,0,24,0,9,18,109,0,16,10,50,0,57,18,97,0,24,0,0,1,0,0,2,1,1,0,2,15,109,0,0,1, -1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0,57,18,97,0,21,0,9,18, -109,0,16,10,50,0,57,18,97,0,21,0,9,18,109,0,16,10,51,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,15,109,0, -0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,9, -18,109,0,16,10,50,0,57,18,97,0,22,0,9,18,109,0,16,10,51,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,15,109, -0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0, -9,18,109,0,16,10,50,0,57,18,97,0,23,0,9,18,109,0,16,10,51,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,15, -109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97,0, -24,0,9,18,109,0,16,10,50,0,57,18,97,0,24,0,9,18,109,0,16,10,51,0,57,18,97,0,24,0,0,1,0,0,2,3,1,0,2, -10,118,0,0,1,1,0,13,109,0,0,0,1,9,18,118,0,18,118,0,18,109,0,48,20,0,0,1,0,0,2,3,1,0,2,11,118,0,0, -1,1,0,14,109,0,0,0,1,9,18,118,0,18,118,0,18,109,0,48,20,0,0,1,0,0,2,3,1,0,2,12,118,0,0,1,1,0,15, -109,0,0,0,1,9,18,118,0,18,118,0,18,109,0,48,20,0,0,1,0,5,2,25,1,0,2,5,97,0,0,0,1,9,18,97,0,18,97,0, -16,10,49,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,6,2,25,1,0,2,6,118,0,0,0, -1,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97, -108,0,18,118,0,20,0,0,1,0,7,2,25,1,0,2,7,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16, -10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,8,2,25,1,0,2,8,118,0,0, -0,1,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97, -108,0,18,118,0,20,0,0,1,0,9,2,25,1,0,2,9,97,0,0,0,1,9,18,97,0,18,97,0,17,49,0,48,0,0,47,20,0,9,18, -95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,10,2,25,1,0,2,10,118,0,0,0,1,9,18,118,0,18,118,0, -58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1, -0,11,2,25,1,0,2,11,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9, -18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,12,2,25,1,0,2,12,118,0,0,0,1,9,18,118,0,18, -118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20, -0,0,1,0,13,2,25,1,0,2,13,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99, -50,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0, -17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,14,2,25,1,0,2,14, -109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47, -20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0, -9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18, -95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,15,2,25,1,0,2,15,109,0,0,0,1,9,18,109,0,16,8,48, -0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57, -18,109,0,16,10,49,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18, -109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,51,0,57,18,109, -0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0, -18,109,0,20,0,0,1,0,5,2,24,1,0,2,5,97,0,0,0,1,9,18,97,0,18,97,0,16,10,49,0,46,20,0,9,18,95,95,114, -101,116,86,97,108,0,18,97,0,20,0,0,1,0,6,2,24,1,0,2,6,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118, -101,99,50,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,7,2,24,1, -0,2,7,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114, -101,116,86,97,108,0,18,118,0,20,0,0,1,0,8,2,24,1,0,2,8,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118, -101,99,52,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,9,2,24,1, -0,2,9,97,0,0,0,1,9,18,97,0,18,97,0,17,49,0,48,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,97, -0,20,0,0,1,0,10,2,24,1,0,2,10,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0, -0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,11,2,24,1,0,2,11,118,0,0,0,1,9,18, -118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18, -118,0,20,0,0,1,0,12,2,24,1,0,2,12,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0, -0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,13,2,24,1,0,2,13,109,0,0,0,1, -9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18, -109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95, -95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,14,2,24,1,0,2,14,109,0,0,0,1,9,18,109,0,16,8,48,0, -57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18, -109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109, -0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0, -18,109,0,20,0,0,1,0,15,2,24,1,0,2,15,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58, -118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118, -101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101, -99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99, -52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,5,0,95,95, -112,111,115,116,68,101,99,114,0,1,0,2,5,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0, -9,18,97,0,18,97,0,16,10,49,0,47,20,0,0,1,0,6,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,6,118,0, -0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,50,0, -16,10,49,0,0,0,47,20,0,0,1,0,7,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,7,118,0,0,0,1,9,18,95, -95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0, -47,20,0,0,1,0,8,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,8,118,0,0,0,1,9,18,95,95,114,101,116, -86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49,0,0,0,47,20,0,0,1,0, -9,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,9,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18, -97,0,20,0,9,18,97,0,18,97,0,17,49,0,48,0,0,47,20,0,0,1,0,10,0,95,95,112,111,115,116,68,101,99,114, -0,1,0,2,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118, -101,99,50,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,11,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,11, -118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,51, -0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,12,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,12,118,0,0,0,1, -9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48, -0,0,0,0,47,20,0,0,1,0,13,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,13,109,0,0,0,1,9,18,95,95, -114,101,116,86,97,108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99, -50,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0, -17,49,0,48,0,0,0,0,47,20,0,0,1,0,14,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,14,109,0,0,0,1,9, -18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58, -118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118, -101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101, -99,51,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,15,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,15,109,0, -0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0, +0,0,1,0,0,2,3,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,18,109,0,18,110,0,48,20,0,0,1,0,0,2, +4,1,0,2,14,109,0,0,1,1,0,14,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,24,0,9,18, +109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,24, +0,0,1,0,0,2,1,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57, +21,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,21,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10, +50,0,57,21,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,21,0,0,1,0,0,2,2,1,0,2,15,109,0,0,1,1, +0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57,18,110,0,16,8,48,0,57,22,0,9,18,109,0,16,10,49,0,57,18, +110,0,16,10,49,0,57,22,0,9,18,109,0,16,10,50,0,57,18,110,0,16,10,50,0,57,22,0,9,18,109,0,16,10,51, +0,57,18,110,0,16,10,51,0,57,22,0,0,1,0,0,2,3,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,18, +109,0,18,110,0,48,20,0,0,1,0,0,2,4,1,0,2,15,109,0,0,1,1,0,15,110,0,0,0,1,9,18,109,0,16,8,48,0,57, +18,110,0,16,8,48,0,57,24,0,9,18,109,0,16,10,49,0,57,18,110,0,16,10,49,0,57,24,0,9,18,109,0,16,10, +50,0,57,18,110,0,16,10,50,0,57,24,0,9,18,109,0,16,10,51,0,57,18,110,0,16,10,51,0,57,24,0,0,1,0,0,2, +1,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0, +57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,22, +0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,13,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0, +16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,13,109,0,0,1,1,0, +9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97,0,24,0,0,1,0,0,2, +1,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0, +57,18,97,0,21,0,9,18,109,0,16,10,50,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,14,109,0,0,1,1,0,9,97,0,0, +0,1,9,18,109,0,16,8,48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,9,18,109,0,16,10,50, +0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0, +23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,9,18,109,0,16,10,50,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2, +14,109,0,0,1,1,0,9,97,0,0,0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97, +0,24,0,9,18,109,0,16,10,50,0,57,18,97,0,24,0,0,1,0,0,2,1,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9,18, +109,0,16,8,48,0,57,18,97,0,21,0,9,18,109,0,16,10,49,0,57,18,97,0,21,0,9,18,109,0,16,10,50,0,57,18, +97,0,21,0,9,18,109,0,16,10,51,0,57,18,97,0,21,0,0,1,0,0,2,2,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1,9, +18,109,0,16,8,48,0,57,18,97,0,22,0,9,18,109,0,16,10,49,0,57,18,97,0,22,0,9,18,109,0,16,10,50,0,57, +18,97,0,22,0,9,18,109,0,16,10,51,0,57,18,97,0,22,0,0,1,0,0,2,3,1,0,2,15,109,0,0,1,1,0,9,97,0,0,0,1, +9,18,109,0,16,8,48,0,57,18,97,0,23,0,9,18,109,0,16,10,49,0,57,18,97,0,23,0,9,18,109,0,16,10,50,0, +57,18,97,0,23,0,9,18,109,0,16,10,51,0,57,18,97,0,23,0,0,1,0,0,2,4,1,0,2,15,109,0,0,1,1,0,9,97,0,0, +0,1,9,18,109,0,16,8,48,0,57,18,97,0,24,0,9,18,109,0,16,10,49,0,57,18,97,0,24,0,9,18,109,0,16,10,50, +0,57,18,97,0,24,0,9,18,109,0,16,10,51,0,57,18,97,0,24,0,0,1,0,0,2,3,1,0,2,10,118,0,0,1,1,0,13,109, +0,0,0,1,9,18,118,0,18,118,0,18,109,0,48,20,0,0,1,0,0,2,3,1,0,2,11,118,0,0,1,1,0,14,109,0,0,0,1,9, +18,118,0,18,118,0,18,109,0,48,20,0,0,1,0,0,2,3,1,0,2,12,118,0,0,1,1,0,15,109,0,0,0,1,9,18,118,0,18, +118,0,18,109,0,48,20,0,0,1,0,5,2,25,1,0,2,5,97,0,0,0,1,9,18,97,0,18,97,0,16,10,49,0,47,20,0,9,18, +95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,6,2,25,1,0,2,6,118,0,0,0,1,9,18,118,0,18,118,0,58, +105,118,101,99,50,0,16,10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0, +7,2,25,1,0,2,7,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,47,20,0,9,18, +95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,8,2,25,1,0,2,8,118,0,0,0,1,9,18,118,0,18,118,0, +58,105,118,101,99,52,0,16,10,49,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1, +0,9,2,25,1,0,2,9,97,0,0,0,1,9,18,97,0,18,97,0,17,49,0,48,0,0,47,20,0,9,18,95,95,114,101,116,86,97, +108,0,18,97,0,20,0,0,1,0,10,2,25,1,0,2,10,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49, +0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,11,2,25,1,0,2,11,118,0, +0,0,1,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86, +97,108,0,18,118,0,20,0,0,1,0,12,2,25,1,0,2,12,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,52,0, +17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,13,2,25,1,0,2,13, +109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47, +20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,47,20,0, +9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,14,2,25,1,0,2,14,109,0,0,0,1,9,18,109,0,16, +8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49, +0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57, +18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97, +108,0,18,109,0,20,0,0,1,0,15,2,25,1,0,2,15,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,  57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,  58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,  118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118, -101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,0,1,0,9,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,9,97, -0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16,10,49,0,46,20,0,0,1,0, -10,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0, -18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,11,0,95,95, -112,111,115,116,73,110,99,114,0,1,0,2,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0, -20,0,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,12,0,95,95,112,111, -115,116,73,110,99,114,0,1,0,2,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18, -118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,5,0,95,95,112,111,115,116,73, -110,99,114,0,1,0,2,5,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0, -16,10,49,0,46,20,0,0,1,0,6,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,6,118,0,0,0,1,9,18,95,95, -114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,46, -20,0,0,1,0,7,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,7,118,0,0,0,1,9,18,95,95,114,101,116,86, -97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,0,1,0,8,0, -95,95,112,111,115,116,73,110,99,114,0,1,0,2,8,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18, -118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,0,1,0,13,0,95,95,112, -111,115,116,73,110,99,114,0,1,0,2,13,109,0,0,0,1,3,2,0,13,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8, +101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,5,2, +24,1,0,2,5,97,0,0,0,1,9,18,97,0,18,97,0,16,10,49,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18, +97,0,20,0,0,1,0,6,2,24,1,0,2,6,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0, +0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,7,2,24,1,0,2,7,118,0,0,0,1,9,18, +118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18, +118,0,20,0,0,1,0,8,2,24,1,0,2,8,118,0,0,0,1,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49,0, +0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,9,2,24,1,0,2,9,97,0,0,0,1,9,18, +97,0,18,97,0,17,49,0,48,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,0,1,0,10,2,24, +1,0,2,10,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95, +114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,11,2,24,1,0,2,11,118,0,0,0,1,9,18,118,0,18,118,0,58, +118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0, +12,2,24,1,0,2,12,118,0,0,0,1,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9, +18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,0,1,0,13,2,24,1,0,2,13,109,0,0,0,1,9,18,109,0,16,8,  48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0, -57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,14,0,95, -95,112,111,115,116,73,110,99,114,0,1,0,2,14,109,0,0,0,1,3,2,0,14,1,110,0,2,18,109,0,0,0,9,18,109,0, -16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10, -49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0, -57,18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,15,0,95, -95,112,111,115,116,73,110,99,114,0,1,0,2,15,109,0,0,0,1,3,2,0,15,1,110,0,2,18,109,0,0,0,9,18,109,0, -16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10, -49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0, -57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,51,0,57, -18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,1,2,15,1,1, -0,9,97,0,0,1,1,0,9,98,0,0,0,1,4,118,101,99,52,95,115,103,116,0,18,95,95,114,101,116,86,97,108,0,59, -120,0,0,18,98,0,0,18,97,0,0,0,0,1,0,1,2,15,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97, -116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0,0,0,40,0,0,1,0,1,2,16,1,1,0,9,97,0,0,1,1,0,9,98, -0,0,0,1,3,2,0,1,1,99,0,0,0,4,102,108,111,97,116,95,108,101,115,115,0,18,99,0,0,18,98,0,0,18,97,0,0, -0,8,18,99,0,0,0,1,0,1,2,16,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0, -58,102,108,111,97,116,0,18,98,0,0,0,41,0,0,1,0,1,2,18,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1, -103,0,0,1,1,101,0,0,0,4,102,108,111,97,116,95,108,101,115,115,0,18,103,0,0,18,98,0,0,18,97,0,0,0,4, -102,108,111,97,116,95,101,113,117,97,108,0,18,101,0,0,18,97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32, -0,0,1,0,1,2,18,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108, -111,97,116,0,18,98,0,0,0,43,0,0,1,0,1,2,17,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,103,0,0,1,1, -101,0,0,0,4,102,108,111,97,116,95,108,101,115,115,0,18,103,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111, -97,116,95,101,113,117,97,108,0,18,101,0,0,18,97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32,0,0,1,0,1,2, -17,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0, -18,98,0,0,0,42,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,9,102,0,0,0,1,4,102,108,111,97, -116,95,112,114,105,110,116,0,18,102,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,5,105, -0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,105,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83, -65,0,1,1,0,1,98,0,0,0,1,4,98,111,111,108,95,112,114,105,110,116,0,18,98,0,0,0,0,1,0,0,0,112,114, -105,110,116,77,69,83,65,0,1,1,0,10,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59, -120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105, -110,116,77,69,83,65,0,1,1,0,11,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120, -0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77, -69,83,65,0,18,118,0,59,122,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,12,118,0,0,0, -1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83, -65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58, -112,114,105,110,116,77,69,83,65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83, -65,0,1,1,0,6,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112, -114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0, -1,1,0,7,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114, -105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0, -59,122,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,8,118,0,0,0,1,9,58,112,114,105, -110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59, -121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110, -116,77,69,83,65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,2,118, -0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77, -69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,3,118,0,0,0,1, -9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83, -65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,0,1,0, -0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,4,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0, -18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112, -114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, -118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,13,109,0,0,0,1,9,58,112,114, -105,110,116,77,69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, -109,0,16,10,49,0,57,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,14,109,0,0,0,1,9,58, -112,114,105,110,116,77,69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65, -0,18,109,0,16,10,49,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,50,0,57,0,0,0, -0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,15,109,0,0,0,1,9,58,112,114,105,110,116,77,69,83, -65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49,0,57,0,0, -0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,50,0,57,0,0,0,9,58,112,114,105,110,116,77, -69,83,65,0,18,109,0,16,10,51,0,57,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,16,101,0, -0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83, -65,0,1,1,0,17,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114, -105,110,116,77,69,83,65,0,1,1,0,18,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0, -0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,19,101,0,0,0,1,4,105,110,116,95,112,114,105,110, -116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,20,101,0,0,0,1,4,105,110,116, -95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,21,101,0,0, -0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,0 +57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86, +97,108,0,18,109,0,20,0,0,1,0,14,2,24,1,0,2,14,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48, +0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57, +58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58, +118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0, +15,2,24,1,0,2,15,109,0,0,0,1,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0,17, +49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17,49,0, +48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0,48,0, +0,0,0,46,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0, +0,46,20,0,9,18,95,95,114,101,116,86,97,108,0,18,109,0,20,0,0,1,0,5,0,95,95,112,111,115,116,68,101, +99,114,0,1,0,2,5,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16, +10,49,0,47,20,0,0,1,0,6,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,6,118,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,47,20, +0,0,1,0,7,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,7,118,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,47,20,0,0,1,0,8,0,95, +95,112,111,115,116,68,101,99,114,0,1,0,2,8,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0, +20,0,9,18,118,0,18,118,0,58,105,118,101,99,52,0,16,10,49,0,0,0,47,20,0,0,1,0,9,0,95,95,112,111,115, +116,68,101,99,114,0,1,0,2,9,97,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0, +18,97,0,17,49,0,48,0,0,47,20,0,0,1,0,10,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,10,118,0,0,0, +1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,50,0,17,49,0, +48,0,0,0,0,47,20,0,0,1,0,11,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,11,118,0,0,0,1,9,18,95, +95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,51,0,17,49,0,48,0,0,0,0, +47,20,0,0,1,0,12,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,12,118,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101,99,52,0,17,49,0,48,0,0,0,0,47,20,0,0, +1,0,13,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,13,109,0,0,0,1,9,18,95,95,114,101,116,86,97, +108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,50,0,17,49,0,48,0, +0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,50,0,17,49,0,48,0,0,0, +0,47,20,0,0,1,0,14,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,14,109,0,0,0,1,9,18,95,95,114,101, +116,86,97,108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,51,0,17, +49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,51,0,17,49,0, +48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,51,0,17,49,0,48,0, +0,0,0,47,20,0,0,1,0,15,0,95,95,112,111,115,116,68,101,99,114,0,1,0,2,15,109,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,18,109,0,20,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0,57,58,118,101,99,52,0, +17,49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57,58,118,101,99,52,0,17, +49,0,48,0,0,0,0,47,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57,58,118,101,99,52,0,17,49,0, +48,0,0,0,0,47,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58,118,101,99,52,0,17,49,0,48,0, +0,0,0,47,20,0,0,1,0,9,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,9,97,0,0,0,1,9,18,95,95,114, +101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16,10,49,0,46,20,0,0,1,0,10,0,95,95,112,111,115, +116,73,110,99,114,0,1,0,2,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118, +0,18,118,0,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,11,0,95,95,112,111,115,116,73,110, +99,114,0,1,0,2,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0, +58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,12,0,95,95,112,111,115,116,73,110,99,114,0,1,0, +2,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18,118,0,58,118,101, +99,52,0,17,49,0,48,0,0,0,0,46,20,0,0,1,0,5,0,95,95,112,111,115,116,73,110,99,114,0,1,0,2,5,97,0,0, +0,1,9,18,95,95,114,101,116,86,97,108,0,18,97,0,20,0,9,18,97,0,18,97,0,16,10,49,0,46,20,0,0,1,0,6,0, +95,95,112,111,115,116,73,110,99,114,0,1,0,2,6,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18, +118,0,20,0,9,18,118,0,18,118,0,58,105,118,101,99,50,0,16,10,49,0,0,0,46,20,0,0,1,0,7,0,95,95,112, +111,115,116,73,110,99,114,0,1,0,2,7,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9, +18,118,0,18,118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,0,1,0,8,0,95,95,112,111,115,116,73, +110,99,114,0,1,0,2,8,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,18,118,0,20,0,9,18,118,0,18, +118,0,58,105,118,101,99,51,0,16,10,49,0,0,0,46,20,0,0,1,0,13,0,95,95,112,111,115,116,73,110,99,114, +0,1,0,2,13,109,0,0,0,1,3,2,0,13,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16,8,48,0, +57,58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49,0,57, +58,118,101,99,50,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,14,0,95,95,112,111,115,116,73,110, +99,114,0,1,0,2,14,109,0,0,0,1,3,2,0,14,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16, +8,48,0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49, +0,57,58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57, +58,118,101,99,51,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,15,0,95,95,112,111,115,116,73,110, +99,114,0,1,0,2,15,109,0,0,0,1,3,2,0,15,1,110,0,2,18,109,0,0,0,9,18,109,0,16,8,48,0,57,18,109,0,16, +8,48,0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,49,0,57,18,109,0,16,10,49, +0,57,58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,50,0,57,18,109,0,16,10,50,0,57, +58,118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,9,18,109,0,16,10,51,0,57,18,109,0,16,10,51,0,57,58, +118,101,99,52,0,17,49,0,48,0,0,0,0,46,20,0,8,18,110,0,0,0,1,0,1,2,15,1,1,0,9,97,0,0,1,1,0,9,98,0,0, +0,1,4,118,101,99,52,95,115,103,116,0,18,95,95,114,101,116,86,97,108,0,59,120,0,0,18,98,0,0,18,97,0, +0,0,0,1,0,1,2,15,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102, +108,111,97,116,0,18,98,0,0,0,40,0,0,1,0,1,2,16,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,99,0,0, +0,4,102,108,111,97,116,95,108,101,115,115,0,18,99,0,0,18,98,0,0,18,97,0,0,0,8,18,99,0,0,0,1,0,1,2, +16,1,1,0,5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0, +18,98,0,0,0,41,0,0,1,0,1,2,18,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,103,0,0,1,1,101,0,0,0,4, +102,108,111,97,116,95,108,101,115,115,0,18,103,0,0,18,98,0,0,18,97,0,0,0,4,102,108,111,97,116,95, +101,113,117,97,108,0,18,101,0,0,18,97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32,0,0,1,0,1,2,18,1,1,0, +5,97,0,0,1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0, +0,0,43,0,0,1,0,1,2,17,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,3,2,0,1,1,103,0,0,1,1,101,0,0,0,4,102,108, +111,97,116,95,108,101,115,115,0,18,103,0,0,18,97,0,0,18,98,0,0,0,4,102,108,111,97,116,95,101,113, +117,97,108,0,18,101,0,0,18,97,0,0,18,98,0,0,0,8,18,103,0,18,101,0,32,0,0,1,0,1,2,17,1,1,0,5,97,0,0, +1,1,0,5,98,0,0,0,1,8,58,102,108,111,97,116,0,18,97,0,0,0,58,102,108,111,97,116,0,18,98,0,0,0,42,0, +0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,9,102,0,0,0,1,4,102,108,111,97,116,95,112,114, +105,110,116,0,18,102,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,5,105,0,0,0,1,4,105, +110,116,95,112,114,105,110,116,0,18,105,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,1, +98,0,0,0,1,4,98,111,111,108,95,112,114,105,110,116,0,18,98,0,0,0,0,1,0,0,0,112,114,105,110,116,77, +69,83,65,0,1,1,0,10,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9, +58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69, +83,65,0,1,1,0,11,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58, +112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0, +18,118,0,59,122,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,12,118,0,0,0,1,9,58,112, +114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, +118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114, +105,110,116,77,69,83,65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1, +0,6,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105, +110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,7, +118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110, +116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0, +0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,8,118,0,0,0,1,9,58,112,114,105,110,116,77, +69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0, +9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110,116,77,69,83, +65,0,18,118,0,59,119,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,2,118,0,0,0,1,9,58, +112,114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0, +18,118,0,59,121,0,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,3,118,0,0,0,1,9,58,112, +114,105,110,116,77,69,83,65,0,18,118,0,59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, +118,0,59,121,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,0,1,0,0,0,112, +114,105,110,116,77,69,83,65,0,1,1,0,4,118,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0, +59,120,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,121,0,0,0,0,9,58,112,114,105,110, +116,77,69,83,65,0,18,118,0,59,122,0,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,118,0,59,119,0, +0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,13,109,0,0,0,1,9,58,112,114,105,110,116,77, +69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49,0, +57,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,14,109,0,0,0,1,9,58,112,114,105,110,116, +77,69,83,65,0,18,109,0,16,8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49, +0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,50,0,57,0,0,0,0,1,0,0,0,112,114, +105,110,116,77,69,83,65,0,1,1,0,15,109,0,0,0,1,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16, +8,48,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18,109,0,16,10,49,0,57,0,0,0,9,58,112,114, +105,110,116,77,69,83,65,0,18,109,0,16,10,50,0,57,0,0,0,9,58,112,114,105,110,116,77,69,83,65,0,18, +109,0,16,10,51,0,57,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,16,101,0,0,0,1,4,105, +110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,17, +101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77, +69,83,65,0,1,1,0,18,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0,0,0,0,1,0,0,0,112, +114,105,110,116,77,69,83,65,0,1,1,0,19,101,0,0,0,1,4,105,110,116,95,112,114,105,110,116,0,18,101,0, +0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,20,101,0,0,0,1,4,105,110,116,95,112,114,105, +110,116,0,18,101,0,0,0,0,1,0,0,0,112,114,105,110,116,77,69,83,65,0,1,1,0,21,101,0,0,0,1,4,105,110, +116,95,112,114,105,110,116,0,18,101,0,0,0,0,0 diff --git a/src/mesa/shader/slang/library/slang_version_syn.h b/src/mesa/shader/slang/library/slang_version_syn.h deleted file mode 100755 index 3b94d85927..0000000000 --- a/src/mesa/shader/slang/library/slang_version_syn.h +++ /dev/null @@ -1,64 +0,0 @@ -".syntax version_directive;\n" -"version_directive\n" -"	version_directive_1 .and .loop version_directive_2;\n" -"version_directive_1\n" -"	prior_optional_spaces .and optional_version_directive .and .true .emit $;\n" -"version_directive_2\n" -"	prior_optional_spaces .and version_directive_body .and .true .emit $;\n" -"optional_version_directive\n" -"	version_directive_body .or .true .emit 10 .emit 1;\n" -"version_directive_body\n" -"	'#' .and optional_space .and \"version\" .and space .and version_number .and optional_space .and\n" -"	new_line;\n" -"version_number\n" -"	version_number_110;\n" -"version_number_110\n" -"	leading_zeroes .and \"110\" .emit 10 .emit 1;\n" -"leading_zeroes\n" -"	.loop zero;\n" -"zero\n" -"	'0';\n" -"space\n" -" single_space .and .loop single_space;\n" -"optional_space\n" -" .loop single_space;\n" -"single_space\n" -" ' ' .or '\\t';\n" -"prior_optional_spaces\n" -"	.loop prior_space;\n" -"prior_space\n" -"	c_style_comment_block .or cpp_style_comment_block .or space .or new_line;\n" -"c_style_comment_block\n" -" '/' .and '*' .and c_style_comment_rest;\n" -"c_style_comment_rest\n" -" .loop c_style_comment_char_no_star .and c_style_comment_rest_1;\n" -"c_style_comment_rest_1\n" -" c_style_comment_end .or c_style_comment_rest_2;\n" -"c_style_comment_rest_2\n" -" '*' .and c_style_comment_rest;\n" -"c_style_comment_char_no_star\n" -" '\\x2B'-'\\xFF' .or '\\x01'-'\\x29';\n" -"c_style_comment_end\n" -" '*' .and '/';\n" -"cpp_style_comment_block\n" -" '/' .and '/' .and cpp_style_comment_block_1;\n" -"cpp_style_comment_block_1\n" -" cpp_style_comment_block_2 .or cpp_style_comment_block_3;\n" -"cpp_style_comment_block_2\n" -" .loop cpp_style_comment_char .and new_line;\n" -"cpp_style_comment_block_3\n" -" .loop cpp_style_comment_char;\n" -"cpp_style_comment_char\n" -" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n" -"new_line\n" -" cr_lf .or lf_cr .or '\\n' .or '\\r';\n" -"cr_lf\n" -" '\\r' .and '\\n';\n" -"lf_cr\n" -"	'\\n' .and '\\r';\n" -".string __string_filter;\n" -"__string_filter\n" -" .loop __identifier_char;\n" -"__identifier_char\n" -" 'a'-'z' .or 'A'-'Z' .or '_' .or '0'-'9';\n" -"" diff --git a/src/mesa/shader/slang/slang_builtin.c b/src/mesa/shader/slang/slang_builtin.c index 1081d8ff8d..f0f59aa87a 100644 --- a/src/mesa/shader/slang/slang_builtin.c +++ b/src/mesa/shader/slang/slang_builtin.c @@ -250,7 +250,7 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,        }     }     else if (strcmp(var, "gl_FrontLightModelProduct") == 0) { -      if (strcmp(field, "ambient") == 0) { +      if (strcmp(field, "sceneColor") == 0) {           tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;           tokens[1] = 0;        } @@ -259,7 +259,7 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,        }     }     else if (strcmp(var, "gl_BackLightModelProduct") == 0) { -      if (strcmp(field, "ambient") == 0) { +      if (strcmp(field, "sceneColor") == 0) {           tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;           tokens[1] = 1;        } @@ -397,6 +397,8 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,   *   var.field   *   var[i].field   *   var[i][j] + * + * \return -1 upon error, else position in paramList of the state var/data   */  GLint  _slang_alloc_statevar(slang_ir_node *n, @@ -414,9 +416,13 @@ _slang_alloc_statevar(slang_ir_node *n,     if (n->Opcode == IR_ELEMENT) {        /* XXX can only handle constant indexes for now */ -      assert(n->Children[1]->Opcode == IR_FLOAT); -      index1 = (GLint) n->Children[1]->Value[0]; -      n = n->Children[0]; +      if (n->Children[1]->Opcode == IR_FLOAT) { +         index1 = (GLint) n->Children[1]->Value[0]; +         n = n->Children[0]; +      } +      else { +         return -1; +      }     }     if (n->Opcode == IR_ELEMENT) { diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 0de2b0a57e..d19d5a0abb 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -495,6 +495,9 @@ new_node0(slang_ir_opcode op)  } +/** + * Create sequence of two nodes. + */  static slang_ir_node *  new_seq(slang_ir_node *left, slang_ir_node *right)  { @@ -535,10 +538,10 @@ new_not(slang_ir_node *n)  /** - * Inlined subroutine. + * Non-inlined function call.   */  static slang_ir_node * -new_inlined_function_call(slang_ir_node *code, slang_label *name) +new_function_call(slang_ir_node *code, slang_label *name)  {     slang_ir_node *n = new_node1(IR_CALL, code);     assert(name); @@ -1226,7 +1229,7 @@ _slang_gen_function_call(slang_assemble_ctx *A, slang_function *fun,           else {              callOper = inlined;           } -         callOper->type = SLANG_OPER_INLINED_CALL; +         callOper->type = SLANG_OPER_NON_INLINED_CALL;           callOper->fun = fun;           callOper->label = _slang_label_new_unique((char*) fun->header.a_name);        } @@ -1844,6 +1847,7 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var)        n->Store->File = PROGRAM_TEMPORARY;        n->Store->Size = _slang_sizeof_type_specifier(&n->Var->type.specifier); +      A->program->NumTemporaries++;        assert(n->Store->Size > 0);     }     return n; @@ -2060,7 +2064,8 @@ _slang_gen_declaration(slang_assemble_ctx *A, slang_operation *oper)        }        /* XXX make copy of this initializer? */        rhs = _slang_gen_operation(A, &oper->children[0]); -      assert(rhs); +      if (!rhs) +         return NULL;  /* must have found an error */        init = new_node2(IR_MOVE, var, rhs);        /*assert(rhs->Opcode != IR_SEQ);*/        n = new_seq(varDecl, init); @@ -2347,7 +2352,8 @@ _slang_gen_field(slang_assemble_ctx * A, slang_operation *oper)        return n;     }     else if (   ti.spec.type == SLANG_SPEC_FLOAT -            || ti.spec.type == SLANG_SPEC_INT) { +            || ti.spec.type == SLANG_SPEC_INT +            || ti.spec.type == SLANG_SPEC_BOOL) {        const GLuint rows = 1;        slang_swizzle swz;        slang_ir_node *n; @@ -2509,49 +2515,6 @@ _slang_gen_subscript(slang_assemble_ctx * A, slang_operation *oper)  /** - * Look for expressions such as:  gl_ModelviewMatrix * gl_Vertex - * and replace with this:  gl_Vertex * gl_ModelviewMatrixTranpose - * Since matrices are stored in column-major order, the second form of - * multiplication is much more efficient (just 4 dot products). - */ -static void -_slang_check_matmul_optimization(slang_assemble_ctx *A, slang_operation *oper) -{ -   static const struct { -      const char *orig; -      const char *tranpose; -   } matrices[] = { -      {"gl_ModelViewMatrix", "gl_ModelViewMatrixTranspose"}, -      {"gl_ProjectionMatrix", "gl_ProjectionMatrixTranspose"}, -      {"gl_ModelViewProjectionMatrix", "gl_ModelViewProjectionMatrixTranspose"}, -      {"gl_TextureMatrix", "gl_TextureMatrixTranspose"}, -      {"gl_NormalMatrix", "__NormalMatrixTranspose"}, -      { NULL, NULL } -   }; - -   assert(oper->type == SLANG_OPER_MULTIPLY); -   if (oper->children[0].type == SLANG_OPER_IDENTIFIER) { -      GLuint i; -      for (i = 0; matrices[i].orig; i++) { -         if (oper->children[0].a_id -             == slang_atom_pool_atom(A->atoms, matrices[i].orig)) { -            /* -            _mesa_printf("Replace %s with %s\n", -                         matrices[i].orig, matrices[i].tranpose); -            */ -            assert(oper->children[0].type == SLANG_OPER_IDENTIFIER); -            oper->children[0].a_id -               = slang_atom_pool_atom(A->atoms, matrices[i].tranpose); -            /* finally, swap the operands */ -            _slang_operation_swap(&oper->children[0], &oper->children[1]); -            return; -         } -      } -   } -} - - -/**   * Generate IR tree for a slang_operation (AST node)   */  static slang_ir_node * @@ -2589,7 +2552,7 @@ _slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper)                 _slang_free_ir_tree(tree);                 return NULL; /* error must have occured */              } -            tree = tree ? new_seq(tree, n) : n; +            tree = new_seq(tree, n);           }  #if 00 @@ -2684,7 +2647,6 @@ _slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper)        {  	 slang_ir_node *n;           assert(oper->num_children == 2); -         _slang_check_matmul_optimization(A, oper);           n = _slang_gen_function_call_name(A, "*", oper, NULL);  	 return n;        } @@ -2817,17 +2779,17 @@ _slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper)  	 return n;        } -   case SLANG_OPER_INLINED_CALL: +   case SLANG_OPER_NON_INLINED_CALL:     case SLANG_OPER_SEQUENCE:        {           slang_ir_node *tree = NULL;           GLuint i;           for (i = 0; i < oper->num_children; i++) {              slang_ir_node *n = _slang_gen_operation(A, &oper->children[i]); -            tree = tree ? new_seq(tree, n) : n; +            tree = new_seq(tree, n);           } -         if (oper->type == SLANG_OPER_INLINED_CALL) { -            tree = new_inlined_function_call(tree, oper->label); +         if (oper->type == SLANG_OPER_NON_INLINED_CALL) { +            tree = new_function_call(tree, oper->label);           }           return tree;        } @@ -2879,17 +2841,7 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,         * store->Index = sampler number (0..7, typically)         * store->Size = texture type index (1D, 2D, 3D, cube, etc)         */ -#if 0 -      GLint samplerUniform -         = _mesa_add_sampler(prog->Parameters, varName, datatype); -#elif 0 -      GLint samplerUniform -         = _mesa_add_sampler(prog->Samplers, varName, datatype); -      (void) _mesa_add_sampler(prog->Parameters, varName, datatype); /* dummy entry */ -#else -      const GLint sampNum = A->numSamplers++; -      _mesa_add_sampler(prog->Parameters, varName, datatype, sampNum); -#endif +      GLint sampNum = _mesa_add_sampler(prog->Parameters, varName, datatype);        store = _slang_new_ir_storage(PROGRAM_SAMPLER, sampNum, texIndex);        if (dbg) printf("SAMPLER ");     } diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c index bfb9ca4db6..46b5c54bbe 100644 --- a/src/mesa/shader/slang/slang_compile.c +++ b/src/mesa/shader/slang/slang_compile.c @@ -31,6 +31,8 @@  #include "main/imports.h"  #include "main/context.h"  #include "shader/program.h" +#include "shader/programopt.h" +#include "shader/prog_print.h"  #include "shader/prog_parameter.h"  #include "shader/grammar/grammar_mesa.h"  #include "slang_codegen.h" @@ -1618,7 +1620,6 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,        A.program = O->program;        A.vartable = O->vartable;        A.curFuncEndLabel = NULL; -      A.numSamplers = 0;        if (!_slang_codegen_global_variable(&A, var, C->type))           return 0;     } @@ -1641,7 +1642,6 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,           A.space.funcs = O->funs;           A.space.structs = O->structs;           A.space.vars = O->vars; -         A.numSamplers = 0;           if (!initialize_global(&A, var))              return 0;        } @@ -1775,7 +1775,6 @@ parse_function(slang_parse_ctx * C, slang_output_ctx * O, int definition,        A.program = O->program;        A.vartable = O->vartable;        A.log = C->L; -      A.numSamplers = 0;        _slang_codegen_function(&A, *parsed_func_ret);     } @@ -2155,9 +2154,6 @@ _slang_compile(GLcontext *ctx, struct gl_shader *shader)        shader->Programs[0]->Parameters = _mesa_new_parameter_list();        shader->Programs[0]->Varying = _mesa_new_parameter_list();        shader->Programs[0]->Attributes = _mesa_new_parameter_list(); -#if 0 -      shader->Programs[0]->Samplers = _mesa_new_parameter_list(); -#endif     }     slang_info_log_construct(&info_log); @@ -2186,6 +2182,19 @@ _slang_compile(GLcontext *ctx, struct gl_shader *shader)     _slang_delete_mempool((slang_mempool *) ctx->Shader.MemPool);     ctx->Shader.MemPool = NULL; +   if (shader->Type == GL_VERTEX_SHADER) { +      /* remove any reads of varying (output) registers */ +#if 0 +      printf("Pre-remove output reads:\n"); +      _mesa_print_program(shader->Programs[0]); +#endif +      _mesa_remove_varying_reads(shader->Programs[0]); +#if 0 +      printf("Post-remove output reads:\n"); +      _mesa_print_program(shader->Programs[0]); +#endif +   } +     return success;  } diff --git a/src/mesa/shader/slang/slang_compile_operation.h b/src/mesa/shader/slang/slang_compile_operation.h index d497b6f66f..d5cbe779a6 100644 --- a/src/mesa/shader/slang/slang_compile_operation.h +++ b/src/mesa/shader/slang/slang_compile_operation.h @@ -93,7 +93,7 @@ typedef enum slang_operation_type_     SLANG_OPER_NOT,              /* "!" [expr] */     SLANG_OPER_SUBSCRIPT,        /* [expr] "[" [expr] "]" */     SLANG_OPER_CALL,             /* [func name] [param] [param] [...] */ -   SLANG_OPER_INLINED_CALL,     /* inlined function call */ +   SLANG_OPER_NON_INLINED_CALL, /* a real function call */     SLANG_OPER_FIELD,            /* i.e.: ".next" or ".xzy" or ".xxx" etc */     SLANG_OPER_POSTINCREMENT,    /* [var] "++" */     SLANG_OPER_POSTDECREMENT     /* [var] "--" */ diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index 382b13ff05..ff63e05dd2 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -1,6 +1,6 @@  /*   * Mesa 3-D graphics library - * Version:  6.5.3 + * Version:  7.0.3   *   * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.   * @@ -79,7 +79,7 @@ new_subroutine(slang_emit_info *emitInfo, GLuint *id)        _mesa_realloc(emitInfo->Subroutines,                      n * sizeof(struct gl_program),                      (n + 1) * sizeof(struct gl_program)); -   emitInfo->Subroutines[n] = _mesa_new_program(ctx, emitInfo->prog->Target, 0); +   emitInfo->Subroutines[n] = ctx->Driver.NewProgram(ctx, emitInfo->prog->Target, 0);     emitInfo->Subroutines[n]->Parameters = emitInfo->prog->Parameters;     emitInfo->NumSubroutines++;     *id = n; @@ -869,12 +869,18 @@ emit_return(slang_emit_info *emitInfo, slang_ir_node *n)  static struct prog_instruction *  emit_kill(slang_emit_info *emitInfo)  { +   struct gl_fragment_program *fp;     struct prog_instruction *inst;     /* NV-KILL - discard fragment depending on condition code.      * Note that ARB-KILL depends on sign of vector operand.      */     inst = new_instruction(emitInfo, OPCODE_KIL_NV);     inst->DstReg.CondMask = COND_TR;  /* always branch */ + +   assert(emitInfo->prog->Target == GL_FRAGMENT_PROGRAM_ARB); +   fp = (struct gl_fragment_program *) emitInfo->prog; +   fp->UsesKill = GL_TRUE; +     return inst;  } @@ -1500,6 +1506,10 @@ emit_struct_field(slang_emit_info *emitInfo, slang_ir_node *n)  {     if (n->Store->File == PROGRAM_STATE_VAR) {        n->Store->Index = _slang_alloc_statevar(n, emitInfo->prog->Parameters); +      if (n->Store->Index < 0) { +         slang_info_log_error(emitInfo->log, "Error parsing state variable"); +         return NULL; +      }     }     else {        GLint offset = n->FieldOffset / 4; @@ -1787,7 +1797,7 @@ _slang_resolve_subroutines(slang_emit_info *emitInfo)                                sub->NumInstructions);        /* delete subroutine code */        sub->Parameters = NULL; /* prevent double-free */ -      _mesa_delete_program(ctx, sub); +      _mesa_reference_program(ctx, &emitInfo->Subroutines[i], NULL);     }     /* free subroutine list */ diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c index addff20421..80cd4b6df6 100644 --- a/src/mesa/shader/slang/slang_link.c +++ b/src/mesa/shader/slang/slang_link.c @@ -369,12 +369,9 @@ link_error(struct gl_shader_program *shProg, const char *msg)   * 2. Varying vars in the two shaders are combined so their locations   *    agree between the vertex and fragment stages.  They're treated as   *    vertex program output attribs and as fragment program input attribs. - * 3. Uniform vars (including state references, constants, etc) from the - *    vertex and fragment shaders are merged into one group.  Recall that - *    GLSL uniforms are shared by all linked shaders. - * 4. The vertex and fragment programs are cloned and modified to update - *    src/dst register references so they use the new, linked uniform/ - *    varying storage locations. + * 3. The vertex and fragment programs are cloned and modified to update + *    src/dst register references so they use the new, linked varying + *    storage locations.   */  void  _slang_link(GLcontext *ctx, @@ -409,20 +406,20 @@ _slang_link(GLcontext *ctx,      * Make copies of the vertex/fragment programs now since we'll be      * changing src/dst registers after merging the uniforms and varying vars.      */ +   _mesa_reference_vertprog(ctx, &shProg->VertexProgram, NULL);     if (vertProg) { -      shProg->VertexProgram -         = vertex_program(_mesa_clone_program(ctx, &vertProg->Base)); -   } -   else { -      shProg->VertexProgram = NULL; +      struct gl_vertex_program *linked_vprog = +         vertex_program(_mesa_clone_program(ctx, &vertProg->Base)); +      shProg->VertexProgram = linked_vprog; /* refcount OK */ +      ASSERT(shProg->VertexProgram->Base.RefCount == 1);     } +   _mesa_reference_fragprog(ctx, &shProg->FragmentProgram, NULL);     if (fragProg) { -      shProg->FragmentProgram -         = fragment_program(_mesa_clone_program(ctx, &fragProg->Base)); -   } -   else { -      shProg->FragmentProgram = NULL; +      struct gl_fragment_program *linked_fprog =  +         fragment_program(_mesa_clone_program(ctx, &fragProg->Base)); +      shProg->FragmentProgram = linked_fprog; /* refcount OK */ +      ASSERT(shProg->FragmentProgram->Base.RefCount == 1);     }     /* link varying vars */ @@ -440,18 +437,6 @@ _slang_link(GLcontext *ctx,     /*_mesa_print_uniforms(shProg->Uniforms);*/     if (shProg->VertexProgram) { -      /* Rather than cloning the parameter list here, just share it. -       * We need to be careful _mesa_clear_shader_program_data() in -       * to avoid double-freeing. -       */ -      shProg->VertexProgram->Base.Parameters = vertProg->Base.Parameters; -   } -   if (shProg->FragmentProgram) { -      /* see comment just above */ -      shProg->FragmentProgram->Base.Parameters = fragProg->Base.Parameters; -   } - -   if (shProg->VertexProgram) {        if (!_slang_resolve_attributes(shProg, &shProg->VertexProgram->Base)) {           /*goto cleanup;*/           _mesa_problem(ctx, "_slang_resolve_attributes() failed"); diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c index 076e982f8f..1645afcc18 100644 --- a/src/mesa/shader/slang/slang_preprocess.c +++ b/src/mesa/shader/slang/slang_preprocess.c @@ -483,6 +483,7 @@ pp_cond_stack_reevaluate (pp_cond_stack *self)  typedef struct  {     GLboolean MESA_shader_debug;        /* GL_MESA_shader_debug enable */ +   GLboolean ARB_texture_rectangle; /* GL_ARB_texture_rectangle enable */  } pp_ext;  /* @@ -498,6 +499,7 @@ static GLvoid  pp_ext_init (pp_ext *self)  {     pp_ext_disable_all (self); +   self->ARB_texture_rectangle = GL_TRUE;     /* Other initialization code goes here. */  } @@ -506,6 +508,8 @@ pp_ext_set (pp_ext *self, const char *name, GLboolean enable)  {     if (_mesa_strcmp (name, "MESA_shader_debug") == 0)        self->MESA_shader_debug = enable; +   else if (_mesa_strcmp (name, "GL_ARB_texture_rectangle") == 0) +      self->ARB_texture_rectangle = enable;     /* Next extension name tests go here. */     else        return GL_FALSE; diff --git a/src/mesa/shader/slang/slang_typeinfo.h b/src/mesa/shader/slang/slang_typeinfo.h index ad5aa3e195..587331e8b1 100644 --- a/src/mesa/shader/slang/slang_typeinfo.h +++ b/src/mesa/shader/slang/slang_typeinfo.h @@ -65,7 +65,6 @@ typedef struct slang_assemble_ctx_     struct slang_label_ *curFuncEndLabel;     struct slang_ir_node_ *CurLoop;     struct slang_function_ *CurFunction; -   GLuint numSamplers;  } slang_assemble_ctx; diff --git a/src/mesa/sources b/src/mesa/sources index a4e2026e4b..5c7ff50cc6 100644 --- a/src/mesa/sources +++ b/src/mesa/sources @@ -245,7 +245,6 @@ ASM_C_SOURCES =	\  	x86/x86.c \  	x86/3dnow.c \  	x86/sse.c \ -	x86/rtasm/x86sse.c \  	sparc/sparc.c \  	ppc/common_ppc.c \  	x86-64/x86-64.c diff --git a/src/mesa/sparc/glapi_sparc.S b/src/mesa/sparc/glapi_sparc.S index b214bef54d..3d1d55fd76 100644 --- a/src/mesa/sparc/glapi_sparc.S +++ b/src/mesa/sparc/glapi_sparc.S @@ -738,10 +738,6 @@ __glapi_sparc_icache_flush: /* %o0 = insn_addr */  		.globl glGetVertexAttribivNV ; .type glGetVertexAttribivNV,#function  		.globl glIsProgramNV ; .type glIsProgramNV,#function  		.globl glLoadProgramNV ; .type glLoadProgramNV,#function -		.globl glProgramParameter4dNV ; .type glProgramParameter4dNV,#function -		.globl glProgramParameter4dvNV ; .type glProgramParameter4dvNV,#function -		.globl glProgramParameter4fNV ; .type glProgramParameter4fNV,#function -		.globl glProgramParameter4fvNV ; .type glProgramParameter4fvNV,#function  		.globl glProgramParameters4dvNV ; .type glProgramParameters4dvNV,#function  		.globl glProgramParameters4fvNV ; .type glProgramParameters4fvNV,#function  		.globl glRequestResidentProgramsNV ; .type glRequestResidentProgramsNV,#function @@ -802,19 +798,19 @@ __glapi_sparc_icache_flush: /* %o0 = insn_addr */  		.globl glSetFragmentShaderConstantATI ; .type glSetFragmentShaderConstantATI,#function  		.globl glPointParameteriNV ; .type glPointParameteriNV,#function  		.globl glPointParameterivNV ; .type glPointParameterivNV,#function +		.globl gl_dispatch_stub_733 ; .type gl_dispatch_stub_733,#function +		.globl gl_dispatch_stub_734 ; .type gl_dispatch_stub_734,#function +		.globl gl_dispatch_stub_735 ; .type gl_dispatch_stub_735,#function +		.globl gl_dispatch_stub_736 ; .type gl_dispatch_stub_736,#function  		.globl gl_dispatch_stub_737 ; .type gl_dispatch_stub_737,#function -		.globl gl_dispatch_stub_738 ; .type gl_dispatch_stub_738,#function -		.globl gl_dispatch_stub_739 ; .type gl_dispatch_stub_739,#function -		.globl gl_dispatch_stub_740 ; .type gl_dispatch_stub_740,#function -		.globl gl_dispatch_stub_741 ; .type gl_dispatch_stub_741,#function  		.globl glGetProgramNamedParameterdvNV ; .type glGetProgramNamedParameterdvNV,#function  		.globl glGetProgramNamedParameterfvNV ; .type glGetProgramNamedParameterfvNV,#function  		.globl glProgramNamedParameter4dNV ; .type glProgramNamedParameter4dNV,#function  		.globl glProgramNamedParameter4dvNV ; .type glProgramNamedParameter4dvNV,#function  		.globl glProgramNamedParameter4fNV ; .type glProgramNamedParameter4fNV,#function  		.globl glProgramNamedParameter4fvNV ; .type glProgramNamedParameter4fvNV,#function -		.globl gl_dispatch_stub_748 ; .type gl_dispatch_stub_748,#function -		.globl gl_dispatch_stub_749 ; .type gl_dispatch_stub_749,#function +		.globl gl_dispatch_stub_744 ; .type gl_dispatch_stub_744,#function +		.globl gl_dispatch_stub_745 ; .type gl_dispatch_stub_745,#function  		.globl glBindFramebufferEXT ; .type glBindFramebufferEXT,#function  		.globl glBindRenderbufferEXT ; .type glBindRenderbufferEXT,#function  		.globl glCheckFramebufferStatusEXT ; .type glCheckFramebufferStatusEXT,#function @@ -832,13 +828,13 @@ __glapi_sparc_icache_flush: /* %o0 = insn_addr */  		.globl glIsFramebufferEXT ; .type glIsFramebufferEXT,#function  		.globl glIsRenderbufferEXT ; .type glIsRenderbufferEXT,#function  		.globl glRenderbufferStorageEXT ; .type glRenderbufferStorageEXT,#function -		.globl gl_dispatch_stub_767 ; .type gl_dispatch_stub_767,#function +		.globl gl_dispatch_stub_763 ; .type gl_dispatch_stub_763,#function  		.globl glFramebufferTextureLayerEXT ; .type glFramebufferTextureLayerEXT,#function +		.globl gl_dispatch_stub_765 ; .type gl_dispatch_stub_765,#function +		.globl gl_dispatch_stub_766 ; .type gl_dispatch_stub_766,#function +		.globl gl_dispatch_stub_767 ; .type gl_dispatch_stub_767,#function +		.globl gl_dispatch_stub_768 ; .type gl_dispatch_stub_768,#function  		.globl gl_dispatch_stub_769 ; .type gl_dispatch_stub_769,#function -		.globl gl_dispatch_stub_770 ; .type gl_dispatch_stub_770,#function -		.globl gl_dispatch_stub_771 ; .type gl_dispatch_stub_771,#function -		.globl gl_dispatch_stub_772 ; .type gl_dispatch_stub_772,#function -		.globl gl_dispatch_stub_773 ; .type gl_dispatch_stub_773,#function  		.globl _mesa_sparc_glapi_begin ; .type _mesa_sparc_glapi_begin,#function  _mesa_sparc_glapi_begin: @@ -1515,10 +1511,6 @@ _mesa_sparc_glapi_begin:  	GL_STUB(glGetVertexAttribivNV, _gloffset_GetVertexAttribivNV)  	GL_STUB(glIsProgramNV, _gloffset_IsProgramNV)  	GL_STUB(glLoadProgramNV, _gloffset_LoadProgramNV) -	GL_STUB(glProgramParameter4dNV, _gloffset_ProgramParameter4dNV) -	GL_STUB(glProgramParameter4dvNV, _gloffset_ProgramParameter4dvNV) -	GL_STUB(glProgramParameter4fNV, _gloffset_ProgramParameter4fNV) -	GL_STUB(glProgramParameter4fvNV, _gloffset_ProgramParameter4fvNV)  	GL_STUB(glProgramParameters4dvNV, _gloffset_ProgramParameters4dvNV)  	GL_STUB(glProgramParameters4fvNV, _gloffset_ProgramParameters4fvNV)  	GL_STUB(glRequestResidentProgramsNV, _gloffset_RequestResidentProgramsNV) @@ -1579,19 +1571,19 @@ _mesa_sparc_glapi_begin:  	GL_STUB(glSetFragmentShaderConstantATI, _gloffset_SetFragmentShaderConstantATI)  	GL_STUB(glPointParameteriNV, _gloffset_PointParameteriNV)  	GL_STUB(glPointParameterivNV, _gloffset_PointParameterivNV) +	GL_STUB(gl_dispatch_stub_733, _gloffset__dispatch_stub_733) +	GL_STUB(gl_dispatch_stub_734, _gloffset__dispatch_stub_734) +	GL_STUB(gl_dispatch_stub_735, _gloffset__dispatch_stub_735) +	GL_STUB(gl_dispatch_stub_736, _gloffset__dispatch_stub_736)  	GL_STUB(gl_dispatch_stub_737, _gloffset__dispatch_stub_737) -	GL_STUB(gl_dispatch_stub_738, _gloffset__dispatch_stub_738) -	GL_STUB(gl_dispatch_stub_739, _gloffset__dispatch_stub_739) -	GL_STUB(gl_dispatch_stub_740, _gloffset__dispatch_stub_740) -	GL_STUB(gl_dispatch_stub_741, _gloffset__dispatch_stub_741)  	GL_STUB(glGetProgramNamedParameterdvNV, _gloffset_GetProgramNamedParameterdvNV)  	GL_STUB(glGetProgramNamedParameterfvNV, _gloffset_GetProgramNamedParameterfvNV)  	GL_STUB(glProgramNamedParameter4dNV, _gloffset_ProgramNamedParameter4dNV)  	GL_STUB(glProgramNamedParameter4dvNV, _gloffset_ProgramNamedParameter4dvNV)  	GL_STUB(glProgramNamedParameter4fNV, _gloffset_ProgramNamedParameter4fNV)  	GL_STUB(glProgramNamedParameter4fvNV, _gloffset_ProgramNamedParameter4fvNV) -	GL_STUB(gl_dispatch_stub_748, _gloffset__dispatch_stub_748) -	GL_STUB(gl_dispatch_stub_749, _gloffset__dispatch_stub_749) +	GL_STUB(gl_dispatch_stub_744, _gloffset__dispatch_stub_744) +	GL_STUB(gl_dispatch_stub_745, _gloffset__dispatch_stub_745)  	GL_STUB(glBindFramebufferEXT, _gloffset_BindFramebufferEXT)  	GL_STUB(glBindRenderbufferEXT, _gloffset_BindRenderbufferEXT)  	GL_STUB(glCheckFramebufferStatusEXT, _gloffset_CheckFramebufferStatusEXT) @@ -1609,13 +1601,13 @@ _mesa_sparc_glapi_begin:  	GL_STUB(glIsFramebufferEXT, _gloffset_IsFramebufferEXT)  	GL_STUB(glIsRenderbufferEXT, _gloffset_IsRenderbufferEXT)  	GL_STUB(glRenderbufferStorageEXT, _gloffset_RenderbufferStorageEXT) -	GL_STUB(gl_dispatch_stub_767, _gloffset__dispatch_stub_767) +	GL_STUB(gl_dispatch_stub_763, _gloffset__dispatch_stub_763)  	GL_STUB(glFramebufferTextureLayerEXT, _gloffset_FramebufferTextureLayerEXT) +	GL_STUB(gl_dispatch_stub_765, _gloffset__dispatch_stub_765) +	GL_STUB(gl_dispatch_stub_766, _gloffset__dispatch_stub_766) +	GL_STUB(gl_dispatch_stub_767, _gloffset__dispatch_stub_767) +	GL_STUB(gl_dispatch_stub_768, _gloffset__dispatch_stub_768)  	GL_STUB(gl_dispatch_stub_769, _gloffset__dispatch_stub_769) -	GL_STUB(gl_dispatch_stub_770, _gloffset__dispatch_stub_770) -	GL_STUB(gl_dispatch_stub_771, _gloffset__dispatch_stub_771) -	GL_STUB(gl_dispatch_stub_772, _gloffset__dispatch_stub_772) -	GL_STUB(gl_dispatch_stub_773, _gloffset__dispatch_stub_773)  		.globl _mesa_sparc_glapi_end ; .type _mesa_sparc_glapi_end,#function  _mesa_sparc_glapi_end: @@ -1710,6 +1702,10 @@ _mesa_sparc_glapi_end:  	.globl glGetVertexAttribdv ; .type glGetVertexAttribdv,#function ; glGetVertexAttribdv = glGetVertexAttribdvARB  	.globl glGetVertexAttribfv ; .type glGetVertexAttribfv,#function ; glGetVertexAttribfv = glGetVertexAttribfvARB  	.globl glGetVertexAttribiv ; .type glGetVertexAttribiv,#function ; glGetVertexAttribiv = glGetVertexAttribivARB +	.globl glProgramParameter4dNV ; .type glProgramParameter4dNV,#function ; glProgramParameter4dNV = glProgramEnvParameter4dARB +	.globl glProgramParameter4dvNV ; .type glProgramParameter4dvNV,#function ; glProgramParameter4dvNV = glProgramEnvParameter4dvARB +	.globl glProgramParameter4fNV ; .type glProgramParameter4fNV,#function ; glProgramParameter4fNV = glProgramEnvParameter4fARB +	.globl glProgramParameter4fvNV ; .type glProgramParameter4fvNV,#function ; glProgramParameter4fvNV = glProgramEnvParameter4fvARB  	.globl glVertexAttrib1d ; .type glVertexAttrib1d,#function ; glVertexAttrib1d = glVertexAttrib1dARB  	.globl glVertexAttrib1dv ; .type glVertexAttrib1dv,#function ; glVertexAttrib1dv = glVertexAttrib1dvARB  	.globl glVertexAttrib1f ; .type glVertexAttrib1f,#function ; glVertexAttrib1f = glVertexAttrib1fARB diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h index 3a63e2dec0..c6c6eba812 100644 --- a/src/mesa/state_tracker/st_atom.h +++ b/src/mesa/state_tracker/st_atom.h @@ -44,20 +44,20 @@ void st_destroy_atoms( struct st_context *st );  void st_validate_state( struct st_context *st ); -const struct st_tracked_state st_update_framebuffer; -const struct st_tracked_state st_update_clip; -const struct st_tracked_state st_update_depth_stencil_alpha; -const struct st_tracked_state st_update_shader; -const struct st_tracked_state st_update_rasterizer; -const struct st_tracked_state st_update_polygon_stipple; -const struct st_tracked_state st_update_viewport; -const struct st_tracked_state st_update_scissor; -const struct st_tracked_state st_update_blend; -const struct st_tracked_state st_update_sampler; -const struct st_tracked_state st_update_texture; -const struct st_tracked_state st_update_fs_constants; -const struct st_tracked_state st_update_vs_constants; -const struct st_tracked_state st_update_pixel_transfer; +extern const struct st_tracked_state st_update_framebuffer; +extern const struct st_tracked_state st_update_clip; +extern const struct st_tracked_state st_update_depth_stencil_alpha; +extern const struct st_tracked_state st_update_shader; +extern const struct st_tracked_state st_update_rasterizer; +extern const struct st_tracked_state st_update_polygon_stipple; +extern const struct st_tracked_state st_update_viewport; +extern const struct st_tracked_state st_update_scissor; +extern const struct st_tracked_state st_update_blend; +extern const struct st_tracked_state st_update_sampler; +extern const struct st_tracked_state st_update_texture; +extern const struct st_tracked_state st_update_fs_constants; +extern const struct st_tracked_state st_update_vs_constants; +extern const struct st_tracked_state st_update_pixel_transfer;  uint st_compare_func_to_pipe(GLenum func); diff --git a/src/mesa/state_tracker/st_atom_blend.c b/src/mesa/state_tracker/st_atom_blend.c index 2a0e92245c..35c09c3e08 100644 --- a/src/mesa/state_tracker/st_atom_blend.c +++ b/src/mesa/state_tracker/st_atom_blend.c @@ -223,15 +223,10 @@ update_blend( struct st_context *st )  const struct st_tracked_state st_update_blend = { -   .name = "st_update_blend", -   .dirty = { -      .mesa = (_NEW_COLOR),  /* XXX _NEW_BLEND someday? */ -      .st  = 0, +   "st_update_blend",					/* name */ +   {							/* dirty */ +      (_NEW_COLOR),  /* XXX _NEW_BLEND someday? */	/* mesa */ +      0,						/* st */     }, -   .update = update_blend +   update_blend,					/* update */  }; - - - - - diff --git a/src/mesa/state_tracker/st_atom_clip.c b/src/mesa/state_tracker/st_atom_clip.c index a6f0568660..23d709b814 100644 --- a/src/mesa/state_tracker/st_atom_clip.c +++ b/src/mesa/state_tracker/st_atom_clip.c @@ -62,15 +62,10 @@ static void update_clip( struct st_context *st )  const struct st_tracked_state st_update_clip = { -   .name = "st_update_clip", -   .dirty = { -      .mesa = (_NEW_TRANSFORM), -      .st  = 0, +   "st_update_clip",					/* name */ +   {							/* dirty */ +      (_NEW_TRANSFORM),					/* mesa */ +      0,						/* st */     }, -   .update = update_clip +   update_clip						/* update */  }; - - - - - diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c index 03093579e1..2856e0f0e0 100644 --- a/src/mesa/state_tracker/st_atom_constbuf.c +++ b/src/mesa/state_tracker/st_atom_constbuf.c @@ -36,7 +36,6 @@  #include "pipe/p_context.h"  #include "pipe/p_defines.h" -#include "pipe/p_winsys.h"  #include "pipe/p_inlines.h"  #include "st_context.h" @@ -54,7 +53,7 @@ void st_upload_constants( struct st_context *st,                            struct gl_program_parameter_list *params,                            unsigned id)  { -   struct pipe_winsys *ws = st->pipe->winsys; +   struct pipe_context *pipe = st->pipe;     struct pipe_constant_buffer *cbuf = &st->state.constants[id];     assert(id == PIPE_SHADER_VERTEX || id == PIPE_SHADER_FRAGMENT); @@ -74,8 +73,8 @@ void st_upload_constants( struct st_context *st,        /* We always need to get a new buffer, to keep the drivers simple and         * avoid gratuitous rendering synchronization.         */ -      pipe_buffer_reference( ws, &cbuf->buffer, NULL ); -      cbuf->buffer = ws->buffer_create( ws, 1, PIPE_BUFFER_USAGE_CONSTANT, +      pipe_reference_buffer(pipe, &cbuf->buffer, NULL ); +      cbuf->buffer = pipe_buffer_create(pipe, 1, PIPE_BUFFER_USAGE_CONSTANT,  					paramBytes );        if (0) @@ -87,9 +86,10 @@ void st_upload_constants( struct st_context *st,        /* load Mesa constants into the constant buffer */        if (cbuf->buffer) { -         memcpy(ws->buffer_map(ws, cbuf->buffer, PIPE_BUFFER_USAGE_CPU_WRITE), -                params->ParameterValues, paramBytes); -         ws->buffer_unmap(ws, cbuf->buffer); +         void *map = pipe_buffer_map(pipe, cbuf->buffer, +                                     PIPE_BUFFER_USAGE_CPU_WRITE); +         memcpy(map, params->ParameterValues, paramBytes); +         pipe_buffer_unmap(pipe, cbuf->buffer);        }        cbuf->size = paramBytes; @@ -113,12 +113,12 @@ static void update_vs_constants(struct st_context *st )  }  const struct st_tracked_state st_update_vs_constants = { -   .name = "st_update_vs_constants", -   .dirty = { -      .mesa  = 0,  /* set dynamically above */ -      .st   = ST_NEW_VERTEX_PROGRAM, +   "st_update_vs_constants",				/* name */ +   {							/* dirty */ +      0,  /* set dynamically above */			/* mesa */ +      ST_NEW_VERTEX_PROGRAM,				/* st */     }, -   .update = update_vs_constants +   update_vs_constants					/* update */  };  /* Fragment shader: @@ -132,11 +132,11 @@ static void update_fs_constants(struct st_context *st )  }  const struct st_tracked_state st_update_fs_constants = { -   .name = "st_update_fs_constants", -   .dirty = { -      .mesa  = 0,  /* set dynamically above */ -      .st   = ST_NEW_FRAGMENT_PROGRAM, +   "st_update_fs_constants",				/* name */ +   {							/* dirty */ +      0,  /* set dynamically above */			/* mesa */ +      ST_NEW_FRAGMENT_PROGRAM,				/* st */     }, -   .update = update_fs_constants +   update_fs_constants					/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_depth.c b/src/mesa/state_tracker/st_atom_depth.c index ef467582c0..0e791ceb20 100644 --- a/src/mesa/state_tracker/st_atom_depth.c +++ b/src/mesa/state_tracker/st_atom_depth.c @@ -142,10 +142,10 @@ update_depth_stencil_alpha(struct st_context *st)  const struct st_tracked_state st_update_depth_stencil_alpha = { -   .name = "st_update_depth_stencil", -   .dirty = { -      .mesa = (_NEW_DEPTH|_NEW_STENCIL|_NEW_COLOR), -      .st  = 0, +   "st_update_depth_stencil",				/* name */ +   {							/* dirty */ +      (_NEW_DEPTH|_NEW_STENCIL|_NEW_COLOR),		/* mesa */ +      0,						/* st */     }, -   .update = update_depth_stencil_alpha +   update_depth_stencil_alpha				/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_fixedfunction.c b/src/mesa/state_tracker/st_atom_fixedfunction.c index 3f137e1633..165567af70 100644 --- a/src/mesa/state_tracker/st_atom_fixedfunction.c +++ b/src/mesa/state_tracker/st_atom_fixedfunction.c @@ -55,12 +55,12 @@ static void update_tnl( struct st_context *st )  const struct st_tracked_state st_update_tnl = { -   .name = "st_update_tnl", -   .dirty = { -      .mesa  = TNL_FIXED_FUNCTION_STATE_FLAGS, -      .st   = 0 +   "st_update_tnl",					/* name */ +   {							/* dirty */ +      TNL_FIXED_FUNCTION_STATE_FLAGS,			/* mesa */ +      0							/* st */     }, -   .update = update_tnl +   update_tnl						/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index 02573af8f0..0a6974d8a7 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -48,7 +48,7 @@ update_framebuffer_state( struct st_context *st )     struct pipe_framebuffer_state *framebuffer = &st->state.framebuffer;     struct gl_framebuffer *fb = st->ctx->DrawBuffer;     struct st_renderbuffer *strb; -   GLuint i; +   GLuint i, j;     memset(framebuffer, 0, sizeof(*framebuffer)); @@ -58,11 +58,14 @@ update_framebuffer_state( struct st_context *st )     /* Examine Mesa's ctx->DrawBuffer->_ColorDrawBuffers state      * to determine which surfaces to draw to      */ -   framebuffer->num_cbufs = fb->_NumColorDrawBuffers[0]; -   for (i = 0; i < framebuffer->num_cbufs; i++) { -      strb = st_renderbuffer(fb->_ColorDrawBuffers[0][i]); -      assert(strb->surface); -      framebuffer->cbufs[i] = strb->surface; +   framebuffer->num_cbufs = 0; +   for (j = 0; j < MAX_DRAW_BUFFERS; j++) { +      for (i = 0; i < fb->_NumColorDrawBuffers[j]; i++) { +         strb = st_renderbuffer(fb->_ColorDrawBuffers[j][i]); +         assert(strb->surface); +         framebuffer->cbufs[framebuffer->num_cbufs] = strb->surface; +         framebuffer->num_cbufs++; +      }     }     strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer); @@ -81,15 +84,23 @@ update_framebuffer_state( struct st_context *st )     }     cso_set_framebuffer(st->cso_context, framebuffer); + +   if (fb->_ColorDrawBufferMask[0] & BUFFER_BIT_FRONT_LEFT) { +      if (st->frontbuffer_status == FRONT_STATUS_COPY_OF_BACK) { +         /* XXX copy back buf to front? */ +      } +      /* we're assuming we'll really draw to the front buffer */ +      st->frontbuffer_status = FRONT_STATUS_DIRTY; +   }  }  const struct st_tracked_state st_update_framebuffer = { -   .name = "st_update_framebuffer", -   .dirty = { -      .mesa = _NEW_BUFFERS, -      .st  = 0, +   "st_update_framebuffer",				/* name */ +   {							/* dirty */ +      _NEW_BUFFERS,					/* mesa */ +      0,						/* st */     }, -   .update = update_framebuffer_state +   update_framebuffer_state				/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_pixeltransfer.c b/src/mesa/state_tracker/st_atom_pixeltransfer.c index 6410e7cb24..999c148449 100644 --- a/src/mesa/state_tracker/st_atom_pixeltransfer.c +++ b/src/mesa/state_tracker/st_atom_pixeltransfer.c @@ -42,14 +42,22 @@  #include "shader/prog_print.h"  #include "st_context.h" +#include "st_format.h"  #include "st_program.h" +#include "st_texture.h" +#include "pipe/p_screen.h" +#include "pipe/p_context.h" +#include "pipe/p_inlines.h" +#include "util/u_pack_color.h"  struct state_key  {     GLuint scaleAndBias:1;     GLuint colorMatrix:1; +   GLuint colorMatrixPostScaleBias:1; +   GLuint pixelMaps:1;  #if 0     GLfloat Maps[3][256][4]; @@ -80,6 +88,9 @@ is_identity(const GLfloat m[16])  static void  make_state_key(GLcontext *ctx,  struct state_key *key)  { +   static const GLfloat zero[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; +   static const GLfloat one[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; +     memset(key, 0, sizeof(*key));     if (ctx->Pixel.RedBias != 0.0 || ctx->Pixel.RedScale != 1.0 || @@ -92,9 +103,76 @@ make_state_key(GLcontext *ctx,  struct state_key *key)     if (!is_identity(ctx->ColorMatrixStack.Top->m)) {        key->colorMatrix = 1;     } + +   if (!TEST_EQ_4V(ctx->Pixel.PostColorMatrixScale, one) || +       !TEST_EQ_4V(ctx->Pixel.PostColorMatrixBias, zero)) { +      key->colorMatrixPostScaleBias = 1; +   } + +   key->pixelMaps = ctx->Pixel.MapColorFlag;  } +static struct pipe_texture * +create_color_map_texture(GLcontext *ctx) +{ +   struct pipe_context *pipe = ctx->st->pipe; +   struct pipe_texture *pt; +   enum pipe_format format; +   const uint texSize = 256; /* simple, and usually perfect */ + +   /* find an RGBA texture format */ +   format = st_choose_format(pipe, GL_RGBA, PIPE_TEXTURE); + +   /* create texture for color map/table */ +   pt = st_texture_create(ctx->st, PIPE_TEXTURE_2D, format, 0, +                          texSize, texSize, 1, 0); +   return pt; +} + + +/** + * Update the pixelmap texture with the contents of the R/G/B/A pixel maps. + */ +static void +load_color_map_texture(GLcontext *ctx, struct pipe_texture *pt) +{ +   struct pipe_context *pipe = ctx->st->pipe; +   struct pipe_screen *screen = pipe->screen; +   struct pipe_surface *surface; +   const GLuint rSize = ctx->PixelMaps.RtoR.Size; +   const GLuint gSize = ctx->PixelMaps.GtoG.Size; +   const GLuint bSize = ctx->PixelMaps.BtoB.Size; +   const GLuint aSize = ctx->PixelMaps.AtoA.Size; +   const uint texSize = pt->width[0]; +   uint *dest; +   uint i, j; + +   surface = screen->get_tex_surface(screen, pt, 0, 0, 0); +   dest = (uint *) pipe_surface_map(surface); + +   /* Pack four 1D maps into a 2D texture: +    * R map is placed horizontally, indexed by S, in channel 0 +    * G map is placed vertically, indexed by T, in channel 1 +    * B map is placed horizontally, indexed by S, in channel 2 +    * A map is placed vertically, indexed by T, in channel 3 +    */ +   for (i = 0; i < texSize; i++) { +      for (j = 0; j < texSize; j++) { +         int k = (i * texSize + j); +         ubyte r = ctx->PixelMaps.RtoR.Map8[j * rSize / texSize]; +         ubyte g = ctx->PixelMaps.GtoG.Map8[i * gSize / texSize]; +         ubyte b = ctx->PixelMaps.BtoB.Map8[j * bSize / texSize]; +         ubyte a = ctx->PixelMaps.AtoA.Map8[i * aSize / texSize]; +         util_pack_color_ub(r, g, b, a, pt->format, dest + k); +      } +   } + +   pipe_surface_unmap(surface); +   pipe_surface_reference(&surface, NULL); +   pipe->texture_update(pipe, pt, 0, 0x1); +} +  #define MAX_INST 100 @@ -105,6 +183,7 @@ make_state_key(GLcontext *ctx,  struct state_key *key)  static struct gl_fragment_program *  get_pixel_transfer_program(GLcontext *ctx, const struct state_key *key)  { +   struct st_context *st = ctx->st;     struct prog_instruction inst[MAX_INST];     struct gl_program_parameter_list *params;     struct gl_fragment_program *fp; @@ -118,7 +197,10 @@ get_pixel_transfer_program(GLcontext *ctx, const struct state_key *key)     params = _mesa_new_parameter_list(); -   /* TEX colorTemp, fragment.texcoord[0], texture[0], 2D; */ +   /* +    * Get initial pixel color from the texture. +    * TEX colorTemp, fragment.texcoord[0], texture[0], 2D; +    */     _mesa_init_instructions(inst + ic, 1);     inst[ic].Opcode = OPCODE_TEX;     inst[ic].DstReg.File = PROGRAM_TEMPORARY; @@ -132,7 +214,6 @@ get_pixel_transfer_program(GLcontext *ctx, const struct state_key *key)     fp->Base.OutputsWritten = (1 << FRAG_RESULT_COLR);     fp->Base.SamplersUsed = 0x1;  /* sampler 0 (bit 0) is used */ -   /* MAD colorTemp, colorTemp, scale, bias; */     if (key->scaleAndBias) {        static const gl_state_index scale_state[STATE_LENGTH] =           { STATE_INTERNAL, STATE_PT_SCALE, 0, 0, 0 }; @@ -153,6 +234,7 @@ get_pixel_transfer_program(GLcontext *ctx, const struct state_key *key)        scale_p = _mesa_add_state_reference(params, scale_state);        bias_p = _mesa_add_state_reference(params, bias_state); +      /* MAD colorTemp, colorTemp, scale, bias; */        _mesa_init_instructions(inst + ic, 1);        inst[ic].Opcode = OPCODE_MAD;        inst[ic].DstReg.File = PROGRAM_TEMPORARY; @@ -166,6 +248,56 @@ get_pixel_transfer_program(GLcontext *ctx, const struct state_key *key)        ic++;     } +   if (key->pixelMaps) { +      const GLuint temp = 1; + +      /* create the colormap/texture now if not already done */ +      if (!st->pixel_xfer.pixelmap_texture) { +         st->pixel_xfer.pixelmap_texture = create_color_map_texture(ctx); +      } + +      /* with a little effort, we can do four pixel map look-ups with +       * two TEX instructions: +       */ + +      /* TEX temp.rg, colorTemp.rgba, texture[1], 2D; */ +      _mesa_init_instructions(inst + ic, 1); +      inst[ic].Opcode = OPCODE_TEX; +      inst[ic].DstReg.File = PROGRAM_TEMPORARY; +      inst[ic].DstReg.Index = temp; +      inst[ic].DstReg.WriteMask = WRITEMASK_XY; /* write R,G */ +      inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; +      inst[ic].SrcReg[0].Index = colorTemp; +      inst[ic].TexSrcUnit = 1; +      inst[ic].TexSrcTarget = TEXTURE_2D_INDEX; +      ic++; + +      /* TEX temp.ba, colorTemp.baba, texture[1], 2D; */ +      _mesa_init_instructions(inst + ic, 1); +      inst[ic].Opcode = OPCODE_TEX; +      inst[ic].DstReg.File = PROGRAM_TEMPORARY; +      inst[ic].DstReg.Index = temp; +      inst[ic].DstReg.WriteMask = WRITEMASK_ZW; /* write B,A */ +      inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; +      inst[ic].SrcReg[0].Index = colorTemp; +      inst[ic].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_W, +                                                 SWIZZLE_Z, SWIZZLE_W); +      inst[ic].TexSrcUnit = 1; +      inst[ic].TexSrcTarget = TEXTURE_2D_INDEX; +      ic++; + +      /* MOV colorTemp, temp; */ +      _mesa_init_instructions(inst + ic, 1); +      inst[ic].Opcode = OPCODE_MOV; +      inst[ic].DstReg.File = PROGRAM_TEMPORARY; +      inst[ic].DstReg.Index = colorTemp; +      inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; +      inst[ic].SrcReg[0].Index = temp; +      ic++; + +      fp->Base.SamplersUsed |= (1 << 1);  /* sampler 1 is used */ +   } +     if (key->colorMatrix) {        static const gl_state_index row0_state[STATE_LENGTH] =           { STATE_COLOR_MATRIX, 0, 0, 0, 0 }; @@ -182,64 +314,85 @@ get_pixel_transfer_program(GLcontext *ctx, const struct state_key *key)        GLint row3_p = _mesa_add_state_reference(params, row3_state);        const GLuint temp = 1; -      /* MOV temp, colorTemp; */ -      _mesa_init_instructions(inst + ic, 1); -      inst[ic].Opcode = OPCODE_MOV; -      inst[ic].DstReg.File = PROGRAM_TEMPORARY; -      inst[ic].DstReg.Index = temp; -      inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; -      inst[ic].SrcReg[0].Index = colorTemp; -      ic++; - -      /* XXX reimplement in terms of MUL/MAD (see t_vp_build.c) */ - -      /* DP4 colorTemp.x, temp, matrow0; */ +      /* DP4 temp.x, colorTemp, matrow0; */        _mesa_init_instructions(inst + ic, 1);        inst[ic].Opcode = OPCODE_DP4;        inst[ic].DstReg.File = PROGRAM_TEMPORARY; -      inst[ic].DstReg.Index = colorTemp; +      inst[ic].DstReg.Index = temp;        inst[ic].DstReg.WriteMask = WRITEMASK_X;        inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; -      inst[ic].SrcReg[0].Index = temp; +      inst[ic].SrcReg[0].Index = colorTemp;        inst[ic].SrcReg[1].File = PROGRAM_STATE_VAR;        inst[ic].SrcReg[1].Index = row0_p;        ic++; -      /* DP4 colorTemp.y, temp, matrow1; */ +      /* DP4 temp.y, colorTemp, matrow1; */        _mesa_init_instructions(inst + ic, 1);        inst[ic].Opcode = OPCODE_DP4;        inst[ic].DstReg.File = PROGRAM_TEMPORARY; -      inst[ic].DstReg.Index = colorTemp; +      inst[ic].DstReg.Index = temp;        inst[ic].DstReg.WriteMask = WRITEMASK_Y;        inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; -      inst[ic].SrcReg[0].Index = temp; +      inst[ic].SrcReg[0].Index = colorTemp;        inst[ic].SrcReg[1].File = PROGRAM_STATE_VAR;        inst[ic].SrcReg[1].Index = row1_p;        ic++; -      /* DP4 colorTemp.z, temp, matrow2; */ +      /* DP4 temp.z, colorTemp, matrow2; */        _mesa_init_instructions(inst + ic, 1);        inst[ic].Opcode = OPCODE_DP4;        inst[ic].DstReg.File = PROGRAM_TEMPORARY; -      inst[ic].DstReg.Index = colorTemp; +      inst[ic].DstReg.Index = temp;        inst[ic].DstReg.WriteMask = WRITEMASK_Z;        inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; -      inst[ic].SrcReg[0].Index = temp; +      inst[ic].SrcReg[0].Index = colorTemp;        inst[ic].SrcReg[1].File = PROGRAM_STATE_VAR;        inst[ic].SrcReg[1].Index = row2_p;        ic++; -      /* DP4 colorTemp.w, temp, matrow3; */ +      /* DP4 temp.w, colorTemp, matrow3; */        _mesa_init_instructions(inst + ic, 1);        inst[ic].Opcode = OPCODE_DP4;        inst[ic].DstReg.File = PROGRAM_TEMPORARY; -      inst[ic].DstReg.Index =colorTemp; +      inst[ic].DstReg.Index = temp;        inst[ic].DstReg.WriteMask = WRITEMASK_W;        inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; -      inst[ic].SrcReg[0].Index = temp; +      inst[ic].SrcReg[0].Index = colorTemp;        inst[ic].SrcReg[1].File = PROGRAM_STATE_VAR;        inst[ic].SrcReg[1].Index = row3_p;        ic++; + +      /* MOV colorTemp, temp; */ +      _mesa_init_instructions(inst + ic, 1); +      inst[ic].Opcode = OPCODE_MOV; +      inst[ic].DstReg.File = PROGRAM_TEMPORARY; +      inst[ic].DstReg.Index = colorTemp; +      inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; +      inst[ic].SrcReg[0].Index = temp; +      ic++; +   } + +   if (key->colorMatrixPostScaleBias) { +      static const gl_state_index scale_state[STATE_LENGTH] = +         { STATE_INTERNAL, STATE_PT_SCALE, 0, 0, 0 }; +      static const gl_state_index bias_state[STATE_LENGTH] = +         { STATE_INTERNAL, STATE_PT_BIAS, 0, 0, 0 }; +      GLint scale_param, bias_param; + +      scale_param = _mesa_add_state_reference(params, scale_state); +      bias_param = _mesa_add_state_reference(params, bias_state); + +      _mesa_init_instructions(inst + ic, 1); +      inst[ic].Opcode = OPCODE_MAD; +      inst[ic].DstReg.File = PROGRAM_TEMPORARY; +      inst[ic].DstReg.Index = colorTemp; +      inst[ic].SrcReg[0].File = PROGRAM_TEMPORARY; +      inst[ic].SrcReg[0].Index = colorTemp; +      inst[ic].SrcReg[1].File = PROGRAM_STATE_VAR; +      inst[ic].SrcReg[1].Index = scale_param; +      inst[ic].SrcReg[2].File = PROGRAM_STATE_VAR; +      inst[ic].SrcReg[2].Index = bias_param; +      ic++;     }     /* Modify last instruction's dst reg to write to result.color */ @@ -285,6 +438,7 @@ get_pixel_transfer_program(GLcontext *ctx, const struct state_key *key)  static void  update_pixel_transfer(struct st_context *st)  { +   GLcontext *ctx = st->ctx;     struct state_key key;     struct gl_fragment_program *fp; @@ -298,16 +452,21 @@ update_pixel_transfer(struct st_context *st)                                   &key, sizeof(key), &fp->Base);     } +   if (ctx->Pixel.MapColorFlag) { +      load_color_map_texture(ctx, st->pixel_xfer.pixelmap_texture); +   } +   st->pixel_xfer.pixelmap_enabled = ctx->Pixel.MapColorFlag; +     st->pixel_xfer.program = (struct st_fragment_program *) fp;  }  const struct st_tracked_state st_update_pixel_transfer = { -   .name = "st_update_pixel_transfer", -   .dirty = { -      .mesa = _NEW_PIXEL | _NEW_COLOR_MATRIX, -      .st  = 0, +   "st_update_pixel_transfer",				/* name */ +   {							/* dirty */ +      _NEW_PIXEL | _NEW_COLOR_MATRIX,			/* mesa */ +      0,						/* st */     }, -   .update = update_pixel_transfer +   update_pixel_transfer				/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c index bb14cf9045..87a91d56d0 100644 --- a/src/mesa/state_tracker/st_atom_rasterizer.c +++ b/src/mesa/state_tracker/st_atom_rasterizer.c @@ -267,11 +267,11 @@ static void update_raster_state( struct st_context *st )  }  const struct st_tracked_state st_update_rasterizer = { -   .name = "st_update_rasterizer", -   .dirty = { -      .mesa = (_NEW_LIGHT | _NEW_POLYGON | _NEW_LINE | _NEW_SCISSOR | -               _NEW_POINT | _NEW_BUFFERS | _NEW_MULTISAMPLE), -      .st  = 0, +   "st_update_rasterizer",					/* name */ +   {								/* dirty */ +      (_NEW_LIGHT | _NEW_POLYGON | _NEW_LINE | _NEW_SCISSOR |	/* mesa */ +               _NEW_POINT | _NEW_BUFFERS | _NEW_MULTISAMPLE),	 +      0,							/* st */     }, -   .update = update_raster_state +   update_raster_state						/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index 5dd242ac66..10283d31a1 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -32,11 +32,14 @@    */ +#include "main/macros.h" +  #include "st_context.h"  #include "st_atom.h"  #include "st_program.h"  #include "pipe/p_context.h"  #include "pipe/p_defines.h" +  #include "cso_cache/cso_context.h" @@ -147,17 +150,14 @@ update_samplers(struct st_context *st)              sampler->normalized_coords = 1;           sampler->lod_bias = st->ctx->Texture.Unit[su].LodBias; -#if 1 -         sampler->min_lod = (texobj->MinLod) < 0.0 ? 0.0 : texobj->MinLod; -         sampler->max_lod = texobj->MaxLod; -#else -         /* min/max lod should really be as follows (untested). -          * Also, calculate_first_last_level() needs to be overhauled -          * since today's hardware had real support for LOD clamping. -          */ -         sampler->min_lod = MAX2(texobj->BaseLevel, texobj->MinLod); -         sampler->max_lod = MIN2(texobj->MaxLevel, texobj->MaxLod); -#endif +         sampler->min_lod = MAX2(0.0f, texobj->MinLod); +         sampler->max_lod = MIN2(texobj->MaxLevel - texobj->BaseLevel, +                                 texobj->MaxLod); + +         sampler->border_color[0] = texobj->BorderColor[RCOMP]; +         sampler->border_color[1] = texobj->BorderColor[GCOMP]; +         sampler->border_color[2] = texobj->BorderColor[BCOMP]; +         sampler->border_color[3] = texobj->BorderColor[ACOMP];  	 sampler->max_anisotropy = texobj->MaxAnisotropy;           if (sampler->max_anisotropy > 1.0) { @@ -188,15 +188,10 @@ update_samplers(struct st_context *st)  const struct st_tracked_state st_update_sampler = { -   .name = "st_update_sampler", -   .dirty = { -      .mesa = _NEW_TEXTURE, -      .st  = 0, +   "st_update_sampler",					/* name */ +   {							/* dirty */ +      _NEW_TEXTURE,					/* mesa */ +      0,						/* st */     }, -   .update = update_samplers +   update_samplers					/* update */  }; - - - - - diff --git a/src/mesa/state_tracker/st_atom_scissor.c b/src/mesa/state_tracker/st_atom_scissor.c index 59601e91a1..f5db492403 100644 --- a/src/mesa/state_tracker/st_atom_scissor.c +++ b/src/mesa/state_tracker/st_atom_scissor.c @@ -83,15 +83,10 @@ update_scissor( struct st_context *st )  const struct st_tracked_state st_update_scissor = { -   .name = "st_update_scissor", -   .dirty = { -      .mesa = (_NEW_SCISSOR | _NEW_BUFFERS), -      .st  = 0, +   "st_update_scissor",					/* name */ +   {							/* dirty */ +      (_NEW_SCISSOR | _NEW_BUFFERS),			/* mesa */ +      0,						/* st */     }, -   .update = update_scissor +   update_scissor					/* update */  }; - - - - - diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index ec39026eb3..7745591afb 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -39,6 +39,7 @@  #include "main/imports.h"  #include "main/mtypes.h" +#include "shader/program.h"  #include "pipe/p_context.h"  #include "pipe/p_shader_tokens.h" @@ -264,27 +265,29 @@ update_linkage( struct st_context *st )      */     assert(st->ctx->VertexProgram._Current);     stvp = st_vertex_program(st->ctx->VertexProgram._Current); +   assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB);     assert(st->ctx->FragmentProgram._Current);     stfp = st_fragment_program(st->ctx->FragmentProgram._Current); +   assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB);     xvp = find_translated_vp(st, stvp, stfp); -   st->vp = stvp; -   st->fp = stfp; +   st_reference_vertprog(st, &st->vp, stvp); +   st_reference_fragprog(st, &st->fp, stfp); -   st->pipe->bind_vs_state(st->pipe, stvp->driver_shader); -   st->pipe->bind_fs_state(st->pipe, stfp->driver_shader); +   cso_set_vertex_shader_handle(st->cso_context, stvp->driver_shader); +   cso_set_fragment_shader_handle(st->cso_context, stfp->driver_shader);     st->vertex_result_to_slot = xvp->output_to_slot;  }  const struct st_tracked_state st_update_shader = { -   .name = "st_update_shader", -   .dirty = { -      .mesa  = 0, -      .st   = ST_NEW_VERTEX_PROGRAM | ST_NEW_FRAGMENT_PROGRAM +   "st_update_shader",					/* name */ +   {							/* dirty */ +      0,						/* mesa */ +      ST_NEW_VERTEX_PROGRAM | ST_NEW_FRAGMENT_PROGRAM	/* st */     }, -   .update = update_linkage +   update_linkage					/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_stipple.c b/src/mesa/state_tracker/st_atom_stipple.c index c91214059a..f395930ab4 100644 --- a/src/mesa/state_tracker/st_atom_stipple.c +++ b/src/mesa/state_tracker/st_atom_stipple.c @@ -54,10 +54,10 @@ update_stipple( struct st_context *st )  const struct st_tracked_state st_update_polygon_stipple = { -   .name = "st_update_polygon_stipple", -   .dirty = { -      .mesa = (_NEW_POLYGONSTIPPLE), -      .st  = 0, +   "st_update_polygon_stipple",				/* name */ +   {							/* dirty */ +      (_NEW_POLYGONSTIPPLE),				/* mesa */ +      0,						/* st */     }, -   .update = update_stipple +   update_stipple					/* update */  }; diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index 01c07dc26d..767654f3d0 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -38,6 +38,23 @@  #include "st_cb_texture.h"  #include "pipe/p_context.h"  #include "pipe/p_inlines.h" +#include "cso_cache/cso_context.h" +#include "util/u_simple_shaders.h" + + +static void * +get_passthrough_fs(struct st_context *st) +{ +   struct pipe_shader_state shader; + +   if (!st->passthrough_fs) { +      st->passthrough_fs = +         util_make_fragment_passthrough_shader(st->pipe, &shader); +      free((void *) shader.tokens); +   } + +   return st->passthrough_fs; +}  /** @@ -49,6 +66,7 @@ update_textures(struct st_context *st)  {     struct gl_fragment_program *fprog = st->ctx->FragmentProgram._Current;     GLuint su; +   GLboolean missing_textures = GL_FALSE;     st->state.num_textures = 0; @@ -67,10 +85,13 @@ update_textures(struct st_context *st)              retval = st_finalize_texture(st->ctx, st->pipe, texObj, &flush);              if (!retval) {                 /* out of mem */ +               missing_textures = GL_TRUE;                 continue;              }              st->state.num_textures = su + 1; + +            stObj->teximage_realloc = TRUE;           }           pt = st_get_stobj_texture(stObj); @@ -79,21 +100,23 @@ update_textures(struct st_context *st)        pipe_texture_reference(&st->state.sampler_texture[su], pt);     } -   st->pipe->set_sampler_textures(st->pipe, st->state.num_textures, -                                  st->state.sampler_texture); +   cso_set_sampler_textures(st->cso_context, +                            st->state.num_textures, +                            st->state.sampler_texture); + +   if (missing_textures) { +      /* use a pass-through frag shader that uses no textures */ +      void *fs = get_passthrough_fs(st); +      cso_set_fragment_shader_handle(st->cso_context, fs); +   }  }  const struct st_tracked_state st_update_texture = { -   .name = "st_update_texture", -   .dirty = { -      .mesa = _NEW_TEXTURE, -      .st  = ST_NEW_FRAGMENT_PROGRAM, +   "st_update_texture",					/* name */ +   {							/* dirty */ +      _NEW_TEXTURE,					/* mesa */ +      ST_NEW_FRAGMENT_PROGRAM,				/* st */     }, -   .update = update_textures +   update_textures					/* update */  }; - - - - - diff --git a/src/mesa/state_tracker/st_atom_viewport.c b/src/mesa/state_tracker/st_atom_viewport.c index eb3f62cfbe..4b51521470 100644 --- a/src/mesa/state_tracker/st_atom_viewport.c +++ b/src/mesa/state_tracker/st_atom_viewport.c @@ -82,10 +82,10 @@ update_viewport( struct st_context *st )  const struct st_tracked_state st_update_viewport = { -   .name = "st_update_viewport", -   .dirty = { -      .mesa = _NEW_BUFFERS | _NEW_VIEWPORT, -      .st = 0, +   "st_update_viewport",				/* name */ +   {							/* dirty */ +      _NEW_BUFFERS | _NEW_VIEWPORT,			/* mesa */ +      0,						/* st */     }, -   .update = update_viewport +   update_viewport					/* update */  }; diff --git a/src/mesa/state_tracker/st_cache.c b/src/mesa/state_tracker/st_cache.c deleted file mode 100644 index 7ee4fadc37..0000000000 --- a/src/mesa/state_tracker/st_cache.c +++ /dev/null @@ -1,181 +0,0 @@ -/************************************************************************** - * - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: -  *   Zack Rusin <zack@tungstengraphics.com> -  */ - -#include "st_cache.h" - -#include "st_context.h" - -#include "pipe/p_state.h" - -#include "cso_cache/cso_cache.h" -#include "cso_cache/cso_hash.h" - - -/* Those function will either find the state of the given template - * in the cache or they will create a new state from the given - * template, insert it in the cache and return it. - */ - -/* - * If the driver returns 0 from the create method then they will assign - * the data member of the cso to be the template itself. - */ - -const struct cso_blend * st_cached_blend_state(struct st_context *st, -                                               const struct pipe_blend_state *templ) -{ -   unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_blend_state)); -   struct cso_hash_iter iter = cso_find_state_template(st->cache, -                                                       hash_key, CSO_BLEND, -                                                       (void*)templ); -   if (cso_hash_iter_is_null(iter)) { -      struct cso_blend *cso = malloc(sizeof(struct cso_blend)); -      memcpy(&cso->state, templ, sizeof(struct pipe_blend_state)); -      cso->data = st->pipe->create_blend_state(st->pipe, &cso->state); -      if (!cso->data) -         cso->data = &cso->state; -      cso->delete_state = (cso_state_callback)st->pipe->delete_blend_state; -      cso->context = st->pipe; -      iter = cso_insert_state(st->cache, hash_key, CSO_BLEND, cso); -   } -   return ((struct cso_blend *)cso_hash_iter_data(iter)); -} - -const struct cso_sampler * -st_cached_sampler_state(struct st_context *st, -                        const struct pipe_sampler_state *templ) -{ -   unsigned hash_key = cso_construct_key((void*)templ, sizeof(struct pipe_sampler_state)); -   struct cso_hash_iter iter = cso_find_state_template(st->cache, -                                                       hash_key, CSO_SAMPLER, -                                                       (void*)templ); -   if (cso_hash_iter_is_null(iter)) { -      struct cso_sampler *cso = malloc(sizeof(struct cso_sampler)); -      memcpy(&cso->state, templ, sizeof(struct pipe_sampler_state)); -      cso->data = st->pipe->create_sampler_state(st->pipe, &cso->state); -      if (!cso->data) -         cso->data = &cso->state; -      cso->delete_state = (cso_state_callback)st->pipe->delete_sampler_state; -      cso->context = st->pipe; -      iter = cso_insert_state(st->cache, hash_key, CSO_SAMPLER, cso); -   } -   return (struct cso_sampler*)(cso_hash_iter_data(iter)); -} - -const struct cso_depth_stencil_alpha * -st_cached_depth_stencil_alpha_state(struct st_context *st, -                              const struct pipe_depth_stencil_alpha_state *templ) -{ -   unsigned hash_key = cso_construct_key((void*)templ, -                                         sizeof(struct pipe_depth_stencil_alpha_state)); -   struct cso_hash_iter iter = cso_find_state_template(st->cache, -                                                       hash_key,  -						       CSO_DEPTH_STENCIL_ALPHA, -                                                       (void*)templ); -   if (cso_hash_iter_is_null(iter)) { -      struct cso_depth_stencil_alpha *cso = malloc(sizeof(struct cso_depth_stencil_alpha)); -      memcpy(&cso->state, templ, sizeof(struct pipe_depth_stencil_alpha_state)); -      cso->data = st->pipe->create_depth_stencil_alpha_state(st->pipe, &cso->state); -      if (!cso->data) -         cso->data = &cso->state; -      cso->delete_state = (cso_state_callback)st->pipe->delete_depth_stencil_alpha_state; -      cso->context = st->pipe; -      iter = cso_insert_state(st->cache, hash_key, CSO_DEPTH_STENCIL_ALPHA, cso); -   } -   return (struct cso_depth_stencil_alpha*)(cso_hash_iter_data(iter)); -} - -const struct cso_rasterizer* st_cached_rasterizer_state( -   struct st_context *st, -   const struct pipe_rasterizer_state *templ) -{ -   unsigned hash_key = cso_construct_key((void*)templ, -                                         sizeof(struct pipe_rasterizer_state)); -   struct cso_hash_iter iter = cso_find_state_template(st->cache, -                                                       hash_key, CSO_RASTERIZER, -                                                       (void*)templ); -   if (cso_hash_iter_is_null(iter)) { -      struct cso_rasterizer *cso = malloc(sizeof(struct cso_rasterizer)); -      memcpy(&cso->state, templ, sizeof(struct pipe_rasterizer_state)); -      cso->data = st->pipe->create_rasterizer_state(st->pipe, &cso->state); -      if (!cso->data) -         cso->data = &cso->state; -      cso->delete_state = (cso_state_callback)st->pipe->delete_rasterizer_state; -      cso->context = st->pipe; -      iter = cso_insert_state(st->cache, hash_key, CSO_RASTERIZER, cso); -   } -   return (struct cso_rasterizer*)(cso_hash_iter_data(iter)); -} - -const struct cso_fragment_shader * -st_cached_fs_state(struct st_context *st, -                   const struct pipe_shader_state *templ) -{ -   unsigned hash_key = cso_construct_key((void*)templ, -                                         sizeof(struct pipe_shader_state)); -   struct cso_hash_iter iter = cso_find_state_template(st->cache, -                                                       hash_key, CSO_FRAGMENT_SHADER, -                                                       (void*)templ); -   if (cso_hash_iter_is_null(iter)) { -      struct cso_fragment_shader *cso = malloc(sizeof(struct cso_fragment_shader)); -      memcpy(&cso->state, templ, sizeof(struct pipe_shader_state)); -      cso->data = st->pipe->create_fs_state(st->pipe, &cso->state); -      if (!cso->data) -         cso->data = &cso->state; -      cso->delete_state = (cso_state_callback)st->pipe->delete_fs_state; -      cso->context = st->pipe; -      iter = cso_insert_state(st->cache, hash_key, CSO_FRAGMENT_SHADER, cso); -   } -   return (struct cso_fragment_shader*)(cso_hash_iter_data(iter)); -} - -const struct cso_vertex_shader * -st_cached_vs_state(struct st_context *st, -                   const struct pipe_shader_state *templ) -{ -   unsigned hash_key = cso_construct_key((void*)templ, -                                         sizeof(struct pipe_shader_state)); -   struct cso_hash_iter iter = cso_find_state_template(st->cache, -                                                       hash_key, CSO_VERTEX_SHADER, -                                                       (void*)templ); -   if (cso_hash_iter_is_null(iter)) { -      struct cso_vertex_shader *cso = malloc(sizeof(struct cso_vertex_shader)); -      memcpy(&cso->state, templ, sizeof(struct pipe_shader_state)); -      cso->data = st->pipe->create_vs_state(st->pipe, &cso->state); -      if (!cso->data) -         cso->data = &cso->state; -      cso->delete_state = (cso_state_callback)st->pipe->delete_vs_state; -      cso->context = st->pipe; -      iter = cso_insert_state(st->cache, hash_key, CSO_VERTEX_SHADER, cso); -   } -   return (struct cso_vertex_shader*)(cso_hash_iter_data(iter)); -} diff --git a/src/mesa/state_tracker/st_cb_accum.c b/src/mesa/state_tracker/st_cb_accum.c index a623d0bcc0..1636bed91a 100644 --- a/src/mesa/state_tracker/st_cb_accum.c +++ b/src/mesa/state_tracker/st_cb_accum.c @@ -56,54 +56,125 @@   */ +/** + * Wrapper for pipe_get_tile_rgba().  Do format/cpp override to make the + * tile util function think the surface is 16bit/channel, even if it's not. + * See also: st_renderbuffer_alloc_storage() + */ +static void +acc_get_tile_rgba(struct pipe_context *pipe, struct pipe_surface *acc_ps, +                  uint x, uint y, uint w, uint h, float *p) +{ +   const enum pipe_format f = acc_ps->format; +   const int cpp = acc_ps->cpp; + +   acc_ps->format = DEFAULT_ACCUM_PIPE_FORMAT; +   acc_ps->cpp = 8; + +   pipe_get_tile_rgba(pipe, acc_ps, x, y, w, h, p); + +   acc_ps->format = f; +   acc_ps->cpp = cpp; +} + + +/** + * Wrapper for pipe_put_tile_rgba().  Do format/cpp override to make the + * tile util function think the surface is 16bit/channel, even if it's not. + * See also: st_renderbuffer_alloc_storage() + */ +static void +acc_put_tile_rgba(struct pipe_context *pipe, struct pipe_surface *acc_ps, +                  uint x, uint y, uint w, uint h, const float *p) +{ +   enum pipe_format f = acc_ps->format; +   const int cpp = acc_ps->cpp; + +   acc_ps->format = DEFAULT_ACCUM_PIPE_FORMAT; +   acc_ps->cpp = 8; + +   pipe_put_tile_rgba(pipe, acc_ps, x, y, w, h, p); + +   acc_ps->format = f; +   acc_ps->cpp = cpp; +} + + +  void  st_clear_accum_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)  { -   struct pipe_context *pipe = ctx->st->pipe;     struct st_renderbuffer *acc_strb = st_renderbuffer(rb);     struct pipe_surface *acc_ps = acc_strb->surface;     const GLint xpos = ctx->DrawBuffer->_Xmin;     const GLint ypos = ctx->DrawBuffer->_Ymin;     const GLint width = ctx->DrawBuffer->_Xmax - xpos;     const GLint height = ctx->DrawBuffer->_Ymax - ypos; -   const GLfloat r = ctx->Accum.ClearColor[0]; -   const GLfloat g = ctx->Accum.ClearColor[1]; -   const GLfloat b = ctx->Accum.ClearColor[2]; -   const GLfloat a = ctx->Accum.ClearColor[3]; -   GLfloat *accBuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); -   int i; +   GLvoid *map; -   for (i = 0; i < width * height; i++) { -      accBuf[i*4+0] = r; -      accBuf[i*4+1] = g; -      accBuf[i*4+2] = b; -      accBuf[i*4+3] = a; +   map = pipe_surface_map(acc_ps); + +   /* note acc_strb->format might not equal acc_ps->format */ +   switch (acc_strb->format) { +   case PIPE_FORMAT_R16G16B16A16_SNORM: +      { +         GLshort r = FLOAT_TO_SHORT(ctx->Accum.ClearColor[0]); +         GLshort g = FLOAT_TO_SHORT(ctx->Accum.ClearColor[1]); +         GLshort b = FLOAT_TO_SHORT(ctx->Accum.ClearColor[2]); +         GLshort a = FLOAT_TO_SHORT(ctx->Accum.ClearColor[3]); +         int i, j; +         for (i = 0; i < height; i++) { +            GLshort *dst = ((GLshort *) map +                            + ((ypos + i) * acc_ps->pitch + xpos) * 4); +            for (j = 0; j < width; j++) { +               dst[0] = r; +               dst[1] = g; +               dst[2] = b; +               dst[3] = a; +               dst += 4; +            } +         } +      } +      break; +   default: +      _mesa_problem(ctx, "unexpected format in st_clear_accum_buffer()");     } -   pipe_put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf); +   pipe_surface_unmap(acc_ps);  }  /** For ADD/MULT */  static void -accum_mad(struct pipe_context *pipe, GLfloat scale, GLfloat bias, +accum_mad(GLcontext *ctx, GLfloat scale, GLfloat bias,            GLint xpos, GLint ypos, GLint width, GLint height, -          struct pipe_surface *acc_ps) +          struct st_renderbuffer *acc_strb)  { -   GLfloat *accBuf; -   GLint i; - -   accBuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); +   struct pipe_surface *acc_ps = acc_strb->surface; +   GLvoid *map; -   pipe_get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf); +   map = pipe_surface_map(acc_ps); -   for (i = 0; i < 4 * width * height; i++) { -      accBuf[i] = accBuf[i] * scale + bias; +   /* note acc_strb->format might not equal acc_ps->format */ +   switch (acc_strb->format) { +   case PIPE_FORMAT_R16G16B16A16_SNORM: +      { +         int i, j; +         for (i = 0; i < height; i++) { +            GLshort *acc = ((GLshort *) map +                            + ((ypos + i) * acc_ps->pitch + xpos) * 4); +            for (j = 0; j < width * 4; j++) { +               float val = SHORT_TO_FLOAT(acc[j]) * scale + bias; +               acc[j] = FLOAT_TO_SHORT(val); +            } +         } +      } +      break; +   default: +      _mesa_problem(NULL, "unexpected format in st_clear_accum_buffer()");     } -   pipe_put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf); - -   free(accBuf); +   pipe_surface_unmap(acc_ps);  } @@ -120,13 +191,13 @@ accum_accum(struct pipe_context *pipe, GLfloat value,     accBuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));     pipe_get_tile_rgba(pipe, color_ps, xpos, ypos, width, height, colorBuf); -   pipe_get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf); +   acc_get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf);     for (i = 0; i < 4 * width * height; i++) {        accBuf[i] = accBuf[i] + colorBuf[i] * value;     } -   pipe_put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf); +   acc_put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf);     free(colorBuf);     free(accBuf); @@ -150,7 +221,7 @@ accum_load(struct pipe_context *pipe, GLfloat value,        buf[i] = buf[i] * value;     } -   pipe_put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, buf); +   acc_put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, buf);     free(buf);  } @@ -169,7 +240,7 @@ accum_return(GLcontext *ctx, GLfloat value,     abuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); -   pipe_get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, abuf); +   acc_get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, abuf);     if (!colormask[0] || !colormask[1] || !colormask[2] || !colormask[3]) {        cbuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); @@ -219,12 +290,12 @@ st_Accum(GLcontext *ctx, GLenum op, GLfloat value)     switch (op) {     case GL_ADD:        if (value != 0.0F) { -         accum_mad(pipe, 1.0, value, xpos, ypos, width, height, acc_ps); +         accum_mad(ctx, 1.0, value, xpos, ypos, width, height, acc_strb);        }        break;     case GL_MULT:        if (value != 1.0F) { -         accum_mad(pipe, value, 0.0, xpos, ypos, width, height, acc_ps); +         accum_mad(ctx, value, 0.0, xpos, ypos, width, height, acc_strb);        }        break;     case GL_ACCUM: diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c index 59f3c385df..e95ff5e2e0 100644 --- a/src/mesa/state_tracker/st_cb_bitmap.c +++ b/src/mesa/state_tracker/st_cb_bitmap.c @@ -50,7 +50,6 @@  #include "pipe/p_context.h"  #include "pipe/p_defines.h"  #include "pipe/p_inlines.h" -#include "pipe/p_winsys.h"  #include "util/p_tile.h"  #include "util/u_draw_quad.h"  #include "util/u_simple_shaders.h" @@ -90,10 +89,14 @@ struct bitmap_cache     GLint xpos, ypos;     /** Bounds of region used in window coords */     GLint xmin, ymin, xmax, ymax; +     struct pipe_texture *texture; +   struct pipe_surface *surf; +     GLboolean empty; +     /** An I8 texture image: */ -   GLubyte buffer[BITMAP_CACHE_HEIGHT][BITMAP_CACHE_WIDTH]; +   ubyte *buffer;  }; @@ -105,7 +108,7 @@ struct bitmap_cache   * This program will be combined with the user's fragment program.   */  static struct st_fragment_program * -make_bitmap_fragment_program(GLcontext *ctx) +make_bitmap_fragment_program(GLcontext *ctx, GLuint samplerIndex)  {     struct st_fragment_program *stfp;     struct gl_program *p; @@ -130,7 +133,7 @@ make_bitmap_fragment_program(GLcontext *ctx)     p->Instructions[ic].DstReg.Index = 0;     p->Instructions[ic].SrcReg[0].File = PROGRAM_INPUT;     p->Instructions[ic].SrcReg[0].Index = FRAG_ATTRIB_TEX0; -   p->Instructions[ic].TexSrcUnit = 0; +   p->Instructions[ic].TexSrcUnit = samplerIndex;     p->Instructions[ic].TexSrcTarget = TEXTURE_2D_INDEX;     ic++; @@ -148,7 +151,7 @@ make_bitmap_fragment_program(GLcontext *ctx)     p->InputsRead = FRAG_BIT_TEX0;     p->OutputsWritten = 0x0; -   p->SamplersUsed = 0x1;  /* sampler 0 (bit 0) is used */ +   p->SamplersUsed = (1 << samplerIndex);     stfp = (struct st_fragment_program *) p;     stfp->Base.UsesKill = GL_TRUE; @@ -158,6 +161,19 @@ make_bitmap_fragment_program(GLcontext *ctx)  } +static int +find_free_bit(uint bitfield) +{ +   int i; +   for (i = 0; i < 32; i++) { +      if ((bitfield & (1 << i)) == 0) { +         return i; +      } +   } +   return -1; +} + +  /**   * Combine basic bitmap fragment program with the user-defined program.   */ @@ -165,28 +181,30 @@ static struct st_fragment_program *  combined_bitmap_fragment_program(GLcontext *ctx)  {     struct st_context *st = ctx->st; -   struct st_fragment_program *stfp; +   struct st_fragment_program *stfp = st->fp; -   if (!st->bitmap.program) { -      /* create the basic bitmap fragment program */ -      st->bitmap.program = make_bitmap_fragment_program(ctx); -   } - -   if (st->bitmap.user_prog_sn == st->fp->serialNo) { -      /* re-use */ -      stfp = st->bitmap.combined_prog; -   } -   else { -      /* Concatenate the bitmap program with the current user-defined program. +   if (!stfp->bitmap_program) { +      /* +       * Generate new program which is the user-defined program prefixed +       * with the bitmap sampler/kill instructions.         */ -      stfp = (struct st_fragment_program *) +      struct st_fragment_program *bitmap_prog; +      uint sampler; + +      sampler = find_free_bit(st->fp->Base.Base.SamplersUsed); +      bitmap_prog = make_bitmap_fragment_program(ctx, sampler); + +      stfp->bitmap_program = (struct st_fragment_program *)           _mesa_combine_programs(ctx, -                                &st->bitmap.program->Base.Base, -                                &st->fp->Base.Base); +                                &bitmap_prog->Base.Base, &stfp->Base.Base); +      stfp->bitmap_program->bitmap_sampler = sampler; + +      /* done with this after combining */ +      st_reference_fragprog(st, &bitmap_prog, NULL);  #if 0        { -         struct gl_program *p = &stfp->Base.Base; +         struct gl_program *p = &stfp->bitmap_program->Base.Base;           printf("Combined bitmap program:\n");           _mesa_print_program(p);           printf("InputsRead: 0x%x\n", p->InputsRead); @@ -196,11 +214,7 @@ combined_bitmap_fragment_program(GLcontext *ctx)  #endif        /* translate to TGSI tokens */ -      st_translate_fragment_program(st, stfp, NULL); - -      /* save new program, update serial numbers */ -      st->bitmap.user_prog_sn = st->fp->serialNo; -      st->bitmap.combined_prog = stfp; +      st_translate_fragment_program(st, stfp->bitmap_program, NULL);     }     /* Ideally we'd have updated the pipe constants during the normal @@ -208,81 +222,42 @@ combined_bitmap_fragment_program(GLcontext *ctx)      */     st_upload_constants(st, stfp->Base.Base.Parameters, PIPE_SHADER_FRAGMENT); -   return stfp; +   return stfp->bitmap_program;  }  /** - * Create a texture which represents a bitmap image. + * Copy user-provide bitmap bits into texture buffer, expanding + * bits into texels. + * "On" bits will set texels to 0xff. + * "Off" bits will not modify texels. + * Note that the image is actually going to be upside down in + * the texture.  We deal with that with texcoords.   */ -static struct pipe_texture * -make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height, -                    const struct gl_pixelstore_attrib *unpack, -                    const GLubyte *bitmap) +static void +unpack_bitmap(struct st_context *st, +              GLint px, GLint py, GLsizei width, GLsizei height, +              const struct gl_pixelstore_attrib *unpack, +              const GLubyte *bitmap, +              ubyte *destBuffer, uint destStride)  { -   struct pipe_context *pipe = ctx->st->pipe; -   struct pipe_screen *screen = pipe->screen; -   struct pipe_surface *surface; -   uint format = 0, cpp, comp; -   ubyte *dest; -   struct pipe_texture *pt; -   int row, col; - -   /* find a texture format we know */ -   if (screen->is_format_supported( screen, PIPE_FORMAT_U_I8, PIPE_TEXTURE )) { -      format = PIPE_FORMAT_U_I8; -      cpp = 1; -      comp = 0; -   } -   else if (screen->is_format_supported( screen, PIPE_FORMAT_A8R8G8B8_UNORM, PIPE_TEXTURE )) { -      format = PIPE_FORMAT_A8R8G8B8_UNORM; -      cpp = 4; -      comp = 3; /* alpha channel */ /*XXX little-endian dependency */ -   } -   else { -      /* XXX support more formats */ -      assert( 0 ); -   } - -   /* PBO source... */ -   bitmap = _mesa_map_bitmap_pbo(ctx, unpack, bitmap); -   if (!bitmap) { -      return NULL; -   } - -   /** -    * Create texture to hold bitmap pattern. -    */ -   pt = st_texture_create(ctx->st, PIPE_TEXTURE_2D, format, 0, width, height, -			  1, 0); -   if (!pt) { -      _mesa_unmap_bitmap_pbo(ctx, unpack); -      return NULL; -   } +   GLint row, col; -   surface = screen->get_tex_surface(screen, pt, 0, 0, 0); - -   /* map texture surface */ -   dest = pipe_surface_map(surface); - -   /* Put image into texture surface. -    * Note that the image is actually going to be upside down in -    * the texture.  We deal with that with texcoords. -    */ +#define SET_PIXEL(COL, ROW) \ +   destBuffer[(py + (ROW)) * destStride + px + (COL)] = 0x0;     for (row = 0; row < height; row++) {        const GLubyte *src = (const GLubyte *) _mesa_image_address2d(unpack,                   bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); -      ubyte *destRow = dest + row * surface->pitch * cpp;        if (unpack->LsbFirst) {           /* Lsb first */           GLubyte mask = 1U << (unpack->SkipPixels & 0x7);           for (col = 0; col < width; col++) { -            /* set texel to 255 if bit is set */ -            destRow[comp] = (*src & mask) ? 0x0 : 0xff; -            destRow += cpp; +            if (*src & mask) { +               SET_PIXEL(col, row); +            }              if (mask == 128U) {                 src++; @@ -302,9 +277,9 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,           GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);           for (col = 0; col < width; col++) { -            /* set texel to 255 if bit is set */ -            destRow[comp] =(*src & mask) ? 0x0 : 0xff; -            destRow += cpp; +            if (*src & mask) { +               SET_PIXEL(col, row); +            }              if (mask == 1U) {                 src++; @@ -322,6 +297,50 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,     } /* row */ +#undef SET_PIXEL +} + + +/** + * Create a texture which represents a bitmap image. + */ +static struct pipe_texture * +make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height, +                    const struct gl_pixelstore_attrib *unpack, +                    const GLubyte *bitmap) +{ +   struct pipe_context *pipe = ctx->st->pipe; +   struct pipe_screen *screen = pipe->screen; +   struct pipe_surface *surface; +   ubyte *dest; +   struct pipe_texture *pt; + +   /* PBO source... */ +   bitmap = _mesa_map_bitmap_pbo(ctx, unpack, bitmap); +   if (!bitmap) { +      return NULL; +   } + +   /** +    * Create texture to hold bitmap pattern. +    */ +   pt = st_texture_create(ctx->st, PIPE_TEXTURE_2D, ctx->st->bitmap.tex_format, +                          0, width, height, 1, 0); +   if (!pt) { +      _mesa_unmap_bitmap_pbo(ctx, unpack); +      return NULL; +   } + +   surface = screen->get_tex_surface(screen, pt, 0, 0, 0); + +   /* map texture surface */ +   dest = pipe_surface_map(surface); + +   /* Put image into texture surface */ +   memset(dest, 0xff, height * surface->pitch); +   unpack_bitmap(ctx->st, 0, 0, width, height, unpack, bitmap, +                 dest, surface->pitch); +     _mesa_unmap_bitmap_pbo(ctx, unpack);     /* Release surface */ @@ -329,8 +348,6 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,     pipe_surface_reference(&surface, NULL);     pipe->texture_update(pipe, pt, 0, 0x1); -   pt->format = format; -     return pt;  } @@ -348,11 +365,8 @@ setup_bitmap_vertex_data(struct st_context *st,     const GLfloat x1 = x + width;     const GLfloat y0 = y;     const GLfloat y1 = y + height; -   const GLfloat bias = st->bitmap_texcoord_bias; -   const GLfloat xBias = bias / (x1-x0); -   const GLfloat yBias = bias / (y1-y0); -   const GLfloat sLeft = 0.0 + xBias, sRight = 1.0 + xBias; -   const GLfloat tTop = yBias, tBot = 1.0 - tTop - yBias; +   const GLfloat sLeft = 0.0F, sRight = 1.0F; +   const GLfloat tTop = 0.0, tBot = 1.0 - tTop;     const GLfloat clip_x0 = x0 / fb_width * 2.0 - 1.0;     const GLfloat clip_y0 = y0 / fb_height * 2.0 - 1.0;     const GLfloat clip_x1 = x1 / fb_width * 2.0 - 1.0; @@ -361,9 +375,8 @@ setup_bitmap_vertex_data(struct st_context *st,     void *buf;     if (!st->bitmap.vbuf) { -      st->bitmap.vbuf = pipe->winsys->buffer_create(pipe->winsys, 32, -                                                   PIPE_BUFFER_USAGE_VERTEX, -                                                   sizeof(st->bitmap.vertices)); +      st->bitmap.vbuf = pipe_buffer_create(pipe, 32, PIPE_BUFFER_USAGE_VERTEX, +                                           sizeof(st->bitmap.vertices));     }     /* Positions are in clip coords since we need to do clipping in case @@ -402,10 +415,9 @@ setup_bitmap_vertex_data(struct st_context *st,     }     /* put vertex data into vbuf */ -   buf = pipe->winsys->buffer_map(pipe->winsys, st->bitmap.vbuf, -                                  PIPE_BUFFER_USAGE_CPU_WRITE); +   buf = pipe_buffer_map(pipe, st->bitmap.vbuf, PIPE_BUFFER_USAGE_CPU_WRITE);     memcpy(buf, st->bitmap.vertices, sizeof(st->bitmap.vertices)); -   pipe->winsys->buffer_unmap(pipe->winsys, st->bitmap.vbuf); +   pipe_buffer_unmap(pipe, st->bitmap.vbuf);  } @@ -438,21 +450,38 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,     cso_save_samplers(cso);     cso_save_sampler_textures(cso);     cso_save_viewport(cso); +   cso_save_fragment_shader(cso); +   cso_save_vertex_shader(cso);     /* rasterizer state: just scissor */     st->bitmap.rasterizer.scissor = ctx->Scissor.Enabled;     cso_set_rasterizer(cso, &st->bitmap.rasterizer);     /* fragment shader state: TEX lookup program */ -   pipe->bind_fs_state(pipe, stfp->driver_shader); +   cso_set_fragment_shader_handle(cso, stfp->driver_shader);     /* vertex shader state: position + texcoord pass-through */ -   pipe->bind_vs_state(pipe, st->bitmap.vs); +   cso_set_vertex_shader_handle(cso, st->bitmap.vs); -   /* sampler / texture state */ -   cso_single_sampler(cso, 0, &st->bitmap.sampler); -   cso_single_sampler_done(cso); -   pipe->set_sampler_textures(pipe, 1, &pt); +   /* user samplers, plus our bitmap sampler */ +   { +      struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; +      uint num = MAX2(stfp->bitmap_sampler + 1, st->state.num_samplers); +      uint i; +      for (i = 0; i < st->state.num_samplers; i++) { +         samplers[i] = &st->state.samplers[i]; +      } +      samplers[stfp->bitmap_sampler] = &st->bitmap.sampler; +      cso_set_samplers(cso, num, (const struct pipe_sampler_state **) samplers);   } + +   /* user textures, plus the bitmap texture */ +   { +      struct pipe_texture *textures[PIPE_MAX_SAMPLERS]; +      uint num = MAX2(stfp->bitmap_sampler + 1, st->state.num_textures); +      memcpy(textures, st->state.sampler_texture, sizeof(textures)); +      textures[stfp->bitmap_sampler] = pt; +      cso_set_sampler_textures(cso, num, textures); +   }     /* viewport state: viewport matching window dims */     { @@ -488,55 +517,42 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,     cso_restore_samplers(cso);     cso_restore_sampler_textures(cso);     cso_restore_viewport(cso); -   /* shaders don't go through cso yet */ -   pipe->bind_fs_state(pipe, st->fp->driver_shader); -   pipe->bind_vs_state(pipe, st->vp->driver_shader); +   cso_restore_fragment_shader(cso); +   cso_restore_vertex_shader(cso);  }  static void  reset_cache(struct st_context *st)  { -   memset(st->bitmap.cache->buffer, 0xff, sizeof(st->bitmap.cache->buffer)); -   st->bitmap.cache->empty = GL_TRUE; - -   st->bitmap.cache->xmin = 1000000; -   st->bitmap.cache->xmax = -1000000; -   st->bitmap.cache->ymin = 1000000; -   st->bitmap.cache->ymax = -1000000; -} - - -static void -init_bitmap_cache(struct st_context *st) -{     struct pipe_context *pipe = st->pipe;     struct pipe_screen *screen = pipe->screen; -   enum pipe_format format; +   struct bitmap_cache *cache = st->bitmap.cache; -   st->bitmap.cache = CALLOC_STRUCT(bitmap_cache); -   if (!st->bitmap.cache) -      return; +   //memset(cache->buffer, 0xff, sizeof(cache->buffer)); +   cache->empty = GL_TRUE; -   /* find a usable texture format */ -   if (screen->is_format_supported(screen, PIPE_FORMAT_U_I8, PIPE_TEXTURE)) { -      format = PIPE_FORMAT_U_I8; -   } -   else { -      /* XXX support more formats */ -      assert(0); -   } +   cache->xmin = 1000000; +   cache->xmax = -1000000; +   cache->ymin = 1000000; +   cache->ymax = -1000000; -   st->bitmap.cache->texture -      = st_texture_create(st, PIPE_TEXTURE_2D, format, 0, -                          BITMAP_CACHE_WIDTH, BITMAP_CACHE_HEIGHT, 1, 0); -   if (!st->bitmap.cache->texture) { -      FREE(st->bitmap.cache); -      st->bitmap.cache = NULL; -      return; -   } +   assert(!cache->texture); -   reset_cache(st); +   /* allocate a new texture */ +   cache->texture = st_texture_create(st, PIPE_TEXTURE_2D, +                                      st->bitmap.tex_format, 0, +                                      BITMAP_CACHE_WIDTH, BITMAP_CACHE_HEIGHT, +                                      1, 0); + +   /* Map the texture surface. +    * Subsequent glBitmap calls will write into the texture image. +    */ +   cache->surf = screen->get_tex_surface(screen, cache->texture, 0, 0, 0); +   cache->buffer = pipe_surface_map(cache->surf); + +   /* init image to all 0xff */ +   memset(cache->buffer, 0xff, BITMAP_CACHE_WIDTH * BITMAP_CACHE_HEIGHT);  } @@ -547,36 +563,37 @@ void  st_flush_bitmap_cache(struct st_context *st)  {     if (!st->bitmap.cache->empty) { -      struct bitmap_cache *cache = st->bitmap.cache; -      struct pipe_context *pipe = st->pipe; -      struct pipe_screen *screen = pipe->screen; -      struct pipe_surface *surf; -      void *dest; +      if (st->ctx->DrawBuffer) { +         struct bitmap_cache *cache = st->bitmap.cache; +         struct pipe_context *pipe = st->pipe; -      assert(cache->xmin <= cache->xmax); -      /* -      printf("flush size %d x %d  at %d, %d\n", -             cache->xmax - cache->xmin, -             cache->ymax - cache->ymin, -             cache->xpos, cache->ypos); -      */ +         assert(cache->xmin <= cache->xmax); +         /* +         printf("flush size %d x %d  at %d, %d\n", +                cache->xmax - cache->xmin, +                cache->ymax - cache->ymin, +                cache->xpos, cache->ypos); +         */ -      /* update the texture map image */ -      surf = screen->get_tex_surface(screen, cache->texture, 0, 0, 0); -      dest = pipe_surface_map(surf); -      memcpy(dest, cache->buffer, sizeof(cache->buffer)); -      pipe_surface_unmap(surf); -      pipe_surface_reference(&surf, NULL); +         /* The texture surface has been mapped until now. +          * So unmap and release the texture surface before drawing. +          */ +         pipe_surface_unmap(cache->surf); +         pipe_surface_reference(&cache->surf, NULL); -      pipe->texture_update(pipe, cache->texture, 0, 0x1); +         /* XXX is this needed? */ +         pipe->texture_update(pipe, cache->texture, 0, 0x1); -      draw_bitmap_quad(st->ctx, -                       cache->xpos, -                       cache->ypos, -                       st->ctx->Current.RasterPos[2], -                       BITMAP_CACHE_WIDTH, BITMAP_CACHE_HEIGHT, -                       cache->texture); +         draw_bitmap_quad(st->ctx, +                          cache->xpos, +                          cache->ypos, +                          st->ctx->Current.RasterPos[2], +                          BITMAP_CACHE_WIDTH, BITMAP_CACHE_HEIGHT, +                          cache->texture); +         /* release/free the texture */ +         pipe_texture_reference(&cache->texture, NULL); +      }        reset_cache(st);     }  } @@ -593,7 +610,6 @@ accum_bitmap(struct st_context *st,               const GLubyte *bitmap )  {     struct bitmap_cache *cache = st->bitmap.cache; -   int row, col;     int px = -999, py;     if (width > BITMAP_CACHE_WIDTH || @@ -632,60 +648,8 @@ accum_bitmap(struct st_context *st,     if (y + height > cache->ymax)        cache->ymax = y + height; -   /* XXX try to combine this code with code in make_bitmap_texture() */ -#define SET_PIXEL(COL, ROW) \ -   cache->buffer[py + (ROW)][px + (COL)] = 0x0; - -   for (row = 0; row < height; row++) { -      const GLubyte *src = (const GLubyte *) _mesa_image_address2d(unpack, -                 bitmap, width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0); - -      if (unpack->LsbFirst) { -         /* Lsb first */ -         GLubyte mask = 1U << (unpack->SkipPixels & 0x7); -         for (col = 0; col < width; col++) { - -            if (*src & mask) { -               SET_PIXEL(col, row); -            } - -            if (mask == 128U) { -               src++; -               mask = 1U; -            } -            else { -               mask = mask << 1; -            } -         } - -         /* get ready for next row */ -         if (mask != 1) -            src++; -      } -      else { -         /* Msb first */ -         GLubyte mask = 128U >> (unpack->SkipPixels & 0x7); -         for (col = 0; col < width; col++) { - -            if (*src & mask) { -               SET_PIXEL(col, row); -            } - -            if (mask == 1U) { -               src++; -               mask = 128U; -            } -            else { -               mask = mask >> 1; -            } -         } - -         /* get ready for next row */ -         if (mask != 128) -            src++; -      } - -   } /* row */ +   unpack_bitmap(st, px, py, width, height, unpack, bitmap, +                 cache->buffer, BITMAP_CACHE_WIDTH);     return GL_TRUE; /* accumulated */  } @@ -724,6 +688,7 @@ st_Bitmap(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,        assert(pt->target == PIPE_TEXTURE_2D);        draw_bitmap_quad(ctx, x, y, ctx->Current.RasterPos[2],                         width, height, pt); +      /* release/free the texture */        pipe_texture_reference(&pt, NULL);     }  } @@ -742,6 +707,8 @@ void  st_init_bitmap(struct st_context *st)  {     struct pipe_sampler_state *sampler = &st->bitmap.sampler; +   struct pipe_context *pipe = st->pipe; +   struct pipe_screen *screen = pipe->screen;     /* init sampler state once */     memset(sampler, 0, sizeof(*sampler)); @@ -758,7 +725,19 @@ st_init_bitmap(struct st_context *st)     st->bitmap.rasterizer.gl_rasterization_rules = 1;     st->bitmap.rasterizer.bypass_vs = 1; -   init_bitmap_cache(st); +   /* find a usable texture format */ +   if (screen->is_format_supported(screen, PIPE_FORMAT_I8_UNORM, PIPE_TEXTURE)) { +      st->bitmap.tex_format = PIPE_FORMAT_I8_UNORM; +   } +   else { +      /* XXX support more formats */ +      assert(0); +   } + +   /* alloc bitmap cache object */ +   st->bitmap.cache = CALLOC_STRUCT(bitmap_cache); + +   reset_cache(st);  } @@ -768,21 +747,13 @@ st_destroy_bitmap(struct st_context *st)  {     struct pipe_context *pipe = st->pipe; -   if (st->bitmap.combined_prog) { -      st_delete_program(st->ctx, &st->bitmap.combined_prog->Base.Base); -   } - -   if (st->bitmap.program) { -      st_delete_program(st->ctx, &st->bitmap.program->Base.Base); -   } -     if (st->bitmap.vs) { -      pipe->delete_vs_state(pipe, st->bitmap.vs); +      cso_delete_vertex_shader(st->cso_context, st->bitmap.vs);        st->bitmap.vs = NULL;     }     if (st->bitmap.vbuf) { -      pipe->winsys->buffer_destroy(pipe->winsys, st->bitmap.vbuf); +      pipe_buffer_destroy(pipe, st->bitmap.vbuf);        st->bitmap.vbuf = NULL;     } diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c index 63211d8b66..0533d9460f 100644 --- a/src/mesa/state_tracker/st_cb_blit.c +++ b/src/mesa/state_tracker/st_cb_blit.c @@ -71,7 +71,6 @@ st_BlitFramebuffer(GLcontext *ctx,                     GLbitfield mask, GLenum filter)  {     struct st_context *st = ctx->st; -   struct pipe_context *pipe = st->pipe;     const uint pFilter = ((filter == GL_NEAREST)                           ? PIPE_TEX_MIPFILTER_NEAREST @@ -100,10 +99,6 @@ st_BlitFramebuffer(GLcontext *ctx,                         0.0, pFilter);     } - -   /* shaders don't go through CSO yet */ -   pipe->bind_fs_state(pipe, st->fp->driver_shader); -   pipe->bind_vs_state(pipe, st->vp->driver_shader);  } diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index fa1254ff7c..af79aefa96 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -35,7 +35,6 @@  #include "pipe/p_context.h"  #include "pipe/p_defines.h" -#include "pipe/p_winsys.h"  #include "pipe/p_inlines.h" @@ -79,7 +78,7 @@ st_bufferobj_free(GLcontext *ctx, struct gl_buffer_object *obj)     struct st_buffer_object *st_obj = st_buffer_object(obj);     if (st_obj->buffer)  -      pipe_buffer_reference(pipe->winsys, &st_obj->buffer, NULL); +      pipe_reference_buffer(pipe, &st_obj->buffer, NULL);     free(st_obj);  } @@ -106,10 +105,9 @@ st_bufferobj_subdata(GLcontext *ctx,     if (offset >= st_obj->size || size > (st_obj->size - offset))        return; -   map = pipe->winsys->buffer_map(pipe->winsys, st_obj->buffer, -                                        PIPE_BUFFER_USAGE_CPU_WRITE); +   map = pipe_buffer_map(pipe, st_obj->buffer, PIPE_BUFFER_USAGE_CPU_WRITE);     memcpy(map + offset, data, size); -   pipe->winsys->buffer_unmap(pipe->winsys, st_obj->buffer); +   pipe_buffer_unmap(pipe, st_obj->buffer);  } @@ -130,10 +128,9 @@ st_bufferobj_get_subdata(GLcontext *ctx,     if (offset >= st_obj->size || size > (st_obj->size - offset))        return; -   map = pipe->winsys->buffer_map(pipe->winsys, st_obj->buffer, -                                  PIPE_BUFFER_USAGE_CPU_READ); +   map = pipe_buffer_map(pipe, st_obj->buffer, PIPE_BUFFER_USAGE_CPU_READ);     memcpy(data, map + offset, size); -   pipe->winsys->buffer_unmap(pipe->winsys, st_obj->buffer); +   pipe_buffer_unmap(pipe, st_obj->buffer);  } @@ -174,10 +171,9 @@ st_bufferobj_data(GLcontext *ctx,        buffer_usage = 0;     } -   pipe_buffer_reference( pipe->winsys, &st_obj->buffer, NULL ); +   pipe_reference_buffer( pipe, &st_obj->buffer, NULL ); -   st_obj->buffer = pipe->winsys->buffer_create( pipe->winsys, 32, buffer_usage, -                                                 size ); +   st_obj->buffer = pipe_buffer_create( pipe, 32, buffer_usage, size );     st_obj->size = size; @@ -211,7 +207,7 @@ st_bufferobj_map(GLcontext *ctx, GLenum target, GLenum access,        break;           } -   obj->Pointer = pipe->winsys->buffer_map(pipe->winsys, st_obj->buffer, flags); +   obj->Pointer = pipe_buffer_map(pipe, st_obj->buffer, flags);     return obj->Pointer;  } @@ -225,7 +221,7 @@ st_bufferobj_unmap(GLcontext *ctx, GLenum target, struct gl_buffer_object *obj)     struct pipe_context *pipe = st_context(ctx)->pipe;     struct st_buffer_object *st_obj = st_buffer_object(obj); -   pipe->winsys->buffer_unmap(pipe->winsys, st_obj->buffer); +   pipe_buffer_unmap(pipe, st_obj->buffer);     obj->Pointer = NULL;     return GL_TRUE;  } diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index fa9f986f11..cdfcdcee72 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -34,8 +34,8 @@  #include "main/glheader.h"  #include "main/macros.h"  #include "shader/prog_instruction.h" -#include "st_atom.h"  #include "st_context.h" +#include "st_atom.h"  #include "st_cb_accum.h"  #include "st_cb_clear.h"  #include "st_cb_fbo.h" @@ -45,9 +45,9 @@  #include "st_mesa_to_tgsi.h"  #include "pipe/p_context.h" +#include "pipe/p_inlines.h"  #include "pipe/p_state.h"  #include "pipe/p_defines.h" -#include "pipe/p_winsys.h"  #include "util/u_pack_color.h"  #include "util/u_simple_shaders.h"  #include "util/u_draw_quad.h" @@ -97,16 +97,26 @@ st_destroy_clear(struct st_context *st)  {     struct pipe_context *pipe = st->pipe; +   if (st->clear.vert_shader.tokens) { +      FREE((void *) st->clear.vert_shader.tokens); +      st->clear.vert_shader.tokens = NULL; +   } + +   if (st->clear.frag_shader.tokens) { +      FREE((void *) st->clear.frag_shader.tokens); +      st->clear.frag_shader.tokens = NULL; +   } +     if (st->clear.fs) { -      pipe->delete_fs_state(pipe, st->clear.fs); +      cso_delete_fragment_shader(st->cso_context, st->clear.fs);        st->clear.fs = NULL;     }     if (st->clear.vs) { -      pipe->delete_vs_state(pipe, st->clear.vs); +      cso_delete_vertex_shader(st->cso_context, st->clear.vs);        st->clear.vs = NULL;     }     if (st->clear.vbuf) { -      pipe->winsys->buffer_destroy(pipe->winsys, st->clear.vbuf); +      pipe_buffer_destroy(pipe, st->clear.vbuf);        st->clear.vbuf = NULL;     }  } @@ -142,9 +152,8 @@ draw_quad(GLcontext *ctx,     void *buf;     if (!st->clear.vbuf) { -      st->clear.vbuf = pipe->winsys->buffer_create(pipe->winsys, 32, -                                                   PIPE_BUFFER_USAGE_VERTEX, -                                                   sizeof(st->clear.vertices)); +      st->clear.vbuf = pipe_buffer_create(pipe, 32, PIPE_BUFFER_USAGE_VERTEX, +                                          sizeof(st->clear.vertices));     }     /* positions */ @@ -171,10 +180,9 @@ draw_quad(GLcontext *ctx,     }     /* put vertex data into vbuf */ -   buf = pipe->winsys->buffer_map(pipe->winsys, st->clear.vbuf, -                                  PIPE_BUFFER_USAGE_CPU_WRITE); +   buf = pipe_buffer_map(pipe, st->clear.vbuf, PIPE_BUFFER_USAGE_CPU_WRITE);     memcpy(buf, st->clear.vertices, sizeof(st->clear.vertices)); -   pipe->winsys->buffer_unmap(pipe->winsys, st->clear.vbuf); +   pipe_buffer_unmap(pipe, st->clear.vbuf);     /* draw */     util_draw_vertex_buffer(pipe, st->clear.vbuf, @@ -195,7 +203,6 @@ clear_with_quad(GLcontext *ctx,                  GLboolean color, GLboolean depth, GLboolean stencil)  {     struct st_context *st = ctx->st; -   struct pipe_context *pipe = st->pipe;     const GLfloat x0 = ctx->DrawBuffer->_Xmin;     const GLfloat x1 = ctx->DrawBuffer->_Xmax;     GLfloat y0, y1; @@ -222,6 +229,8 @@ clear_with_quad(GLcontext *ctx,     cso_save_depth_stencil_alpha(st->cso_context);     cso_save_rasterizer(st->cso_context);     cso_save_viewport(st->cso_context); +   cso_save_fragment_shader(st->cso_context); +   cso_save_vertex_shader(st->cso_context);     /* blend state: RGBA masking */     { @@ -273,8 +282,8 @@ clear_with_quad(GLcontext *ctx,     cso_set_rasterizer(st->cso_context, &st->clear.raster);     cso_set_viewport(st->cso_context, &st->clear.viewport); -   pipe->bind_fs_state(pipe, st->clear.fs); -   pipe->bind_vs_state(pipe, st->clear.vs); +   cso_set_fragment_shader_handle(st->cso_context, st->clear.fs); +   cso_set_vertex_shader_handle(st->cso_context, st->clear.vs);     /* draw quad matching scissor rect (XXX verify coord round-off) */     draw_quad(ctx, x0, y0, x1, y1, ctx->Depth.Clear, ctx->Color.ClearColor); @@ -284,9 +293,8 @@ clear_with_quad(GLcontext *ctx,     cso_restore_depth_stencil_alpha(st->cso_context);     cso_restore_rasterizer(st->cso_context);     cso_restore_viewport(st->cso_context); -   /* these don't go through cso yet */ -   pipe->bind_fs_state(pipe, st->fp->driver_shader); -   pipe->bind_vs_state(pipe, st->vp->driver_shader); +   cso_restore_fragment_shader(st->cso_context); +   cso_restore_vertex_shader(st->cso_context);  } @@ -406,7 +414,7 @@ clear_color_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)        /* clear whole buffer w/out masking */        struct st_renderbuffer *strb = st_renderbuffer(rb);        uint clearValue; -      util_pack_color(ctx->Color.ClearColor, strb->surface->format, &clearValue); +      util_pack_color(ctx->Color.ClearColor, PIPE_FORMAT_A8R8G8B8_UNORM, &clearValue);        ctx->st->pipe->clear(ctx->st->pipe, strb->surface, clearValue);     }  } diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index c57e05312a..fbbe8d2d64 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -55,7 +55,6 @@  #include "pipe/p_context.h"  #include "pipe/p_defines.h"  #include "pipe/p_inlines.h" -#include "pipe/p_winsys.h"  #include "util/p_tile.h"  #include "util/u_draw_quad.h"  #include "shader/prog_instruction.h" @@ -165,14 +164,16 @@ static struct st_fragment_program *  make_fragment_shader_z(struct st_context *st)  {     GLcontext *ctx = st->ctx; -   /* only make programs once and re-use */ -   static struct st_fragment_program *stfp = NULL;     struct gl_program *p;     GLuint ic = 0; -   if (stfp) -      return stfp; +   if (st->drawpix.z_shader) { +      return st->drawpix.z_shader; +   } +   /* +    * Create shader now +    */     p = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);     if (!p)        return NULL; @@ -214,10 +215,10 @@ make_fragment_shader_z(struct st_context *st)     p->OutputsWritten = (1 << FRAG_RESULT_COLR) | (1 << FRAG_RESULT_DEPR);     p->SamplersUsed = 0x1;  /* sampler 0 (bit 0) is used */ -   stfp = (struct st_fragment_program *) p; -   st_translate_fragment_program(st, stfp, NULL); +   st->drawpix.z_shader = (struct st_fragment_program *) p; +   st_translate_fragment_program(st, st->drawpix.z_shader, NULL); -   return stfp; +   return st->drawpix.z_shader;  } @@ -229,16 +230,17 @@ make_fragment_shader_z(struct st_context *st)  static struct st_vertex_program *  st_make_passthrough_vertex_shader(struct st_context *st, GLboolean passColor)  { -   /* only make programs once and re-use */ -   static struct st_vertex_program *progs[2] = { NULL, NULL };     GLcontext *ctx = st->ctx;     struct st_vertex_program *stvp;     struct gl_program *p;     GLuint ic = 0; -   if (progs[passColor]) -      return progs[passColor]; +   if (st->drawpix.vert_shaders[passColor]) +      return st->drawpix.vert_shaders[passColor]; +   /* +    * Create shader now +    */     p = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);     if (!p)        return NULL; @@ -294,7 +296,7 @@ st_make_passthrough_vertex_shader(struct st_context *st, GLboolean passColor)     stvp = (struct st_vertex_program *) p;     st_translate_vertex_program(st, stvp, NULL); -   progs[passColor] = stvp; +   st->drawpix.vert_shaders[passColor] = stvp;     return stvp;  } @@ -349,7 +351,7 @@ make_texture(struct st_context *st,     pt = st_texture_create(st, PIPE_TEXTURE_2D, pipeFormat, 0, width, height,  			  1, 0);     if (!pt) { -      _mesa_unmap_drapix_pbo(ctx, unpack); +      _mesa_unmap_drawpix_pbo(ctx, unpack);        return NULL;     } @@ -395,111 +397,107 @@ make_texture(struct st_context *st,        ctx->_ImageTransferState = imageTransferStateSave;     } -   _mesa_unmap_drapix_pbo(ctx, unpack); +   _mesa_unmap_drawpix_pbo(ctx, unpack);     return pt;  }  /** - * Draw textured quad. + * Draw quad with texcoords and optional color.   * Coords are window coords with y=0=bottom. + * \param color  may be null + * \param invertTex  if true, flip texcoords vertically   */  static void  draw_quad(GLcontext *ctx, GLfloat x0, GLfloat y0, GLfloat z, -          GLfloat x1, GLfloat y1, GLboolean invertTex) +          GLfloat x1, GLfloat y1, const GLfloat *color, +          GLboolean invertTex)  { -   GLfloat verts[4][2][4]; /* four verts, two attribs, XYZW */ -   GLuint i; -   GLfloat sLeft = 0.0, sRight = 1.0; -   GLfloat tTop = invertTex, tBot = 1.0 - tTop; - -   /* upper-left */ -   verts[0][0][0] = x0;    /* attr[0].x */ -   verts[0][0][1] = y0;    /* attr[0].y */ -   verts[0][1][0] = sLeft; /* attr[1].s */ -   verts[0][1][1] = tTop;  /* attr[1].t */ - -   /* upper-right */ -   verts[1][0][0] = x1; -   verts[1][0][1] = y0; -   verts[1][1][0] = sRight; -   verts[1][1][1] = tTop; +   struct st_context *st = ctx->st; +   struct pipe_context *pipe = ctx->st->pipe; +   GLfloat verts[4][3][4]; /* four verts, three attribs, XYZW */ -   /* lower-right */ -   verts[2][0][0] = x1; -   verts[2][0][1] = y1; -   verts[2][1][0] = sRight; -   verts[2][1][1] = tBot; +   /* setup vertex data */ +   { +      const struct gl_framebuffer *fb = st->ctx->DrawBuffer; +      const GLfloat fb_width = fb->Width; +      const GLfloat fb_height = fb->Height; +      const GLfloat clip_x0 = x0 / fb_width * 2.0 - 1.0; +      const GLfloat clip_y0 = y0 / fb_height * 2.0 - 1.0; +      const GLfloat clip_x1 = x1 / fb_width * 2.0 - 1.0; +      const GLfloat clip_y1 = y1 / fb_height * 2.0 - 1.0; +      const GLfloat sLeft = 0.0F, sRight = 1.0F; +      const GLfloat tTop = invertTex, tBot = 1.0 - tTop; +      GLuint tex, i; -   /* lower-left */ -   verts[3][0][0] = x0; -   verts[3][0][1] = y1; -   verts[3][1][0] = sLeft; -   verts[3][1][1] = tBot; +      /* upper-left */ +      verts[0][0][0] = clip_x0;    /* v[0].attr[0].x */ +      verts[0][0][1] = clip_y0;    /* v[0].attr[0].y */ -   /* same for all verts: */ -   for (i = 0; i < 4; i++) { -      verts[i][0][2] = z;   /*Z*/ -      verts[i][0][3] = 1.0; /*W*/ -      verts[i][1][2] = 0.0; /*R*/ -      verts[i][1][3] = 1.0; /*Q*/ -   } +      /* upper-right */ +      verts[1][0][0] = clip_x1; +      verts[1][0][1] = clip_y0; -   st_draw_vertices(ctx, PIPE_PRIM_QUADS, 4, (float *) verts, 2, GL_FALSE); -} +      /* lower-right */ +      verts[2][0][0] = clip_x1; +      verts[2][0][1] = clip_y1; +      /* lower-left */ +      verts[3][0][0] = clip_x0; +      verts[3][0][1] = clip_y1; -static void -draw_quad_colored(GLcontext *ctx, GLfloat x0, GLfloat y0, GLfloat z, -                  GLfloat x1, GLfloat y1, const GLfloat *color, -                  GLboolean invertTex) -{ -   GLfloat bias = ctx->st->bitmap_texcoord_bias; -   GLfloat verts[4][3][4]; /* four verts, three attribs, XYZW */ -   GLuint i; -   GLfloat xBias = bias / (x1-x0); -   GLfloat yBias = bias / (y1-y0); -   GLfloat sLeft = 0.0 + xBias, sRight = 1.0 + xBias; -   GLfloat tTop = invertTex - yBias, tBot = 1.0 - tTop - yBias; +      tex = color ? 2 : 1; +      verts[0][tex][0] = sLeft; /* v[0].attr[tex].s */ +      verts[0][tex][1] = tTop;  /* v[0].attr[tex].t */ +      verts[1][tex][0] = sRight; +      verts[1][tex][1] = tTop; +      verts[2][tex][0] = sRight; +      verts[2][tex][1] = tBot; +      verts[3][tex][0] = sLeft; +      verts[3][tex][1] = tBot; -   /* upper-left */ -   verts[0][0][0] = x0;    /* attr[0].x */ -   verts[0][0][1] = y0;    /* attr[0].y */ -   verts[0][2][0] = sLeft; /* attr[2].s */ -   verts[0][2][1] = tTop;  /* attr[2].t */ +      /* same for all verts: */ +      if (color) { +         for (i = 0; i < 4; i++) { +            verts[i][0][2] = z;   /*Z*/ +            verts[i][0][3] = 1.0; /*W*/ +            verts[i][1][0] = color[0]; +            verts[i][1][1] = color[1]; +            verts[i][1][2] = color[2]; +            verts[i][1][3] = color[3]; +            verts[i][2][2] = 0.0; /*R*/ +            verts[i][2][3] = 1.0; /*Q*/ +         } +      } +      else { +         for (i = 0; i < 4; i++) { +            verts[i][0][2] = z;   /*Z*/ +            verts[i][0][3] = 1.0; /*W*/ +            verts[i][1][2] = 0.0; /*R*/ +            verts[i][1][3] = 1.0; /*Q*/ +         } +      } +   } -   /* upper-right */ -   verts[1][0][0] = x1; -   verts[1][0][1] = y0; -   verts[1][2][0] = sRight; -   verts[1][2][1] = tTop; +   { +      struct pipe_buffer *buf; +      ubyte *map; -   /* lower-right */ -   verts[2][0][0] = x1; -   verts[2][0][1] = y1; -   verts[2][2][0] = sRight; -   verts[2][2][1] = tBot; +      /* allocate/load buffer object with vertex data */ +      buf = pipe_buffer_create(pipe,32, PIPE_BUFFER_USAGE_VERTEX, +                               sizeof(verts)); +      map = pipe_buffer_map(pipe, buf, PIPE_BUFFER_USAGE_CPU_WRITE); +      memcpy(map, verts, sizeof(verts)); +      pipe_buffer_unmap(pipe, buf); -   /* lower-left */ -   verts[3][0][0] = x0; -   verts[3][0][1] = y1; -   verts[3][2][0] = sLeft; -   verts[3][2][1] = tBot; +      util_draw_vertex_buffer(pipe, buf, +                              PIPE_PRIM_QUADS, +                              4,  /* verts */ +                              3); /* attribs/vert */ -   /* same for all verts: */ -   for (i = 0; i < 4; i++) { -      verts[i][0][2] = z;   /*Z*/ -      verts[i][0][3] = 1.0; /*W*/ -      verts[i][1][0] = color[0]; -      verts[i][1][1] = color[1]; -      verts[i][1][2] = color[2]; -      verts[i][1][3] = color[3]; -      verts[i][2][2] = 0.0; /*R*/ -      verts[i][2][3] = 1.0; /*Q*/ +      pipe_buffer_destroy(pipe, buf);     } - -   st_draw_vertices(ctx, PIPE_PRIM_QUADS, 4, (float *) verts, 3, GL_FALSE);  } @@ -532,6 +530,8 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,     cso_save_viewport(cso);     cso_save_samplers(cso);     cso_save_sampler_textures(cso); +   cso_save_fragment_shader(cso); +   cso_save_vertex_shader(cso);     /* rasterizer state: just scissor */     { @@ -543,10 +543,10 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,     }     /* fragment shader state: TEX lookup program */ -   pipe->bind_fs_state(pipe, stfp->driver_shader); +   cso_set_fragment_shader_handle(cso, stfp->driver_shader);     /* vertex shader state: position + texcoord pass-through */ -   pipe->bind_vs_state(pipe, stvp->driver_shader); +   cso_set_vertex_shader_handle(cso, stvp->driver_shader);     /* texture sampling state: */ @@ -562,6 +562,9 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,        sampler.normalized_coords = 1;        cso_single_sampler(cso, 0, &sampler); +      if (st->pixel_xfer.pixelmap_enabled) { +         cso_single_sampler(cso, 1, &sampler); +      }        cso_single_sampler_done(cso);     } @@ -582,7 +585,15 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,     }     /* texture state: */ -   pipe->set_sampler_textures(pipe, 1, &pt); +   if (st->pixel_xfer.pixelmap_enabled) { +      struct pipe_texture *textures[2]; +      textures[0] = pt; +      textures[1] = st->pixel_xfer.pixelmap_texture; +      pipe->set_sampler_textures(pipe, 2, textures); +   } +   else { +      pipe->set_sampler_textures(pipe, 1, &pt); +   }     /* Compute window coords (y=0=bottom) with pixel zoom.      * Recall that these coords are transformed by the current @@ -592,22 +603,15 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,     x1 = x + width * ctx->Pixel.ZoomX;     y0 = y;     y1 = y + height * ctx->Pixel.ZoomY; - -   /* draw textured quad */ -   if (color) -      draw_quad_colored(ctx, x0, y0, z, x1, y1, color, invertTex); -   else -      draw_quad(ctx, x0, y0, z, x1, y1, invertTex); +   draw_quad(ctx, x0, y0, z, x1, y1, color, invertTex);     /* restore state */     cso_restore_rasterizer(cso);     cso_restore_viewport(cso);     cso_restore_samplers(cso);     cso_restore_sampler_textures(cso); - -   /* shaders don't go through cso yet */ -   pipe->bind_fs_state(pipe, st->fp->driver_shader); -   pipe->bind_vs_state(pipe, st->vp->driver_shader); +   cso_restore_fragment_shader(cso); +   cso_restore_vertex_shader(cso);  } @@ -769,7 +773,7 @@ draw_stencil_pixels(GLcontext *ctx, GLint x, GLint y,              }              switch (ps->format) { -            case PIPE_FORMAT_U_S8: +            case PIPE_FORMAT_S8_UNORM:                 {                    ubyte *dest = stmap + spanY * ps->pitch + spanX;                    memcpy(dest, values, spanWidth); @@ -867,11 +871,9 @@ copy_stencil_pixels(GLcontext *ctx, GLint srcx, GLint srcy,                      GLsizei width, GLsizei height,                      GLint dstx, GLint dsty)  { -   struct st_renderbuffer *rbRead = st_renderbuffer(ctx->ReadBuffer->_StencilBuffer);     struct st_renderbuffer *rbDraw = st_renderbuffer(ctx->DrawBuffer->_StencilBuffer); -   struct pipe_surface *psRead = rbRead->surface;     struct pipe_surface *psDraw = rbDraw->surface; -   ubyte *readMap, *drawMap; +   ubyte *drawMap;     ubyte *buffer;     int i; @@ -881,14 +883,13 @@ copy_stencil_pixels(GLcontext *ctx, GLint srcx, GLint srcy,        return;     } -   /* map the stencil buffers */ -   readMap = pipe_surface_map(psRead); -   drawMap = pipe_surface_map(psDraw); -     /* this will do stencil pixel transfer ops */     st_read_stencil_pixels(ctx, srcx, srcy, width, height, GL_UNSIGNED_BYTE,                            &ctx->DefaultPacking, buffer); +   /* map the stencil buffer */ +   drawMap = pipe_surface_map(psDraw); +     /* draw */     /* XXX PixelZoom not handled yet */     for (i = 0; i < height; i++) { @@ -916,7 +917,7 @@ copy_stencil_pixels(GLcontext *ctx, GLint srcx, GLint srcy,              }           }           break; -      case PIPE_FORMAT_U_S8: +      case PIPE_FORMAT_S8_UNORM:           memcpy(dst, src, width);           break;        default: @@ -926,8 +927,7 @@ copy_stencil_pixels(GLcontext *ctx, GLint srcx, GLint srcy,     free(buffer); -   /* unmap the stencil buffers */ -   pipe_surface_unmap(psRead); +   /* unmap the stencil buffer */     pipe_surface_unmap(psDraw);  } @@ -961,7 +961,7 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,     }     if (type == GL_COLOR) { -      rbRead = st_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer); +      rbRead = st_get_color_read_renderbuffer(ctx);        color = NULL;        stfp = combined_drawpix_fragment_program(ctx);        stvp = st_make_passthrough_vertex_shader(ctx->st, GL_FALSE); @@ -983,22 +983,8 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,     else {        /* srcFormat can't be used as a texture format */        if (type == GL_DEPTH) { -         static const enum pipe_format zFormats[] = { -            PIPE_FORMAT_Z16_UNORM, -            PIPE_FORMAT_Z32_UNORM, -            PIPE_FORMAT_S8Z24_UNORM, -            PIPE_FORMAT_Z24S8_UNORM -         }; -         uint i; -         texFormat = 0; -         for (i = 0; i < Elements(zFormats); i++) { -            if (screen->is_format_supported(screen, zFormats[i], -                                            PIPE_TEXTURE)) { -               texFormat = zFormats[i]; -               break; -            } -         } -         assert(texFormat); /* XXX no depth texture formats??? */ +         texFormat = st_choose_format(pipe, GL_DEPTH_COMPONENT, PIPE_TEXTURE); +         assert(texFormat != PIPE_FORMAT_NONE); /* XXX no depth texture formats??? */        }        else {           /* todo */ @@ -1017,11 +1003,7 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,        srcy = ctx->DrawBuffer->Height - srcy - height;     } -   /* For some drivers (like Xlib) it's not possible to treat the -    * front/back color buffers as surfaces (they're XImages and Pixmaps). -    * So, this var tells us if we can use surface_copy here... -    */ -   if (st->haveFramebufferSurfaces && srcFormat == texFormat) { +   if (srcFormat == texFormat) {        /* copy source framebuffer surface into mipmap/texture */        pipe->surface_copy(pipe,                           FALSE, @@ -1063,3 +1045,15 @@ void st_init_drawpixels_functions(struct dd_function_table *functions)     functions->DrawPixels = st_DrawPixels;     functions->CopyPixels = st_CopyPixels;  } + + +void +st_destroy_drawpix(struct st_context *st) +{ +   st_reference_fragprog(st, &st->drawpix.z_shader, NULL); +   st_reference_fragprog(st, &st->pixel_xfer.combined_prog, NULL); +   st_reference_vertprog(st, &st->drawpix.vert_shaders[0], NULL); +   st_reference_vertprog(st, &st->drawpix.vert_shaders[1], NULL); +} + + diff --git a/src/mesa/state_tracker/st_cb_drawpixels.h b/src/mesa/state_tracker/st_cb_drawpixels.h index 71ba487020..26fe864d18 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.h +++ b/src/mesa/state_tracker/st_cb_drawpixels.h @@ -32,5 +32,8 @@  extern void st_init_drawpixels_functions(struct dd_function_table *functions); +extern void +st_destroy_drawpix(struct st_context *st); +  #endif /* ST_CB_DRAWPIXELS_H */ diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index ec7788923a..fc8a5ea7f6 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -80,6 +80,8 @@ init_renderbuffer_bits(struct st_renderbuffer *strb,  /**   * gl_renderbuffer::AllocStorage() + * This is called to allocate the original drawing surface, and + * during window resize.   */  static GLboolean  st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb, @@ -90,8 +92,10 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,     struct st_renderbuffer *strb = st_renderbuffer(rb);     enum pipe_format pipeFormat;     GLbitfield flags = 0x0; /* XXX needed? */ +   int ret;     if (!strb->surface) { +      /* first time surface creation */        strb->surface = pipe->winsys->surface_alloc(pipe->winsys);        assert(strb->surface);        assert(strb->surface->refcount); @@ -99,10 +103,10 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,        if (!strb->surface)           return GL_FALSE;     } - -   if (strb->surface->buffer) -      pipe_buffer_reference(pipe->winsys, &strb->surface->buffer, -			    NULL); +   else if (strb->surface->buffer) { +      /* release/discard the old surface buffer */ +      pipe_reference_buffer(pipe, &strb->surface->buffer, NULL); +   }     /* Determine surface format here */     if (strb->format != PIPE_FORMAT_NONE) { @@ -116,20 +120,44 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,     init_renderbuffer_bits(strb, pipeFormat); -   pipe->winsys->surface_alloc_storage(pipe->winsys, -                                       strb->surface, -                                       width, -                                       height, -                                       pipeFormat, -                                       flags); -   if (!strb->surface->buffer) -      return GL_FALSE; /* out of memory, try s/w buffer? */ +   ret = pipe->winsys->surface_alloc_storage(pipe->winsys, +                                             strb->surface, +                                             width, +                                             height, +                                             pipeFormat, +                                             flags); +   if (ret || !strb->surface->buffer) { +      if (pipeFormat == DEFAULT_ACCUM_PIPE_FORMAT) { +         /* Accum buffer.  Try a different surface format.  Since accum +          * buffers are s/w only for now, the surface pixel format doesn't +          * really matter, only that the buffer is large enough. +          */ +         int sz, mult; +         enum pipe_format accum_format; + +         /* allocate a buffer of (typically) double height to get 64bpp */ +         accum_format = st_choose_renderbuffer_format(pipe, GL_RGBA); +         sz = pf_get_size(accum_format); +         mult = pf_get_size(DEFAULT_ACCUM_PIPE_FORMAT) / sz; + +         ret = pipe->winsys->surface_alloc_storage(pipe->winsys, +                                                   strb->surface, +                                                   width, height * mult, +                                                   accum_format, flags); +         if (ret) +            return GL_FALSE; /* we've _really_ failed */ + +      } +      else { +         return GL_FALSE; /* out of memory, try s/w buffer? */ +      } +   }     ASSERT(strb->surface->buffer);     ASSERT(strb->surface->format);     ASSERT(strb->surface->cpp);     ASSERT(strb->surface->width == width); -   ASSERT(strb->surface->height == height); +   /*ASSERT(strb->surface->height == height);*/     ASSERT(strb->surface->pitch);     strb->Base.Width  = width; @@ -224,6 +252,8 @@ st_new_renderbuffer_fb(enum pipe_format format)     switch (format) {     case PIPE_FORMAT_A8R8G8B8_UNORM:     case PIPE_FORMAT_B8G8R8A8_UNORM: +   case PIPE_FORMAT_X8R8G8B8_UNORM: +   case PIPE_FORMAT_B8G8R8X8_UNORM:     case PIPE_FORMAT_A1R5G5B5_UNORM:     case PIPE_FORMAT_A4R4G4B4_UNORM:     case PIPE_FORMAT_R5G6B5_UNORM: @@ -240,6 +270,8 @@ st_new_renderbuffer_fb(enum pipe_format format)        break;     case PIPE_FORMAT_S8Z24_UNORM:     case PIPE_FORMAT_Z24S8_UNORM: +   case PIPE_FORMAT_X8Z24_UNORM: +   case PIPE_FORMAT_Z24X8_UNORM:        strb->Base.InternalFormat = GL_DEPTH24_STENCIL8_EXT;        strb->Base._BaseFormat = GL_DEPTH_STENCIL_EXT;        break; @@ -247,7 +279,7 @@ st_new_renderbuffer_fb(enum pipe_format format)        strb->Base.InternalFormat = GL_STENCIL_INDEX8_EXT;        strb->Base._BaseFormat = GL_STENCIL_INDEX;        break; -   case PIPE_FORMAT_R16G16B16A16_SNORM: +   case DEFAULT_ACCUM_PIPE_FORMAT: /*PIPE_FORMAT_R16G16B16A16_SNORM*/        strb->Base.InternalFormat = GL_RGBA16;        strb->Base._BaseFormat = GL_RGBA;        break; @@ -338,6 +370,8 @@ st_render_texture(GLcontext *ctx,                                             att->TextureLevel,                                             att->Zoffset);     assert(strb->surface); +   assert(screen->is_format_supported(screen, strb->surface->format, PIPE_TEXTURE)); +   assert(screen->is_format_supported(screen, strb->surface->format, PIPE_SURFACE));     init_renderbuffer_bits(strb, pt->format); @@ -368,6 +402,10 @@ st_finish_render_texture(GLcontext *ctx,     ctx->st->pipe->flush(ctx->st->pipe, PIPE_FLUSH_RENDER_CACHE, NULL); +   ctx->st->pipe->texture_update(ctx->st->pipe, +                                 st_get_texobj_texture(att->Texture), +                                 att->CubeMapFace, 1 << att->TextureLevel); +     /*     printf("FINISH RENDER TO TEXTURE surf=%p\n", strb->surface);     */ diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h index 21e531d1d0..c1aa14f9b2 100644 --- a/src/mesa/state_tracker/st_cb_fbo.h +++ b/src/mesa/state_tracker/st_cb_fbo.h @@ -30,6 +30,9 @@  #define ST_CB_FBO_H +#define DEFAULT_ACCUM_PIPE_FORMAT PIPE_FORMAT_R16G16B16A16_SNORM + +  /**   * Derived renderbuffer class.  Just need to add a pointer to the diff --git a/src/mesa/state_tracker/st_cb_feedback.c b/src/mesa/state_tracker/st_cb_feedback.c index 5315294c07..1b50792bd1 100644 --- a/src/mesa/state_tracker/st_cb_feedback.c +++ b/src/mesa/state_tracker/st_cb_feedback.c @@ -56,7 +56,7 @@  #include "cso_cache/cso_cache.h"  #include "draw/draw_context.h" -#include "draw/draw_private.h" +#include "draw/draw_pipe.h"  /** @@ -238,6 +238,12 @@ select_reset_stipple_counter( struct draw_stage *stage )     /* no-op */  } +static void +select_destroy( struct draw_stage *stage ) +{ +   /* no-op */ +} +  /**   * Create GL selection mode drawing stage. @@ -254,6 +260,7 @@ draw_glselect_stage(GLcontext *ctx, struct draw_context *draw)     fs->stage.tri = select_tri;     fs->stage.flush = select_flush;     fs->stage.reset_stipple_counter = select_reset_stipple_counter; +   fs->stage.destroy = select_destroy;     fs->ctx = ctx;     return &fs->stage; diff --git a/src/mesa/state_tracker/st_cb_flush.c b/src/mesa/state_tracker/st_cb_flush.c index c7efa40e38..5e866b0d41 100644 --- a/src/mesa/state_tracker/st_cb_flush.c +++ b/src/mesa/state_tracker/st_cb_flush.c @@ -44,76 +44,49 @@  #include "pipe/p_winsys.h" -void st_flush( struct st_context *st, uint pipeFlushFlags, -               struct pipe_fence_handle **fence ) +static INLINE GLboolean +is_front_buffer_dirty(struct st_context *st)  { -   FLUSH_VERTICES(st->ctx, 0); - -   st_flush_bitmap_cache(st); - -   st->pipe->flush( st->pipe, pipeFlushFlags, fence ); +   return st->frontbuffer_status == FRONT_STATUS_DIRTY;  } -static void st_gl_flush( struct st_context *st, uint pipeFlushFlags, -                         struct pipe_fence_handle **fence ) +/** + * Tell the winsys to display the front color buffer on-screen. + */ +static void +display_front_buffer(struct st_context *st)  {     GLframebuffer *fb = st->ctx->DrawBuffer; +   struct st_renderbuffer *strb +      = st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer); +   struct pipe_surface *front_surf = strb->surface; -   st_flush_bitmap_cache(st); - -   FLUSH_VERTICES(st->ctx, 0); +   /* Hook for copying "fake" frontbuffer if necessary: +    */ +   st->pipe->winsys->flush_frontbuffer( st->pipe->winsys, front_surf, +                                        st->pipe->priv ); -   if (!fb) -      return; +   /* +   st->frontbuffer_status = FRONT_STATUS_UNDEFINED; +   */ +} -   /* XXX: temporary hack.  This flag should only be set if we do any -    * rendering to the front buffer. -    * -    * Further more, the scissor rectangle could be tracked to -    * construct a dirty region of the front buffer, to avoid -    * situations where it must be copied repeatedly. -    * -    * In the extreme case, some kind of timer could be set up to allow -    * coalescing of multiple flushes to the frontbuffer, which can be -    * quite a performance drain if there are a sufficient number of -    * them. -    */ -   st->flags.frontbuffer_dirty -      = (fb->_ColorDrawBufferMask[0] & BUFFER_BIT_FRONT_LEFT); -   if (st->flags.frontbuffer_dirty) { -      struct st_renderbuffer *strb -         = st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer); -      struct pipe_surface *front_surf = strb->surface; +void st_flush( struct st_context *st, uint pipeFlushFlags, +               struct pipe_fence_handle **fence ) +{ +   FLUSH_VERTICES(st->ctx, 0); -      /* If we aren't rendering to the frontbuffer, this is a noop. -       * This should be uncontroversial for glFlush, though people may -       * feel more strongly about glFinish. -       * -       * Additionally, need to make sure that the frontbuffer_dirty -       * flag really gets set on frontbuffer rendering. -       */ -      st->pipe->flush( st->pipe, pipeFlushFlags, fence ); +   st_flush_bitmap_cache(st); -      /* Hook for copying "fake" frontbuffer if necessary: -       */ -      st->pipe->winsys->flush_frontbuffer( st->pipe->winsys, front_surf, -                                           st->pipe->priv ); -      st->flags.frontbuffer_dirty = 0; -   } +   st->pipe->flush( st->pipe, pipeFlushFlags, fence );  }  /** - * Called via ctx->Driver.Flush() + * Flush, and wait for completion.   */ -static void st_glFlush(GLcontext *ctx) -{ -   st_gl_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL); -} - -  void st_finish( struct st_context *st )  {     struct pipe_fence_handle *fence = NULL; @@ -125,12 +98,36 @@ void st_finish( struct st_context *st )  } + +/** + * Called via ctx->Driver.Flush() + */ +static void st_glFlush(GLcontext *ctx) +{ +   struct st_context *st = ctx->st; + +   if (is_front_buffer_dirty(st)) { +      st_finish(st); +      display_front_buffer(st); +   } +   else { +      st_flush(st, PIPE_FLUSH_RENDER_CACHE, NULL); +   } +} + +  /**   * Called via ctx->Driver.Finish()   */  static void st_glFinish(GLcontext *ctx)  { -   st_finish( ctx->st ); +   struct st_context *st = ctx->st; + +   st_finish(st); + +   if (is_front_buffer_dirty(st)) { +      display_front_buffer(st); +   }  } diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c index 003ec0d2b7..5f753afdd3 100644 --- a/src/mesa/state_tracker/st_cb_program.c +++ b/src/mesa/state_tracker/st_cb_program.c @@ -39,7 +39,7 @@  #include "shader/programopt.h"  #include "shader/shader_api.h" -#include "cso_cache/cso_cache.h" +#include "cso_cache/cso_context.h"  #include "draw/draw_context.h"  #include "st_context.h" @@ -89,8 +89,12 @@ static void st_use_program( GLcontext *ctx, +/** + * Called via ctx->Driver.NewProgram() to allocate a new vertex or + * fragment program. + */  static struct gl_program *st_new_program( GLcontext *ctx, -					  GLenum target,  +					  GLenum target,  					  GLuint id )  {     switch (target) { @@ -118,7 +122,8 @@ static struct gl_program *st_new_program( GLcontext *ctx,     }     default: -      return _mesa_new_program(ctx, target, id); +      assert(0); +      return NULL;     }  } @@ -127,7 +132,6 @@ void  st_delete_program(GLcontext *ctx, struct gl_program *prog)  {     struct st_context *st = st_context(ctx); -   struct pipe_context *pipe = st->pipe;     switch( prog->Target ) {     case GL_VERTEX_PROGRAM_ARB: @@ -135,10 +139,16 @@ st_delete_program(GLcontext *ctx, struct gl_program *prog)           struct st_vertex_program *stvp = (struct st_vertex_program *) prog;           if (stvp->driver_shader) { -            pipe->delete_vs_state(pipe, stvp->driver_shader); +            cso_delete_vertex_shader(st->cso_context, stvp->driver_shader);              stvp->driver_shader = NULL;           } +         if (stvp->draw_shader) { +            /* this would only have been allocated for the RasterPos path */ +            draw_delete_vertex_shader(st->draw, stvp->draw_shader); +            stvp->draw_shader = NULL; +         } +           if (stvp->state.tokens) {              FREE((void *) stvp->state.tokens);              stvp->state.tokens = NULL; @@ -150,7 +160,7 @@ st_delete_program(GLcontext *ctx, struct gl_program *prog)           struct st_fragment_program *stfp = (struct st_fragment_program *) prog;           if (stfp->driver_shader) { -            pipe->delete_fs_state(pipe, stfp->driver_shader); +            cso_delete_fragment_shader(st->cso_context, stfp->driver_shader);              stfp->driver_shader = NULL;           } @@ -159,6 +169,12 @@ st_delete_program(GLcontext *ctx, struct gl_program *prog)              stfp->state.tokens = NULL;           } +         if (stfp->bitmap_program) { +            struct gl_program *prg = &stfp->bitmap_program->Base.Base; +            _mesa_reference_program(ctx, &prg, NULL); +            stfp->bitmap_program = NULL; +         } +           st_free_translated_vertex_programs(st, stfp->vertex_programs);        }        break; @@ -183,7 +199,6 @@ static void st_program_string_notify( GLcontext *ctx,  				      struct gl_program *prog )  {     struct st_context *st = st_context(ctx); -   struct pipe_context *pipe = st->pipe;     if (target == GL_FRAGMENT_PROGRAM_ARB) {        struct st_fragment_program *stfp = (struct st_fragment_program *) prog; @@ -191,7 +206,7 @@ static void st_program_string_notify( GLcontext *ctx,        stfp->serialNo++;        if (stfp->driver_shader) { -         pipe->delete_fs_state(pipe, stfp->driver_shader); +         cso_delete_fragment_shader(st->cso_context, stfp->driver_shader);           stfp->driver_shader = NULL;        } @@ -211,11 +226,12 @@ static void st_program_string_notify( GLcontext *ctx,        stvp->serialNo++;        if (stvp->driver_shader) { -         pipe->delete_vs_state(pipe, stvp->driver_shader); +         cso_delete_vertex_shader(st->cso_context, stvp->driver_shader);           stvp->driver_shader = NULL;        }        if (stvp->draw_shader) { +         /* this would only have been allocated for the RasterPos path */           draw_delete_vertex_shader(st->draw, stvp->draw_shader);           stvp->draw_shader = NULL;        } diff --git a/src/mesa/state_tracker/st_cb_queryobj.c b/src/mesa/state_tracker/st_cb_queryobj.c index c1d0d086b4..21c2c7dd9f 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.c +++ b/src/mesa/state_tracker/st_cb_queryobj.c @@ -90,11 +90,7 @@ st_DeleteQuery(GLcontext *ctx, struct gl_query_object *q)     FREE(stq);  } -/** - * Do glReadPixels by getting rows from the framebuffer surface with - * get_tile().  Convert to requested format/type with Mesa image routines. - * Image transfer ops are done in software too. - */ +  static void  st_BeginQuery(GLcontext *ctx, struct gl_query_object *q)  { diff --git a/src/mesa/state_tracker/st_cb_rasterpos.c b/src/mesa/state_tracker/st_cb_rasterpos.c index 2ed228778e..3cb7b68bea 100644 --- a/src/mesa/state_tracker/st_cb_rasterpos.c +++ b/src/mesa/state_tracker/st_cb_rasterpos.c @@ -46,7 +46,7 @@  #include "st_cb_rasterpos.h"  #include "st_draw.h"  #include "draw/draw_context.h" -#include "draw/draw_private.h" +#include "draw/draw_pipe.h"  #include "shader/prog_instruction.h"  #include "vbo/vbo.h" diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c index 2bcc8c99fb..745755566e 100644 --- a/src/mesa/state_tracker/st_cb_readpixels.c +++ b/src/mesa/state_tracker/st_cb_readpixels.c @@ -87,7 +87,7 @@ st_read_stencil_pixels(GLcontext *ctx, GLint x, GLint y,        /* get stencil values */        switch (ps->format) { -      case PIPE_FORMAT_U_S8: +      case PIPE_FORMAT_S8_UNORM:           {              const ubyte *src = stmap + srcY * ps->pitch + x;              memcpy(values, src, width); @@ -129,6 +129,34 @@ st_read_stencil_pixels(GLcontext *ctx, GLint x, GLint y,  /** + * Return renderbuffer to use for reading color pixels for glRead/CopyPixel + * commands. + * Special care is needed for the front buffer. + */ +struct st_renderbuffer * +st_get_color_read_renderbuffer(GLcontext *ctx) +{ +   struct gl_framebuffer *fb = ctx->ReadBuffer; +   struct st_renderbuffer *strb = +      st_renderbuffer(fb->_ColorReadBuffer); +   struct st_renderbuffer *front =  +      st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer); + +   if (strb == front +       && ctx->st->frontbuffer_status == FRONT_STATUS_COPY_OF_BACK) { +      /* reading from front color buffer, which is a logical copy of the +       * back color buffer. +       */ +      struct st_renderbuffer *back =  +         st_renderbuffer(fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer); +      strb = back; +   } + +   return strb; +} + + +/**   * Do glReadPixels by getting rows from the framebuffer surface with   * get_tile().  Convert to requested format/type with Mesa image routines.   * Image transfer ops are done in software too. @@ -173,12 +201,13 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,        strb = st_renderbuffer(ctx->ReadBuffer->_DepthBuffer);     }     else { -      strb = st_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer); +      /* Read color buffer */ +      strb = st_get_color_read_renderbuffer(ctx);     } +     if (!strb)        return; -     if (format == GL_RGBA && type == GL_FLOAT) {        /* write tile(row) directly into user's buffer */        df = (GLfloat *) _mesa_image_address2d(&clippedPacking, dest, width, @@ -211,7 +240,8 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,        const GLint dstStride = _mesa_image_row_stride(&clippedPacking, width,                                                       format, type); -      if (strb->surface->format == PIPE_FORMAT_S8Z24_UNORM) { +      if (strb->surface->format == PIPE_FORMAT_S8Z24_UNORM || +          strb->surface->format == PIPE_FORMAT_X8Z24_UNORM) {           if (format == GL_DEPTH_COMPONENT) {              for (i = 0; i < height; i++) {                 GLuint ztemp[MAX_WIDTH], j; @@ -240,7 +270,7 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,        }        else if (strb->surface->format == PIPE_FORMAT_Z16_UNORM) {           for (i = 0; i < height; i++) { -            GLshort ztemp[MAX_WIDTH], j; +            GLushort ztemp[MAX_WIDTH], j;              GLfloat zfloat[MAX_WIDTH];              const double scale = 1.0 / 0xffff;              pipe_get_tile_raw(pipe, strb->surface, x, y, width, 1, ztemp, 0); diff --git a/src/mesa/state_tracker/st_cb_readpixels.h b/src/mesa/state_tracker/st_cb_readpixels.h index 79acdad88e..9e151be51f 100644 --- a/src/mesa/state_tracker/st_cb_readpixels.h +++ b/src/mesa/state_tracker/st_cb_readpixels.h @@ -29,6 +29,9 @@  #ifndef ST_CB_READPIXELS_H  #define ST_CB_READPIXELS_H +extern struct st_renderbuffer * +st_get_color_read_renderbuffer(GLcontext *ctx); +  extern void  st_read_stencil_pixels(GLcontext *ctx, GLint x, GLint y,                         GLsizei width, GLsizei height, GLenum type, diff --git a/src/mesa/state_tracker/st_cb_strings.c b/src/mesa/state_tracker/st_cb_strings.c index 247519ab3d..066124f8f3 100644 --- a/src/mesa/state_tracker/st_cb_strings.c +++ b/src/mesa/state_tracker/st_cb_strings.c @@ -53,21 +53,21 @@ st_get_string(GLcontext * ctx, GLenum name)        const char *vendor = screen->get_vendor( screen );        const char *tungsten = "Tungsten Graphics, Inc."; -      /* Tungsten developed the state_tracker module (and much of -       * Mesa), but the driver itself may come from elsewhere.  The -       * additional string allows "and XyzCorp" to reflect this. +      /* Tungsten Graphics, Inc. developed the state_tracker module +       * (and much of Mesa), but the driver itself may come from elsewhere. +       * The additional string allows "and XyzCorp" to reflect this.         */        if (vendor && strcmp(vendor, tungsten) != 0) -	 snprintf(st->vendor, sizeof(st->vendor), +	 util_snprintf(st->vendor, sizeof(st->vendor),                    "%s and %s", tungsten, vendor);        else -	 snprintf(st->vendor, sizeof(st->vendor), "%s", tungsten); +	 util_snprintf(st->vendor, sizeof(st->vendor), "%s", tungsten);        return (GLubyte *) st->vendor;     }     case GL_RENDERER: -      snprintf(st->renderer, sizeof(st->renderer), "Gallium %s, %s on %s",  +      util_snprintf(st->renderer, sizeof(st->renderer), "Gallium %s, %s on %s",                  ST_VERSION_STRING,  	       screen->get_name( screen ),  	       screen->winsys->get_name( screen->winsys )); diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 43b43ec14c..cc17bebc6b 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -31,6 +31,7 @@  #include "main/image.h"  #include "main/macros.h"  #include "main/mipmap.h" +#include "main/pixel.h"  #include "main/texcompress.h"  #include "main/texformat.h"  #include "main/teximage.h" @@ -41,6 +42,7 @@  #include "state_tracker/st_cb_fbo.h"  #include "state_tracker/st_cb_texture.h"  #include "state_tracker/st_format.h" +#include "state_tracker/st_public.h"  #include "state_tracker/st_texture.h"  #include "state_tracker/st_gen_mipmap.h" @@ -48,6 +50,7 @@  #include "pipe/p_defines.h"  #include "pipe/p_inlines.h"  #include "util/p_tile.h" +#include "util/u_blit.h"  #define DBG if (0) printf @@ -148,7 +151,7 @@ st_DeleteTextureObject(GLcontext *ctx,  {     struct st_texture_object *stObj = st_texture_object(texObj);     if (stObj->pt) -      pipe_texture_release(&stObj->pt); +      pipe_texture_reference(&stObj->pt, NULL);     _mesa_delete_texture_object(ctx, texObj);  } @@ -162,7 +165,7 @@ st_FreeTextureImageData(GLcontext * ctx, struct gl_texture_image *texImage)     DBG("%s\n", __FUNCTION__);     if (stImage->pt) { -      pipe_texture_release(&stImage->pt); +      pipe_texture_reference(&stImage->pt, NULL);     }     if (texImage->Data) { @@ -491,6 +494,10 @@ st_TexImage(GLcontext * ctx,        strip_texture_border(border, &width, &height, &depth,                             unpack, &unpackNB);        unpack = &unpackNB; +      texImage->Width = width; +      texImage->Height = height; +      texImage->Depth = depth; +      texImage->Border = 0;        border = 0;     } @@ -537,7 +544,7 @@ st_TexImage(GLcontext * ctx,      * Release any old malloced memory.      */     if (stImage->pt) { -      pipe_texture_release(&stImage->pt); +      pipe_texture_reference(&stImage->pt, NULL);        assert(!texImage->Data);     }     else if (texImage->Data) { @@ -549,15 +556,17 @@ st_TexImage(GLcontext * ctx,      * waiting on any outstanding fences.      */     if (stObj->pt && -       /*stObj->pt->first_level == level &&*/ -       stObj->pt->last_level == level && -       stObj->pt->target != PIPE_TEXTURE_CUBE && -       !st_texture_match_image(stObj->pt, &stImage->base, -                                  stImage->face, stImage->level)) { +       (stObj->teximage_realloc || +        (/*stObj->pt->first_level == level &&*/ +         stObj->pt->last_level == level && +         stObj->pt->target != PIPE_TEXTURE_CUBE && +         !st_texture_match_image(stObj->pt, &stImage->base, +                                 stImage->face, stImage->level)))) {        DBG("release it\n"); -      pipe_texture_release(&stObj->pt); +      pipe_texture_reference(&stObj->pt, NULL);        assert(!stObj->pt); +      stObj->teximage_realloc = FALSE;     }     if (!stObj->pt) { @@ -894,6 +903,11 @@ st_TexSubimage(GLcontext * ctx,        dstRowStride = stImage->surface->pitch * stImage->surface->cpp;     } +   if (!texImage->Data) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); +      return; +   } +     src = (const GLubyte *) pixels;     for (i = 0; i++ < depth;) { @@ -905,10 +919,11 @@ st_TexSubimage(GLcontext * ctx,  					   texImage->ImageOffsets,  					   width, height, 1,  					   format, type, src, packing)) { -	 _mesa_error(ctx, GL_OUT_OF_MEMORY, "st_TexSubImage"); +	 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage");        }        if (stImage->pt && i < depth) { +         /* map next slice of 3D texture */  	 st_texture_image_unmap(stImage);  	 texImage->Data = st_texture_image_map(ctx->st, stImage, zoffset + i);  	 src += srcImageStride; @@ -1030,9 +1045,10 @@ fallback_copy_texsubimage(GLcontext *ctx,     const uint face = texture_face(target);     struct pipe_texture *pt = stImage->pt;     struct pipe_surface *src_surf, *dest_surf; -   GLfloat *data;     GLint row, yStep; +   st_flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL); +     /* determine bottom-to-top vs. top-to-bottom order */     if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {        destY = height - 1 - destY; @@ -1046,25 +1062,38 @@ fallback_copy_texsubimage(GLcontext *ctx,     dest_surf = screen->get_tex_surface(screen, pt, face, level, destZ); -   /* buffer for one row */ -   data = (GLfloat *) malloc(width * 4 * sizeof(GLfloat)); +   assert(width <= MAX_WIDTH); -   /* do copy row by row */ -   for (row = 0; row < height; row++) { -      pipe_get_tile_rgba(pipe, src_surf, srcX, srcY + row, width, 1, data); +   /* +    * To avoid a large temp memory allocation, do copy row by row. +    */ +   if (baseFormat == GL_DEPTH_COMPONENT) { +      const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F || +                                     ctx->Pixel.DepthBias != 0.0F); -      /* XXX we're ignoring convolution for now */ -      if (ctx->_ImageTransferState) { -         _mesa_apply_rgba_transfer_ops(ctx, -                            ctx->_ImageTransferState & ~IMAGE_CONVOLUTION_BIT, -                            width, (GLfloat (*)[4])data); +      for (row = 0; row < height; row++, srcY++, destY += yStep) { +         uint data[MAX_WIDTH]; +         pipe_get_tile_z(pipe, src_surf, srcX, srcY, width, 1, data); +         if (scaleOrBias) { +            _mesa_scale_and_bias_depth_uint(ctx, width, data); +         } +         pipe_put_tile_z(pipe, dest_surf, destX, destY, width, 1, data); +      } +   } +   else { +      /* RGBA format */ +      for (row = 0; row < height; row++, srcY++, destY += yStep) { +         float data[4 * MAX_WIDTH]; +         pipe_get_tile_rgba(pipe, src_surf, srcX, srcY, width, 1, data); +         /* XXX we're ignoring convolution for now */ +         if (ctx->_ImageTransferState) { +            _mesa_apply_rgba_transfer_ops(ctx, +                          ctx->_ImageTransferState & ~IMAGE_CONVOLUTION_BIT, +                          width, (GLfloat (*)[4]) data); +         } +         pipe_put_tile_rgba(pipe, dest_surf, destX, destY, width, 1, data);        } - -      pipe_put_tile_rgba(pipe, dest_surf, destX, destY, width, 1, data); -      destY += yStep;     } - -   free(data);  } @@ -1101,6 +1130,7 @@ do_copy_texsubimage(GLcontext *ctx,     struct pipe_surface *dest_surface;     uint dest_format, src_format;     uint do_flip = FALSE; +   GLboolean use_fallback = GL_TRUE;     (void) texImage; @@ -1131,11 +1161,9 @@ do_copy_texsubimage(GLcontext *ctx,     dest_surface = screen->get_tex_surface(screen, stImage->pt, stImage->face,                                            stImage->level, destZ); -   if (src_format == dest_format && -       ctx->_ImageTransferState == 0x0 && +   if (ctx->_ImageTransferState == 0x0 &&         strb->surface->buffer && -       dest_surface->buffer && -       strb->surface->cpp == stImage->pt->cpp) { +       dest_surface->buffer) {        /* do blit-style copy */        /* XXX may need to invert image depending on window @@ -1159,19 +1187,36 @@ do_copy_texsubimage(GLcontext *ctx,                          GL_COPY); /* ? */  #else -      pipe->surface_copy(pipe, -                         do_flip, -			 /* dest */ -			 dest_surface, -			 destX, destY, -			 /* src */ -			 strb->surface, -			 srcX, srcY, -			 /* size */ -			 width, height); +      if (src_format == dest_format) { +          pipe->surface_copy(pipe, +			     do_flip, +			     /* dest */ +			     dest_surface, +			     destX, destY, +			     /* src */ +			     strb->surface, +			     srcX, srcY, +			     /* size */ +			     width, height); +          use_fallback = GL_FALSE; +      } +      else if (screen->is_format_supported(screen, strb->surface->format, +                                           PIPE_TEXTURE) && +               screen->is_format_supported(screen, dest_surface->format, +                                           PIPE_SURFACE)) { +         util_blit_pixels(ctx->st->blit, +                          strb->surface, +                          srcX, do_flip ? srcY + height : srcY, +                          srcX + width, do_flip ? srcY : srcY + height, +                          dest_surface, +                          destX, destY, destX + width, destY + height, +                          0.0, PIPE_TEX_MIPFILTER_NEAREST); +         use_fallback = GL_FALSE; +      }  #endif     } -   else { + +   if (use_fallback) {        fallback_copy_texsubimage(ctx, target, level,                                  strb, stImage, baseFormat,                                  destX, destY, destZ, @@ -1299,8 +1344,6 @@ static void  calculate_first_last_level(struct st_texture_object *stObj)  {     struct gl_texture_object *tObj = &stObj->base; -   const struct gl_texture_image *const baseImage = -      tObj->Image[0][tObj->BaseLevel];     /* These must be signed values.  MinLod and MaxLod can be negative numbers,      * and having firstLevel and lastLevel as signed prevents the need for @@ -1323,7 +1366,7 @@ calculate_first_last_level(struct st_texture_object *stObj)        }        else {           firstLevel = 0; -         lastLevel = MIN2(tObj->MaxLevel - tObj->BaseLevel, baseImage->MaxLog2); +         lastLevel = MIN2(tObj->MaxLevel, tObj->Image[0][tObj->BaseLevel]->WidthLog2);        }        break;     case GL_TEXTURE_RECTANGLE_NV: @@ -1353,9 +1396,9 @@ copy_image_data_to_texture(struct st_context *st,                              stImage->face                              ); -      pipe_texture_release(&stImage->pt); +      pipe_texture_reference(&stImage->pt, NULL);     } -   else { +   else if (stImage->base.Data) {        assert(stImage->base.Data != NULL);        /* More straightforward upload.   @@ -1363,7 +1406,7 @@ copy_image_data_to_texture(struct st_context *st,        st_texture_image_data(st->pipe,                                 stObj->pt,                                 stImage->face, -                               stImage->level, +                               dstLevel,                                 stImage->base.Data,                                 stImage->base.RowStride,                                 stImage->base.RowStride * @@ -1405,17 +1448,6 @@ st_finalize_texture(GLcontext *ctx,     calculate_first_last_level(stObj);     firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); -#if 0 -   /* Fallback case: -    */ -   if (firstImage->base.Border) { -      if (stObj->pt) { -         pipe_texture_release(&stObj->pt); -      } -      return GL_FALSE; -   } -#endif -     /* If both firstImage and stObj point to a texture which can contain      * all active images, favour firstImage.  Note that because of the      * completeness requirement, we know that the image dimensions @@ -1425,9 +1457,6 @@ st_finalize_texture(GLcontext *ctx,         firstImage->pt != stObj->pt &&         firstImage->pt->last_level >= stObj->lastLevel) { -      if (stObj->pt) -         pipe_texture_release(&stObj->pt); -        pipe_texture_reference(&stObj->pt, firstImage->pt);     } @@ -1439,24 +1468,25 @@ st_finalize_texture(GLcontext *ctx,        cpp = firstImage->base.TexFormat->TexelBytes;     } -   /* Check texture can hold all active levels.  Check texture matches -    * target, imageFormat, etc. +   /* If we already have a gallium texture, check that it matches the texture +    * object's format, target, size, num_levels, etc.      */ -   if (stObj->pt && -       (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || -	stObj->pt->format != -	st_mesa_format_to_pipe_format(firstImage->base.TexFormat->MesaFormat) || -	stObj->pt->last_level != stObj->lastLevel || -	stObj->pt->width[0] != firstImage->base.Width2 || -	stObj->pt->height[0] != firstImage->base.Height2 || -	stObj->pt->depth[0] != firstImage->base.Depth2 || -	stObj->pt->cpp != cpp || -	stObj->pt->compressed != firstImage->base.IsCompressed)) { -      pipe_texture_release(&stObj->pt); +   if (stObj->pt) { +      const enum pipe_format fmt = +         st_mesa_format_to_pipe_format(firstImage->base.TexFormat->MesaFormat); +      if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || +          stObj->pt->format != fmt || +          stObj->pt->last_level < stObj->lastLevel || +          stObj->pt->width[0] != firstImage->base.Width2 || +          stObj->pt->height[0] != firstImage->base.Height2 || +          stObj->pt->depth[0] != firstImage->base.Depth2 || +          stObj->pt->cpp != cpp || +          stObj->pt->compressed != firstImage->base.IsCompressed) { +         pipe_texture_release(&stObj->pt); +      }     } - -   /* May need to create a new texture: +   /* May need to create a new gallium texture:      */     if (!stObj->pt) {        stObj->pt = st_texture_create(ctx->st, diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 7511c28074..4081722bc7 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -55,7 +55,6 @@  #include "st_gen_mipmap.h"  #include "st_program.h"  #include "pipe/p_context.h" -#include "pipe/p_winsys.h"  #include "pipe/p_inlines.h"  #include "draw/draw_context.h"  #include "cso_cache/cso_cache.h" @@ -128,8 +127,6 @@ st_create_context_priv( GLcontext *ctx, struct pipe_context *pipe )     st->ctx->VertexProgram._MaintainTnlProgram = GL_TRUE; -   st->haveFramebufferSurfaces = GL_TRUE; -     st->pixel_xfer.cache = _mesa_new_program_cache();     /* GL limits and extensions */ @@ -159,7 +156,6 @@ struct st_context *st_create_context(struct pipe_context *pipe,  static void st_destroy_context_priv( struct st_context *st )  { -   struct pipe_winsys *ws = st->pipe->winsys;     uint i;     draw_destroy(st->draw); @@ -169,29 +165,46 @@ static void st_destroy_context_priv( struct st_context *st )     st_destroy_bitmap(st);     st_destroy_blit(st);     st_destroy_clear(st); +   st_destroy_drawpix(st);     _vbo_DestroyContext(st->ctx); -   cso_destroy_context(st->cso_context); - -   _mesa_delete_program_cache(st->ctx, st->pixel_xfer.cache); +   for (i = 0; i < Elements(st->state.sampler_texture); i++) { +      pipe_texture_reference(&st->state.sampler_texture[i], NULL); +   }     for (i = 0; i < Elements(st->state.constants); i++) {        if (st->state.constants[i].buffer) { -         pipe_buffer_reference(ws, &st->state.constants[i].buffer, NULL); +         pipe_reference_buffer(st->pipe, &st->state.constants[i].buffer, NULL);        }     } -   st->pipe->destroy( st->pipe );     free( st );  }  void st_destroy_context( struct st_context *st )  { +   struct pipe_context *pipe = st->pipe; +   struct cso_context *cso = st->cso_context;     GLcontext *ctx = st->ctx; + +   /* need to unbind and destroy CSO objects before anything else */ +   cso_release_all(st->cso_context); + +   st_reference_fragprog(st, &st->fp, NULL); +   st_reference_vertprog(st, &st->vp, NULL); + +   _mesa_delete_program_cache(st->ctx, st->pixel_xfer.cache); +     _mesa_free_context_data(ctx); +     st_destroy_context_priv(st); + +   cso_destroy_context(cso); + +   pipe->destroy( pipe ); +     free(ctx);  } diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index bcebbd4943..46c16e45e6 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -45,6 +45,11 @@ struct blit_state;  struct bitmap_cache; +#define FRONT_STATUS_UNDEFINED    0 +#define FRONT_STATUS_DIRTY        1 +#define FRONT_STATUS_COPY_OF_BACK 2 + +  #define ST_NEW_MESA                    0x1 /* Mesa state has changed */  #define ST_NEW_FRAGMENT_PROGRAM        0x2  #define ST_NEW_VERTEX_PROGRAM          0x4 @@ -104,19 +109,11 @@ struct st_context        struct gl_fragment_program *fragment_program;     } cb; -   struct { -      GLuint frontbuffer_dirty:1; -   } flags; +   GLuint frontbuffer_status;  /**< one of FRONT_STATUS_ */     char vendor[100];     char renderer[100]; -   /** Can we access the front/back color buffers as pipe_surfaces? -    * We can't with the Xlib driver... -    * This is a hack that should be fixed someday. -    */ -   GLboolean haveFramebufferSurfaces; -     /* State to be validated:      */     struct st_tracked_state **atoms; @@ -126,8 +123,6 @@ struct st_context     GLfloat polygon_offset_scale; /* ?? */ -   GLfloat bitmap_texcoord_bias; -     /** Mapping from VERT_RESULT_x to post-transformed vertex slot */     const GLuint *vertex_result_to_slot; @@ -141,22 +136,28 @@ struct st_context        GLuint user_prog_sn;  /**< user fragment program serial no. */        struct st_fragment_program *combined_prog;        GLuint combined_prog_sn; +      struct pipe_texture *pixelmap_texture; +      boolean pixelmap_enabled;  /**< use the pixelmap texture? */     } pixel_xfer;     /** for glBitmap */     struct { -      struct st_fragment_program *program;  /**< bitmap tex/kil program */ -      GLuint user_prog_sn;  /**< user fragment program serial no. */ -      struct st_fragment_program *combined_prog;        struct pipe_rasterizer_state rasterizer;        struct pipe_sampler_state sampler;        struct pipe_shader_state vert_shader; +      enum pipe_format tex_format;        void *vs;        float vertices[4][3][4];  /**< vertex pos + color + texcoord */        struct pipe_buffer *vbuf;        struct bitmap_cache *cache;     } bitmap; +   /** for glDraw/CopyPixels */ +   struct { +      struct st_fragment_program *z_shader; +      struct st_vertex_program *vert_shaders[2]; +   } drawpix; +     /** for glClear */     struct {        struct pipe_shader_state vert_shader; @@ -169,6 +170,8 @@ struct st_context        struct pipe_buffer *vbuf;     } clear; +   void *passthrough_fs;  /**< simple pass-through frag shader */ +     struct gen_mipmap_state *gen_mipmap;     struct blit_state *blit; diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index f0f62246dd..a3bffbfc95 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -35,15 +35,14 @@  #include "vbo/vbo.h" -#include "st_atom.h"  #include "st_context.h" +#include "st_atom.h"  #include "st_cb_bufferobjects.h"  #include "st_draw.h"  #include "st_program.h"  #include "pipe/p_context.h"  #include "pipe/p_defines.h" -#include "pipe/p_winsys.h"  #include "pipe/p_inlines.h"  #include "draw/draw_private.h" @@ -190,6 +189,60 @@ pipe_vertex_format(GLenum type, GLuint size, GLboolean normalized)  } +/* + * If edge flags are needed, setup an bitvector of flags and call + * pipe->set_edgeflags(). + * XXX memleak: need to free the returned pointer at some point + */ +static void * +setup_edgeflags(GLcontext *ctx, GLenum primMode, GLint start, GLint count, +                const struct gl_client_array *array) +{ +   struct pipe_context *pipe = ctx->st->pipe; + +   if ((primMode == GL_TRIANGLES || +        primMode == GL_QUADS || +        primMode == GL_POLYGON) && +       (ctx->Polygon.FrontMode != GL_FILL || +        ctx->Polygon.BackMode != GL_FILL)) { +      /* need edge flags */ +      GLuint i; +      unsigned *vec; +      struct st_buffer_object *stobj = st_buffer_object(array->BufferObj); +      ubyte *map; + +      if (!stobj) +         return NULL; + +      vec = (unsigned *) calloc(sizeof(unsigned), (count + 31) / 32); +      if (!vec) +         return NULL; + +      map = pipe_buffer_map(pipe, stobj->buffer, PIPE_BUFFER_USAGE_CPU_READ); +      map = ADD_POINTERS(map, array->Ptr); + +      for (i = 0; i < count; i++) { +         if (*((float *) map)) +            vec[i/32] |= 1 << (i % 32); + +         map += array->StrideB; +      } + +      pipe_buffer_unmap(pipe, stobj->buffer); + +      pipe->set_edgeflags(pipe, vec); + +      return vec; +   } +   else { +      /* edge flags not needed */ +      pipe->set_edgeflags(pipe, NULL); +      return NULL; +   } +} + + +  /**   * This function gets plugged into the VBO module and is called when   * we have something to render. @@ -205,7 +258,6 @@ st_draw_vbo(GLcontext *ctx,              GLuint max_index)  {     struct pipe_context *pipe = ctx->st->pipe; -   struct pipe_winsys *winsys = pipe->winsys;     const struct st_vertex_program *vp;     const struct pipe_shader_state *vs;     struct pipe_vertex_buffer vbuffer[PIPE_MAX_SHADER_INPUTS]; @@ -237,7 +289,7 @@ st_draw_vbo(GLcontext *ctx,           assert(stobj->buffer);           vbuffer[attr].buffer = NULL; -         pipe_buffer_reference(winsys, &vbuffer[attr].buffer, stobj->buffer); +         pipe_reference_buffer(pipe, &vbuffer[attr].buffer, stobj->buffer);           vbuffer[attr].buffer_offset = (unsigned) arrays[0]->Ptr;/* in bytes */           velements[attr].src_offset = arrays[mesaAttr]->Ptr - arrays[0]->Ptr;           assert(velements[attr].src_offset <= 2048); /* 11-bit field */ @@ -255,9 +307,8 @@ st_draw_vbo(GLcontext *ctx,           /* wrap user data */           vbuffer[attr].buffer -            = winsys->user_buffer_create(winsys, -                                         (void *) arrays[mesaAttr]->Ptr, -                                         bytes); +            = pipe_user_buffer_create(pipe, (void *) arrays[mesaAttr]->Ptr, +                                      bytes);           vbuffer[attr].buffer_offset = 0;           velements[attr].src_offset = 0;        } @@ -277,7 +328,6 @@ st_draw_vbo(GLcontext *ctx,     pipe->set_vertex_buffers(pipe, vp->num_inputs, vbuffer);     pipe->set_vertex_elements(pipe, vp->num_inputs, velements); -     /* do actual drawing */     if (ib) {        /* indexed primitive */ @@ -304,37 +354,44 @@ st_draw_vbo(GLcontext *ctx,        if (bufobj && bufobj->Name) {           /* elements/indexes are in a real VBO */           struct st_buffer_object *stobj = st_buffer_object(bufobj); -         pipe_buffer_reference(winsys, &indexBuf, stobj->buffer); +         pipe_reference_buffer(pipe, &indexBuf, stobj->buffer);           indexOffset = (unsigned) ib->ptr / indexSize;        }        else {           /* element/indicies are in user space memory */ -         indexBuf = winsys->user_buffer_create(winsys, -                                               (void *) ib->ptr, -                                               ib->count * indexSize); +         indexBuf = pipe_user_buffer_create(pipe, (void *) ib->ptr, +                                            ib->count * indexSize);           indexOffset = 0;        }        /* draw */        for (i = 0; i < nr_prims; i++) { +         setup_edgeflags(ctx, prims[i].mode, +                         prims[i].start + indexOffset, prims[i].count, +                         arrays[VERT_ATTRIB_EDGEFLAG]); +           pipe->draw_elements(pipe, indexBuf, indexSize,                               prims[i].mode,                               prims[i].start + indexOffset, prims[i].count);        } -      pipe_buffer_reference(winsys, &indexBuf, NULL); +      pipe_reference_buffer(pipe, &indexBuf, NULL);     }     else {        /* non-indexed */        GLuint i;        for (i = 0; i < nr_prims; i++) { +         setup_edgeflags(ctx, prims[i].mode, +                         prims[i].start, prims[i].count, +                         arrays[VERT_ATTRIB_EDGEFLAG]); +           pipe->draw_arrays(pipe, prims[i].mode, prims[i].start, prims[i].count);        }     }     /* unreference buffers (frees wrapped user-space buffer objects) */     for (attr = 0; attr < vp->num_inputs; attr++) { -      pipe_buffer_reference(winsys, &vbuffer[attr].buffer, NULL); +      pipe_reference_buffer(pipe, &vbuffer[attr].buffer, NULL);        assert(!vbuffer[attr].buffer);     }     pipe->set_vertex_buffers(pipe, vp->num_inputs, vbuffer); @@ -343,76 +400,6 @@ st_draw_vbo(GLcontext *ctx,  /** - * Utility function for drawing simple primitives (such as quads for - * glClear and glDrawPixels).  Coordinates are in screen space. - * \param mode  one of PIPE_PRIM_x - * \param numVertex  number of vertices - * \param verts  vertex data (all attributes are float[4]) - * \param numAttribs  number of attributes per vertex - */ -void  -st_draw_vertices(GLcontext *ctx, unsigned prim, -                 unsigned numVertex, float *verts, -                 unsigned numAttribs, -                 GLboolean inClipCoords) -{ -   const float width = ctx->DrawBuffer->Width; -   const float height = ctx->DrawBuffer->Height; -   const unsigned vertex_bytes = numVertex * numAttribs * 4 * sizeof(float); -   struct pipe_context *pipe = ctx->st->pipe; -   struct pipe_buffer *vbuf; -   struct pipe_vertex_buffer vbuffer; -   struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS]; -   unsigned i; - -   assert(numAttribs > 0); - -   if (!inClipCoords) { -      /* convert to clip coords */ -      for (i = 0; i < numVertex; i++) { -         float x = verts[i * numAttribs * 4 + 0]; -         float y = verts[i * numAttribs * 4 + 1]; -         x = x / width * 2.0 - 1.0; -         y = y / height * 2.0 - 1.0; -         verts[i * numAttribs * 4 + 0] = x; -         verts[i * numAttribs * 4 + 1] = y; -      } -   } - -   /* XXX create one-time */ -   vbuf = pipe->winsys->buffer_create(pipe->winsys, 32, -                                      PIPE_BUFFER_USAGE_VERTEX, vertex_bytes); -   assert(vbuf); - -   memcpy(pipe->winsys->buffer_map(pipe->winsys, vbuf, -                                   PIPE_BUFFER_USAGE_CPU_WRITE), -          verts, vertex_bytes); -   pipe->winsys->buffer_unmap(pipe->winsys, vbuf); - -   /* tell pipe about the vertex buffer */ -   vbuffer.buffer = vbuf; -   vbuffer.pitch = numAttribs * 4 * sizeof(float);  /* vertex size */ -   vbuffer.buffer_offset = 0; -   pipe->set_vertex_buffers(pipe, 1, &vbuffer); - -   /* tell pipe about the vertex attributes */ -   for (i = 0; i < numAttribs; i++) { -      velements[i].src_offset = i * 4 * sizeof(GLfloat); -      velements[i].vertex_buffer_index = 0; -      velements[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; -      velements[i].nr_components = 4; -   } -   pipe->set_vertex_elements(pipe, numAttribs, velements); - -   /* draw */ -   pipe->draw_arrays(pipe, prim, 0, numVertex); - -   /* XXX: do one-time */ -   pipe_buffer_reference(pipe->winsys, &vbuf, NULL); -} - - -/**   * Set the (private) draw module's post-transformed vertex format when in   * GL_SELECT or GL_FEEDBACK mode or for glRasterPos.   */ @@ -466,7 +453,6 @@ st_feedback_draw_vbo(GLcontext *ctx,     struct st_context *st = ctx->st;     struct pipe_context *pipe = st->pipe;     struct draw_context *draw = st->draw; -   struct pipe_winsys *winsys = pipe->winsys;     const struct st_vertex_program *vp;     const struct pipe_shader_state *vs;     struct pipe_buffer *index_buffer_handle = 0; @@ -517,7 +503,7 @@ st_feedback_draw_vbo(GLcontext *ctx,           assert(stobj->buffer);           vbuffers[attr].buffer = NULL; -         pipe_buffer_reference(winsys, &vbuffers[attr].buffer, stobj->buffer); +         pipe_reference_buffer(pipe, &vbuffers[attr].buffer, stobj->buffer);           vbuffers[attr].buffer_offset = (unsigned) arrays[0]->Ptr;/* in bytes */           velements[attr].src_offset = arrays[mesaAttr]->Ptr - arrays[0]->Ptr;        } @@ -529,9 +515,8 @@ st_feedback_draw_vbo(GLcontext *ctx,           /* wrap user data */           vbuffers[attr].buffer -            = winsys->user_buffer_create(winsys, -                                         (void *) arrays[mesaAttr]->Ptr, -                                         bytes); +            = pipe_user_buffer_create(pipe, (void *) arrays[mesaAttr]->Ptr, +                                      bytes);           vbuffers[attr].buffer_offset = 0;           velements[attr].src_offset = 0;        } @@ -552,9 +537,8 @@ st_feedback_draw_vbo(GLcontext *ctx,  #endif        /* map the attrib buffer */ -      map = pipe->winsys->buffer_map(pipe->winsys, -                                     vbuffers[attr].buffer, -                                     PIPE_BUFFER_USAGE_CPU_READ); +      map = pipe_buffer_map(pipe, vbuffers[attr].buffer, +                            PIPE_BUFFER_USAGE_CPU_READ);        draw_set_mapped_vertex_buffer(draw, attr, map);     } @@ -565,9 +549,10 @@ st_feedback_draw_vbo(GLcontext *ctx,        unsigned indexSize;        struct gl_buffer_object *bufobj = ib->obj;        struct st_buffer_object *stobj = st_buffer_object(bufobj); -      index_buffer_handle = stobj->buffer;        void *map; +      index_buffer_handle = stobj->buffer; +        switch (ib->type) {        case GL_UNSIGNED_INT:           indexSize = 4; @@ -580,9 +565,8 @@ st_feedback_draw_vbo(GLcontext *ctx,  	 return;        } -      map = pipe->winsys->buffer_map(pipe->winsys, -                                     index_buffer_handle, -                                     PIPE_BUFFER_USAGE_CPU_READ); +      map = pipe_buffer_map(pipe, index_buffer_handle, +                            PIPE_BUFFER_USAGE_CPU_READ);        draw_set_mapped_element_buffer(draw, indexSize, map);     }     else { @@ -592,7 +576,7 @@ st_feedback_draw_vbo(GLcontext *ctx,     /* map constant buffers */ -   mapped_constants = winsys->buffer_map(winsys, +   mapped_constants = pipe_buffer_map(pipe,                                 st->state.constants[PIPE_SHADER_VERTEX].buffer,                                 PIPE_BUFFER_USAGE_CPU_READ);     draw_set_mapped_constant_buffer(st->draw, mapped_constants); @@ -605,21 +589,20 @@ st_feedback_draw_vbo(GLcontext *ctx,     /* unmap constant buffers */ -   winsys->buffer_unmap(winsys, st->state.constants[PIPE_SHADER_VERTEX].buffer); +   pipe_buffer_unmap(pipe, st->state.constants[PIPE_SHADER_VERTEX].buffer);     /*      * unmap vertex/index buffers      */     for (i = 0; i < PIPE_MAX_ATTRIBS; i++) { -      if (draw->vertex_buffer[i].buffer) { -         pipe->winsys->buffer_unmap(pipe->winsys, -                                    draw->vertex_buffer[i].buffer); -         pipe_buffer_reference(winsys, &draw->vertex_buffer[i].buffer, NULL); +      if (draw->pt.vertex_buffer[i].buffer) { +         pipe_buffer_unmap(pipe, draw->pt.vertex_buffer[i].buffer); +         pipe_reference_buffer(pipe, &draw->pt.vertex_buffer[i].buffer, NULL);           draw_set_mapped_vertex_buffer(draw, i, NULL);        }     }     if (ib) { -      pipe->winsys->buffer_unmap(pipe->winsys, index_buffer_handle); +      pipe_buffer_unmap(pipe, index_buffer_handle);        draw_set_mapped_element_buffer(draw, 0, NULL);     }  } diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h index 171bde57e5..c81f2b25da 100644 --- a/src/mesa/state_tracker/st_draw.h +++ b/src/mesa/state_tracker/st_draw.h @@ -59,11 +59,4 @@ st_feedback_draw_vbo(GLcontext *ctx,                       GLuint min_index,                       GLuint max_index); -void  -st_draw_vertices(GLcontext *ctx, unsigned prim, -                 unsigned numVertex, float *verts, -                 unsigned numAttribs, -                 GLboolean inClipCoords); - -  #endif diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 47a50d40ca..6f94ba39ae 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -38,17 +38,17 @@  #include "st_extensions.h" -static int min(int a, int b) +static int _min(int a, int b)  {     return (a < b) ? a : b;  } -static int max(int a, int b) +static int _max(int a, int b)  {     return (a > b) ? a : b;  } -static int clamp(int a, int min, int max) +static int _clamp(int a, int min, int max)  {     if (a < min)        return min; @@ -69,48 +69,49 @@ void st_init_limits(struct st_context *st)     struct gl_constants *c = &st->ctx->Const;     c->MaxTextureLevels -      = min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS), +      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),              MAX_TEXTURE_LEVELS);     c->Max3DTextureLevels -      = min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS), +      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),              MAX_3D_TEXTURE_LEVELS);     c->MaxCubeTextureLevels -      = min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS), +      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),              MAX_CUBE_TEXTURE_LEVELS);     c->MaxTextureRectSize -      = min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE); +      = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);     c->MaxTextureUnits        = c->MaxTextureImageUnits        = c->MaxTextureCoordUnits -      = min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS), +      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS),              MAX_TEXTURE_IMAGE_UNITS);     c->MaxDrawBuffers -      = clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS), +      = _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),                1, MAX_DRAW_BUFFERS);     c->MaxLineWidth -      = max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH)); +      = _max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH));     c->MaxLineWidthAA -      = max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH_AA)); +      = _max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH_AA));     c->MaxPointSize -      = max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH)); +      = _max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH));     c->MaxPointSizeAA -      = max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH_AA)); +      = _max(1.0, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH_AA));     c->MaxTextureMaxAnisotropy -      = max(2.0, screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_ANISOTROPY)); +      = _max(2.0, screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_ANISOTROPY));     c->MaxTextureLodBias        = screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_LOD_BIAS); -   st->bitmap_texcoord_bias -      = screen->get_paramf(screen, PIPE_CAP_BITMAP_TEXCOORD_BIAS); +   c->MaxDrawBuffers +      = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS), +              1, MAX_DRAW_BUFFERS);  } @@ -160,6 +161,7 @@ void st_init_extensions(struct st_context *st)     ctx->Extensions.NV_blend_square = GL_TRUE;     ctx->Extensions.NV_texgen_reflection = GL_TRUE; +   ctx->Extensions.SGI_color_matrix = GL_TRUE;     ctx->Extensions.SGIS_generate_mipmap = GL_TRUE; /* XXX temp */     /* @@ -215,11 +217,12 @@ void st_init_extensions(struct st_context *st)        ctx->Extensions.EXT_texture_sRGB = GL_TRUE;     } +#if 01     if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,                                     PIPE_TEXTURE)) {        ctx->Extensions.EXT_texture_compression_s3tc = GL_TRUE;     } - +#endif     if (screen->is_format_supported(screen, PIPE_FORMAT_YCBCR, PIPE_TEXTURE) ||         screen->is_format_supported(screen, PIPE_FORMAT_YCBCR_REV, PIPE_TEXTURE)) {        ctx->Extensions.MESA_ycbcr_texture = GL_TRUE; diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index 20defd5e16..17a3cfd5a4 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -261,13 +261,13 @@ st_mesa_format_to_pipe_format(GLuint mesaFormat)     case MESA_FORMAT_RGB565:        return PIPE_FORMAT_R5G6B5_UNORM;     case MESA_FORMAT_AL88: -      return PIPE_FORMAT_U_A8_L8; +      return PIPE_FORMAT_A8L8_UNORM;     case MESA_FORMAT_A8: -      return PIPE_FORMAT_U_A8; +      return PIPE_FORMAT_A8_UNORM;     case MESA_FORMAT_L8: -      return PIPE_FORMAT_U_L8; +      return PIPE_FORMAT_L8_UNORM;     case MESA_FORMAT_I8: -      return PIPE_FORMAT_U_I8; +      return PIPE_FORMAT_I8_UNORM;     case MESA_FORMAT_Z16:        return PIPE_FORMAT_Z16_UNORM;     case MESA_FORMAT_Z32: @@ -293,7 +293,7 @@ st_mesa_format_to_pipe_format(GLuint mesaFormat)  /**   * Find an RGBA format supported by the context/winsys.   */ -static GLuint +static enum pipe_format  default_rgba_format(struct pipe_screen *screen, uint type)  {     static const enum pipe_format colorFormats[] = { @@ -315,20 +315,23 @@ default_rgba_format(struct pipe_screen *screen, uint type)  /**   * Search list of formats for first RGBA format with >8 bits/channel.   */ -static GLuint +static enum pipe_format  default_deep_rgba_format(struct pipe_screen *screen, uint type)  {     if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SNORM, type)) {        return PIPE_FORMAT_R16G16B16A16_SNORM;     } -   return PIPE_FORMAT_NONE; +   if (type == PIPE_TEXTURE) +      return default_rgba_format(screen, type); +   else +      return PIPE_FORMAT_NONE;  }  /**   * Find an Z format supported by the context/winsys.   */ -static GLuint +static enum pipe_format  default_depth_format(struct pipe_screen *screen, uint type)  {     static const enum pipe_format zFormats[] = { @@ -351,8 +354,9 @@ default_depth_format(struct pipe_screen *screen, uint type)   * Given an OpenGL internalFormat value for a texture or surface, return   * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.   */ -static enum pipe_format -choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType) +enum pipe_format +st_choose_format(struct pipe_context *pipe, GLint internalFormat, +                 uint surfType)  {     struct pipe_screen *screen = pipe->screen; @@ -405,8 +409,8 @@ choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType)     case GL_ALPHA12:     case GL_ALPHA16:     case GL_COMPRESSED_ALPHA: -      if (screen->is_format_supported( screen, PIPE_FORMAT_U_A8, surfType )) -         return PIPE_FORMAT_U_A8; +      if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, surfType )) +         return PIPE_FORMAT_A8_UNORM;        return default_rgba_format( screen, surfType );     case 1: @@ -416,8 +420,8 @@ choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType)     case GL_LUMINANCE12:     case GL_LUMINANCE16:     case GL_COMPRESSED_LUMINANCE: -      if (screen->is_format_supported( screen, PIPE_FORMAT_U_L8, surfType )) -         return PIPE_FORMAT_U_L8; +      if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, surfType )) +         return PIPE_FORMAT_L8_UNORM;        return default_rgba_format( screen, surfType );     case 2: @@ -429,8 +433,8 @@ choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType)     case GL_LUMINANCE12_ALPHA12:     case GL_LUMINANCE16_ALPHA16:     case GL_COMPRESSED_LUMINANCE_ALPHA: -      if (screen->is_format_supported( screen, PIPE_FORMAT_U_A8_L8, surfType )) -         return PIPE_FORMAT_U_A8_L8; +      if (screen->is_format_supported( screen, PIPE_FORMAT_A8L8_UNORM, surfType )) +         return PIPE_FORMAT_A8L8_UNORM;        return default_rgba_format( screen, surfType );     case GL_INTENSITY: @@ -439,8 +443,8 @@ choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType)     case GL_INTENSITY12:     case GL_INTENSITY16:     case GL_COMPRESSED_INTENSITY: -      if (screen->is_format_supported( screen, PIPE_FORMAT_U_I8, surfType )) -         return PIPE_FORMAT_U_I8; +      if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, surfType )) +         return PIPE_FORMAT_I8_UNORM;        return default_rgba_format( screen, surfType );     case GL_YCBCR_MESA: @@ -499,8 +503,8 @@ choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType)     case GL_STENCIL_INDEX4_EXT:     case GL_STENCIL_INDEX8_EXT:     case GL_STENCIL_INDEX16_EXT: -      if (screen->is_format_supported( screen, PIPE_FORMAT_U_S8, surfType )) -         return PIPE_FORMAT_U_S8; +      if (screen->is_format_supported( screen, PIPE_FORMAT_S8_UNORM, surfType )) +         return PIPE_FORMAT_S8_UNORM;        if (screen->is_format_supported( screen, PIPE_FORMAT_S8Z24_UNORM, surfType ))           return PIPE_FORMAT_S8Z24_UNORM;        if (screen->is_format_supported( screen, PIPE_FORMAT_Z24S8_UNORM, surfType )) @@ -527,7 +531,7 @@ choose_format(struct pipe_context *pipe, GLint internalFormat, uint surfType)  enum pipe_format  st_choose_renderbuffer_format(struct pipe_context *pipe, GLint internalFormat)  { -   return choose_format(pipe, internalFormat, PIPE_SURFACE); +   return st_choose_format(pipe, internalFormat, PIPE_SURFACE);  } @@ -543,13 +547,13 @@ translate_gallium_format_to_mesa_format(enum pipe_format format)        return &_mesa_texformat_argb4444;     case PIPE_FORMAT_R5G6B5_UNORM:        return &_mesa_texformat_rgb565; -   case PIPE_FORMAT_U_A8_L8: +   case PIPE_FORMAT_A8L8_UNORM:        return &_mesa_texformat_al88; -   case PIPE_FORMAT_U_A8: +   case PIPE_FORMAT_A8_UNORM:        return &_mesa_texformat_a8; -   case PIPE_FORMAT_U_L8: +   case PIPE_FORMAT_L8_UNORM:        return &_mesa_texformat_l8; -   case PIPE_FORMAT_U_I8: +   case PIPE_FORMAT_I8_UNORM:        return &_mesa_texformat_i8;     case PIPE_FORMAT_Z16_UNORM:        return &_mesa_texformat_z16; @@ -591,7 +595,7 @@ st_ChooseTextureFormat(GLcontext *ctx, GLint internalFormat,     (void) format;     (void) type; -   pFormat = choose_format(ctx->st->pipe, internalFormat, PIPE_TEXTURE); +   pFormat = st_choose_format(ctx->st->pipe, internalFormat, PIPE_TEXTURE);     if (pFormat == PIPE_FORMAT_NONE)        return NULL; diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h index c9a11de504..ff0fd042db 100644 --- a/src/mesa/state_tracker/st_format.h +++ b/src/mesa/state_tracker/st_format.h @@ -64,6 +64,10 @@ st_mesa_format_to_pipe_format(GLuint mesaFormat);  extern enum pipe_format +st_choose_format(struct pipe_context *pipe, GLint internalFormat, +                 uint surfType); + +extern enum pipe_format  st_choose_renderbuffer_format(struct pipe_context *pipe, GLint internalFormat); diff --git a/src/mesa/state_tracker/st_framebuffer.c b/src/mesa/state_tracker/st_framebuffer.c index 075e9d1bd6..47466c97d8 100644 --- a/src/mesa/state_tracker/st_framebuffer.c +++ b/src/mesa/state_tracker/st_framebuffer.c @@ -107,7 +107,7 @@ st_create_framebuffer( const __GLcontextModes *visual,        if (visual->accumRedBits > 0) {           /* 16-bit/channel accum */           struct gl_renderbuffer *accumRb -            = st_new_renderbuffer_fb(PIPE_FORMAT_R16G16B16A16_SNORM); +            = st_new_renderbuffer_fb(DEFAULT_ACCUM_PIPE_FORMAT);           _mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb);        } @@ -188,6 +188,7 @@ st_notify_swapbuffers(struct st_framebuffer *stfb)        st_flush( ctx->st,   		PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_SWAPBUFFERS,                  NULL ); +      ctx->st->frontbuffer_status = FRONT_STATUS_COPY_OF_BACK;     }  } diff --git a/src/mesa/state_tracker/st_gen_mipmap.c b/src/mesa/state_tracker/st_gen_mipmap.c index a931911227..047743689d 100644 --- a/src/mesa/state_tracker/st_gen_mipmap.c +++ b/src/mesa/state_tracker/st_gen_mipmap.c @@ -36,7 +36,6 @@  #include "pipe/p_context.h"  #include "pipe/p_defines.h"  #include "pipe/p_inlines.h" -#include "pipe/p_winsys.h"  #include "util/u_gen_mipmap.h"  #include "cso_cache/cso_cache.h" @@ -95,12 +94,6 @@ st_render_mipmap(struct st_context *st,     util_gen_mipmap(st->gen_mipmap, pt, face, baseLevel, lastLevel,                     PIPE_TEX_FILTER_LINEAR); -   /* shaders don't go through CSO yet */ -   if (st->fp) -      pipe->bind_fs_state(pipe, st->fp->driver_shader); -   if (st->vp) -      pipe->bind_vs_state(pipe, st->vp->driver_shader); -     return TRUE;  } @@ -111,7 +104,6 @@ fallback_generate_mipmap(GLcontext *ctx, GLenum target,  {     struct pipe_context *pipe = ctx->st->pipe;     struct pipe_screen *screen = pipe->screen; -   struct pipe_winsys *ws = pipe->winsys;     struct pipe_texture *pt = st_get_texobj_texture(texObj);     const uint baseLevel = texObj->BaseLevel;     const uint lastLevel = pt->last_level; @@ -134,11 +126,11 @@ fallback_generate_mipmap(GLcontext *ctx, GLenum target,        srcSurf = screen->get_tex_surface(screen, pt, face, srcLevel, zslice);        dstSurf = screen->get_tex_surface(screen, pt, face, dstLevel, zslice); -      srcData = (ubyte *) ws->buffer_map(ws, srcSurf->buffer, -                                         PIPE_BUFFER_USAGE_CPU_READ) +      srcData = (ubyte *) pipe_buffer_map(pipe, srcSurf->buffer, +                                          PIPE_BUFFER_USAGE_CPU_READ)                + srcSurf->offset; -      dstData = (ubyte *) ws->buffer_map(ws, dstSurf->buffer, -                                         PIPE_BUFFER_USAGE_CPU_WRITE) +      dstData = (ubyte *) pipe_buffer_map(pipe, dstSurf->buffer, +                                          PIPE_BUFFER_USAGE_CPU_WRITE)                + dstSurf->offset;        _mesa_generate_mipmap_level(target, datatype, comps, @@ -150,8 +142,8 @@ fallback_generate_mipmap(GLcontext *ctx, GLenum target,                     dstSurf->pitch * dstSurf->cpp, /* stride in bytes */                     dstData); -      ws->buffer_unmap(ws, srcSurf->buffer); -      ws->buffer_unmap(ws, dstSurf->buffer); +      pipe_buffer_unmap(pipe, srcSurf->buffer); +      pipe_buffer_unmap(pipe, dstSurf->buffer);        pipe_surface_reference(&srcSurf, NULL);        pipe_surface_reference(&dstSurf, NULL); @@ -205,6 +197,6 @@ st_generate_mipmap(GLcontext *ctx, GLenum target,        dstImage->TexFormat = srcImage->TexFormat;        stImage = (struct st_texture_image *) dstImage; -      stImage->pt = pt; +      pipe_texture_reference(&stImage->pt, pt);     }  } diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c index 578fd2ecb0..d2be450bdb 100644 --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c @@ -767,12 +767,14 @@ tgsi_translate_mesa_program(           switch (outputSemanticName[i]) {           case TGSI_SEMANTIC_POSITION:              fulldecl = make_output_decl(i, -                                        TGSI_SEMANTIC_POSITION, 0, /* Z / Depth */ +                                        TGSI_SEMANTIC_POSITION, /* Z / Depth */ +                                        outputSemanticIndex[i],                                          TGSI_WRITEMASK_Z );              break;           case TGSI_SEMANTIC_COLOR:              fulldecl = make_output_decl(i, -                                        TGSI_SEMANTIC_COLOR, 0, +                                        TGSI_SEMANTIC_COLOR, +                                        outputSemanticIndex[i],                                          TGSI_WRITEMASK_XYZW );              break;           default: @@ -803,7 +805,7 @@ tgsi_translate_mesa_program(     {        GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1];        GLboolean inside_range = GL_FALSE; -      GLuint start_range; +      GLuint start_range = 0;        find_temporaries(program, tempsUsed);        tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE; diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 4d1ef1bf3d..d450c30694 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -270,7 +270,7 @@ st_translate_vertex_program(struct st_context *st,        stvp->state.tokens = NULL;     }     if (stvp->driver_shader) { -      pipe->delete_vs_state(pipe, stvp->driver_shader); +      cso_delete_vertex_shader(st->cso_context, stvp->driver_shader);        stvp->driver_shader = NULL;     } @@ -315,7 +315,7 @@ st_translate_vertex_program(struct st_context *st,   * \param tokensOut  destination for TGSI tokens   * \return  pointer to cached pipe_shader object.   */ -const struct cso_fragment_shader * +void  st_translate_fragment_program(struct st_context *st,                                struct st_fragment_program *stfp,                                const GLuint inputMapping[]) @@ -325,7 +325,6 @@ st_translate_fragment_program(struct st_context *st,     GLuint outputMapping[FRAG_RESULT_MAX];     GLuint defaultInputMapping[FRAG_ATTRIB_MAX];     struct pipe_shader_state fs; -   const struct cso_fragment_shader *cso;     GLuint interpMode[16];  /* XXX size? */     GLuint attr;     const GLbitfield inputsRead = stfp->Base.Base.InputsRead; @@ -475,7 +474,5 @@ st_translate_fragment_program(struct st_context *st,     if (TGSI_DEBUG)        tgsi_dump( fs.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); - -   return cso;  } diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 63d6590540..bf07a50789 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -34,7 +34,8 @@  #ifndef ST_PROGRAM_H  #define ST_PROGRAM_H -#include "mtypes.h" +#include "main/mtypes.h" +#include "shader/program.h"  #include "pipe/p_shader_tokens.h" @@ -61,7 +62,7 @@ struct st_fragment_program     GLuint input_map[PIPE_MAX_SHADER_INPUTS];     struct pipe_shader_state state; -   struct pipe_shader_state *driver_shader; +   void *driver_shader;     GLuint param_state; @@ -69,6 +70,10 @@ struct st_fragment_program      * outputs match this fragment program's inputs.      */     struct translated_vertex_program *vertex_programs; + +   /** Program prefixed with glBitmap prologue */ +   struct st_fragment_program *bitmap_program; +   uint bitmap_sampler;  }; @@ -88,7 +93,7 @@ struct st_vertex_program     GLuint num_inputs;     struct pipe_shader_state state; -   struct pipe_shader_state *driver_shader; +   void *driver_shader;     /** For using our private draw module (glRasterPos) */     struct draw_vertex_shader *draw_shader; @@ -97,21 +102,42 @@ struct st_vertex_program  }; -static inline struct st_fragment_program * +static INLINE struct st_fragment_program *  st_fragment_program( struct gl_fragment_program *fp )  {     return (struct st_fragment_program *)fp;  } -static inline struct st_vertex_program * +static INLINE struct st_vertex_program *  st_vertex_program( struct gl_vertex_program *vp )  {     return (struct st_vertex_program *)vp;  } -extern const struct cso_fragment_shader * +static INLINE void +st_reference_vertprog(struct st_context *st, +                      struct st_vertex_program **ptr, +                      struct st_vertex_program *prog) +{ +   _mesa_reference_program(st->ctx, +                           (struct gl_program **) ptr, +                           (struct gl_program *) prog); +} + +static INLINE void +st_reference_fragprog(struct st_context *st, +                      struct st_fragment_program **ptr, +                      struct st_fragment_program *prog) +{ +   _mesa_reference_program(st->ctx, +                           (struct gl_program **) ptr, +                           (struct gl_program *) prog); +} + + +extern void  st_translate_fragment_program(struct st_context *st,                                struct st_fragment_program *fp,                                const GLuint inputMapping[]); diff --git a/src/mesa/state_tracker/st_texobj.c b/src/mesa/state_tracker/st_texobj.c deleted file mode 100644 index eb5bdb2d08..0000000000 --- a/src/mesa/state_tracker/st_texobj.c +++ /dev/null @@ -1,102 +0,0 @@ -/************************************************************************** - *  - * Copyright 2007 Tungsten Graphics, 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 TUNGSTEN GRAPHICS 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: - *   Brian Paul - */ - -#include "imports.h" -#include "texformat.h" - -#include "st_context.h" -#include "st_texobj.h" -#include "pipe/p_defines.h" - - -/** - * Create a pipe_texture_object from a Mesa texture object. - * Eventually, gl_texture_object may be derived from this... - */ -struct pipe_texture_object * -create_texture_object(struct gl_texture_object *texObj) -{ -   struct pipe_texture_object *pto; -   const struct gl_texture_image *texImage; - -   pto = calloc(1, sizeof(*pto)); -   if (!pto) -      return NULL; - -   /* XXX: Member not defined. Comment-out to get it compile. */ -   /*assert(texObj->Complete);*/ - -   switch (texObj->Target) { -   case GL_TEXTURE_1D: -      pto->type = PIPE_TEXTURE_1D; -      break; -   case GL_TEXTURE_2D: -      pto->type = PIPE_TEXTURE_2D; -      break; -   case GL_TEXTURE_3D: -      pto->type = PIPE_TEXTURE_3D; -      break; -   case GL_TEXTURE_CUBE_MAP: -      pto->type = PIPE_TEXTURE_CUBE; -      break; -   default: -      assert(0); -      return NULL; -   } - -   texImage = texObj->Image[0][texObj->BaseLevel]; -   assert(texImage); - -   switch (texImage->TexFormat->MesaFormat) { -   case MESA_FORMAT_RGBA8888: -      pto->format = PIPE_FORMAT_U_R8_G8_B8_A8; -      break; -   case MESA_FORMAT_RGB565: -      pto->format = PIPE_FORMAT_U_R5_G6_B5; -      break; - -   /* XXX fill in more formats */ - -   default: -      assert(0); -      return NULL; -   } - -   pto->width = texImage->Width; -   pto->height = texImage->Height; -   pto->depth = texImage->Depth; - -   /* XXX verify this */ -   pto->mipmapped = texObj->Image[0][texObj->BaseLevel + 1] != NULL; - -   return pto; -} diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c index 8e3235cc99..f68bef1207 100644 --- a/src/mesa/state_tracker/st_texture.c +++ b/src/mesa/state_tracker/st_texture.c @@ -38,7 +38,6 @@  #include "pipe/p_inlines.h"  #include "pipe/p_util.h"  #include "pipe/p_inlines.h" -#include "pipe/p_winsys.h"  #define DBG if(0) printf @@ -290,8 +289,7 @@ st_texture_image_copy(struct pipe_context *pipe,     GLuint i;     /* XXX this is a hack */ -   if (dst->compressed) -      height /= 4; +   const GLuint copyHeight = dst->compressed ? height / 4 : height;     for (i = 0; i < depth; i++) {        GLuint srcLevel; @@ -315,7 +313,7 @@ st_texture_image_copy(struct pipe_context *pipe,  			 0, 0, /* destX, Y */  			 src_surface,  			 0, 0, /* srcX, Y */ -			 width, height); +			 width, copyHeight);        pipe_surface_reference(&dst_surface, NULL);        pipe_surface_reference(&src_surface, NULL); diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index 7abccb3a69..b05762113c 100644 --- a/src/mesa/state_tracker/st_texture.h +++ b/src/mesa/state_tracker/st_texture.h @@ -68,9 +68,7 @@ struct st_texture_object      */     struct pipe_texture *pt; -   GLboolean imageOverride; -   GLint depthOverride; -   GLuint pitchOverride; +   GLboolean teximage_realloc;  }; diff --git a/src/mesa/swrast/s_drawpix.c b/src/mesa/swrast/s_drawpix.c index fb04d9f746..cbf6617058 100644 --- a/src/mesa/swrast/s_drawpix.c +++ b/src/mesa/swrast/s_drawpix.c @@ -877,7 +877,7 @@ end:     RENDER_FINISH(swrast,ctx); -   _mesa_unmap_drapix_pbo(ctx, unpack); +   _mesa_unmap_drawpix_pbo(ctx, unpack);  } diff --git a/src/mesa/swrast/s_fragprog.c b/src/mesa/swrast/s_fragprog.c index 6ee8bfd0a5..8eeb40f7c5 100644 --- a/src/mesa/swrast/s_fragprog.c +++ b/src/mesa/swrast/s_fragprog.c @@ -1,8 +1,8 @@  /*   * Mesa 3-D graphics library - * Version:  6.5.2 + * Version:  7.0.3   * - * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2007  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"), @@ -33,18 +33,21 @@  /** - * Fetch a texel. + * Fetch a texel with given lod. + * Called via machine->FetchTexelLod()   */  static void -fetch_texel( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda, -             GLuint unit, GLfloat color[4] ) +fetch_texel_lod( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda, +                 GLuint unit, GLfloat color[4] )  {     GLchan rgba[4];     SWcontext *swrast = SWRAST_CONTEXT(ctx); +   const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current; + +   lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod);     /* XXX use a float-valued TextureSample routine here!!! */ -   swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current, -                               1, (const GLfloat (*)[4]) texcoord, +   swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord,                                 &lambda, &rgba);     color[0] = CHAN_TO_FLOAT(rgba[0]);     color[1] = CHAN_TO_FLOAT(rgba[1]); @@ -56,11 +59,12 @@ fetch_texel( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,  /**   * Fetch a texel with the given partial derivatives to compute a level   * of detail in the mipmap. + * Called via machine->FetchTexelDeriv()   */  static void  fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],                     const GLfloat texdx[4], const GLfloat texdy[4], -                   GLuint unit, GLfloat color[4] ) +                   GLfloat lodBias, GLuint unit, GLfloat color[4] )  {     SWcontext *swrast = SWRAST_CONTEXT(ctx);     const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current; @@ -69,15 +73,17 @@ fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],     const GLfloat texH = (GLfloat) texImg->HeightScale;     GLchan rgba[4]; -   GLfloat lambda = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */ -                                         texdx[1], texdy[1], /* dt/dx, dt/dy */ -                                         texdx[3], texdy[2], /* dq/dx, dq/dy */ -                                         texW, texH, -                                         texcoord[0], texcoord[1], texcoord[3], -                                         1.0F / texcoord[3]); +   GLfloat lambda +      = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */ +                               texdx[1], texdy[1], /* dt/dx, dt/dy */ +                               texdx[3], texdy[2], /* dq/dx, dq/dy */ +                               texW, texH, +                               texcoord[0], texcoord[1], texcoord[3], +                               1.0F / texcoord[3]) + lodBias; + +   lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod); -   swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current, -                               1, (const GLfloat (*)[4]) texcoord, +   swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord,                                 &lambda, &rgba);     color[0] = CHAN_TO_FLOAT(rgba[0]);     color[1] = CHAN_TO_FLOAT(rgba[1]); @@ -132,7 +138,7 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine,     /* init call stack */     machine->StackDepth = 0; -   machine->FetchTexelLod = fetch_texel; +   machine->FetchTexelLod = fetch_texel_lod;     machine->FetchTexelDeriv = fetch_texel_deriv;  } diff --git a/src/mesa/vbo/vbo_exec.h b/src/mesa/vbo/vbo_exec.h index b7e8c9fe79..ddbcbe1181 100644 --- a/src/mesa/vbo/vbo_exec.h +++ b/src/mesa/vbo/vbo_exec.h @@ -162,4 +162,7 @@ void vbo_exec_do_EvalCoord2f( struct vbo_exec_context *exec,  void vbo_exec_do_EvalCoord1f( struct vbo_exec_context *exec,  				     GLfloat u); +extern GLboolean  +vbo_validate_shaders(GLcontext *ctx); +  #endif diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index b7f4d8a307..98580170e3 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -477,6 +477,23 @@ static void GLAPIENTRY vbo_exec_EvalPoint2( GLint i, GLint j )  } +/** + * Check if programs/shaders are enabled and valid at glBegin time. + */ +GLboolean  +vbo_validate_shaders(GLcontext *ctx) +{ +   if ((ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) || +       (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled)) { +      return GL_FALSE; +   } +   if (ctx->Shader.CurrentProgram && !ctx->Shader.CurrentProgram->LinkStatus) { +      return GL_FALSE; +   } +   return GL_TRUE; +} + +  /* Build a list of primitives on the fly.  Keep   * ctx->Driver.CurrentExecPrimitive uptodate as well.   */ @@ -491,18 +508,16 @@ static void GLAPIENTRY vbo_exec_Begin( GLenum mode )        if (ctx->NewState) {  	 _mesa_update_state( ctx ); -         /* XXX also need to check if shader enabled, but invalid */ -         if ((ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) || -            (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled)) { -            _mesa_error(ctx, GL_INVALID_OPERATION, -                        "glBegin (invalid vertex/fragment program)"); -            return; -         } -  	 CALL_Begin(ctx->Exec, (mode));  	 return;        } +      if (!vbo_validate_shaders(ctx)) { +         _mesa_error(ctx, GL_INVALID_OPERATION, +                     "glBegin (invalid vertex/fragment program)"); +         return; +      } +        /* Heuristic: attempt to isolate attributes occuring outside         * begin/end pairs.         */ diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index 77f3cf1455..a52521db64 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -245,6 +245,11 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count)     if (ctx->NewState)        _mesa_update_state( ctx ); +   if (!vbo_validate_shaders(ctx)) { +      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawArrays(bad shader)"); +      return; +   } +     bind_arrays( ctx );     prim[0].begin = 1; @@ -280,6 +285,11 @@ vbo_exec_DrawRangeElements(GLenum mode,     if (ctx->NewState)        _mesa_update_state( ctx ); +   if (!vbo_validate_shaders(ctx)) { +      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawRangeElements(bad shader)"); +      return; +   } +     bind_arrays( ctx );     ib.count = count; @@ -340,6 +350,11 @@ vbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *ind     if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices ))        return; +   if (!vbo_validate_shaders(ctx)) { +      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawElements(bad shader)"); +      return; +   } +     if (ctx->Array.ElementArrayBufferObj->Name) {        const GLvoid *map = ctx->Driver.MapBuffer(ctx,  						 GL_ELEMENT_ARRAY_BUFFER_ARB, diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c index 23a3658386..6bb6849a6a 100644 --- a/src/mesa/vbo/vbo_exec_draw.c +++ b/src/mesa/vbo/vbo_exec_draw.c @@ -198,7 +198,7 @@ static void vbo_exec_bind_arrays( GLcontext *ctx )  	 arrays[attr].BufferObj = exec->vtx.bufferobj;  	 arrays[attr]._MaxElement = count; /* ??? */ -	 data += exec->vtx.attrsz[attr] * sizeof(GLfloat); +	 data += exec->vtx.attrsz[src] * sizeof(GLfloat);        }     }  } diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index 3c6f0fccd9..bf5c6d4eef 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -131,10 +131,12 @@ static void vbo_bind_vertex_list( GLcontext *ctx,        break;     } -   for (attr = 0; attr < VBO_ATTRIB_MAX; attr++) { -      if (node->attrsz[attr]) { +   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { +      GLuint src = map[attr]; + +      if (node->attrsz[src]) {  	 arrays[attr].Ptr = (const GLubyte *)data; -	 arrays[attr].Size = node->attrsz[attr]; +	 arrays[attr].Size = node->attrsz[src];  	 arrays[attr].StrideB = node->vertex_size * sizeof(GLfloat);  	 arrays[attr].Stride = node->vertex_size * sizeof(GLfloat);  	 arrays[attr].Type = GL_FLOAT; @@ -144,7 +146,7 @@ static void vbo_bind_vertex_list( GLcontext *ctx,  	 assert(arrays[attr].BufferObj->Name); -	 data += node->attrsz[attr] * sizeof(GLfloat); +	 data += node->attrsz[src] * sizeof(GLfloat);        }     }  } diff --git a/src/mesa/x86-64/glapi_x86-64.S b/src/mesa/x86-64/glapi_x86-64.S index a239a6749d..cb34061b36 100644 --- a/src/mesa/x86-64/glapi_x86-64.S +++ b/src/mesa/x86-64/glapi_x86-64.S @@ -25268,192 +25268,12 @@ GL_PREFIX(LoadProgramNV):  	.size	GL_PREFIX(LoadProgramNV), .-GL_PREFIX(LoadProgramNV)  	.p2align	4,,15 -	.globl	GL_PREFIX(ProgramParameter4dNV) -	.type	GL_PREFIX(ProgramParameter4dNV), @function -GL_PREFIX(ProgramParameter4dNV): -#if defined(GLX_USE_TLS) -	call	_x86_64_get_dispatch@PLT -	movq	5384(%rax), %r11 -	jmp	*%r11 -#elif defined(PTHREADS) -	subq	$56, %rsp -	movq	%rdi, (%rsp) -	movq	%rsi, 8(%rsp) -	movq	%xmm0, 16(%rsp) -	movq	%xmm1, 24(%rsp) -	movq	%xmm2, 32(%rsp) -	movq	%xmm3, 40(%rsp) -	call	_x86_64_get_dispatch@PLT -	movq	40(%rsp), %xmm3 -	movq	32(%rsp), %xmm2 -	movq	24(%rsp), %xmm1 -	movq	16(%rsp), %xmm0 -	movq	8(%rsp), %rsi -	movq	(%rsp), %rdi -	addq	$56, %rsp -	movq	5384(%rax), %r11 -	jmp	*%r11 -#else -	movq	_glapi_Dispatch(%rip), %rax -	testq	%rax, %rax -	je	1f -	movq	5384(%rax), %r11 -	jmp	*%r11 -1: -	subq	$56, %rsp -	movq	%rdi, (%rsp) -	movq	%rsi, 8(%rsp) -	movq	%xmm0, 16(%rsp) -	movq	%xmm1, 24(%rsp) -	movq	%xmm2, 32(%rsp) -	movq	%xmm3, 40(%rsp) -	call	_glapi_get_dispatch -	movq	40(%rsp), %xmm3 -	movq	32(%rsp), %xmm2 -	movq	24(%rsp), %xmm1 -	movq	16(%rsp), %xmm0 -	movq	8(%rsp), %rsi -	movq	(%rsp), %rdi -	addq	$56, %rsp -	movq	5384(%rax), %r11 -	jmp	*%r11 -#endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(ProgramParameter4dNV), .-GL_PREFIX(ProgramParameter4dNV) - -	.p2align	4,,15 -	.globl	GL_PREFIX(ProgramParameter4dvNV) -	.type	GL_PREFIX(ProgramParameter4dvNV), @function -GL_PREFIX(ProgramParameter4dvNV): -#if defined(GLX_USE_TLS) -	call	_x86_64_get_dispatch@PLT -	movq	5392(%rax), %r11 -	jmp	*%r11 -#elif defined(PTHREADS) -	pushq	%rdi -	pushq	%rsi -	pushq	%rdx -	call	_x86_64_get_dispatch@PLT -	popq	%rdx -	popq	%rsi -	popq	%rdi -	movq	5392(%rax), %r11 -	jmp	*%r11 -#else -	movq	_glapi_Dispatch(%rip), %rax -	testq	%rax, %rax -	je	1f -	movq	5392(%rax), %r11 -	jmp	*%r11 -1: -	pushq	%rdi -	pushq	%rsi -	pushq	%rdx -	call	_glapi_get_dispatch -	popq	%rdx -	popq	%rsi -	popq	%rdi -	movq	5392(%rax), %r11 -	jmp	*%r11 -#endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(ProgramParameter4dvNV), .-GL_PREFIX(ProgramParameter4dvNV) - -	.p2align	4,,15 -	.globl	GL_PREFIX(ProgramParameter4fNV) -	.type	GL_PREFIX(ProgramParameter4fNV), @function -GL_PREFIX(ProgramParameter4fNV): -#if defined(GLX_USE_TLS) -	call	_x86_64_get_dispatch@PLT -	movq	5400(%rax), %r11 -	jmp	*%r11 -#elif defined(PTHREADS) -	subq	$56, %rsp -	movq	%rdi, (%rsp) -	movq	%rsi, 8(%rsp) -	movq	%xmm0, 16(%rsp) -	movq	%xmm1, 24(%rsp) -	movq	%xmm2, 32(%rsp) -	movq	%xmm3, 40(%rsp) -	call	_x86_64_get_dispatch@PLT -	movq	40(%rsp), %xmm3 -	movq	32(%rsp), %xmm2 -	movq	24(%rsp), %xmm1 -	movq	16(%rsp), %xmm0 -	movq	8(%rsp), %rsi -	movq	(%rsp), %rdi -	addq	$56, %rsp -	movq	5400(%rax), %r11 -	jmp	*%r11 -#else -	movq	_glapi_Dispatch(%rip), %rax -	testq	%rax, %rax -	je	1f -	movq	5400(%rax), %r11 -	jmp	*%r11 -1: -	subq	$56, %rsp -	movq	%rdi, (%rsp) -	movq	%rsi, 8(%rsp) -	movq	%xmm0, 16(%rsp) -	movq	%xmm1, 24(%rsp) -	movq	%xmm2, 32(%rsp) -	movq	%xmm3, 40(%rsp) -	call	_glapi_get_dispatch -	movq	40(%rsp), %xmm3 -	movq	32(%rsp), %xmm2 -	movq	24(%rsp), %xmm1 -	movq	16(%rsp), %xmm0 -	movq	8(%rsp), %rsi -	movq	(%rsp), %rdi -	addq	$56, %rsp -	movq	5400(%rax), %r11 -	jmp	*%r11 -#endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(ProgramParameter4fNV), .-GL_PREFIX(ProgramParameter4fNV) - -	.p2align	4,,15 -	.globl	GL_PREFIX(ProgramParameter4fvNV) -	.type	GL_PREFIX(ProgramParameter4fvNV), @function -GL_PREFIX(ProgramParameter4fvNV): -#if defined(GLX_USE_TLS) -	call	_x86_64_get_dispatch@PLT -	movq	5408(%rax), %r11 -	jmp	*%r11 -#elif defined(PTHREADS) -	pushq	%rdi -	pushq	%rsi -	pushq	%rdx -	call	_x86_64_get_dispatch@PLT -	popq	%rdx -	popq	%rsi -	popq	%rdi -	movq	5408(%rax), %r11 -	jmp	*%r11 -#else -	movq	_glapi_Dispatch(%rip), %rax -	testq	%rax, %rax -	je	1f -	movq	5408(%rax), %r11 -	jmp	*%r11 -1: -	pushq	%rdi -	pushq	%rsi -	pushq	%rdx -	call	_glapi_get_dispatch -	popq	%rdx -	popq	%rsi -	popq	%rdi -	movq	5408(%rax), %r11 -	jmp	*%r11 -#endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(ProgramParameter4fvNV), .-GL_PREFIX(ProgramParameter4fvNV) - -	.p2align	4,,15  	.globl	GL_PREFIX(ProgramParameters4dvNV)  	.type	GL_PREFIX(ProgramParameters4dvNV), @function  GL_PREFIX(ProgramParameters4dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5416(%rax), %r11 +	movq	5384(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25467,13 +25287,13 @@ GL_PREFIX(ProgramParameters4dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5416(%rax), %r11 +	movq	5384(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5416(%rax), %r11 +	movq	5384(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25487,7 +25307,7 @@ GL_PREFIX(ProgramParameters4dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5416(%rax), %r11 +	movq	5384(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ProgramParameters4dvNV), .-GL_PREFIX(ProgramParameters4dvNV) @@ -25498,7 +25318,7 @@ GL_PREFIX(ProgramParameters4dvNV):  GL_PREFIX(ProgramParameters4fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5424(%rax), %r11 +	movq	5392(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25512,13 +25332,13 @@ GL_PREFIX(ProgramParameters4fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5424(%rax), %r11 +	movq	5392(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5424(%rax), %r11 +	movq	5392(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25532,7 +25352,7 @@ GL_PREFIX(ProgramParameters4fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5424(%rax), %r11 +	movq	5392(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ProgramParameters4fvNV), .-GL_PREFIX(ProgramParameters4fvNV) @@ -25543,7 +25363,7 @@ GL_PREFIX(ProgramParameters4fvNV):  GL_PREFIX(RequestResidentProgramsNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5432(%rax), %r11 +	movq	5400(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25553,13 +25373,13 @@ GL_PREFIX(RequestResidentProgramsNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5432(%rax), %r11 +	movq	5400(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5432(%rax), %r11 +	movq	5400(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25569,7 +25389,7 @@ GL_PREFIX(RequestResidentProgramsNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5432(%rax), %r11 +	movq	5400(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(RequestResidentProgramsNV), .-GL_PREFIX(RequestResidentProgramsNV) @@ -25580,7 +25400,7 @@ GL_PREFIX(RequestResidentProgramsNV):  GL_PREFIX(TrackMatrixNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5440(%rax), %r11 +	movq	5408(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25594,13 +25414,13 @@ GL_PREFIX(TrackMatrixNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5440(%rax), %r11 +	movq	5408(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5440(%rax), %r11 +	movq	5408(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25614,7 +25434,7 @@ GL_PREFIX(TrackMatrixNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5440(%rax), %r11 +	movq	5408(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(TrackMatrixNV), .-GL_PREFIX(TrackMatrixNV) @@ -25625,7 +25445,7 @@ GL_PREFIX(TrackMatrixNV):  GL_PREFIX(VertexAttrib1dNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5448(%rax), %r11 +	movq	5416(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$24, %rsp @@ -25635,13 +25455,13 @@ GL_PREFIX(VertexAttrib1dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5448(%rax), %r11 +	movq	5416(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5448(%rax), %r11 +	movq	5416(%rax), %r11  	jmp	*%r11  1:  	subq	$24, %rsp @@ -25651,7 +25471,7 @@ GL_PREFIX(VertexAttrib1dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5448(%rax), %r11 +	movq	5416(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib1dNV), .-GL_PREFIX(VertexAttrib1dNV) @@ -25662,7 +25482,7 @@ GL_PREFIX(VertexAttrib1dNV):  GL_PREFIX(VertexAttrib1dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5456(%rax), %r11 +	movq	5424(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25672,13 +25492,13 @@ GL_PREFIX(VertexAttrib1dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5456(%rax), %r11 +	movq	5424(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5456(%rax), %r11 +	movq	5424(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25688,7 +25508,7 @@ GL_PREFIX(VertexAttrib1dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5456(%rax), %r11 +	movq	5424(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib1dvNV), .-GL_PREFIX(VertexAttrib1dvNV) @@ -25699,7 +25519,7 @@ GL_PREFIX(VertexAttrib1dvNV):  GL_PREFIX(VertexAttrib1fNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5464(%rax), %r11 +	movq	5432(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$24, %rsp @@ -25709,13 +25529,13 @@ GL_PREFIX(VertexAttrib1fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5464(%rax), %r11 +	movq	5432(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5464(%rax), %r11 +	movq	5432(%rax), %r11  	jmp	*%r11  1:  	subq	$24, %rsp @@ -25725,7 +25545,7 @@ GL_PREFIX(VertexAttrib1fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5464(%rax), %r11 +	movq	5432(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib1fNV), .-GL_PREFIX(VertexAttrib1fNV) @@ -25736,7 +25556,7 @@ GL_PREFIX(VertexAttrib1fNV):  GL_PREFIX(VertexAttrib1fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5472(%rax), %r11 +	movq	5440(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25746,13 +25566,13 @@ GL_PREFIX(VertexAttrib1fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5472(%rax), %r11 +	movq	5440(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5472(%rax), %r11 +	movq	5440(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25762,7 +25582,7 @@ GL_PREFIX(VertexAttrib1fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5472(%rax), %r11 +	movq	5440(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib1fvNV), .-GL_PREFIX(VertexAttrib1fvNV) @@ -25773,7 +25593,7 @@ GL_PREFIX(VertexAttrib1fvNV):  GL_PREFIX(VertexAttrib1sNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5480(%rax), %r11 +	movq	5448(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25783,13 +25603,13 @@ GL_PREFIX(VertexAttrib1sNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5480(%rax), %r11 +	movq	5448(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5480(%rax), %r11 +	movq	5448(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25799,7 +25619,7 @@ GL_PREFIX(VertexAttrib1sNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5480(%rax), %r11 +	movq	5448(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib1sNV), .-GL_PREFIX(VertexAttrib1sNV) @@ -25810,7 +25630,7 @@ GL_PREFIX(VertexAttrib1sNV):  GL_PREFIX(VertexAttrib1svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5488(%rax), %r11 +	movq	5456(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25820,13 +25640,13 @@ GL_PREFIX(VertexAttrib1svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5488(%rax), %r11 +	movq	5456(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5488(%rax), %r11 +	movq	5456(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25836,7 +25656,7 @@ GL_PREFIX(VertexAttrib1svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5488(%rax), %r11 +	movq	5456(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib1svNV), .-GL_PREFIX(VertexAttrib1svNV) @@ -25847,7 +25667,7 @@ GL_PREFIX(VertexAttrib1svNV):  GL_PREFIX(VertexAttrib2dNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5496(%rax), %r11 +	movq	5464(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$24, %rsp @@ -25859,13 +25679,13 @@ GL_PREFIX(VertexAttrib2dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5496(%rax), %r11 +	movq	5464(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5496(%rax), %r11 +	movq	5464(%rax), %r11  	jmp	*%r11  1:  	subq	$24, %rsp @@ -25877,7 +25697,7 @@ GL_PREFIX(VertexAttrib2dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5496(%rax), %r11 +	movq	5464(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib2dNV), .-GL_PREFIX(VertexAttrib2dNV) @@ -25888,7 +25708,7 @@ GL_PREFIX(VertexAttrib2dNV):  GL_PREFIX(VertexAttrib2dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5504(%rax), %r11 +	movq	5472(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25898,13 +25718,13 @@ GL_PREFIX(VertexAttrib2dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5504(%rax), %r11 +	movq	5472(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5504(%rax), %r11 +	movq	5472(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25914,7 +25734,7 @@ GL_PREFIX(VertexAttrib2dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5504(%rax), %r11 +	movq	5472(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib2dvNV), .-GL_PREFIX(VertexAttrib2dvNV) @@ -25925,7 +25745,7 @@ GL_PREFIX(VertexAttrib2dvNV):  GL_PREFIX(VertexAttrib2fNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5512(%rax), %r11 +	movq	5480(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$24, %rsp @@ -25937,13 +25757,13 @@ GL_PREFIX(VertexAttrib2fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5512(%rax), %r11 +	movq	5480(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5512(%rax), %r11 +	movq	5480(%rax), %r11  	jmp	*%r11  1:  	subq	$24, %rsp @@ -25955,7 +25775,7 @@ GL_PREFIX(VertexAttrib2fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$24, %rsp -	movq	5512(%rax), %r11 +	movq	5480(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib2fNV), .-GL_PREFIX(VertexAttrib2fNV) @@ -25966,7 +25786,7 @@ GL_PREFIX(VertexAttrib2fNV):  GL_PREFIX(VertexAttrib2fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5520(%rax), %r11 +	movq	5488(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -25976,13 +25796,13 @@ GL_PREFIX(VertexAttrib2fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5520(%rax), %r11 +	movq	5488(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5520(%rax), %r11 +	movq	5488(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -25992,7 +25812,7 @@ GL_PREFIX(VertexAttrib2fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5520(%rax), %r11 +	movq	5488(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib2fvNV), .-GL_PREFIX(VertexAttrib2fvNV) @@ -26003,7 +25823,7 @@ GL_PREFIX(VertexAttrib2fvNV):  GL_PREFIX(VertexAttrib2sNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5528(%rax), %r11 +	movq	5496(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26013,13 +25833,13 @@ GL_PREFIX(VertexAttrib2sNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5528(%rax), %r11 +	movq	5496(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5528(%rax), %r11 +	movq	5496(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26029,7 +25849,7 @@ GL_PREFIX(VertexAttrib2sNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5528(%rax), %r11 +	movq	5496(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib2sNV), .-GL_PREFIX(VertexAttrib2sNV) @@ -26040,7 +25860,7 @@ GL_PREFIX(VertexAttrib2sNV):  GL_PREFIX(VertexAttrib2svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5536(%rax), %r11 +	movq	5504(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26050,13 +25870,13 @@ GL_PREFIX(VertexAttrib2svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5536(%rax), %r11 +	movq	5504(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5536(%rax), %r11 +	movq	5504(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26066,7 +25886,7 @@ GL_PREFIX(VertexAttrib2svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5536(%rax), %r11 +	movq	5504(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib2svNV), .-GL_PREFIX(VertexAttrib2svNV) @@ -26077,7 +25897,7 @@ GL_PREFIX(VertexAttrib2svNV):  GL_PREFIX(VertexAttrib3dNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5544(%rax), %r11 +	movq	5512(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$40, %rsp @@ -26091,13 +25911,13 @@ GL_PREFIX(VertexAttrib3dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5544(%rax), %r11 +	movq	5512(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5544(%rax), %r11 +	movq	5512(%rax), %r11  	jmp	*%r11  1:  	subq	$40, %rsp @@ -26111,7 +25931,7 @@ GL_PREFIX(VertexAttrib3dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5544(%rax), %r11 +	movq	5512(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib3dNV), .-GL_PREFIX(VertexAttrib3dNV) @@ -26122,7 +25942,7 @@ GL_PREFIX(VertexAttrib3dNV):  GL_PREFIX(VertexAttrib3dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5552(%rax), %r11 +	movq	5520(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26132,13 +25952,13 @@ GL_PREFIX(VertexAttrib3dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5552(%rax), %r11 +	movq	5520(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5552(%rax), %r11 +	movq	5520(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26148,7 +25968,7 @@ GL_PREFIX(VertexAttrib3dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5552(%rax), %r11 +	movq	5520(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib3dvNV), .-GL_PREFIX(VertexAttrib3dvNV) @@ -26159,7 +25979,7 @@ GL_PREFIX(VertexAttrib3dvNV):  GL_PREFIX(VertexAttrib3fNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5560(%rax), %r11 +	movq	5528(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$40, %rsp @@ -26173,13 +25993,13 @@ GL_PREFIX(VertexAttrib3fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5560(%rax), %r11 +	movq	5528(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5560(%rax), %r11 +	movq	5528(%rax), %r11  	jmp	*%r11  1:  	subq	$40, %rsp @@ -26193,7 +26013,7 @@ GL_PREFIX(VertexAttrib3fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5560(%rax), %r11 +	movq	5528(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib3fNV), .-GL_PREFIX(VertexAttrib3fNV) @@ -26204,7 +26024,7 @@ GL_PREFIX(VertexAttrib3fNV):  GL_PREFIX(VertexAttrib3fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5568(%rax), %r11 +	movq	5536(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26214,13 +26034,13 @@ GL_PREFIX(VertexAttrib3fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5568(%rax), %r11 +	movq	5536(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5568(%rax), %r11 +	movq	5536(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26230,7 +26050,7 @@ GL_PREFIX(VertexAttrib3fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5568(%rax), %r11 +	movq	5536(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib3fvNV), .-GL_PREFIX(VertexAttrib3fvNV) @@ -26241,7 +26061,7 @@ GL_PREFIX(VertexAttrib3fvNV):  GL_PREFIX(VertexAttrib3sNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5576(%rax), %r11 +	movq	5544(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26255,13 +26075,13 @@ GL_PREFIX(VertexAttrib3sNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5576(%rax), %r11 +	movq	5544(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5576(%rax), %r11 +	movq	5544(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26275,7 +26095,7 @@ GL_PREFIX(VertexAttrib3sNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5576(%rax), %r11 +	movq	5544(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib3sNV), .-GL_PREFIX(VertexAttrib3sNV) @@ -26286,7 +26106,7 @@ GL_PREFIX(VertexAttrib3sNV):  GL_PREFIX(VertexAttrib3svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5584(%rax), %r11 +	movq	5552(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26296,13 +26116,13 @@ GL_PREFIX(VertexAttrib3svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5584(%rax), %r11 +	movq	5552(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5584(%rax), %r11 +	movq	5552(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26312,7 +26132,7 @@ GL_PREFIX(VertexAttrib3svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5584(%rax), %r11 +	movq	5552(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib3svNV), .-GL_PREFIX(VertexAttrib3svNV) @@ -26323,7 +26143,7 @@ GL_PREFIX(VertexAttrib3svNV):  GL_PREFIX(VertexAttrib4dNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5592(%rax), %r11 +	movq	5560(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$40, %rsp @@ -26339,13 +26159,13 @@ GL_PREFIX(VertexAttrib4dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5592(%rax), %r11 +	movq	5560(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5592(%rax), %r11 +	movq	5560(%rax), %r11  	jmp	*%r11  1:  	subq	$40, %rsp @@ -26361,7 +26181,7 @@ GL_PREFIX(VertexAttrib4dNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5592(%rax), %r11 +	movq	5560(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4dNV), .-GL_PREFIX(VertexAttrib4dNV) @@ -26372,7 +26192,7 @@ GL_PREFIX(VertexAttrib4dNV):  GL_PREFIX(VertexAttrib4dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5600(%rax), %r11 +	movq	5568(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26382,13 +26202,13 @@ GL_PREFIX(VertexAttrib4dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5600(%rax), %r11 +	movq	5568(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5600(%rax), %r11 +	movq	5568(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26398,7 +26218,7 @@ GL_PREFIX(VertexAttrib4dvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5600(%rax), %r11 +	movq	5568(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4dvNV), .-GL_PREFIX(VertexAttrib4dvNV) @@ -26409,7 +26229,7 @@ GL_PREFIX(VertexAttrib4dvNV):  GL_PREFIX(VertexAttrib4fNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5608(%rax), %r11 +	movq	5576(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$40, %rsp @@ -26425,13 +26245,13 @@ GL_PREFIX(VertexAttrib4fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5608(%rax), %r11 +	movq	5576(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5608(%rax), %r11 +	movq	5576(%rax), %r11  	jmp	*%r11  1:  	subq	$40, %rsp @@ -26447,7 +26267,7 @@ GL_PREFIX(VertexAttrib4fNV):  	movq	8(%rsp), %xmm0  	movq	(%rsp), %rdi  	addq	$40, %rsp -	movq	5608(%rax), %r11 +	movq	5576(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4fNV), .-GL_PREFIX(VertexAttrib4fNV) @@ -26458,7 +26278,7 @@ GL_PREFIX(VertexAttrib4fNV):  GL_PREFIX(VertexAttrib4fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5616(%rax), %r11 +	movq	5584(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26468,13 +26288,13 @@ GL_PREFIX(VertexAttrib4fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5616(%rax), %r11 +	movq	5584(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5616(%rax), %r11 +	movq	5584(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26484,7 +26304,7 @@ GL_PREFIX(VertexAttrib4fvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5616(%rax), %r11 +	movq	5584(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4fvNV), .-GL_PREFIX(VertexAttrib4fvNV) @@ -26495,7 +26315,7 @@ GL_PREFIX(VertexAttrib4fvNV):  GL_PREFIX(VertexAttrib4sNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5624(%rax), %r11 +	movq	5592(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26509,13 +26329,13 @@ GL_PREFIX(VertexAttrib4sNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5624(%rax), %r11 +	movq	5592(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5624(%rax), %r11 +	movq	5592(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26529,7 +26349,7 @@ GL_PREFIX(VertexAttrib4sNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5624(%rax), %r11 +	movq	5592(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4sNV), .-GL_PREFIX(VertexAttrib4sNV) @@ -26540,7 +26360,7 @@ GL_PREFIX(VertexAttrib4sNV):  GL_PREFIX(VertexAttrib4svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5632(%rax), %r11 +	movq	5600(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26550,13 +26370,13 @@ GL_PREFIX(VertexAttrib4svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5632(%rax), %r11 +	movq	5600(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5632(%rax), %r11 +	movq	5600(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26566,7 +26386,7 @@ GL_PREFIX(VertexAttrib4svNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5632(%rax), %r11 +	movq	5600(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4svNV), .-GL_PREFIX(VertexAttrib4svNV) @@ -26577,7 +26397,7 @@ GL_PREFIX(VertexAttrib4svNV):  GL_PREFIX(VertexAttrib4ubNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5640(%rax), %r11 +	movq	5608(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26591,13 +26411,13 @@ GL_PREFIX(VertexAttrib4ubNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5640(%rax), %r11 +	movq	5608(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5640(%rax), %r11 +	movq	5608(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26611,7 +26431,7 @@ GL_PREFIX(VertexAttrib4ubNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5640(%rax), %r11 +	movq	5608(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4ubNV), .-GL_PREFIX(VertexAttrib4ubNV) @@ -26622,7 +26442,7 @@ GL_PREFIX(VertexAttrib4ubNV):  GL_PREFIX(VertexAttrib4ubvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5648(%rax), %r11 +	movq	5616(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26632,13 +26452,13 @@ GL_PREFIX(VertexAttrib4ubvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5648(%rax), %r11 +	movq	5616(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5648(%rax), %r11 +	movq	5616(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26648,7 +26468,7 @@ GL_PREFIX(VertexAttrib4ubvNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5648(%rax), %r11 +	movq	5616(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttrib4ubvNV), .-GL_PREFIX(VertexAttrib4ubvNV) @@ -26659,7 +26479,7 @@ GL_PREFIX(VertexAttrib4ubvNV):  GL_PREFIX(VertexAttribPointerNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5656(%rax), %r11 +	movq	5624(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26673,13 +26493,13 @@ GL_PREFIX(VertexAttribPointerNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5656(%rax), %r11 +	movq	5624(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5656(%rax), %r11 +	movq	5624(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26693,7 +26513,7 @@ GL_PREFIX(VertexAttribPointerNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5656(%rax), %r11 +	movq	5624(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribPointerNV), .-GL_PREFIX(VertexAttribPointerNV) @@ -26704,7 +26524,7 @@ GL_PREFIX(VertexAttribPointerNV):  GL_PREFIX(VertexAttribs1dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5664(%rax), %r11 +	movq	5632(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26714,13 +26534,13 @@ GL_PREFIX(VertexAttribs1dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5664(%rax), %r11 +	movq	5632(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5664(%rax), %r11 +	movq	5632(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26730,7 +26550,7 @@ GL_PREFIX(VertexAttribs1dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5664(%rax), %r11 +	movq	5632(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs1dvNV), .-GL_PREFIX(VertexAttribs1dvNV) @@ -26741,7 +26561,7 @@ GL_PREFIX(VertexAttribs1dvNV):  GL_PREFIX(VertexAttribs1fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5672(%rax), %r11 +	movq	5640(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26751,13 +26571,13 @@ GL_PREFIX(VertexAttribs1fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5672(%rax), %r11 +	movq	5640(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5672(%rax), %r11 +	movq	5640(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26767,7 +26587,7 @@ GL_PREFIX(VertexAttribs1fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5672(%rax), %r11 +	movq	5640(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs1fvNV), .-GL_PREFIX(VertexAttribs1fvNV) @@ -26778,7 +26598,7 @@ GL_PREFIX(VertexAttribs1fvNV):  GL_PREFIX(VertexAttribs1svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5680(%rax), %r11 +	movq	5648(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26788,13 +26608,13 @@ GL_PREFIX(VertexAttribs1svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5680(%rax), %r11 +	movq	5648(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5680(%rax), %r11 +	movq	5648(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26804,7 +26624,7 @@ GL_PREFIX(VertexAttribs1svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5680(%rax), %r11 +	movq	5648(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs1svNV), .-GL_PREFIX(VertexAttribs1svNV) @@ -26815,7 +26635,7 @@ GL_PREFIX(VertexAttribs1svNV):  GL_PREFIX(VertexAttribs2dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5688(%rax), %r11 +	movq	5656(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26825,13 +26645,13 @@ GL_PREFIX(VertexAttribs2dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5688(%rax), %r11 +	movq	5656(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5688(%rax), %r11 +	movq	5656(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26841,7 +26661,7 @@ GL_PREFIX(VertexAttribs2dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5688(%rax), %r11 +	movq	5656(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs2dvNV), .-GL_PREFIX(VertexAttribs2dvNV) @@ -26852,7 +26672,7 @@ GL_PREFIX(VertexAttribs2dvNV):  GL_PREFIX(VertexAttribs2fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5696(%rax), %r11 +	movq	5664(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26862,13 +26682,13 @@ GL_PREFIX(VertexAttribs2fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5696(%rax), %r11 +	movq	5664(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5696(%rax), %r11 +	movq	5664(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26878,7 +26698,7 @@ GL_PREFIX(VertexAttribs2fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5696(%rax), %r11 +	movq	5664(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs2fvNV), .-GL_PREFIX(VertexAttribs2fvNV) @@ -26889,7 +26709,7 @@ GL_PREFIX(VertexAttribs2fvNV):  GL_PREFIX(VertexAttribs2svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5704(%rax), %r11 +	movq	5672(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26899,13 +26719,13 @@ GL_PREFIX(VertexAttribs2svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5704(%rax), %r11 +	movq	5672(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5704(%rax), %r11 +	movq	5672(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26915,7 +26735,7 @@ GL_PREFIX(VertexAttribs2svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5704(%rax), %r11 +	movq	5672(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs2svNV), .-GL_PREFIX(VertexAttribs2svNV) @@ -26926,7 +26746,7 @@ GL_PREFIX(VertexAttribs2svNV):  GL_PREFIX(VertexAttribs3dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5712(%rax), %r11 +	movq	5680(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26936,13 +26756,13 @@ GL_PREFIX(VertexAttribs3dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5712(%rax), %r11 +	movq	5680(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5712(%rax), %r11 +	movq	5680(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26952,7 +26772,7 @@ GL_PREFIX(VertexAttribs3dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5712(%rax), %r11 +	movq	5680(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs3dvNV), .-GL_PREFIX(VertexAttribs3dvNV) @@ -26963,7 +26783,7 @@ GL_PREFIX(VertexAttribs3dvNV):  GL_PREFIX(VertexAttribs3fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5720(%rax), %r11 +	movq	5688(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -26973,13 +26793,13 @@ GL_PREFIX(VertexAttribs3fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5720(%rax), %r11 +	movq	5688(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5720(%rax), %r11 +	movq	5688(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -26989,7 +26809,7 @@ GL_PREFIX(VertexAttribs3fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5720(%rax), %r11 +	movq	5688(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs3fvNV), .-GL_PREFIX(VertexAttribs3fvNV) @@ -27000,7 +26820,7 @@ GL_PREFIX(VertexAttribs3fvNV):  GL_PREFIX(VertexAttribs3svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5728(%rax), %r11 +	movq	5696(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27010,13 +26830,13 @@ GL_PREFIX(VertexAttribs3svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5728(%rax), %r11 +	movq	5696(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5728(%rax), %r11 +	movq	5696(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27026,7 +26846,7 @@ GL_PREFIX(VertexAttribs3svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5728(%rax), %r11 +	movq	5696(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs3svNV), .-GL_PREFIX(VertexAttribs3svNV) @@ -27037,7 +26857,7 @@ GL_PREFIX(VertexAttribs3svNV):  GL_PREFIX(VertexAttribs4dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5736(%rax), %r11 +	movq	5704(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27047,13 +26867,13 @@ GL_PREFIX(VertexAttribs4dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5736(%rax), %r11 +	movq	5704(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5736(%rax), %r11 +	movq	5704(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27063,7 +26883,7 @@ GL_PREFIX(VertexAttribs4dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5736(%rax), %r11 +	movq	5704(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs4dvNV), .-GL_PREFIX(VertexAttribs4dvNV) @@ -27074,7 +26894,7 @@ GL_PREFIX(VertexAttribs4dvNV):  GL_PREFIX(VertexAttribs4fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5744(%rax), %r11 +	movq	5712(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27084,13 +26904,13 @@ GL_PREFIX(VertexAttribs4fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5744(%rax), %r11 +	movq	5712(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5744(%rax), %r11 +	movq	5712(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27100,7 +26920,7 @@ GL_PREFIX(VertexAttribs4fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5744(%rax), %r11 +	movq	5712(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs4fvNV), .-GL_PREFIX(VertexAttribs4fvNV) @@ -27111,7 +26931,7 @@ GL_PREFIX(VertexAttribs4fvNV):  GL_PREFIX(VertexAttribs4svNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5752(%rax), %r11 +	movq	5720(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27121,13 +26941,13 @@ GL_PREFIX(VertexAttribs4svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5752(%rax), %r11 +	movq	5720(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5752(%rax), %r11 +	movq	5720(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27137,7 +26957,7 @@ GL_PREFIX(VertexAttribs4svNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5752(%rax), %r11 +	movq	5720(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs4svNV), .-GL_PREFIX(VertexAttribs4svNV) @@ -27148,7 +26968,7 @@ GL_PREFIX(VertexAttribs4svNV):  GL_PREFIX(VertexAttribs4ubvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5760(%rax), %r11 +	movq	5728(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27158,13 +26978,13 @@ GL_PREFIX(VertexAttribs4ubvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5760(%rax), %r11 +	movq	5728(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5760(%rax), %r11 +	movq	5728(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27174,7 +26994,7 @@ GL_PREFIX(VertexAttribs4ubvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5760(%rax), %r11 +	movq	5728(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(VertexAttribs4ubvNV), .-GL_PREFIX(VertexAttribs4ubvNV) @@ -27185,7 +27005,7 @@ GL_PREFIX(VertexAttribs4ubvNV):  GL_PREFIX(AlphaFragmentOp1ATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5768(%rax), %r11 +	movq	5736(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27203,13 +27023,13 @@ GL_PREFIX(AlphaFragmentOp1ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5768(%rax), %r11 +	movq	5736(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5768(%rax), %r11 +	movq	5736(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27227,7 +27047,7 @@ GL_PREFIX(AlphaFragmentOp1ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5768(%rax), %r11 +	movq	5736(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(AlphaFragmentOp1ATI), .-GL_PREFIX(AlphaFragmentOp1ATI) @@ -27238,7 +27058,7 @@ GL_PREFIX(AlphaFragmentOp1ATI):  GL_PREFIX(AlphaFragmentOp2ATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5776(%rax), %r11 +	movq	5744(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27256,13 +27076,13 @@ GL_PREFIX(AlphaFragmentOp2ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5776(%rax), %r11 +	movq	5744(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5776(%rax), %r11 +	movq	5744(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27280,7 +27100,7 @@ GL_PREFIX(AlphaFragmentOp2ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5776(%rax), %r11 +	movq	5744(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(AlphaFragmentOp2ATI), .-GL_PREFIX(AlphaFragmentOp2ATI) @@ -27291,7 +27111,7 @@ GL_PREFIX(AlphaFragmentOp2ATI):  GL_PREFIX(AlphaFragmentOp3ATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5784(%rax), %r11 +	movq	5752(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27309,13 +27129,13 @@ GL_PREFIX(AlphaFragmentOp3ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5784(%rax), %r11 +	movq	5752(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5784(%rax), %r11 +	movq	5752(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27333,7 +27153,7 @@ GL_PREFIX(AlphaFragmentOp3ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5784(%rax), %r11 +	movq	5752(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(AlphaFragmentOp3ATI), .-GL_PREFIX(AlphaFragmentOp3ATI) @@ -27344,25 +27164,25 @@ GL_PREFIX(AlphaFragmentOp3ATI):  GL_PREFIX(BeginFragmentShaderATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5792(%rax), %r11 +	movq	5760(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rbp  	call	_x86_64_get_dispatch@PLT  	popq	%rbp -	movq	5792(%rax), %r11 +	movq	5760(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5792(%rax), %r11 +	movq	5760(%rax), %r11  	jmp	*%r11  1:  	pushq	%rbp  	call	_glapi_get_dispatch  	popq	%rbp -	movq	5792(%rax), %r11 +	movq	5760(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(BeginFragmentShaderATI), .-GL_PREFIX(BeginFragmentShaderATI) @@ -27373,25 +27193,25 @@ GL_PREFIX(BeginFragmentShaderATI):  GL_PREFIX(BindFragmentShaderATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5800(%rax), %r11 +	movq	5768(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	5800(%rax), %r11 +	movq	5768(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5800(%rax), %r11 +	movq	5768(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	5800(%rax), %r11 +	movq	5768(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(BindFragmentShaderATI), .-GL_PREFIX(BindFragmentShaderATI) @@ -27402,7 +27222,7 @@ GL_PREFIX(BindFragmentShaderATI):  GL_PREFIX(ColorFragmentOp1ATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5808(%rax), %r11 +	movq	5776(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27420,13 +27240,13 @@ GL_PREFIX(ColorFragmentOp1ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5808(%rax), %r11 +	movq	5776(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5808(%rax), %r11 +	movq	5776(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27444,7 +27264,7 @@ GL_PREFIX(ColorFragmentOp1ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5808(%rax), %r11 +	movq	5776(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ColorFragmentOp1ATI), .-GL_PREFIX(ColorFragmentOp1ATI) @@ -27455,7 +27275,7 @@ GL_PREFIX(ColorFragmentOp1ATI):  GL_PREFIX(ColorFragmentOp2ATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5816(%rax), %r11 +	movq	5784(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27473,13 +27293,13 @@ GL_PREFIX(ColorFragmentOp2ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5816(%rax), %r11 +	movq	5784(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5816(%rax), %r11 +	movq	5784(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27497,7 +27317,7 @@ GL_PREFIX(ColorFragmentOp2ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5816(%rax), %r11 +	movq	5784(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ColorFragmentOp2ATI), .-GL_PREFIX(ColorFragmentOp2ATI) @@ -27508,7 +27328,7 @@ GL_PREFIX(ColorFragmentOp2ATI):  GL_PREFIX(ColorFragmentOp3ATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5824(%rax), %r11 +	movq	5792(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27526,13 +27346,13 @@ GL_PREFIX(ColorFragmentOp3ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5824(%rax), %r11 +	movq	5792(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5824(%rax), %r11 +	movq	5792(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27550,7 +27370,7 @@ GL_PREFIX(ColorFragmentOp3ATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5824(%rax), %r11 +	movq	5792(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ColorFragmentOp3ATI), .-GL_PREFIX(ColorFragmentOp3ATI) @@ -27561,25 +27381,25 @@ GL_PREFIX(ColorFragmentOp3ATI):  GL_PREFIX(DeleteFragmentShaderATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5832(%rax), %r11 +	movq	5800(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	5832(%rax), %r11 +	movq	5800(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5832(%rax), %r11 +	movq	5800(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	5832(%rax), %r11 +	movq	5800(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(DeleteFragmentShaderATI), .-GL_PREFIX(DeleteFragmentShaderATI) @@ -27590,25 +27410,25 @@ GL_PREFIX(DeleteFragmentShaderATI):  GL_PREFIX(EndFragmentShaderATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5840(%rax), %r11 +	movq	5808(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rbp  	call	_x86_64_get_dispatch@PLT  	popq	%rbp -	movq	5840(%rax), %r11 +	movq	5808(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5840(%rax), %r11 +	movq	5808(%rax), %r11  	jmp	*%r11  1:  	pushq	%rbp  	call	_glapi_get_dispatch  	popq	%rbp -	movq	5840(%rax), %r11 +	movq	5808(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(EndFragmentShaderATI), .-GL_PREFIX(EndFragmentShaderATI) @@ -27619,25 +27439,25 @@ GL_PREFIX(EndFragmentShaderATI):  GL_PREFIX(GenFragmentShadersATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5848(%rax), %r11 +	movq	5816(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	5848(%rax), %r11 +	movq	5816(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5848(%rax), %r11 +	movq	5816(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	5848(%rax), %r11 +	movq	5816(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GenFragmentShadersATI), .-GL_PREFIX(GenFragmentShadersATI) @@ -27648,7 +27468,7 @@ GL_PREFIX(GenFragmentShadersATI):  GL_PREFIX(PassTexCoordATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5856(%rax), %r11 +	movq	5824(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27658,13 +27478,13 @@ GL_PREFIX(PassTexCoordATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5856(%rax), %r11 +	movq	5824(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5856(%rax), %r11 +	movq	5824(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27674,7 +27494,7 @@ GL_PREFIX(PassTexCoordATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5856(%rax), %r11 +	movq	5824(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(PassTexCoordATI), .-GL_PREFIX(PassTexCoordATI) @@ -27685,7 +27505,7 @@ GL_PREFIX(PassTexCoordATI):  GL_PREFIX(SampleMapATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5864(%rax), %r11 +	movq	5832(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27695,13 +27515,13 @@ GL_PREFIX(SampleMapATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5864(%rax), %r11 +	movq	5832(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5864(%rax), %r11 +	movq	5832(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27711,7 +27531,7 @@ GL_PREFIX(SampleMapATI):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5864(%rax), %r11 +	movq	5832(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(SampleMapATI), .-GL_PREFIX(SampleMapATI) @@ -27722,7 +27542,7 @@ GL_PREFIX(SampleMapATI):  GL_PREFIX(SetFragmentShaderConstantATI):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5872(%rax), %r11 +	movq	5840(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27732,13 +27552,13 @@ GL_PREFIX(SetFragmentShaderConstantATI):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5872(%rax), %r11 +	movq	5840(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5872(%rax), %r11 +	movq	5840(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27748,7 +27568,7 @@ GL_PREFIX(SetFragmentShaderConstantATI):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5872(%rax), %r11 +	movq	5840(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(SetFragmentShaderConstantATI), .-GL_PREFIX(SetFragmentShaderConstantATI) @@ -27759,7 +27579,7 @@ GL_PREFIX(SetFragmentShaderConstantATI):  GL_PREFIX(PointParameteriNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5880(%rax), %r11 +	movq	5848(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27769,13 +27589,13 @@ GL_PREFIX(PointParameteriNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5880(%rax), %r11 +	movq	5848(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5880(%rax), %r11 +	movq	5848(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27785,7 +27605,7 @@ GL_PREFIX(PointParameteriNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5880(%rax), %r11 +	movq	5848(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(PointParameteriNV), .-GL_PREFIX(PointParameteriNV) @@ -27796,7 +27616,7 @@ GL_PREFIX(PointParameteriNV):  GL_PREFIX(PointParameterivNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5888(%rax), %r11 +	movq	5856(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27806,13 +27626,13 @@ GL_PREFIX(PointParameterivNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5888(%rax), %r11 +	movq	5856(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5888(%rax), %r11 +	movq	5856(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27822,79 +27642,79 @@ GL_PREFIX(PointParameterivNV):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5888(%rax), %r11 +	movq	5856(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(PointParameterivNV), .-GL_PREFIX(PointParameterivNV)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_737) -	.type	GL_PREFIX(_dispatch_stub_737), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_737)) -GL_PREFIX(_dispatch_stub_737): +	.globl	GL_PREFIX(_dispatch_stub_733) +	.type	GL_PREFIX(_dispatch_stub_733), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_733)) +GL_PREFIX(_dispatch_stub_733):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5896(%rax), %r11 +	movq	5864(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	5896(%rax), %r11 +	movq	5864(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5896(%rax), %r11 +	movq	5864(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	5896(%rax), %r11 +	movq	5864(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_737), .-GL_PREFIX(_dispatch_stub_737) +	.size	GL_PREFIX(_dispatch_stub_733), .-GL_PREFIX(_dispatch_stub_733)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_738) -	.type	GL_PREFIX(_dispatch_stub_738), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_738)) -GL_PREFIX(_dispatch_stub_738): +	.globl	GL_PREFIX(_dispatch_stub_734) +	.type	GL_PREFIX(_dispatch_stub_734), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_734)) +GL_PREFIX(_dispatch_stub_734):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5904(%rax), %r11 +	movq	5872(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	5904(%rax), %r11 +	movq	5872(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5904(%rax), %r11 +	movq	5872(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	5904(%rax), %r11 +	movq	5872(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_738), .-GL_PREFIX(_dispatch_stub_738) +	.size	GL_PREFIX(_dispatch_stub_734), .-GL_PREFIX(_dispatch_stub_734)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_739) -	.type	GL_PREFIX(_dispatch_stub_739), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_739)) -GL_PREFIX(_dispatch_stub_739): +	.globl	GL_PREFIX(_dispatch_stub_735) +	.type	GL_PREFIX(_dispatch_stub_735), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_735)) +GL_PREFIX(_dispatch_stub_735):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5912(%rax), %r11 +	movq	5880(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27904,13 +27724,13 @@ GL_PREFIX(_dispatch_stub_739):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5912(%rax), %r11 +	movq	5880(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5912(%rax), %r11 +	movq	5880(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27920,19 +27740,19 @@ GL_PREFIX(_dispatch_stub_739):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5912(%rax), %r11 +	movq	5880(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_739), .-GL_PREFIX(_dispatch_stub_739) +	.size	GL_PREFIX(_dispatch_stub_735), .-GL_PREFIX(_dispatch_stub_735)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_740) -	.type	GL_PREFIX(_dispatch_stub_740), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_740)) -GL_PREFIX(_dispatch_stub_740): +	.globl	GL_PREFIX(_dispatch_stub_736) +	.type	GL_PREFIX(_dispatch_stub_736), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_736)) +GL_PREFIX(_dispatch_stub_736):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5920(%rax), %r11 +	movq	5888(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -27942,13 +27762,13 @@ GL_PREFIX(_dispatch_stub_740):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5920(%rax), %r11 +	movq	5888(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5920(%rax), %r11 +	movq	5888(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -27958,40 +27778,40 @@ GL_PREFIX(_dispatch_stub_740):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5920(%rax), %r11 +	movq	5888(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_740), .-GL_PREFIX(_dispatch_stub_740) +	.size	GL_PREFIX(_dispatch_stub_736), .-GL_PREFIX(_dispatch_stub_736)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_741) -	.type	GL_PREFIX(_dispatch_stub_741), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_741)) -GL_PREFIX(_dispatch_stub_741): +	.globl	GL_PREFIX(_dispatch_stub_737) +	.type	GL_PREFIX(_dispatch_stub_737), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_737)) +GL_PREFIX(_dispatch_stub_737):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5928(%rax), %r11 +	movq	5896(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	5928(%rax), %r11 +	movq	5896(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5928(%rax), %r11 +	movq	5896(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	5928(%rax), %r11 +	movq	5896(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_741), .-GL_PREFIX(_dispatch_stub_741) +	.size	GL_PREFIX(_dispatch_stub_737), .-GL_PREFIX(_dispatch_stub_737)  	.p2align	4,,15  	.globl	GL_PREFIX(GetProgramNamedParameterdvNV) @@ -27999,7 +27819,7 @@ GL_PREFIX(_dispatch_stub_741):  GL_PREFIX(GetProgramNamedParameterdvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5936(%rax), %r11 +	movq	5904(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28013,13 +27833,13 @@ GL_PREFIX(GetProgramNamedParameterdvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5936(%rax), %r11 +	movq	5904(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5936(%rax), %r11 +	movq	5904(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28033,7 +27853,7 @@ GL_PREFIX(GetProgramNamedParameterdvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5936(%rax), %r11 +	movq	5904(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GetProgramNamedParameterdvNV), .-GL_PREFIX(GetProgramNamedParameterdvNV) @@ -28044,7 +27864,7 @@ GL_PREFIX(GetProgramNamedParameterdvNV):  GL_PREFIX(GetProgramNamedParameterfvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5944(%rax), %r11 +	movq	5912(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28058,13 +27878,13 @@ GL_PREFIX(GetProgramNamedParameterfvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5944(%rax), %r11 +	movq	5912(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5944(%rax), %r11 +	movq	5912(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28078,7 +27898,7 @@ GL_PREFIX(GetProgramNamedParameterfvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5944(%rax), %r11 +	movq	5912(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GetProgramNamedParameterfvNV), .-GL_PREFIX(GetProgramNamedParameterfvNV) @@ -28089,7 +27909,7 @@ GL_PREFIX(GetProgramNamedParameterfvNV):  GL_PREFIX(ProgramNamedParameter4dNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5952(%rax), %r11 +	movq	5920(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$56, %rsp @@ -28109,13 +27929,13 @@ GL_PREFIX(ProgramNamedParameter4dNV):  	movq	8(%rsp), %rsi  	movq	(%rsp), %rdi  	addq	$56, %rsp -	movq	5952(%rax), %r11 +	movq	5920(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5952(%rax), %r11 +	movq	5920(%rax), %r11  	jmp	*%r11  1:  	subq	$56, %rsp @@ -28135,7 +27955,7 @@ GL_PREFIX(ProgramNamedParameter4dNV):  	movq	8(%rsp), %rsi  	movq	(%rsp), %rdi  	addq	$56, %rsp -	movq	5952(%rax), %r11 +	movq	5920(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ProgramNamedParameter4dNV), .-GL_PREFIX(ProgramNamedParameter4dNV) @@ -28146,7 +27966,7 @@ GL_PREFIX(ProgramNamedParameter4dNV):  GL_PREFIX(ProgramNamedParameter4dvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5960(%rax), %r11 +	movq	5928(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28160,13 +27980,13 @@ GL_PREFIX(ProgramNamedParameter4dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5960(%rax), %r11 +	movq	5928(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5960(%rax), %r11 +	movq	5928(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28180,7 +28000,7 @@ GL_PREFIX(ProgramNamedParameter4dvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5960(%rax), %r11 +	movq	5928(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ProgramNamedParameter4dvNV), .-GL_PREFIX(ProgramNamedParameter4dvNV) @@ -28191,7 +28011,7 @@ GL_PREFIX(ProgramNamedParameter4dvNV):  GL_PREFIX(ProgramNamedParameter4fNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5968(%rax), %r11 +	movq	5936(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	subq	$56, %rsp @@ -28211,13 +28031,13 @@ GL_PREFIX(ProgramNamedParameter4fNV):  	movq	8(%rsp), %rsi  	movq	(%rsp), %rdi  	addq	$56, %rsp -	movq	5968(%rax), %r11 +	movq	5936(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5968(%rax), %r11 +	movq	5936(%rax), %r11  	jmp	*%r11  1:  	subq	$56, %rsp @@ -28237,7 +28057,7 @@ GL_PREFIX(ProgramNamedParameter4fNV):  	movq	8(%rsp), %rsi  	movq	(%rsp), %rdi  	addq	$56, %rsp -	movq	5968(%rax), %r11 +	movq	5936(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ProgramNamedParameter4fNV), .-GL_PREFIX(ProgramNamedParameter4fNV) @@ -28248,7 +28068,7 @@ GL_PREFIX(ProgramNamedParameter4fNV):  GL_PREFIX(ProgramNamedParameter4fvNV):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5976(%rax), %r11 +	movq	5944(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28262,13 +28082,13 @@ GL_PREFIX(ProgramNamedParameter4fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5976(%rax), %r11 +	movq	5944(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5976(%rax), %r11 +	movq	5944(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28282,19 +28102,19 @@ GL_PREFIX(ProgramNamedParameter4fvNV):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	5976(%rax), %r11 +	movq	5944(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(ProgramNamedParameter4fvNV), .-GL_PREFIX(ProgramNamedParameter4fvNV)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_748) -	.type	GL_PREFIX(_dispatch_stub_748), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_748)) -GL_PREFIX(_dispatch_stub_748): +	.globl	GL_PREFIX(_dispatch_stub_744) +	.type	GL_PREFIX(_dispatch_stub_744), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_744)) +GL_PREFIX(_dispatch_stub_744):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5984(%rax), %r11 +	movq	5952(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28304,13 +28124,13 @@ GL_PREFIX(_dispatch_stub_748):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5984(%rax), %r11 +	movq	5952(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5984(%rax), %r11 +	movq	5952(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28320,19 +28140,19 @@ GL_PREFIX(_dispatch_stub_748):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5984(%rax), %r11 +	movq	5952(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_748), .-GL_PREFIX(_dispatch_stub_748) +	.size	GL_PREFIX(_dispatch_stub_744), .-GL_PREFIX(_dispatch_stub_744)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_749) -	.type	GL_PREFIX(_dispatch_stub_749), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_749)) -GL_PREFIX(_dispatch_stub_749): +	.globl	GL_PREFIX(_dispatch_stub_745) +	.type	GL_PREFIX(_dispatch_stub_745), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_745)) +GL_PREFIX(_dispatch_stub_745):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	5992(%rax), %r11 +	movq	5960(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28342,13 +28162,13 @@ GL_PREFIX(_dispatch_stub_749):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5992(%rax), %r11 +	movq	5960(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	5992(%rax), %r11 +	movq	5960(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28358,10 +28178,10 @@ GL_PREFIX(_dispatch_stub_749):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	5992(%rax), %r11 +	movq	5960(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_749), .-GL_PREFIX(_dispatch_stub_749) +	.size	GL_PREFIX(_dispatch_stub_745), .-GL_PREFIX(_dispatch_stub_745)  	.p2align	4,,15  	.globl	GL_PREFIX(BindFramebufferEXT) @@ -28369,7 +28189,7 @@ GL_PREFIX(_dispatch_stub_749):  GL_PREFIX(BindFramebufferEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6000(%rax), %r11 +	movq	5968(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28379,13 +28199,13 @@ GL_PREFIX(BindFramebufferEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6000(%rax), %r11 +	movq	5968(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6000(%rax), %r11 +	movq	5968(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28395,7 +28215,7 @@ GL_PREFIX(BindFramebufferEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6000(%rax), %r11 +	movq	5968(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(BindFramebufferEXT), .-GL_PREFIX(BindFramebufferEXT) @@ -28406,7 +28226,7 @@ GL_PREFIX(BindFramebufferEXT):  GL_PREFIX(BindRenderbufferEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6008(%rax), %r11 +	movq	5976(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28416,13 +28236,13 @@ GL_PREFIX(BindRenderbufferEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6008(%rax), %r11 +	movq	5976(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6008(%rax), %r11 +	movq	5976(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28432,7 +28252,7 @@ GL_PREFIX(BindRenderbufferEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6008(%rax), %r11 +	movq	5976(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(BindRenderbufferEXT), .-GL_PREFIX(BindRenderbufferEXT) @@ -28443,25 +28263,25 @@ GL_PREFIX(BindRenderbufferEXT):  GL_PREFIX(CheckFramebufferStatusEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6016(%rax), %r11 +	movq	5984(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	6016(%rax), %r11 +	movq	5984(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6016(%rax), %r11 +	movq	5984(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	6016(%rax), %r11 +	movq	5984(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(CheckFramebufferStatusEXT), .-GL_PREFIX(CheckFramebufferStatusEXT) @@ -28472,7 +28292,7 @@ GL_PREFIX(CheckFramebufferStatusEXT):  GL_PREFIX(DeleteFramebuffersEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6024(%rax), %r11 +	movq	5992(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28482,13 +28302,13 @@ GL_PREFIX(DeleteFramebuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6024(%rax), %r11 +	movq	5992(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6024(%rax), %r11 +	movq	5992(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28498,7 +28318,7 @@ GL_PREFIX(DeleteFramebuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6024(%rax), %r11 +	movq	5992(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(DeleteFramebuffersEXT), .-GL_PREFIX(DeleteFramebuffersEXT) @@ -28509,7 +28329,7 @@ GL_PREFIX(DeleteFramebuffersEXT):  GL_PREFIX(DeleteRenderbuffersEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6032(%rax), %r11 +	movq	6000(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28519,13 +28339,13 @@ GL_PREFIX(DeleteRenderbuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6032(%rax), %r11 +	movq	6000(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6032(%rax), %r11 +	movq	6000(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28535,7 +28355,7 @@ GL_PREFIX(DeleteRenderbuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6032(%rax), %r11 +	movq	6000(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(DeleteRenderbuffersEXT), .-GL_PREFIX(DeleteRenderbuffersEXT) @@ -28546,7 +28366,7 @@ GL_PREFIX(DeleteRenderbuffersEXT):  GL_PREFIX(FramebufferRenderbufferEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6040(%rax), %r11 +	movq	6008(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28560,13 +28380,13 @@ GL_PREFIX(FramebufferRenderbufferEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6040(%rax), %r11 +	movq	6008(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6040(%rax), %r11 +	movq	6008(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28580,7 +28400,7 @@ GL_PREFIX(FramebufferRenderbufferEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6040(%rax), %r11 +	movq	6008(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(FramebufferRenderbufferEXT), .-GL_PREFIX(FramebufferRenderbufferEXT) @@ -28591,7 +28411,7 @@ GL_PREFIX(FramebufferRenderbufferEXT):  GL_PREFIX(FramebufferTexture1DEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6048(%rax), %r11 +	movq	6016(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28605,13 +28425,13 @@ GL_PREFIX(FramebufferTexture1DEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6048(%rax), %r11 +	movq	6016(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6048(%rax), %r11 +	movq	6016(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28625,7 +28445,7 @@ GL_PREFIX(FramebufferTexture1DEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6048(%rax), %r11 +	movq	6016(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(FramebufferTexture1DEXT), .-GL_PREFIX(FramebufferTexture1DEXT) @@ -28636,7 +28456,7 @@ GL_PREFIX(FramebufferTexture1DEXT):  GL_PREFIX(FramebufferTexture2DEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6056(%rax), %r11 +	movq	6024(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28650,13 +28470,13 @@ GL_PREFIX(FramebufferTexture2DEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6056(%rax), %r11 +	movq	6024(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6056(%rax), %r11 +	movq	6024(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28670,7 +28490,7 @@ GL_PREFIX(FramebufferTexture2DEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6056(%rax), %r11 +	movq	6024(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(FramebufferTexture2DEXT), .-GL_PREFIX(FramebufferTexture2DEXT) @@ -28681,7 +28501,7 @@ GL_PREFIX(FramebufferTexture2DEXT):  GL_PREFIX(FramebufferTexture3DEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6064(%rax), %r11 +	movq	6032(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28699,13 +28519,13 @@ GL_PREFIX(FramebufferTexture3DEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6064(%rax), %r11 +	movq	6032(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6064(%rax), %r11 +	movq	6032(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28723,7 +28543,7 @@ GL_PREFIX(FramebufferTexture3DEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6064(%rax), %r11 +	movq	6032(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(FramebufferTexture3DEXT), .-GL_PREFIX(FramebufferTexture3DEXT) @@ -28734,7 +28554,7 @@ GL_PREFIX(FramebufferTexture3DEXT):  GL_PREFIX(GenFramebuffersEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6072(%rax), %r11 +	movq	6040(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28744,13 +28564,13 @@ GL_PREFIX(GenFramebuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6072(%rax), %r11 +	movq	6040(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6072(%rax), %r11 +	movq	6040(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28760,7 +28580,7 @@ GL_PREFIX(GenFramebuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6072(%rax), %r11 +	movq	6040(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GenFramebuffersEXT), .-GL_PREFIX(GenFramebuffersEXT) @@ -28771,7 +28591,7 @@ GL_PREFIX(GenFramebuffersEXT):  GL_PREFIX(GenRenderbuffersEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6080(%rax), %r11 +	movq	6048(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28781,13 +28601,13 @@ GL_PREFIX(GenRenderbuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6080(%rax), %r11 +	movq	6048(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6080(%rax), %r11 +	movq	6048(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28797,7 +28617,7 @@ GL_PREFIX(GenRenderbuffersEXT):  	popq	%rbp  	popq	%rsi  	popq	%rdi -	movq	6080(%rax), %r11 +	movq	6048(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GenRenderbuffersEXT), .-GL_PREFIX(GenRenderbuffersEXT) @@ -28808,25 +28628,25 @@ GL_PREFIX(GenRenderbuffersEXT):  GL_PREFIX(GenerateMipmapEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6088(%rax), %r11 +	movq	6056(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	6088(%rax), %r11 +	movq	6056(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6088(%rax), %r11 +	movq	6056(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	6088(%rax), %r11 +	movq	6056(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GenerateMipmapEXT), .-GL_PREFIX(GenerateMipmapEXT) @@ -28837,7 +28657,7 @@ GL_PREFIX(GenerateMipmapEXT):  GL_PREFIX(GetFramebufferAttachmentParameterivEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6096(%rax), %r11 +	movq	6064(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28851,13 +28671,13 @@ GL_PREFIX(GetFramebufferAttachmentParameterivEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6096(%rax), %r11 +	movq	6064(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6096(%rax), %r11 +	movq	6064(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28871,7 +28691,7 @@ GL_PREFIX(GetFramebufferAttachmentParameterivEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6096(%rax), %r11 +	movq	6064(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GetFramebufferAttachmentParameterivEXT), .-GL_PREFIX(GetFramebufferAttachmentParameterivEXT) @@ -28882,7 +28702,7 @@ GL_PREFIX(GetFramebufferAttachmentParameterivEXT):  GL_PREFIX(GetRenderbufferParameterivEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6104(%rax), %r11 +	movq	6072(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28892,13 +28712,13 @@ GL_PREFIX(GetRenderbufferParameterivEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6104(%rax), %r11 +	movq	6072(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6104(%rax), %r11 +	movq	6072(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -28908,7 +28728,7 @@ GL_PREFIX(GetRenderbufferParameterivEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6104(%rax), %r11 +	movq	6072(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(GetRenderbufferParameterivEXT), .-GL_PREFIX(GetRenderbufferParameterivEXT) @@ -28919,25 +28739,25 @@ GL_PREFIX(GetRenderbufferParameterivEXT):  GL_PREFIX(IsFramebufferEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6112(%rax), %r11 +	movq	6080(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	6112(%rax), %r11 +	movq	6080(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6112(%rax), %r11 +	movq	6080(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	6112(%rax), %r11 +	movq	6080(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(IsFramebufferEXT), .-GL_PREFIX(IsFramebufferEXT) @@ -28948,25 +28768,25 @@ GL_PREFIX(IsFramebufferEXT):  GL_PREFIX(IsRenderbufferEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6120(%rax), %r11 +	movq	6088(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi  	call	_x86_64_get_dispatch@PLT  	popq	%rdi -	movq	6120(%rax), %r11 +	movq	6088(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6120(%rax), %r11 +	movq	6088(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi  	call	_glapi_get_dispatch  	popq	%rdi -	movq	6120(%rax), %r11 +	movq	6088(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(IsRenderbufferEXT), .-GL_PREFIX(IsRenderbufferEXT) @@ -28977,7 +28797,7 @@ GL_PREFIX(IsRenderbufferEXT):  GL_PREFIX(RenderbufferStorageEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6128(%rax), %r11 +	movq	6096(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -28991,13 +28811,13 @@ GL_PREFIX(RenderbufferStorageEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6128(%rax), %r11 +	movq	6096(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6128(%rax), %r11 +	movq	6096(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29011,19 +28831,19 @@ GL_PREFIX(RenderbufferStorageEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6128(%rax), %r11 +	movq	6096(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(RenderbufferStorageEXT), .-GL_PREFIX(RenderbufferStorageEXT)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_767) -	.type	GL_PREFIX(_dispatch_stub_767), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_767)) -GL_PREFIX(_dispatch_stub_767): +	.globl	GL_PREFIX(_dispatch_stub_763) +	.type	GL_PREFIX(_dispatch_stub_763), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_763)) +GL_PREFIX(_dispatch_stub_763):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6136(%rax), %r11 +	movq	6104(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -29041,13 +28861,13 @@ GL_PREFIX(_dispatch_stub_767):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6136(%rax), %r11 +	movq	6104(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6136(%rax), %r11 +	movq	6104(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29065,10 +28885,10 @@ GL_PREFIX(_dispatch_stub_767):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6136(%rax), %r11 +	movq	6104(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_767), .-GL_PREFIX(_dispatch_stub_767) +	.size	GL_PREFIX(_dispatch_stub_763), .-GL_PREFIX(_dispatch_stub_763)  	.p2align	4,,15  	.globl	GL_PREFIX(FramebufferTextureLayerEXT) @@ -29076,7 +28896,7 @@ GL_PREFIX(_dispatch_stub_767):  GL_PREFIX(FramebufferTextureLayerEXT):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6144(%rax), %r11 +	movq	6112(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -29090,13 +28910,13 @@ GL_PREFIX(FramebufferTextureLayerEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6144(%rax), %r11 +	movq	6112(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6144(%rax), %r11 +	movq	6112(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29110,19 +28930,19 @@ GL_PREFIX(FramebufferTextureLayerEXT):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6144(%rax), %r11 +	movq	6112(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */  	.size	GL_PREFIX(FramebufferTextureLayerEXT), .-GL_PREFIX(FramebufferTextureLayerEXT)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_769) -	.type	GL_PREFIX(_dispatch_stub_769), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_769)) -GL_PREFIX(_dispatch_stub_769): +	.globl	GL_PREFIX(_dispatch_stub_765) +	.type	GL_PREFIX(_dispatch_stub_765), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_765)) +GL_PREFIX(_dispatch_stub_765):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6152(%rax), %r11 +	movq	6120(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -29136,13 +28956,13 @@ GL_PREFIX(_dispatch_stub_769):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6152(%rax), %r11 +	movq	6120(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6152(%rax), %r11 +	movq	6120(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29156,19 +28976,19 @@ GL_PREFIX(_dispatch_stub_769):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6152(%rax), %r11 +	movq	6120(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_769), .-GL_PREFIX(_dispatch_stub_769) +	.size	GL_PREFIX(_dispatch_stub_765), .-GL_PREFIX(_dispatch_stub_765)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_770) -	.type	GL_PREFIX(_dispatch_stub_770), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_770)) -GL_PREFIX(_dispatch_stub_770): +	.globl	GL_PREFIX(_dispatch_stub_766) +	.type	GL_PREFIX(_dispatch_stub_766), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_766)) +GL_PREFIX(_dispatch_stub_766):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6160(%rax), %r11 +	movq	6128(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -29182,13 +29002,13 @@ GL_PREFIX(_dispatch_stub_770):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6160(%rax), %r11 +	movq	6128(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6160(%rax), %r11 +	movq	6128(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29202,19 +29022,19 @@ GL_PREFIX(_dispatch_stub_770):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6160(%rax), %r11 +	movq	6128(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_770), .-GL_PREFIX(_dispatch_stub_770) +	.size	GL_PREFIX(_dispatch_stub_766), .-GL_PREFIX(_dispatch_stub_766)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_771) -	.type	GL_PREFIX(_dispatch_stub_771), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_771)) -GL_PREFIX(_dispatch_stub_771): +	.globl	GL_PREFIX(_dispatch_stub_767) +	.type	GL_PREFIX(_dispatch_stub_767), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_767)) +GL_PREFIX(_dispatch_stub_767):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6168(%rax), %r11 +	movq	6136(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -29228,13 +29048,13 @@ GL_PREFIX(_dispatch_stub_771):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6168(%rax), %r11 +	movq	6136(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6168(%rax), %r11 +	movq	6136(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29248,19 +29068,19 @@ GL_PREFIX(_dispatch_stub_771):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6168(%rax), %r11 +	movq	6136(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_771), .-GL_PREFIX(_dispatch_stub_771) +	.size	GL_PREFIX(_dispatch_stub_767), .-GL_PREFIX(_dispatch_stub_767)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_772) -	.type	GL_PREFIX(_dispatch_stub_772), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_772)) -GL_PREFIX(_dispatch_stub_772): +	.globl	GL_PREFIX(_dispatch_stub_768) +	.type	GL_PREFIX(_dispatch_stub_768), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_768)) +GL_PREFIX(_dispatch_stub_768):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6176(%rax), %r11 +	movq	6144(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -29270,13 +29090,13 @@ GL_PREFIX(_dispatch_stub_772):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6176(%rax), %r11 +	movq	6144(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6176(%rax), %r11 +	movq	6144(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29286,19 +29106,19 @@ GL_PREFIX(_dispatch_stub_772):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6176(%rax), %r11 +	movq	6144(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_772), .-GL_PREFIX(_dispatch_stub_772) +	.size	GL_PREFIX(_dispatch_stub_768), .-GL_PREFIX(_dispatch_stub_768)  	.p2align	4,,15 -	.globl	GL_PREFIX(_dispatch_stub_773) -	.type	GL_PREFIX(_dispatch_stub_773), @function -	HIDDEN(GL_PREFIX(_dispatch_stub_773)) -GL_PREFIX(_dispatch_stub_773): +	.globl	GL_PREFIX(_dispatch_stub_769) +	.type	GL_PREFIX(_dispatch_stub_769), @function +	HIDDEN(GL_PREFIX(_dispatch_stub_769)) +GL_PREFIX(_dispatch_stub_769):  #if defined(GLX_USE_TLS)  	call	_x86_64_get_dispatch@PLT -	movq	6184(%rax), %r11 +	movq	6152(%rax), %r11  	jmp	*%r11  #elif defined(PTHREADS)  	pushq	%rdi @@ -29308,13 +29128,13 @@ GL_PREFIX(_dispatch_stub_773):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6184(%rax), %r11 +	movq	6152(%rax), %r11  	jmp	*%r11  #else  	movq	_glapi_Dispatch(%rip), %rax  	testq	%rax, %rax  	je	1f -	movq	6184(%rax), %r11 +	movq	6152(%rax), %r11  	jmp	*%r11  1:  	pushq	%rdi @@ -29324,10 +29144,10 @@ GL_PREFIX(_dispatch_stub_773):  	popq	%rdx  	popq	%rsi  	popq	%rdi -	movq	6184(%rax), %r11 +	movq	6152(%rax), %r11  	jmp	*%r11  #endif /* defined(GLX_USE_TLS) */ -	.size	GL_PREFIX(_dispatch_stub_773), .-GL_PREFIX(_dispatch_stub_773) +	.size	GL_PREFIX(_dispatch_stub_769), .-GL_PREFIX(_dispatch_stub_769)  	.globl GL_PREFIX(ArrayElementEXT) ; .set GL_PREFIX(ArrayElementEXT), GL_PREFIX(ArrayElement)  	.globl GL_PREFIX(BindTextureEXT) ; .set GL_PREFIX(BindTextureEXT), GL_PREFIX(BindTexture) @@ -29419,6 +29239,10 @@ GL_PREFIX(_dispatch_stub_773):  	.globl GL_PREFIX(GetVertexAttribdv) ; .set GL_PREFIX(GetVertexAttribdv), GL_PREFIX(GetVertexAttribdvARB)  	.globl GL_PREFIX(GetVertexAttribfv) ; .set GL_PREFIX(GetVertexAttribfv), GL_PREFIX(GetVertexAttribfvARB)  	.globl GL_PREFIX(GetVertexAttribiv) ; .set GL_PREFIX(GetVertexAttribiv), GL_PREFIX(GetVertexAttribivARB) +	.globl GL_PREFIX(ProgramParameter4dNV) ; .set GL_PREFIX(ProgramParameter4dNV), GL_PREFIX(ProgramEnvParameter4dARB) +	.globl GL_PREFIX(ProgramParameter4dvNV) ; .set GL_PREFIX(ProgramParameter4dvNV), GL_PREFIX(ProgramEnvParameter4dvARB) +	.globl GL_PREFIX(ProgramParameter4fNV) ; .set GL_PREFIX(ProgramParameter4fNV), GL_PREFIX(ProgramEnvParameter4fARB) +	.globl GL_PREFIX(ProgramParameter4fvNV) ; .set GL_PREFIX(ProgramParameter4fvNV), GL_PREFIX(ProgramEnvParameter4fvARB)  	.globl GL_PREFIX(VertexAttrib1d) ; .set GL_PREFIX(VertexAttrib1d), GL_PREFIX(VertexAttrib1dARB)  	.globl GL_PREFIX(VertexAttrib1dv) ; .set GL_PREFIX(VertexAttrib1dv), GL_PREFIX(VertexAttrib1dvARB)  	.globl GL_PREFIX(VertexAttrib1f) ; .set GL_PREFIX(VertexAttrib1f), GL_PREFIX(VertexAttrib1fARB) @@ -29578,7 +29402,7 @@ GL_PREFIX(_dispatch_stub_773):  	.globl GL_PREFIX(IsProgramARB) ; .set GL_PREFIX(IsProgramARB), GL_PREFIX(IsProgramNV)  	.globl GL_PREFIX(PointParameteri) ; .set GL_PREFIX(PointParameteri), GL_PREFIX(PointParameteriNV)  	.globl GL_PREFIX(PointParameteriv) ; .set GL_PREFIX(PointParameteriv), GL_PREFIX(PointParameterivNV) -	.globl GL_PREFIX(BlendEquationSeparate) ; .set GL_PREFIX(BlendEquationSeparate), GL_PREFIX(_dispatch_stub_749) +	.globl GL_PREFIX(BlendEquationSeparate) ; .set GL_PREFIX(BlendEquationSeparate), GL_PREFIX(_dispatch_stub_745)  #if defined(GLX_USE_TLS) && defined(__linux__)  	.section ".note.ABI-tag", "a" diff --git a/src/mesa/x86/glapi_x86.S b/src/mesa/x86/glapi_x86.S index 40ecc20753..b99c2b6520 100644 --- a/src/mesa/x86/glapi_x86.S +++ b/src/mesa/x86/glapi_x86.S @@ -844,10 +844,6 @@ GLNAME(gl_dispatch_functions_start):  	GL_STUB(GetVertexAttribivNV, _gloffset_GetVertexAttribivNV, GetVertexAttribivNV@12)  	GL_STUB(IsProgramNV, _gloffset_IsProgramNV, IsProgramNV@4)  	GL_STUB(LoadProgramNV, _gloffset_LoadProgramNV, LoadProgramNV@16) -	GL_STUB(ProgramParameter4dNV, _gloffset_ProgramParameter4dNV, ProgramParameter4dNV@40) -	GL_STUB(ProgramParameter4dvNV, _gloffset_ProgramParameter4dvNV, ProgramParameter4dvNV@12) -	GL_STUB(ProgramParameter4fNV, _gloffset_ProgramParameter4fNV, ProgramParameter4fNV@24) -	GL_STUB(ProgramParameter4fvNV, _gloffset_ProgramParameter4fvNV, ProgramParameter4fvNV@12)  	GL_STUB(ProgramParameters4dvNV, _gloffset_ProgramParameters4dvNV, ProgramParameters4dvNV@16)  	GL_STUB(ProgramParameters4fvNV, _gloffset_ProgramParameters4fvNV, ProgramParameters4fvNV@16)  	GL_STUB(RequestResidentProgramsNV, _gloffset_RequestResidentProgramsNV, RequestResidentProgramsNV@8) @@ -908,26 +904,26 @@ GLNAME(gl_dispatch_functions_start):  	GL_STUB(SetFragmentShaderConstantATI, _gloffset_SetFragmentShaderConstantATI, SetFragmentShaderConstantATI@8)  	GL_STUB(PointParameteriNV, _gloffset_PointParameteriNV, PointParameteriNV@8)  	GL_STUB(PointParameterivNV, _gloffset_PointParameterivNV, PointParameterivNV@8) -	GL_STUB(_dispatch_stub_737, _gloffset_ActiveStencilFaceEXT, _dispatch_stub_737@4) +	GL_STUB(_dispatch_stub_733, _gloffset_ActiveStencilFaceEXT, _dispatch_stub_733@4) +	HIDDEN(GL_PREFIX(_dispatch_stub_733, _dispatch_stub_733@4)) +	GL_STUB(_dispatch_stub_734, _gloffset_BindVertexArrayAPPLE, _dispatch_stub_734@4) +	HIDDEN(GL_PREFIX(_dispatch_stub_734, _dispatch_stub_734@4)) +	GL_STUB(_dispatch_stub_735, _gloffset_DeleteVertexArraysAPPLE, _dispatch_stub_735@8) +	HIDDEN(GL_PREFIX(_dispatch_stub_735, _dispatch_stub_735@8)) +	GL_STUB(_dispatch_stub_736, _gloffset_GenVertexArraysAPPLE, _dispatch_stub_736@8) +	HIDDEN(GL_PREFIX(_dispatch_stub_736, _dispatch_stub_736@8)) +	GL_STUB(_dispatch_stub_737, _gloffset_IsVertexArrayAPPLE, _dispatch_stub_737@4)  	HIDDEN(GL_PREFIX(_dispatch_stub_737, _dispatch_stub_737@4)) -	GL_STUB(_dispatch_stub_738, _gloffset_BindVertexArrayAPPLE, _dispatch_stub_738@4) -	HIDDEN(GL_PREFIX(_dispatch_stub_738, _dispatch_stub_738@4)) -	GL_STUB(_dispatch_stub_739, _gloffset_DeleteVertexArraysAPPLE, _dispatch_stub_739@8) -	HIDDEN(GL_PREFIX(_dispatch_stub_739, _dispatch_stub_739@8)) -	GL_STUB(_dispatch_stub_740, _gloffset_GenVertexArraysAPPLE, _dispatch_stub_740@8) -	HIDDEN(GL_PREFIX(_dispatch_stub_740, _dispatch_stub_740@8)) -	GL_STUB(_dispatch_stub_741, _gloffset_IsVertexArrayAPPLE, _dispatch_stub_741@4) -	HIDDEN(GL_PREFIX(_dispatch_stub_741, _dispatch_stub_741@4))  	GL_STUB(GetProgramNamedParameterdvNV, _gloffset_GetProgramNamedParameterdvNV, GetProgramNamedParameterdvNV@16)  	GL_STUB(GetProgramNamedParameterfvNV, _gloffset_GetProgramNamedParameterfvNV, GetProgramNamedParameterfvNV@16)  	GL_STUB(ProgramNamedParameter4dNV, _gloffset_ProgramNamedParameter4dNV, ProgramNamedParameter4dNV@44)  	GL_STUB(ProgramNamedParameter4dvNV, _gloffset_ProgramNamedParameter4dvNV, ProgramNamedParameter4dvNV@16)  	GL_STUB(ProgramNamedParameter4fNV, _gloffset_ProgramNamedParameter4fNV, ProgramNamedParameter4fNV@28)  	GL_STUB(ProgramNamedParameter4fvNV, _gloffset_ProgramNamedParameter4fvNV, ProgramNamedParameter4fvNV@16) -	GL_STUB(_dispatch_stub_748, _gloffset_DepthBoundsEXT, _dispatch_stub_748@16) -	HIDDEN(GL_PREFIX(_dispatch_stub_748, _dispatch_stub_748@16)) -	GL_STUB(_dispatch_stub_749, _gloffset_BlendEquationSeparateEXT, _dispatch_stub_749@8) -	HIDDEN(GL_PREFIX(_dispatch_stub_749, _dispatch_stub_749@8)) +	GL_STUB(_dispatch_stub_744, _gloffset_DepthBoundsEXT, _dispatch_stub_744@16) +	HIDDEN(GL_PREFIX(_dispatch_stub_744, _dispatch_stub_744@16)) +	GL_STUB(_dispatch_stub_745, _gloffset_BlendEquationSeparateEXT, _dispatch_stub_745@8) +	HIDDEN(GL_PREFIX(_dispatch_stub_745, _dispatch_stub_745@8))  	GL_STUB(BindFramebufferEXT, _gloffset_BindFramebufferEXT, BindFramebufferEXT@8)  	GL_STUB(BindRenderbufferEXT, _gloffset_BindRenderbufferEXT, BindRenderbufferEXT@8)  	GL_STUB(CheckFramebufferStatusEXT, _gloffset_CheckFramebufferStatusEXT, CheckFramebufferStatusEXT@4) @@ -945,19 +941,19 @@ GLNAME(gl_dispatch_functions_start):  	GL_STUB(IsFramebufferEXT, _gloffset_IsFramebufferEXT, IsFramebufferEXT@4)  	GL_STUB(IsRenderbufferEXT, _gloffset_IsRenderbufferEXT, IsRenderbufferEXT@4)  	GL_STUB(RenderbufferStorageEXT, _gloffset_RenderbufferStorageEXT, RenderbufferStorageEXT@16) -	GL_STUB(_dispatch_stub_767, _gloffset_BlitFramebufferEXT, _dispatch_stub_767@40) -	HIDDEN(GL_PREFIX(_dispatch_stub_767, _dispatch_stub_767@40)) +	GL_STUB(_dispatch_stub_763, _gloffset_BlitFramebufferEXT, _dispatch_stub_763@40) +	HIDDEN(GL_PREFIX(_dispatch_stub_763, _dispatch_stub_763@40))  	GL_STUB(FramebufferTextureLayerEXT, _gloffset_FramebufferTextureLayerEXT, FramebufferTextureLayerEXT@20) -	GL_STUB(_dispatch_stub_769, _gloffset_StencilFuncSeparateATI, _dispatch_stub_769@16) -	HIDDEN(GL_PREFIX(_dispatch_stub_769, _dispatch_stub_769@16)) -	GL_STUB(_dispatch_stub_770, _gloffset_ProgramEnvParameters4fvEXT, _dispatch_stub_770@16) -	HIDDEN(GL_PREFIX(_dispatch_stub_770, _dispatch_stub_770@16)) -	GL_STUB(_dispatch_stub_771, _gloffset_ProgramLocalParameters4fvEXT, _dispatch_stub_771@16) -	HIDDEN(GL_PREFIX(_dispatch_stub_771, _dispatch_stub_771@16)) -	GL_STUB(_dispatch_stub_772, _gloffset_GetQueryObjecti64vEXT, _dispatch_stub_772@12) -	HIDDEN(GL_PREFIX(_dispatch_stub_772, _dispatch_stub_772@12)) -	GL_STUB(_dispatch_stub_773, _gloffset_GetQueryObjectui64vEXT, _dispatch_stub_773@12) -	HIDDEN(GL_PREFIX(_dispatch_stub_773, _dispatch_stub_773@12)) +	GL_STUB(_dispatch_stub_765, _gloffset_StencilFuncSeparateATI, _dispatch_stub_765@16) +	HIDDEN(GL_PREFIX(_dispatch_stub_765, _dispatch_stub_765@16)) +	GL_STUB(_dispatch_stub_766, _gloffset_ProgramEnvParameters4fvEXT, _dispatch_stub_766@16) +	HIDDEN(GL_PREFIX(_dispatch_stub_766, _dispatch_stub_766@16)) +	GL_STUB(_dispatch_stub_767, _gloffset_ProgramLocalParameters4fvEXT, _dispatch_stub_767@16) +	HIDDEN(GL_PREFIX(_dispatch_stub_767, _dispatch_stub_767@16)) +	GL_STUB(_dispatch_stub_768, _gloffset_GetQueryObjecti64vEXT, _dispatch_stub_768@12) +	HIDDEN(GL_PREFIX(_dispatch_stub_768, _dispatch_stub_768@12)) +	GL_STUB(_dispatch_stub_769, _gloffset_GetQueryObjectui64vEXT, _dispatch_stub_769@12) +	HIDDEN(GL_PREFIX(_dispatch_stub_769, _dispatch_stub_769@12))  	GL_STUB_ALIAS(ArrayElementEXT, _gloffset_ArrayElement, ArrayElementEXT@4, ArrayElement, ArrayElement@4)  	GL_STUB_ALIAS(BindTextureEXT, _gloffset_BindTexture, BindTextureEXT@8, BindTexture, BindTexture@8)  	GL_STUB_ALIAS(DrawArraysEXT, _gloffset_DrawArrays, DrawArraysEXT@12, DrawArrays, DrawArrays@12) @@ -1107,6 +1103,10 @@ GLNAME(gl_dispatch_functions_start):  	GL_STUB_ALIAS(GetVertexAttribdv, _gloffset_GetVertexAttribdvARB, GetVertexAttribdv@12, GetVertexAttribdvARB, GetVertexAttribdvARB@12)  	GL_STUB_ALIAS(GetVertexAttribfv, _gloffset_GetVertexAttribfvARB, GetVertexAttribfv@12, GetVertexAttribfvARB, GetVertexAttribfvARB@12)  	GL_STUB_ALIAS(GetVertexAttribiv, _gloffset_GetVertexAttribivARB, GetVertexAttribiv@12, GetVertexAttribivARB, GetVertexAttribivARB@12) +	GL_STUB_ALIAS(ProgramParameter4dNV, _gloffset_ProgramEnvParameter4dARB, ProgramParameter4dNV@40, ProgramEnvParameter4dARB, ProgramEnvParameter4dARB@40) +	GL_STUB_ALIAS(ProgramParameter4dvNV, _gloffset_ProgramEnvParameter4dvARB, ProgramParameter4dvNV@12, ProgramEnvParameter4dvARB, ProgramEnvParameter4dvARB@12) +	GL_STUB_ALIAS(ProgramParameter4fNV, _gloffset_ProgramEnvParameter4fARB, ProgramParameter4fNV@24, ProgramEnvParameter4fARB, ProgramEnvParameter4fARB@24) +	GL_STUB_ALIAS(ProgramParameter4fvNV, _gloffset_ProgramEnvParameter4fvARB, ProgramParameter4fvNV@12, ProgramEnvParameter4fvARB, ProgramEnvParameter4fvARB@12)  	GL_STUB_ALIAS(VertexAttrib1d, _gloffset_VertexAttrib1dARB, VertexAttrib1d@12, VertexAttrib1dARB, VertexAttrib1dARB@12)  	GL_STUB_ALIAS(VertexAttrib1dv, _gloffset_VertexAttrib1dvARB, VertexAttrib1dv@8, VertexAttrib1dvARB, VertexAttrib1dvARB@8)  	GL_STUB_ALIAS(VertexAttrib1f, _gloffset_VertexAttrib1fARB, VertexAttrib1f@8, VertexAttrib1fARB, VertexAttrib1fARB@8) diff --git a/src/mesa/x86/rtasm/x86sse.c b/src/mesa/x86/rtasm/x86sse.c index 39c0e9b851..7a91364ed8 100644 --- a/src/mesa/x86/rtasm/x86sse.c +++ b/src/mesa/x86/rtasm/x86sse.c @@ -1,3 +1,4 @@ +#ifdef USE_X86_ASM  #if defined(__i386__) || defined(__386__)  #include "imports.h" @@ -290,7 +291,7 @@ void x86_call( struct x86_function *p, void (*label)())  void x86_call( struct x86_function *p, struct x86_reg reg)  {     emit_1ub(p, 0xff); -   emit_modrm(p, reg, reg); +   emit_modrm_noreg(p, 2, reg);  }  #endif @@ -1191,3 +1192,9 @@ void x86sse_dummy( void )  }  #endif + +#else  /* USE_X86_ASM */ + +int x86sse_c_dummy_var; /* silence warning */ + +#endif /* USE_X86_ASM */ @@ -89,105 +89,6 @@ def get_winddk_paths(env, version=None):      exe_path = string.join(exe_paths, os.pathsep )      return (include_path, lib_path, exe_path) -def set_winddk_flags(env): -    """Mimic WINDDK's builtin flags. - -    See also: -    - WINDDK's bin/makefile.new i386mk.inc for more info. -    - buildchk_wxp_x86.log files, generated by the WINDDK's build -    - http://alter.org.ua/docs/nt_kernel/vc8_proj/ -    """ -     -    cppdefines = [ -        ('_X86_', '1'),  -        ('i386', '1'),  -        'STD_CALL',  -        ('CONDITION_HANDLING', '1'), -        ('NT_INST', '0'),  -        ('WIN32', '100'), -        ('_NT1X_', '100'), -        ('WINNT', '1'), -        ('_WIN32_WINNT', '0x0501'), # minimum required OS version -        ('WINVER', '0x0501'), -        ('_WIN32_IE', '0x0603'), -        ('WIN32_LEAN_AND_MEAN', '1'), -        ('DEVL', '1'), -        ('__BUILDMACHINE__', 'WinDDK'), -        ('FPO', '0'), -    ] -    if env.get('DEBUG', False): -         cppdefines += [ -              ('DBG', 1), -         ] -    env.Append(CPPDEFINES = cppdefines) - -    # See also: -    # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx -    # - cl /? -    cflags = [ -        '/Zl', # omit default library name in .OBJ -        '/Zp8', # 8bytes struct member alignment -        '/Gy', # separate functions for linker -        '/Gm-', # disable minimal rebuild -        '/W3', # warning level -        '/WX', # treat warnings as errors -        '/Gz', # __stdcall Calling convention -        '/GX-', # disable C++ EH -        '/GR-', # disable C++ RTTI -        '/GF', # enable read-only string pooling -        '/GS', # enable security checks -        '/G6', # optimize for PPro, P-II, P-III -        '/Ze', # enable extensions -        #'/Gi-', # ??? -        '/QIfdiv-', # disable Pentium FDIV fix -        #'/hotpatch', # ??? -        #'/Z7', #enable old-style debug info -    ] -    if env.get('debug', False): -        cflags += [ -          '/Od', # disable optimizations -          '/Oi', # enable intrinsic functions -          '/Oy-', # disable frame pointer omission -        ] -    else: -        cflags += [ -          '/Ox', # maximum optimizations -          '/Oi', # enable intrinsic functions -          '/Os', # favor code space -        ] -    env.Append(CFLAGS = cflags) -    env.Append(CXXFLAGS = cflags) -     -    # See also: -    # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx -    env.Append(LINKFLAGS = [ -        '/merge:_PAGE=PAGE', -        '/merge:_TEXT=.text', -        '/section:INIT,d', -        '/opt:ref', -        '/opt:icf', -        '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221', -        '/incremental:no', -        '/fullbuild', -        '/release', -        '/nodefaultlib', -        '/wx', -        '/debug', -        '/debugtype:cv', -        '/version:5.1', -        '/osversion:5.1', -        '/functionpadmin:5', -        '/safeseh', -        '/pdbcompress', -        '/stack:0x40000,0x1000', -        '/driver',  -        '/align:0x80', -        '/subsystem:native,5.01', -        '/base:0x10000', -         -        '/entry:DrvEnableDriver', -    ]) -  def validate_vars(env):      """Validate the PCH and PCHSTOP construction variables."""      if env.has_key('PCH') and env['PCH']: @@ -314,8 +215,6 @@ def generate(env):      SCons.Tool.mslink.generate(env) -    set_winddk_flags(env) -          if not env.has_key('ENV'):          env['ENV'] = {}  | 
