Compare commits
	
		
			6 Commits
		
	
	
		
			mesa-12.0.
			...
			mesa_7_1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6d9b25e522 | ||
| 
						 | 
					31bad23f0f | ||
| 
						 | 
					29b9b25e72 | ||
| 
						 | 
					e794f496c6 | ||
| 
						 | 
					68067c66d3 | ||
| 
						 | 
					ad5474e995 | 
							
								
								
									
										8
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								Makefile
									
									
									
									
									
								
							@@ -174,10 +174,10 @@ ultrix-gcc:
 | 
			
		||||
 | 
			
		||||
# Rules for making release tarballs
 | 
			
		||||
 | 
			
		||||
DIRECTORY = Mesa-7.1-rc4
 | 
			
		||||
LIB_NAME = MesaLib-7.1-rc4
 | 
			
		||||
DEMO_NAME = MesaDemos-7.1-rc4
 | 
			
		||||
GLUT_NAME = MesaGLUT-7.1-rc4
 | 
			
		||||
DIRECTORY = Mesa-7.1
 | 
			
		||||
LIB_NAME = MesaLib-7.1
 | 
			
		||||
DEMO_NAME = MesaDemos-7.1
 | 
			
		||||
GLUT_NAME = MesaGLUT-7.1
 | 
			
		||||
 | 
			
		||||
MAIN_FILES = \
 | 
			
		||||
	$(DIRECTORY)/Makefile*						\
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,7 @@ a:visited {
 | 
			
		||||
<li><a href="lists.html" target="MainFrame">Mailing Lists</a>
 | 
			
		||||
<li><a href="bugs.html" target="MainFrame">Bug Database</a>
 | 
			
		||||
<li><a href="webmaster.html" target="MainFrame">Webmaster</a>
 | 
			
		||||
<li><a href="http://dri.freedesktop.org/" target="MainFrame">Wiki</a>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<b>User Topics</b>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,8 @@
 | 
			
		||||
<H1>Downloading</H1>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Current development release: <b>7.1</b>
 | 
			
		||||
<br>
 | 
			
		||||
Last stable release: <b>7.0.4</b>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,9 +22,10 @@ for modern GPUs.
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Mesa ties into several other open-source projects: the 
 | 
			
		||||
<a href="http://dri.sf.net/" target="_parent">Direct Rendering Infrastructure</a>
 | 
			
		||||
and <a href="http://x.org" target="_parent">X.org</a> to provide OpenGL
 | 
			
		||||
support to users of X on Linux, FreeBSD and other operating systems.
 | 
			
		||||
<a href="http://dri.freedesktop.org/" target="_parent">Direct Rendering 
 | 
			
		||||
Infrastructure</a> and <a href="http://x.org" target="_parent">X.org</a> to 
 | 
			
		||||
provide OpenGL support to users of X on Linux, FreeBSD and other operating 
 | 
			
		||||
systems.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
<H1>Mailing Lists</H1>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>There are four Mesa mailing lists:
 | 
			
		||||
<p>There are four Mesa 3D / DRI mailing lists:
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<ul>
 | 
			
		||||
@@ -19,14 +19,14 @@ versions are sent to this list.
 | 
			
		||||
</li>
 | 
			
		||||
<br>
 | 
			
		||||
<li><a href="https://lists.sourceforge.net/lists/listinfo/mesa3d-users"
 | 
			
		||||
target="_parent">mesa3d-users</a> - intended for users of the Mesa library.
 | 
			
		||||
target="_parent">mesa3d-users</a> - intended for users of the Mesa and DRI.
 | 
			
		||||
Newbie questions are appropriate, but please try the general OpenGL
 | 
			
		||||
resources and Mesa documentation first.
 | 
			
		||||
resources and Mesa/DRI documentation first.
 | 
			
		||||
</li>
 | 
			
		||||
<br>
 | 
			
		||||
<li><a href="https://lists.sourceforge.net/lists/listinfo/mesa3d-dev"
 | 
			
		||||
target="_parent">mesa3d-dev</a> - for discussion of Mesa development.
 | 
			
		||||
Not for beginners.
 | 
			
		||||
target="_parent">mesa3d-dev</a> - for discussion of Mesa and Direct Rendering 
 | 
			
		||||
Infrastructure development. Not for beginners.
 | 
			
		||||
</li>
 | 
			
		||||
<br>
 | 
			
		||||
<li><a href="http://lists.freedesktop.org/mailman/listinfo/mesa-commit"
 | 
			
		||||
@@ -37,6 +37,9 @@ Note: the old mesa3d-cvs list is no longer in use.
 | 
			
		||||
</li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<p>For mailing lists about Direct Rendering Modules (drm) in Linux/BSD 
 | 
			
		||||
kernels, see <a href="http://dri.freedesktop.org/wiki/MailingLists">wiki</a>.
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
<b>Notice</b>: non-member posts to any of these lists will be automatically
 | 
			
		||||
rejected.
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,16 @@
 | 
			
		||||
<H1>News</H1>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2>August 26, 2008</h2>
 | 
			
		||||
<p>
 | 
			
		||||
<a href="relnotes-7.1.html">Mesa 7.1</a> is released.
 | 
			
		||||
This is a new development release.
 | 
			
		||||
It should be relatively stable, but those especially concerned about
 | 
			
		||||
stability should wait for the 7.2 release or use Mesa 7.0.4 (the
 | 
			
		||||
previous stable release).
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2>August 16, 2008</h2>
 | 
			
		||||
<p>
 | 
			
		||||
<a href="relnotes-7.0.4.html">Mesa 7.0.4</a> is released.
 | 
			
		||||
 
 | 
			
		||||
@@ -8,13 +8,21 @@
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#eeeeee">
 | 
			
		||||
 | 
			
		||||
<H1>Mesa 7.1 Release Notes / May XX, 2008</H1>
 | 
			
		||||
<H1>Mesa 7.1 Release Notes / August 26, 2008</H1>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Mesa 7.1 is a new development release.
 | 
			
		||||
There have been many internal code changes since Mesa 7.0.x.
 | 
			
		||||
It should be relatively stable, but those who are especially concerned about
 | 
			
		||||
stability should wait for Mesa 7.2.
 | 
			
		||||
stability should wait for Mesa 7.2 or use Mesa 7.0.4 (the previous stable
 | 
			
		||||
release).
 | 
			
		||||
</p>
 | 
			
		||||
</>
 | 
			
		||||
Note that this version of Mesa does not use the GEM memory manager.
 | 
			
		||||
The master branch of git uses GEM.
 | 
			
		||||
</p>
 | 
			
		||||
<p>
 | 
			
		||||
DRM version 2.3.1 should be used with Mesa 7.1
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -27,9 +35,11 @@ TBD
 | 
			
		||||
<h2>New features</h2>
 | 
			
		||||
<ul>
 | 
			
		||||
<li>autoconf-based configuration (and clean-up of Makefiles)
 | 
			
		||||
<li>Assorted DRI driver enhancements
 | 
			
		||||
<li>Reduced dependencies between X server and Mesa
 | 
			
		||||
<li>GL_EXT_texture_from_pixmap extension for Xlib driver
 | 
			
		||||
<li>Support for the GL shading language with i965 driver (implemented by Intel)
 | 
			
		||||
<li>ATI R500 series support (Radeon X1300–X1950) in r300 DRI driver
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -37,6 +47,7 @@ TBD
 | 
			
		||||
<ul>
 | 
			
		||||
<li>Numerous GLSL fixes
 | 
			
		||||
<li>Fixed some error code/detection bugs in the GLSL-related API functions
 | 
			
		||||
<li>Lots of DRI driver fixes.
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  6.5.1
 | 
			
		||||
 * Version:  7.1
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
 | 
			
		||||
 * Copyright (C) 1999-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"),
 | 
			
		||||
 
 | 
			
		||||
@@ -85,7 +85,7 @@ compute_version(const GLcontext *ctx)
 | 
			
		||||
                              ctx->Extensions.ARB_texture_non_power_of_two &&
 | 
			
		||||
                              ctx->Extensions.EXT_blend_equation_separate);
 | 
			
		||||
   const GLboolean ver_2_1 = (ver_2_0 &&
 | 
			
		||||
                              ctx->Extensions.ARB_shading_language_120 &&
 | 
			
		||||
                              /*ctx->Extensions.ARB_shading_language_120 &&*/
 | 
			
		||||
                              ctx->Extensions.EXT_pixel_buffer_object &&
 | 
			
		||||
                              ctx->Extensions.EXT_texture_sRGB);
 | 
			
		||||
   if (ver_2_1)
 | 
			
		||||
@@ -121,12 +121,6 @@ _mesa_GetString( GLenum name )
 | 
			
		||||
   static const char *vendor = "Brian Paul";
 | 
			
		||||
   static const char *renderer = "Mesa";
 | 
			
		||||
 | 
			
		||||
#if FEATURE_ARB_shading_language_120_foo /* support not complete! */
 | 
			
		||||
   static const char *sl_version = "1.20";
 | 
			
		||||
#elif FEATURE_ARB_shading_language_100
 | 
			
		||||
   static const char *sl_version = "1.10";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   if (!ctx)
 | 
			
		||||
      return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -154,8 +148,10 @@ _mesa_GetString( GLenum name )
 | 
			
		||||
         return (const GLubyte *) ctx->Extensions.String;
 | 
			
		||||
#if FEATURE_ARB_shading_language_100
 | 
			
		||||
      case GL_SHADING_LANGUAGE_VERSION_ARB:
 | 
			
		||||
         if (ctx->Extensions.ARB_shading_language_100)
 | 
			
		||||
            return (const GLubyte *) sl_version;
 | 
			
		||||
         if (ctx->Extensions.ARB_shading_language_120)
 | 
			
		||||
            return (const GLubyte *) "1.20";
 | 
			
		||||
         else if (ctx->Extensions.ARB_shading_language_100)
 | 
			
		||||
            return (const GLubyte *) "1.10";
 | 
			
		||||
         goto error;
 | 
			
		||||
#endif
 | 
			
		||||
#if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program || \
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * Mesa 3-D graphics library
 | 
			
		||||
 * Version:  7.1
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
 | 
			
		||||
 * Copyright (C) 1999-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"),
 | 
			
		||||
@@ -31,7 +31,7 @@
 | 
			
		||||
#define MESA_MAJOR 7
 | 
			
		||||
#define MESA_MINOR 1
 | 
			
		||||
#define MESA_PATCH 0
 | 
			
		||||
#define MESA_VERSION_STRING "7.1 rc4"
 | 
			
		||||
#define MESA_VERSION_STRING "7.1"
 | 
			
		||||
 | 
			
		||||
/* To make version comparison easy */
 | 
			
		||||
#define MESA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
 | 
			
		||||
 
 | 
			
		||||
@@ -29,9 +29,9 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "glheader.h"
 | 
			
		||||
#include "imports.h"
 | 
			
		||||
#include "macros.h"
 | 
			
		||||
#include "main/glheader.h"
 | 
			
		||||
#include "main/imports.h"
 | 
			
		||||
#include "main/macros.h"
 | 
			
		||||
#include "prog_instruction.h"
 | 
			
		||||
#include "prog_parameter.h"
 | 
			
		||||
#include "prog_statevars.h"
 | 
			
		||||
@@ -277,6 +277,26 @@ _mesa_add_uniform(struct gl_program_parameter_list *paramList,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Mark the named uniform as 'used'.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_mesa_use_uniform(struct gl_program_parameter_list *paramList,
 | 
			
		||||
                  const char *name)
 | 
			
		||||
{
 | 
			
		||||
   GLuint i;
 | 
			
		||||
   for (i = 0; i < paramList->NumParameters; i++) {
 | 
			
		||||
      struct gl_program_parameter *p = paramList->Parameters + i;
 | 
			
		||||
      if (p->Type == PROGRAM_UNIFORM && _mesa_strcmp(p->Name, name) == 0) {
 | 
			
		||||
         p->Used = GL_TRUE;
 | 
			
		||||
         /* Note that large uniforms may occupy several slots so we're
 | 
			
		||||
          * not done searching yet.
 | 
			
		||||
          */
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add a sampler to the parameter list.
 | 
			
		||||
 * \param name  uniform's name
 | 
			
		||||
@@ -591,21 +611,24 @@ _mesa_clone_parameter_list(const struct gl_program_parameter_list *list)
 | 
			
		||||
   /** Not too efficient, but correct */
 | 
			
		||||
   for (i = 0; i < list->NumParameters; i++) {
 | 
			
		||||
      struct gl_program_parameter *p = list->Parameters + i;
 | 
			
		||||
      struct gl_program_parameter *pCopy;
 | 
			
		||||
      GLuint size = MIN2(p->Size, 4);
 | 
			
		||||
      GLint j = _mesa_add_parameter(clone, p->Type, p->Name, size, p->DataType,
 | 
			
		||||
                                    list->ParameterValues[i], NULL);
 | 
			
		||||
      ASSERT(j >= 0);
 | 
			
		||||
      pCopy = clone->Parameters + j;
 | 
			
		||||
      pCopy->Used = p->Used;
 | 
			
		||||
      /* copy state indexes */
 | 
			
		||||
      if (p->Type == PROGRAM_STATE_VAR) {
 | 
			
		||||
         GLint k;
 | 
			
		||||
         struct gl_program_parameter *q = clone->Parameters + j;
 | 
			
		||||
         for (k = 0; k < STATE_LENGTH; k++) {
 | 
			
		||||
            q->StateIndexes[k] = p->StateIndexes[k];
 | 
			
		||||
            pCopy->StateIndexes[k] = p->StateIndexes[k];
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
         clone->Parameters[j].Size = p->Size;
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   clone->StateFlags = list->StateFlags;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@
 | 
			
		||||
#ifndef PROG_PARAMETER_H
 | 
			
		||||
#define PROG_PARAMETER_H
 | 
			
		||||
 | 
			
		||||
#include "mtypes.h"
 | 
			
		||||
#include "main/mtypes.h"
 | 
			
		||||
#include "prog_statevars.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -48,6 +48,7 @@ struct gl_program_parameter
 | 
			
		||||
   enum register_file Type; /**< PROGRAM_NAMED_PARAM, CONSTANT or STATE_VAR */
 | 
			
		||||
   GLenum DataType;         /**< GL_FLOAT, GL_FLOAT_VEC2, etc */
 | 
			
		||||
   GLuint Size;             /**< Number of components (1..4) */
 | 
			
		||||
   GLboolean Used;          /**< Helper flag for GLSL uniform tracking */
 | 
			
		||||
   /**
 | 
			
		||||
    * A sequence of STATE_* tokens and integers to identify GL state.
 | 
			
		||||
    */
 | 
			
		||||
@@ -112,6 +113,10 @@ extern GLint
 | 
			
		||||
_mesa_add_uniform(struct gl_program_parameter_list *paramList,
 | 
			
		||||
                  const char *name, GLuint size, GLenum datatype);
 | 
			
		||||
 | 
			
		||||
extern void
 | 
			
		||||
_mesa_use_uniform(struct gl_program_parameter_list *paramList,
 | 
			
		||||
                  const char *name);
 | 
			
		||||
 | 
			
		||||
extern GLint
 | 
			
		||||
_mesa_add_sampler(struct gl_program_parameter_list *paramList,
 | 
			
		||||
                  const char *name, GLenum datatype);
 | 
			
		||||
 
 | 
			
		||||
@@ -473,32 +473,33 @@ vec4 pow(const vec4 a, const vec4 b)
 | 
			
		||||
 | 
			
		||||
float exp(const float a)
 | 
			
		||||
{
 | 
			
		||||
   const float e = 2.71828;
 | 
			
		||||
   __asm float_power __retVal, e, a;
 | 
			
		||||
   // NOTE: log2(e) = 1.44269502
 | 
			
		||||
   float t = a * 1.44269502;
 | 
			
		||||
   __asm float_exp2 __retVal, t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
vec2 exp(const vec2 a)
 | 
			
		||||
{
 | 
			
		||||
   const float e = 2.71828;
 | 
			
		||||
   __asm float_power __retVal.x, e, a.x;
 | 
			
		||||
   __asm float_power __retVal.y, e, a.y;
 | 
			
		||||
   vec2 t = a * 1.44269502;
 | 
			
		||||
   __asm float_exp2 __retVal.x, t.x;
 | 
			
		||||
   __asm float_exp2 __retVal.y, t.y;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
vec3 exp(const vec3 a)
 | 
			
		||||
{
 | 
			
		||||
   const float e = 2.71828;
 | 
			
		||||
   __asm float_power __retVal.x, e, a.x;
 | 
			
		||||
   __asm float_power __retVal.y, e, a.y;
 | 
			
		||||
   __asm float_power __retVal.z, e, a.z;
 | 
			
		||||
   vec3 t = a * 1.44269502;
 | 
			
		||||
   __asm float_exp2 __retVal.x, t.x;
 | 
			
		||||
   __asm float_exp2 __retVal.y, t.y;
 | 
			
		||||
   __asm float_exp2 __retVal.z, t.z;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
vec4 exp(const vec4 a)
 | 
			
		||||
{
 | 
			
		||||
   const float e = 2.71828;
 | 
			
		||||
   __asm float_power __retVal.x, e, a.x;
 | 
			
		||||
   __asm float_power __retVal.y, e, a.y;
 | 
			
		||||
   __asm float_power __retVal.z, e, a.z;
 | 
			
		||||
   __asm float_power __retVal.w, e, a.w;
 | 
			
		||||
   vec4 t = a * 1.44269502;
 | 
			
		||||
   __asm float_exp2 __retVal.x, t.x;
 | 
			
		||||
   __asm float_exp2 __retVal.y, t.y;
 | 
			
		||||
   __asm float_exp2 __retVal.z, t.z;
 | 
			
		||||
   __asm float_exp2 __retVal.w, t.w;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1481,7 +1481,7 @@ _slang_simple_writemask(GLuint writemask, GLuint swizzle)
 | 
			
		||||
 * \return GL_FALSE for simple writemasks, GL_TRUE for non-simple
 | 
			
		||||
 */
 | 
			
		||||
static GLboolean
 | 
			
		||||
swizzle_to_writemask(GLuint swizzle,
 | 
			
		||||
swizzle_to_writemask(slang_assemble_ctx *A, GLuint swizzle,
 | 
			
		||||
                     GLuint *writemaskOut, GLuint *swizzleOut)
 | 
			
		||||
{
 | 
			
		||||
   GLuint mask = 0x0, newSwizzle[4];
 | 
			
		||||
@@ -1495,6 +1495,18 @@ swizzle_to_writemask(GLuint swizzle,
 | 
			
		||||
         break;
 | 
			
		||||
      }
 | 
			
		||||
      assert(swz >= 0 && swz <= 3);
 | 
			
		||||
 | 
			
		||||
      if (swizzle != SWIZZLE_XXXX &&
 | 
			
		||||
          swizzle != SWIZZLE_YYYY &&
 | 
			
		||||
          swizzle != SWIZZLE_ZZZZ &&
 | 
			
		||||
          swizzle != SWIZZLE_WWWW &&
 | 
			
		||||
          (mask & (1 << swz))) {
 | 
			
		||||
         /* a channel can't be specified twice (ex: ".xyyz") */
 | 
			
		||||
         slang_info_log_error(A->log, "Invalid writemask '%s'",
 | 
			
		||||
                              _mesa_swizzle_string(swizzle, 0, 0));
 | 
			
		||||
         return GL_FALSE;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      mask |= (1 << swz);
 | 
			
		||||
   }
 | 
			
		||||
   assert(mask <= 0xf);
 | 
			
		||||
@@ -1590,11 +1602,11 @@ resolve_swizzle(const slang_operation *oper)
 | 
			
		||||
 * As above, but produce a writemask.
 | 
			
		||||
 */
 | 
			
		||||
static GLuint
 | 
			
		||||
resolve_writemask(const slang_operation *oper)
 | 
			
		||||
resolve_writemask(slang_assemble_ctx *A, const slang_operation *oper)
 | 
			
		||||
{
 | 
			
		||||
   GLuint swizzle = resolve_swizzle(oper);
 | 
			
		||||
   GLuint writemask, swizzleOut;
 | 
			
		||||
   swizzle_to_writemask(swizzle, &writemask, &swizzleOut);
 | 
			
		||||
   swizzle_to_writemask(A, swizzle, &writemask, &swizzleOut);
 | 
			
		||||
   return writemask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1668,7 +1680,7 @@ _slang_gen_asm(slang_assemble_ctx *A, slang_operation *oper,
 | 
			
		||||
 | 
			
		||||
      dest_oper = &oper->children[0];
 | 
			
		||||
 | 
			
		||||
      writemask = resolve_writemask(dest_oper);
 | 
			
		||||
      writemask = resolve_writemask(A, dest_oper);
 | 
			
		||||
 | 
			
		||||
      n0 = _slang_gen_operation(A, dest_oper);
 | 
			
		||||
      if (!n0)
 | 
			
		||||
@@ -1980,6 +1992,12 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
 | 
			
		||||
      fun = _slang_locate_struct_constructor(A, name);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /*
 | 
			
		||||
    * At this point, some heuristics are used to try to find a function
 | 
			
		||||
    * that matches the calling signature by means of casting or "unrolling"
 | 
			
		||||
    * of constructors.
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
   if (!fun && _slang_is_vec_mat_type(name)) {
 | 
			
		||||
      /* Next, if this call looks like a vec() or mat() constructor call,
 | 
			
		||||
       * try "unwinding" the args to satisfy a constructor.
 | 
			
		||||
@@ -1995,7 +2013,7 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (!fun) {
 | 
			
		||||
   if (!fun && _slang_is_vec_mat_type(name)) {
 | 
			
		||||
      /* Next, try casting args to the types of the formal parameters */
 | 
			
		||||
      int numArgs = oper->num_children;
 | 
			
		||||
      fun = _slang_find_function_by_argc(A->space.funcs, name, numArgs);
 | 
			
		||||
@@ -2008,6 +2026,13 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
 | 
			
		||||
      assert(fun);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (!fun) {
 | 
			
		||||
      slang_info_log_error(A->log,
 | 
			
		||||
                           "Function '%s' not found (check argument types)",
 | 
			
		||||
                           name);
 | 
			
		||||
      return NULL;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   n = _slang_gen_function_call(A, fun, oper, dest);
 | 
			
		||||
 | 
			
		||||
   if (n && !n->Store && !dest
 | 
			
		||||
@@ -2716,7 +2741,11 @@ _slang_assignment_compatible(slang_assemble_ctx *A,
 | 
			
		||||
   slang_typeinfo t0, t1;
 | 
			
		||||
   GLuint sz0, sz1;
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
   if (op0->type == SLANG_OPER_POSTINCREMENT ||
 | 
			
		||||
       op0->type == SLANG_OPER_POSTDECREMENT) {
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   slang_typeinfo_construct(&t0);
 | 
			
		||||
   _slang_typeof_operation(A, op0, &t0);
 | 
			
		||||
 | 
			
		||||
@@ -3020,7 +3049,7 @@ _slang_gen_assignment(slang_assemble_ctx * A, slang_operation *oper)
 | 
			
		||||
      if (lhs && rhs) {
 | 
			
		||||
         /* convert lhs swizzle into writemask */
 | 
			
		||||
         GLuint writemask, newSwizzle;
 | 
			
		||||
         if (!swizzle_to_writemask(lhs->Store->Swizzle,
 | 
			
		||||
         if (!swizzle_to_writemask(A, lhs->Store->Swizzle,
 | 
			
		||||
                                   &writemask, &newSwizzle)) {
 | 
			
		||||
            /* Non-simple writemask, need to swizzle right hand side in
 | 
			
		||||
             * order to put components into the right place.
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,9 @@ writemask_to_swizzle(GLuint writemask)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Swizzle a swizzle.  That is, return swz2(swz1)
 | 
			
		||||
 * Swizzle a swizzle (function composition).
 | 
			
		||||
 * That is, return swz2(swz1), or said another way: swz1.szw2
 | 
			
		||||
 * Example: swizzle_swizzle(".zwxx", ".xxyw") yields ".zzwx"
 | 
			
		||||
 */
 | 
			
		||||
GLuint
 | 
			
		||||
_slang_swizzle_swizzle(GLuint swz1, GLuint swz2)
 | 
			
		||||
@@ -279,7 +281,7 @@ storage_to_src_reg(struct prog_src_register *src, const slang_ir_storage *st)
 | 
			
		||||
   while (st->Parent) {
 | 
			
		||||
      st = st->Parent;
 | 
			
		||||
      index += st->Index;
 | 
			
		||||
      swizzle = _slang_swizzle_swizzle(st->Swizzle, swizzle);
 | 
			
		||||
      swizzle = _slang_swizzle_swizzle(fix_swizzle(st->Swizzle), swizzle);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   assert(st->File >= 0);
 | 
			
		||||
@@ -1636,6 +1638,88 @@ emit_struct_field(slang_emit_info *emitInfo, slang_ir_node *n)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Emit code for a variable declaration.
 | 
			
		||||
 * This usually doesn't result in any code generation, but just
 | 
			
		||||
 * memory allocation.
 | 
			
		||||
 */
 | 
			
		||||
static struct prog_instruction *
 | 
			
		||||
emit_var_decl(slang_emit_info *emitInfo, slang_ir_node *n)
 | 
			
		||||
{
 | 
			
		||||
   struct prog_instruction *inst;
 | 
			
		||||
 | 
			
		||||
   assert(n->Store);
 | 
			
		||||
   assert(n->Store->File != PROGRAM_UNDEFINED);
 | 
			
		||||
   assert(n->Store->Size > 0);
 | 
			
		||||
   /*assert(n->Store->Index < 0);*/
 | 
			
		||||
 | 
			
		||||
   if (!n->Var || n->Var->isTemp) {
 | 
			
		||||
      /* a nameless/temporary variable, will be freed after first use */
 | 
			
		||||
      /*NEW*/
 | 
			
		||||
      if (n->Store->Index < 0 && !_slang_alloc_temp(emitInfo->vt, n->Store)) {
 | 
			
		||||
         slang_info_log_error(emitInfo->log,
 | 
			
		||||
                              "Ran out of registers, too many temporaries");
 | 
			
		||||
         return NULL;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      /* a regular variable */
 | 
			
		||||
      _slang_add_variable(emitInfo->vt, n->Var);
 | 
			
		||||
      if (!_slang_alloc_var(emitInfo->vt, n->Store)) {
 | 
			
		||||
         slang_info_log_error(emitInfo->log,
 | 
			
		||||
                              "Ran out of registers, too many variables");
 | 
			
		||||
         return NULL;
 | 
			
		||||
      }
 | 
			
		||||
      /*
 | 
			
		||||
        printf("IR_VAR_DECL %s %d store %p\n",
 | 
			
		||||
        (char*) n->Var->a_name, n->Store->Index, (void*) n->Store);
 | 
			
		||||
      */
 | 
			
		||||
      assert(n->Var->aux == n->Store);
 | 
			
		||||
   }
 | 
			
		||||
   if (emitInfo->EmitComments) {
 | 
			
		||||
      /* emit NOP with comment describing the variable's storage location */
 | 
			
		||||
      char s[1000];
 | 
			
		||||
      sprintf(s, "TEMP[%d]%s = variable %s (size %d)",
 | 
			
		||||
              n->Store->Index,
 | 
			
		||||
              _mesa_swizzle_string(n->Store->Swizzle, 0, GL_FALSE), 
 | 
			
		||||
              (n->Var ? (char *) n->Var->a_name : "anonymous"),
 | 
			
		||||
              n->Store->Size);
 | 
			
		||||
      inst = emit_comment(emitInfo, s);
 | 
			
		||||
      return inst;
 | 
			
		||||
   }
 | 
			
		||||
   return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Emit code for a reference to a variable.
 | 
			
		||||
 * Actually, no code is generated but we may do some memory alloation.
 | 
			
		||||
 * In particular, state vars (uniforms) are allocated on an as-needed basis.
 | 
			
		||||
 */
 | 
			
		||||
static struct prog_instruction *
 | 
			
		||||
emit_var_ref(slang_emit_info *emitInfo, slang_ir_node *n)
 | 
			
		||||
{
 | 
			
		||||
   assert(n->Store);
 | 
			
		||||
   assert(n->Store->File != PROGRAM_UNDEFINED);
 | 
			
		||||
 | 
			
		||||
   if (n->Store->File == PROGRAM_STATE_VAR && n->Store->Index < 0) {
 | 
			
		||||
      n->Store->Index = _slang_alloc_statevar(n, emitInfo->prog->Parameters);
 | 
			
		||||
   }
 | 
			
		||||
   else if (n->Store->File == PROGRAM_UNIFORM) {
 | 
			
		||||
      /* mark var as used */
 | 
			
		||||
      _mesa_use_uniform(emitInfo->prog->Parameters, (char *) n->Var->a_name);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   if (n->Store->Index < 0) {
 | 
			
		||||
      /* probably ran out of registers */
 | 
			
		||||
      return NULL;
 | 
			
		||||
   }
 | 
			
		||||
   assert(n->Store->Size > 0);
 | 
			
		||||
 | 
			
		||||
   return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static struct prog_instruction *
 | 
			
		||||
emit(slang_emit_info *emitInfo, slang_ir_node *n)
 | 
			
		||||
{
 | 
			
		||||
@@ -1671,64 +1755,14 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
 | 
			
		||||
 | 
			
		||||
   case IR_VAR_DECL:
 | 
			
		||||
      /* Variable declaration - allocate a register for it */
 | 
			
		||||
      assert(n->Store);
 | 
			
		||||
      assert(n->Store->File != PROGRAM_UNDEFINED);
 | 
			
		||||
      assert(n->Store->Size > 0);
 | 
			
		||||
      /*assert(n->Store->Index < 0);*/
 | 
			
		||||
      if (!n->Var || n->Var->isTemp) {
 | 
			
		||||
         /* a nameless/temporary variable, will be freed after first use */
 | 
			
		||||
         /*NEW*/
 | 
			
		||||
         if (n->Store->Index < 0 && !_slang_alloc_temp(emitInfo->vt, n->Store)) {
 | 
			
		||||
            slang_info_log_error(emitInfo->log,
 | 
			
		||||
                                 "Ran out of registers, too many temporaries");
 | 
			
		||||
            return NULL;
 | 
			
		||||
         }
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
         /* a regular variable */
 | 
			
		||||
         _slang_add_variable(emitInfo->vt, n->Var);
 | 
			
		||||
         if (!_slang_alloc_var(emitInfo->vt, n->Store)) {
 | 
			
		||||
            slang_info_log_error(emitInfo->log,
 | 
			
		||||
                                 "Ran out of registers, too many variables");
 | 
			
		||||
            return NULL;
 | 
			
		||||
         }
 | 
			
		||||
         /*
 | 
			
		||||
         printf("IR_VAR_DECL %s %d store %p\n",
 | 
			
		||||
                (char*) n->Var->a_name, n->Store->Index, (void*) n->Store);
 | 
			
		||||
         */
 | 
			
		||||
         assert(n->Var->aux == n->Store);
 | 
			
		||||
      }
 | 
			
		||||
      if (emitInfo->EmitComments) {
 | 
			
		||||
         /* emit NOP with comment describing the variable's storage location */
 | 
			
		||||
         char s[1000];
 | 
			
		||||
         sprintf(s, "TEMP[%d]%s = variable %s (size %d)",
 | 
			
		||||
                 n->Store->Index,
 | 
			
		||||
                 _mesa_swizzle_string(n->Store->Swizzle, 0, GL_FALSE), 
 | 
			
		||||
                 (n->Var ? (char *) n->Var->a_name : "anonymous"),
 | 
			
		||||
                 n->Store->Size);
 | 
			
		||||
         inst = emit_comment(emitInfo, s);
 | 
			
		||||
         return inst;
 | 
			
		||||
      }
 | 
			
		||||
      return NULL;
 | 
			
		||||
      inst = emit_var_decl(emitInfo, n);
 | 
			
		||||
      return inst;
 | 
			
		||||
 | 
			
		||||
   case IR_VAR:
 | 
			
		||||
      /* Reference to a variable
 | 
			
		||||
       * Storage should have already been resolved/allocated.
 | 
			
		||||
       */
 | 
			
		||||
      assert(n->Store);
 | 
			
		||||
      assert(n->Store->File != PROGRAM_UNDEFINED);
 | 
			
		||||
 | 
			
		||||
      if (n->Store->File == PROGRAM_STATE_VAR &&
 | 
			
		||||
          n->Store->Index < 0) {
 | 
			
		||||
         n->Store->Index = _slang_alloc_statevar(n, emitInfo->prog->Parameters);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (n->Store->Index < 0) {
 | 
			
		||||
         /* probably ran out of registers */
 | 
			
		||||
         return NULL;
 | 
			
		||||
      }
 | 
			
		||||
      assert(n->Store->Size > 0);
 | 
			
		||||
      break;
 | 
			
		||||
      return emit_var_ref(emitInfo, n);
 | 
			
		||||
 | 
			
		||||
   case IR_ELEMENT:
 | 
			
		||||
      return emit_array_element(emitInfo, n);
 | 
			
		||||
@@ -1939,6 +1973,7 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
 | 
			
		||||
   GET_CURRENT_CONTEXT(ctx);
 | 
			
		||||
   GLboolean success;
 | 
			
		||||
   slang_emit_info emitInfo;
 | 
			
		||||
   GLuint maxUniforms;
 | 
			
		||||
 | 
			
		||||
   emitInfo.log = log;
 | 
			
		||||
   emitInfo.vt = vt;
 | 
			
		||||
@@ -1955,6 +1990,19 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
 | 
			
		||||
      emitInfo.EmitHighLevelInstructions = GL_TRUE;
 | 
			
		||||
   }      
 | 
			
		||||
 | 
			
		||||
   /* Check uniform/constant limits */
 | 
			
		||||
   if (prog->Target == GL_FRAGMENT_PROGRAM_ARB) {
 | 
			
		||||
      maxUniforms = ctx->Const.FragmentProgram.MaxUniformComponents / 4;
 | 
			
		||||
   }
 | 
			
		||||
   else {
 | 
			
		||||
      assert(prog->Target == GL_VERTEX_PROGRAM_ARB);
 | 
			
		||||
      maxUniforms = ctx->Const.VertexProgram.MaxUniformComponents / 4;
 | 
			
		||||
   }
 | 
			
		||||
   if (prog->Parameters->NumParameters > maxUniforms) {
 | 
			
		||||
      slang_info_log_error(log, "Constant/uniform register limit exceeded");
 | 
			
		||||
      return GL_FALSE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   (void) emit(&emitInfo, n);
 | 
			
		||||
 | 
			
		||||
   /* finish up by adding the END opcode to program */
 | 
			
		||||
 
 | 
			
		||||
@@ -173,7 +173,7 @@ link_uniform_vars(struct gl_shader_program *shProg,
 | 
			
		||||
       * Furthermore, we'll need to fix the state-var's size/datatype info.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      if (p->Type == PROGRAM_UNIFORM ||
 | 
			
		||||
      if ((p->Type == PROGRAM_UNIFORM && p->Used) ||
 | 
			
		||||
          p->Type == PROGRAM_SAMPLER) {
 | 
			
		||||
         _mesa_append_uniform(shProg->Uniforms, p->Name, prog->Target, i);
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user