updated mesa to 7.0.3

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25189 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2008-04-26 16:33:15 +00:00
parent 2f5d215b2e
commit e8bc20e263
64 changed files with 1116 additions and 575 deletions
+15 -4
View File
@@ -46,9 +46,9 @@ extern "C" {
/*************************************************************/ /*************************************************************/
/* Header file version number, required by OpenGL ABI for Linux */ /* Header file version number, required by OpenGL ABI for Linux */
/* glext.h last updated 2007/02/12 */ /* glext.h last updated 2008/03/24 */
/* Current version at http://www.opengl.org/registry/ */ /* Current version at http://www.opengl.org/registry/ */
#define GL_GLEXT_VERSION 39 #define GL_GLEXT_VERSION 40
#ifndef GL_VERSION_1_2 #ifndef GL_VERSION_1_2
#define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_BYTE_3_3_2 0x8032
@@ -3091,8 +3091,8 @@ extern "C" {
#ifndef GL_EXT_framebuffer_blit #ifndef GL_EXT_framebuffer_blit
#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 #define GL_READ_FRAMEBUFFER_EXT 0x8CA8
#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
#define GL_READ_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT #define GL_DRAW_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT
#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CAA #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
#endif #endif
#ifndef GL_EXT_framebuffer_multisample #ifndef GL_EXT_framebuffer_multisample
@@ -3379,6 +3379,9 @@ extern "C" {
#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E #define GL_RGBA_INTEGER_MODE_EXT 0x8D9E
#endif #endif
#ifndef GL_GREMEDY_frame_terminator
#endif
/*************************************************************/ /*************************************************************/
@@ -7252,6 +7255,14 @@ typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint
typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);
#endif #endif
#ifndef GL_GREMEDY_frame_terminator
#define GL_GREMEDY_frame_terminator 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glFrameTerminatorGREMEDY (void);
#endif /* GL_GLEXT_PROTOTYPES */
typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void);
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
@@ -112,6 +112,8 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
driver->DeleteTexture = _mesa_delete_texture_object; driver->DeleteTexture = _mesa_delete_texture_object;
driver->NewTextureImage = _mesa_new_texture_image; driver->NewTextureImage = _mesa_new_texture_image;
driver->FreeTexImageData = _mesa_free_texture_image_data; driver->FreeTexImageData = _mesa_free_texture_image_data;
driver->MapTexture = NULL;
driver->UnmapTexture = NULL;
driver->TextureMemCpy = _mesa_memcpy; driver->TextureMemCpy = _mesa_memcpy;
driver->IsTextureResident = NULL; driver->IsTextureResident = NULL;
driver->PrioritizeTexture = NULL; driver->PrioritizeTexture = NULL;
+16
View File
@@ -271,6 +271,14 @@ draw_buffer_enum_to_bitmask(GLenum buffer)
return BUFFER_BIT_COLOR2; return BUFFER_BIT_COLOR2;
case GL_COLOR_ATTACHMENT3_EXT: case GL_COLOR_ATTACHMENT3_EXT:
return BUFFER_BIT_COLOR3; return BUFFER_BIT_COLOR3;
case GL_COLOR_ATTACHMENT4_EXT:
return BUFFER_BIT_COLOR4;
case GL_COLOR_ATTACHMENT5_EXT:
return BUFFER_BIT_COLOR5;
case GL_COLOR_ATTACHMENT6_EXT:
return BUFFER_BIT_COLOR6;
case GL_COLOR_ATTACHMENT7_EXT:
return BUFFER_BIT_COLOR7;
default: default:
/* error */ /* error */
return BAD_MASK; return BAD_MASK;
@@ -320,6 +328,14 @@ read_buffer_enum_to_index(GLenum buffer)
return BUFFER_COLOR2; return BUFFER_COLOR2;
case GL_COLOR_ATTACHMENT3_EXT: case GL_COLOR_ATTACHMENT3_EXT:
return BUFFER_COLOR3; return BUFFER_COLOR3;
case GL_COLOR_ATTACHMENT4_EXT:
return BUFFER_COLOR4;
case GL_COLOR_ATTACHMENT5_EXT:
return BUFFER_COLOR5;
case GL_COLOR_ATTACHMENT6_EXT:
return BUFFER_COLOR6;
case GL_COLOR_ATTACHMENT7_EXT:
return BUFFER_COLOR7;
default: default:
/* error */ /* error */
return -1; return -1;
+1 -1
View File
@@ -209,7 +209,7 @@
/** For GL_ARB_vertex_shader */ /** For GL_ARB_vertex_shader */
/*@{*/ /*@{*/
#define MAX_VERTEX_ATTRIBS 16 #define MAX_VERTEX_ATTRIBS 16
#define MAX_VERTEX_TEXTURE_IMAGE_UNITS 0 #define MAX_VERTEX_TEXTURE_IMAGE_UNITS MAX_TEXTURE_UNITS
#define MAX_COMBINED_TEXTURE_IMAGE_UNITS (MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS) #define MAX_COMBINED_TEXTURE_IMAGE_UNITS (MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS)
/*@}*/ /*@}*/
+9 -5
View File
@@ -640,7 +640,12 @@ delete_framebuffer_cb(GLuint id, void *data, void *userData)
*/ */
/*assert(fb->RefCount == 1);*/ /*assert(fb->RefCount == 1);*/
fb->RefCount = 0; fb->RefCount = 0;
fb->Delete(fb);
/* NOTE: Delete should always be defined but there are two reports
* of it being NULL (bugs 13507, 14293). Work-around for now.
*/
if (fb->Delete)
fb->Delete(fb);
} }
/** /**
@@ -682,10 +687,10 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
_mesa_DeleteHashTable(ss->Programs); _mesa_DeleteHashTable(ss->Programs);
#endif #endif
#if FEATURE_ARB_vertex_program #if FEATURE_ARB_vertex_program
_mesa_delete_program(ctx, ss->DefaultVertexProgram); ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram);
#endif #endif
#if FEATURE_ARB_fragment_program #if FEATURE_ARB_fragment_program
_mesa_delete_program(ctx, ss->DefaultFragmentProgram); ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram);
#endif #endif
#if FEATURE_ATI_fragment_shader #if FEATURE_ATI_fragment_shader
@@ -749,7 +754,7 @@ _mesa_init_current(GLcontext *ctx)
} }
/* redo special cases: */ /* redo special cases: */
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 1.0 ); ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_WEIGHT], 1.0, 0.0, 0.0, 0.0 );
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 ); ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], 0.0, 0.0, 1.0, 1.0 );
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 ); ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], 1.0, 1.0, 1.0, 1.0 );
ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 ); ASSIGN_4V( ctx->Current.Attrib[VERT_ATTRIB_COLOR1], 0.0, 0.0, 0.0, 1.0 );
@@ -977,7 +982,6 @@ init_attrib_groups(GLcontext *ctx)
/* Miscellaneous */ /* Miscellaneous */
ctx->NewState = _NEW_ALL; ctx->NewState = _NEW_ALL;
ctx->ErrorValue = (GLenum) GL_NO_ERROR; ctx->ErrorValue = (GLenum) GL_NO_ERROR;
ctx->_Facing = 0;
return GL_TRUE; return GL_TRUE;
} }
+4 -4
View File
@@ -272,10 +272,10 @@ do { \
(((CTX)->Light.Enabled && \ (((CTX)->Light.Enabled && \
(CTX)->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) \ (CTX)->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) \
|| (CTX)->Fog.ColorSumEnabled \ || (CTX)->Fog.ColorSumEnabled \
|| ((CTX)->VertexProgram._Enabled && \ || ((CTX)->VertexProgram._Current && \
((CTX)->VertexProgram.Current->Base.InputsRead & VERT_BIT_COLOR1)) \ ((CTX)->VertexProgram._Current->Base.InputsRead & VERT_BIT_COLOR1)) \
|| ((CTX)->FragmentProgram._Enabled && \ || ((CTX)->FragmentProgram._Current && \
((CTX)->FragmentProgram.Current->Base.InputsRead & FRAG_BIT_COL1)) \ ((CTX)->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_COL1)) \
) )
+5
View File
@@ -493,6 +493,11 @@ struct dd_function_table {
*/ */
void (*FreeTexImageData)( GLcontext *ctx, struct gl_texture_image *tImage ); void (*FreeTexImageData)( GLcontext *ctx, struct gl_texture_image *tImage );
/** Map texture image data into user space */
void (*MapTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
/** Unmap texture images from user space */
void (*UnmapTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
/** /**
* Note: no context argument. This function doesn't initially look * Note: no context argument. This function doesn't initially look
* like it belongs here, except that the driver is the only entity * like it belongs here, except that the driver is the only entity
+6 -8
View File
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5 * Version: 7.0.3
* *
* 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -341,12 +341,10 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
} }
if (ctx->RenderMode == GL_RENDER) { if (ctx->RenderMode == GL_RENDER) {
if (bitmap) { /* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */
/* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */ GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig);
GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig); GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig);
GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig); ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );
ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );
}
} }
#if _HAVE_FULL_GL #if _HAVE_FULL_GL
else if (ctx->RenderMode == GL_FEEDBACK) { else if (ctx->RenderMode == GL_FEEDBACK) {
+4 -4
View File
@@ -5,9 +5,9 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.1 * 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -364,12 +364,12 @@ _mesa_set_enable(GLcontext *ctx, GLenum cap, GLboolean state)
case GL_LIGHTING: case GL_LIGHTING:
if (ctx->Light.Enabled == state) if (ctx->Light.Enabled == state)
return; return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Enabled = state;
if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE; ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
else else
ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE; ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Enabled = state;
break; break;
case GL_LINE_SMOOTH: case GL_LINE_SMOOTH:
if (ctx->Line.SmoothFlag == state) if (ctx->Line.SmoothFlag == state)
+1 -1
View File
@@ -302,7 +302,7 @@ test_attachment_completeness(const GLcontext *ctx, GLenum format,
/* OK */ /* OK */
} }
else if (ctx->Extensions.EXT_packed_depth_stencil && else if (ctx->Extensions.EXT_packed_depth_stencil &&
att->Renderbuffer->_BaseFormat == GL_DEPTH_STENCIL_EXT) { texImage->TexFormat->BaseFormat == GL_DEPTH_STENCIL_EXT) {
/* OK */ /* OK */
} }
else { else {
+12
View File
@@ -1864,6 +1864,10 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
CHECK_EXT1(EXT_framebuffer_object, "GetBooleanv"); CHECK_EXT1(EXT_framebuffer_object, "GetBooleanv");
params[0] = INT_TO_BOOLEAN(ctx->Const.MaxRenderbufferSize); params[0] = INT_TO_BOOLEAN(ctx->Const.MaxRenderbufferSize);
break; break;
case GL_READ_FRAMEBUFFER_BINDING_EXT:
CHECK_EXT1(EXT_framebuffer_blit, "GetBooleanv");
params[0] = INT_TO_BOOLEAN(ctx->ReadBuffer->Name);
break;
case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB: case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB:
CHECK_EXT1(ARB_fragment_shader, "GetBooleanv"); CHECK_EXT1(ARB_fragment_shader, "GetBooleanv");
params[0] = INT_TO_BOOLEAN(ctx->Const.FragmentProgram.MaxUniformComponents); params[0] = INT_TO_BOOLEAN(ctx->Const.FragmentProgram.MaxUniformComponents);
@@ -3695,6 +3699,10 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
CHECK_EXT1(EXT_framebuffer_object, "GetFloatv"); CHECK_EXT1(EXT_framebuffer_object, "GetFloatv");
params[0] = (GLfloat)(ctx->Const.MaxRenderbufferSize); params[0] = (GLfloat)(ctx->Const.MaxRenderbufferSize);
break; break;
case GL_READ_FRAMEBUFFER_BINDING_EXT:
CHECK_EXT1(EXT_framebuffer_blit, "GetFloatv");
params[0] = (GLfloat)(ctx->ReadBuffer->Name);
break;
case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB: case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB:
CHECK_EXT1(ARB_fragment_shader, "GetFloatv"); CHECK_EXT1(ARB_fragment_shader, "GetFloatv");
params[0] = (GLfloat)(ctx->Const.FragmentProgram.MaxUniformComponents); params[0] = (GLfloat)(ctx->Const.FragmentProgram.MaxUniformComponents);
@@ -5526,6 +5534,10 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
CHECK_EXT1(EXT_framebuffer_object, "GetIntegerv"); CHECK_EXT1(EXT_framebuffer_object, "GetIntegerv");
params[0] = ctx->Const.MaxRenderbufferSize; params[0] = ctx->Const.MaxRenderbufferSize;
break; break;
case GL_READ_FRAMEBUFFER_BINDING_EXT:
CHECK_EXT1(EXT_framebuffer_blit, "GetIntegerv");
params[0] = ctx->ReadBuffer->Name;
break;
case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB: case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB:
CHECK_EXT1(ARB_fragment_shader, "GetIntegerv"); CHECK_EXT1(ARB_fragment_shader, "GetIntegerv");
params[0] = ctx->Const.FragmentProgram.MaxUniformComponents; params[0] = ctx->Const.FragmentProgram.MaxUniformComponents;
+1 -1
View File
@@ -237,7 +237,7 @@
#endif #endif
#if (!defined(__GNUC__) || __GNUC__ < 3) && !defined(__IBMC__) #if (!defined(__GNUC__) || __GNUC__ < 3) && (!defined(__IBMC__) || __IBMC__ < 900)
# define __builtin_expect(x, y) x # define __builtin_expect(x, y) x
#endif #endif
+3 -3
View File
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * 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-2008 Brian Paul All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -159,7 +159,7 @@ typedef union { GLfloat f; GLint i; } fi_type;
***/ ***/
#if defined(__i386__) || defined(__386__) || defined(__sparc__) || \ #if defined(__i386__) || defined(__386__) || defined(__sparc__) || \
defined(__s390x__) || defined(__powerpc__) || \ defined(__s390x__) || defined(__powerpc__) || \
defined(__amd64__) || \ defined(__amd64__) || defined(__x86_64__) || \
defined(ia64) || defined(__ia64__) || \ defined(ia64) || defined(__ia64__) || \
defined(__hppa__) || defined(hpux) || \ defined(__hppa__) || defined(hpux) || \
defined(__mips) || defined(_MIPS_ARCH) || \ defined(__mips) || defined(_MIPS_ARCH) || \
+2 -8
View File
@@ -7,7 +7,7 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -1063,7 +1063,7 @@ struct gl_point_attrib
{ {
GLboolean SmoothFlag; /**< True if GL_POINT_SMOOTH is enabled */ GLboolean SmoothFlag; /**< True if GL_POINT_SMOOTH is enabled */
GLfloat Size; /**< User-specified point size */ GLfloat Size; /**< User-specified point size */
GLfloat _Size; /**< Size clamped to Const.Min/MaxPointSize */ GLfloat _Size; /**< Size clamped to user limits */
GLfloat Params[3]; /**< GL_EXT_point_parameters */ GLfloat Params[3]; /**< GL_EXT_point_parameters */
GLfloat MinSize, MaxSize; /**< GL_EXT_point_parameters */ GLfloat MinSize, MaxSize; /**< GL_EXT_point_parameters */
GLfloat Threshold; /**< GL_EXT_point_parameters */ GLfloat Threshold; /**< GL_EXT_point_parameters */
@@ -3032,12 +3032,6 @@ struct __GLcontextRec
struct gl_list_extensions ListExt; /**< driver dlist extensions */ struct gl_list_extensions ListExt; /**< driver dlist extensions */
GLuint _Facing; /**< This is a hack for 2-sided stencil test.
*
* We don't have a better way to communicate this value from
* swrast_setup to swrast. */
/** \name For debugging/development only */ /** \name For debugging/development only */
/*@{*/ /*@{*/
GLboolean FirstTimeCurrent; GLboolean FirstTimeCurrent;
+10 -1
View File
@@ -5,7 +5,7 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 7.0.1 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -57,6 +57,7 @@ _mesa_PointSize( GLfloat size )
FLUSH_VERTICES(ctx, _NEW_POINT); FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.Size = size; ctx->Point.Size = size;
/* _Size is only used for non-attenuated path */
ctx->Point._Size = CLAMP(ctx->Point.Size, ctx->Point._Size = CLAMP(ctx->Point.Size,
ctx->Point.MinSize, ctx->Point.MinSize,
ctx->Point.MaxSize); ctx->Point.MaxSize);
@@ -150,6 +151,10 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
return; return;
FLUSH_VERTICES(ctx, _NEW_POINT); FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.MinSize = params[0]; ctx->Point.MinSize = params[0];
/* re-clamp _Size */
ctx->Point._Size = CLAMP(ctx->Point.Size,
ctx->Point.MinSize,
ctx->Point.MaxSize);
} }
else { else {
_mesa_error(ctx, GL_INVALID_ENUM, _mesa_error(ctx, GL_INVALID_ENUM,
@@ -168,6 +173,10 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
return; return;
FLUSH_VERTICES(ctx, _NEW_POINT); FLUSH_VERTICES(ctx, _NEW_POINT);
ctx->Point.MaxSize = params[0]; ctx->Point.MaxSize = params[0];
/* re-clamp _Size */
ctx->Point._Size = CLAMP(ctx->Point.Size,
ctx->Point.MinSize,
ctx->Point.MaxSize);
} }
else { else {
_mesa_error(ctx, GL_INVALID_ENUM, _mesa_error(ctx, GL_INVALID_ENUM,
+1 -1
View File
@@ -960,7 +960,7 @@ update_program(GLcontext *ctx)
ctx->FragmentProgram._Enabled = ctx->FragmentProgram.Enabled ctx->FragmentProgram._Enabled = ctx->FragmentProgram.Enabled
&& ctx->FragmentProgram.Current->Base.Instructions; && ctx->FragmentProgram.Current->Base.Instructions;
ctx->ATIFragmentShader._Enabled = ctx->ATIFragmentShader.Enabled ctx->ATIFragmentShader._Enabled = ctx->ATIFragmentShader.Enabled
&& ctx->ATIFragmentShader.Current->Instructions; && ctx->ATIFragmentShader.Current->Instructions[0];
/* /*
* Set the ctx->VertexProgram._Current and ctx->FragmentProgram._Current * Set the ctx->VertexProgram._Current and ctx->FragmentProgram._Current
+2 -2
View File
@@ -199,8 +199,8 @@ static void make_state_key( GLcontext *ctx, struct state_key *key )
for (i=0;i<MAX_TEXTURE_UNITS;i++) { for (i=0;i<MAX_TEXTURE_UNITS;i++) {
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i]; const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
if (!texUnit->_ReallyEnabled) if (!texUnit->_ReallyEnabled || !texUnit->Enabled)
continue; continue;
key->unit[i].enabled = 1; key->unit[i].enabled = 1;
+4 -7
View File
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 7.0.1 * Version: 7.0.3
* *
* 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -2177,9 +2177,6 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
return; return;
} }
if (!pixels)
return;
_mesa_lock_texture(ctx, texObj); _mesa_lock_texture(ctx, texObj);
{ {
texImage = _mesa_select_tex_image(ctx, texObj, target, level); texImage = _mesa_select_tex_image(ctx, texObj, target, level);
@@ -2554,8 +2551,8 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
} }
else { else {
/* no error, set the tex image parameters */ /* no error, set the tex image parameters */
_mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, _mesa_init_teximage_fields(ctx, target, texImage, width, height,
border, internalFormat); depth, border, internalFormat);
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx, texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
internalFormat, format, type); internalFormat, format, type);
} }
+3 -1
View File
@@ -854,7 +854,8 @@ _mesa_BindTexture( GLenum target, GLuint texName )
newTexObj = ctx->Shared->DefaultRect; newTexObj = ctx->Shared->DefaultRect;
break; break;
default: default:
; /* Bad targets are caught above */ _mesa_error(ctx, GL_INVALID_ENUM, "glBindTexture(target)");
return;
} }
} }
else { else {
@@ -926,6 +927,7 @@ _mesa_BindTexture( GLenum target, GLuint texName )
_mesa_reference_texobj(&texUnit->CurrentRect, newTexObj); _mesa_reference_texobj(&texUnit->CurrentRect, newTexObj);
break; break;
default: default:
/* Bad target should be caught above */
_mesa_problem(ctx, "bad target in BindTexture"); _mesa_problem(ctx, "bad target in BindTexture");
return; return;
} }
+1
View File
@@ -809,6 +809,7 @@ _mesa_swizzle_ubyte_image(GLcontext *ctx,
/* _mesa_printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]); */ /* _mesa_printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]); */
if (srcRowStride == dstRowStride && if (srcRowStride == dstRowStride &&
srcComponents == dstComponents &&
srcRowStride == srcWidth * srcComponents && srcRowStride == srcWidth * srcComponents &&
dimensions < 3) { dimensions < 3) {
/* 1 and 2D images only */ /* 1 and 2D images only */
+2 -1
View File
@@ -443,7 +443,7 @@ void GLAPIENTRY
_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
GLsizei stride, const GLvoid *ptr) GLsizei stride, const GLvoid *ptr)
{ {
const GLboolean normalized = GL_FALSE; GLboolean normalized = GL_FALSE;
GLsizei elementSize; GLsizei elementSize;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx);
@@ -471,6 +471,7 @@ _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
/* check for valid 'type' and compute StrideB right away */ /* check for valid 'type' and compute StrideB right away */
switch (type) { switch (type) {
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
normalized = GL_TRUE;
elementSize = size * sizeof(GLubyte); elementSize = size * sizeof(GLubyte);
break; break;
case GL_SHORT: case GL_SHORT:
+4 -4
View File
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 7.0.2 * Version: 7.0.3
* *
* 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -30,8 +30,8 @@
/* Mesa version */ /* Mesa version */
#define MESA_MAJOR 7 #define MESA_MAJOR 7
#define MESA_MINOR 0 #define MESA_MINOR 0
#define MESA_PATCH 2 #define MESA_PATCH 3
#define MESA_VERSION_STRING "7.0.2" #define MESA_VERSION_STRING "7.0.3"
/* To make version comparison easy */ /* To make version comparison easy */
#define MESA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) #define MESA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+7 -4
View File
@@ -1609,8 +1609,6 @@ parse_attrib_binding(GLcontext * ctx, const GLubyte ** inst,
program_error(ctx, Program->Position, "Bad attribute binding"); program_error(ctx, Program->Position, "Bad attribute binding");
} }
Program->Base.InputsRead |= (1 << *inputReg);
return err; return err;
} }
@@ -1759,7 +1757,7 @@ parse_param_elements (GLcontext * ctx, const GLubyte ** inst,
{ {
GLint idx; GLint idx;
GLuint err = 0; GLuint err = 0;
gl_state_index state_tokens[STATE_LENGTH]; gl_state_index state_tokens[STATE_LENGTH] = {0, 0, 0, 0, 0};
GLfloat const_values[4]; GLfloat const_values[4];
switch (*(*inst)++) { switch (*(*inst)++) {
@@ -2565,6 +2563,11 @@ parse_src_reg (GLcontext * ctx, const GLubyte ** inst,
return 1; return 1;
} }
/* Add attributes to InputsRead only if they are used the program.
* This avoids the handling of unused ATTRIB declarations in the drivers. */
if (*File == PROGRAM_INPUT)
Program->Base.InputsRead |= (1 << *Index);
return 0; return 0;
} }
@@ -3916,7 +3919,7 @@ _mesa_parse_arb_vertex_program(GLcontext *ctx, GLenum target,
ASSERT(target == GL_VERTEX_PROGRAM_ARB); ASSERT(target == GL_VERTEX_PROGRAM_ARB);
if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, &ap)) { if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, &ap)) {
/* Error in the program. Just return. */ _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramString(bad program)");
return; return;
} }
+2 -2
View File
@@ -229,7 +229,7 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
struct gl_vertex_program *prog = ctx->VertexProgram.Current; struct gl_vertex_program *prog = ctx->VertexProgram.Current;
_mesa_parse_arb_vertex_program(ctx, target, string, len, prog); _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 ); ctx->Driver.ProgramStringNotify( ctx, target, &prog->Base );
} }
else if (target == GL_FRAGMENT_PROGRAM_ARB 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; struct gl_fragment_program *prog = ctx->FragmentProgram.Current;
_mesa_parse_arb_fragment_program(ctx, target, string, len, prog); _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 ); ctx->Driver.ProgramStringNotify( ctx, target, &prog->Base );
} }
else { else {
+5 -3
View File
@@ -905,6 +905,8 @@
"stateTexEnvProperty\n" "stateTexEnvProperty\n"
" \"color\" .emit TEX_ENV_COLOR;\n" " \"color\" .emit TEX_ENV_COLOR;\n"
"optLegacyTexUnitNum\n" "optLegacyTexUnitNum\n"
" optLegacyTexUnitNum_1 .or .true .emit 0x00;\n"
"optLegacyTexUnitNum_1\n"
" lbracket_ne .and legacyTexUnitNum .and rbracket;\n" " lbracket_ne .and legacyTexUnitNum .and rbracket;\n"
"legacyTexUnitNum\n" "legacyTexUnitNum\n"
" integer;\n" " integer;\n"
@@ -1221,11 +1223,11 @@
"white_char\n" "white_char\n"
" ' ' .or '\\t' .or '\\n' .or '\\r';\n" " ' ' .or '\\t' .or '\\n' .or '\\r';\n"
"comment_block\n" "comment_block\n"
" '#' .and .loop comment_char .and new_line;\n" " '#' .and .loop comment_char .and optional_new_line;\n"
"comment_char\n" "comment_char\n"
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n" " '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
"new_line\n" "optional_new_line\n"
" '\\n' .or crlf .or '\\0';\n" " '\\n' .or crlf .or .true;\n"
"crlf\n" "crlf\n"
" '\\r' .and '\\n';\n" " '\\r' .and '\\n';\n"
"semicolon\n" "semicolon\n"
+65 -63
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -46,9 +46,6 @@
#include "slang_library_noise.h" #include "slang_library_noise.h"
/* See comments below for info about this */
#define LAMBDA_ZERO 1
/* debug predicate */ /* debug predicate */
#define DEBUG_PROG 0 #define DEBUG_PROG 0
@@ -302,6 +299,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])
{
/* 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,
inst->TexSrcUnit, color);
}
else {
machine->FetchTexelLod(ctx, texcoord, lodBias,
inst->TexSrcUnit, color);
}
}
/** /**
* Test value against zero and return GT, LT, EQ or UN if NaN. * Test value against zero and return GT, LT, EQ or UN if NaN.
*/ */
@@ -1306,33 +1333,18 @@ _mesa_execute_program(GLcontext * ctx,
} }
break; break;
case OPCODE_TEX: /* Both ARB and NV frag prog */ case OPCODE_TEX: /* Both ARB and NV frag prog */
/* Texel lookup */ /* Simple texel lookup */
{ {
/* Note: only use the precomputed lambda value when we're GLfloat texcoord[4], color[4];
* sampling texture unit [K] with texcoord[K]. fetch_vector4(&inst->SrcReg[0], machine, texcoord);
* Otherwise, the lambda value may have no relation to the
* instruction's texcoord or texture image. Using the wrong fetch_texel(ctx, machine, inst, texcoord, 0.0, color);
* lambda is usually bad news.
* The rest of the time, just use zero (until we get a more
* sophisticated way of computing lambda).
*/
GLfloat coord[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;
fetch_vector4(&inst->SrcReg[0], machine, coord);
machine->FetchTexelLod(ctx, coord, lambda, inst->TexSrcUnit,
color);
if (DEBUG_PROG) { if (DEBUG_PROG) {
printf("TEX (%g, %g, %g, %g) = texture[%d][%g, %g, %g, %g], " printf("TEX (%g, %g, %g, %g) = texture[%d][%g, %g, %g, %g]\n",
"lod %f\n",
color[0], color[1], color[2], color[3], color[0], color[1], color[2], color[3],
inst->TexSrcUnit, inst->TexSrcUnit,
coord[0], coord[1], coord[2], coord[3], lambda); texcoord[0], texcoord[1], texcoord[2], texcoord[3]);
} }
store_vector4(inst, machine, color); store_vector4(inst, machine, color);
} }
@@ -1342,21 +1354,18 @@ _mesa_execute_program(GLcontext * ctx,
{ {
const struct gl_texture_unit *texUnit const struct gl_texture_unit *texUnit
= &ctx->Texture.Unit[inst->TexSrcUnit]; = &ctx->Texture.Unit[inst->TexSrcUnit];
GLfloat coord[4], color[4], lambda, bias; GLfloat texcoord[4], color[4], lodBias;
#if 0
if (inst->SrcReg[0].File == PROGRAM_INPUT && fetch_vector4(&inst->SrcReg[0], machine, texcoord);
inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit)
lambda = span->array->lambda[inst->TexSrcUnit][column]; /* texcoord[3] is the bias to add to lambda */
else lodBias = texUnit->LodBias + texcoord[3];
#endif if (texUnit->_Current) {
lambda = 0.0; lodBias += texUnit->_Current->LodBias;
fetch_vector4(&inst->SrcReg[0], machine, coord); }
/* coord[3] is the bias to add to lambda */
bias = texUnit->LodBias + coord[3]; fetch_texel(ctx, machine, inst, texcoord, lodBias, color);
if (texUnit->_Current)
bias += texUnit->_Current->LodBias;
machine->FetchTexelLod(ctx, coord, lambda + bias,
inst->TexSrcUnit, color);
store_vector4(inst, machine, color); store_vector4(inst, machine, color);
} }
break; break;
@@ -1368,6 +1377,7 @@ _mesa_execute_program(GLcontext * ctx,
fetch_vector4(&inst->SrcReg[1], machine, dtdx); fetch_vector4(&inst->SrcReg[1], machine, dtdx);
fetch_vector4(&inst->SrcReg[2], machine, dtdy); fetch_vector4(&inst->SrcReg[2], machine, dtdy);
machine->FetchTexelDeriv(ctx, texcoord, dtdx, dtdy, machine->FetchTexelDeriv(ctx, texcoord, dtdx, dtdy,
0.0, /* lodBias */
inst->TexSrcUnit, color); inst->TexSrcUnit, color);
store_vector4(inst, machine, color); store_vector4(inst, machine, color);
} }
@@ -1375,14 +1385,8 @@ _mesa_execute_program(GLcontext * ctx,
case OPCODE_TXP: /* GL_ARB_fragment_program only */ case OPCODE_TXP: /* GL_ARB_fragment_program only */
/* Texture lookup w/ projective divide */ /* Texture lookup w/ projective divide */
{ {
GLfloat texcoord[4], color[4], lambda; GLfloat texcoord[4], color[4];
#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, texcoord); fetch_vector4(&inst->SrcReg[0], machine, texcoord);
/* Not so sure about this test - if texcoord[3] is /* Not so sure about this test - if texcoord[3] is
* zero, we'd probably be fine except for an ASSERT in * zero, we'd probably be fine except for an ASSERT in
@@ -1393,22 +1397,19 @@ _mesa_execute_program(GLcontext * ctx,
texcoord[1] /= texcoord[3]; texcoord[1] /= texcoord[3];
texcoord[2] /= 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); store_vector4(inst, machine, color);
} }
break; break;
case OPCODE_TXP_NV: /* GL_NV_fragment_program only */ 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; GLfloat texcoord[4], color[4];
#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, texcoord); fetch_vector4(&inst->SrcReg[0], machine, texcoord);
if (inst->TexSrcTarget != TEXTURE_CUBE_INDEX && if (inst->TexSrcTarget != TEXTURE_CUBE_INDEX &&
texcoord[3] != 0.0) { texcoord[3] != 0.0) {
@@ -1416,8 +1417,9 @@ _mesa_execute_program(GLcontext * ctx,
texcoord[1] /= texcoord[3]; texcoord[1] /= texcoord[3];
texcoord[2] /= 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); store_vector4(inst, machine, color);
} }
break; break;
+2 -1
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * 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], typedef void (*FetchTexelDerivFunc)(GLcontext *ctx, const GLfloat texcoord[4],
const GLfloat texdx[4], const GLfloat texdx[4],
const GLfloat texdy[4], const GLfloat texdy[4],
GLfloat lodBias,
GLuint unit, GLfloat color[4]); GLuint unit, GLfloat color[4]);
+1 -1
View File
@@ -384,7 +384,7 @@ sizeof_state_reference(const GLint *stateTokens)
* PARAM ambient = state.material.front.ambient; * PARAM ambient = state.material.front.ambient;
* *
* \param paramList the parameter list * \param paramList the parameter list
* \param state an array of 6 (STATE_LENGTH) state tokens * \param stateTokens an array of 5 (STATE_LENGTH) state tokens
* \return index of the new parameter. * \return index of the new parameter.
*/ */
GLint GLint
+95 -4
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 7.0 * Version: 7.1
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * 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]; ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i];
} }
/* [3] = material alpha */ /* [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; return;
case STATE_DIFFUSE: case STATE_DIFFUSE:
for (i = 0; i < 3; i++) { 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]; ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i];
} }
/* [3] = material alpha */ /* [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; return;
default: default:
_mesa_problem(ctx, "Invalid lightprod state in fetch_state"); _mesa_problem(ctx, "Invalid lightprod state in fetch_state");
@@ -349,7 +349,7 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
value[0] = ctx->Viewport.Near; /* near */ value[0] = ctx->Viewport.Near; /* near */
value[1] = ctx->Viewport.Far; /* far */ value[1] = ctx->Viewport.Far; /* far */
value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */ value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */
value[3] = 0; value[3] = 1.0;
return; return;
case STATE_FRAGMENT_PROGRAM: case STATE_FRAGMENT_PROGRAM:
{ {
@@ -824,3 +824,94 @@ _mesa_load_state_parameters(GLcontext *ctx,
} }
} }
/**
* Copy the 16 elements of a matrix into four consecutive program
* registers starting at 'pos'.
*/
static void
load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16])
{
GLuint i;
for (i = 0; i < 4; i++) {
registers[pos + i][0] = mat[0 + i];
registers[pos + i][1] = mat[4 + i];
registers[pos + i][2] = mat[8 + i];
registers[pos + i][3] = mat[12 + i];
}
}
/**
* As above, but transpose the matrix.
*/
static void
load_transpose_matrix(GLfloat registers[][4], GLuint pos,
const GLfloat mat[16])
{
MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat));
}
/**
* Load current vertex program's parameter registers with tracked
* matrices (if NV program). This only needs to be done per
* glBegin/glEnd, not per-vertex.
*/
void
_mesa_load_tracked_matrices(GLcontext *ctx)
{
GLuint i;
for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {
/* point 'mat' at source matrix */
GLmatrix *mat;
if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
mat = ctx->ModelviewMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
mat = ctx->ProjectionMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
mat = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_COLOR) {
mat = ctx->ColorMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
/* XXX verify the combined matrix is up to date */
mat = &ctx->_ModelProjectMatrix;
}
else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
ASSERT(n < MAX_PROGRAM_MATRICES);
mat = ctx->ProgramMatrixStack[n].Top;
}
else {
/* no matrix is tracked, but we leave the register values as-is */
assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
continue;
}
/* load the matrix values into sequential registers */
if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
}
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
_math_matrix_analyse(mat); /* update the inverse */
ASSERT(!_math_matrix_is_dirty(mat));
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
}
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
}
else {
assert(ctx->VertexProgram.TrackMatrixTransform[i]
== GL_INVERSE_TRANSPOSE_NV);
_math_matrix_analyse(mat); /* update the inverse */
ASSERT(!_math_matrix_is_dirty(mat));
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
}
}
}
+6 -2
View File
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.2 * Version: 7.1
* *
* 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -126,4 +126,8 @@ extern const char *
_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]); _mesa_program_state_string(const gl_state_index state[STATE_LENGTH]);
extern void
_mesa_load_tracked_matrices(GLcontext *ctx);
#endif /* PROG_STATEVARS_H */ #endif /* PROG_STATEVARS_H */
+1 -1
View File
@@ -343,7 +343,7 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)
clone->Format = prog->Format; clone->Format = prog->Format;
clone->Instructions = _mesa_alloc_instructions(prog->NumInstructions); clone->Instructions = _mesa_alloc_instructions(prog->NumInstructions);
if (!clone->Instructions) { if (!clone->Instructions) {
_mesa_delete_program(ctx, clone); ctx->Driver.DeleteProgram(ctx, clone);
return NULL; return NULL;
} }
_mesa_copy_instructions(clone->Instructions, prog->Instructions, _mesa_copy_instructions(clone->Instructions, prog->Instructions,
+172 -30
View File
@@ -80,7 +80,7 @@ _mesa_clear_shader_program_data(GLcontext *ctx,
/* to prevent a double-free in the next call */ /* to prevent a double-free in the next call */
shProg->VertexProgram->Base.Parameters = NULL; shProg->VertexProgram->Base.Parameters = NULL;
} }
_mesa_delete_program(ctx, &shProg->VertexProgram->Base); ctx->Driver.DeleteProgram(ctx, &shProg->VertexProgram->Base);
shProg->VertexProgram = NULL; shProg->VertexProgram = NULL;
} }
@@ -89,7 +89,7 @@ _mesa_clear_shader_program_data(GLcontext *ctx,
/* to prevent a double-free in the next call */ /* to prevent a double-free in the next call */
shProg->FragmentProgram->Base.Parameters = NULL; shProg->FragmentProgram->Base.Parameters = NULL;
} }
_mesa_delete_program(ctx, &shProg->FragmentProgram->Base); ctx->Driver.DeleteProgram(ctx, &shProg->FragmentProgram->Base);
shProg->FragmentProgram = NULL; shProg->FragmentProgram = NULL;
} }
@@ -247,7 +247,7 @@ _mesa_free_shader(GLcontext *ctx, struct gl_shader *sh)
_mesa_free(sh->InfoLog); _mesa_free(sh->InfoLog);
for (i = 0; i < sh->NumPrograms; i++) { for (i = 0; i < sh->NumPrograms; i++) {
assert(sh->Programs[i]); assert(sh->Programs[i]);
_mesa_delete_program(ctx, sh->Programs[i]); ctx->Driver.DeleteProgram(ctx, sh->Programs[i]);
} }
if (sh->Programs) if (sh->Programs)
_mesa_free(sh->Programs); _mesa_free(sh->Programs);
@@ -369,6 +369,54 @@ copy_string(GLchar *dst, GLsizei maxLength, GLsizei *length, const GLchar *src)
} }
/**
* Return size (in floats) of the given GLSL type.
* See also _slang_sizeof_type_specifier().
*/
static GLint
sizeof_glsl_type(GLenum type)
{
switch (type) {
case GL_BOOL:
case GL_FLOAT:
case GL_INT:
return 1;
case GL_BOOL_VEC2:
case GL_FLOAT_VEC2:
case GL_INT_VEC2:
return 2;
case GL_BOOL_VEC3:
case GL_FLOAT_VEC3:
case GL_INT_VEC3:
return 3;
case GL_BOOL_VEC4:
case GL_FLOAT_VEC4:
case GL_INT_VEC4:
return 4;
case GL_FLOAT_MAT2:
return 8; /* 2 rows of 4, actually */
case GL_FLOAT_MAT3:
return 12; /* 3 rows of 4, actually */
case GL_FLOAT_MAT4:
return 16;
case GL_FLOAT_MAT2x3:
return 8; /* 2 rows of 4, actually */
case GL_FLOAT_MAT2x4:
return 8;
case GL_FLOAT_MAT3x2:
return 12; /* 3 rows of 4, actually */
case GL_FLOAT_MAT3x4:
return 12;
case GL_FLOAT_MAT4x2:
return 16; /* 4 rows of 4, actually */
case GL_FLOAT_MAT4x3:
return 16; /* 4 rows of 4, actually */
default:
return 0; /* error */
}
}
/** /**
* Called via ctx->Driver.AttachShader() * Called via ctx->Driver.AttachShader()
*/ */
@@ -633,9 +681,9 @@ _mesa_get_active_attrib(GLcontext *ctx, GLuint program, GLuint index,
shProg->Attributes->Parameters[index].Name); shProg->Attributes->Parameters[index].Name);
sz = shProg->Attributes->Parameters[index].Size; sz = shProg->Attributes->Parameters[index].Size;
if (size) if (size)
*size = sz; *size = 1; /* attributes may not be arrays */
if (type) if (type && sz > 0 && sz <= 4) /* XXX this is a temporary hack */
*type = vec_types[sz]; /* XXX this is a temporary hack */ *type = vec_types[sz - 1];
} }
@@ -666,13 +714,17 @@ _mesa_get_active_uniform(GLcontext *ctx, GLuint program, GLuint index,
if (shProg->Uniforms->Parameters[j].Type == PROGRAM_UNIFORM || if (shProg->Uniforms->Parameters[j].Type == PROGRAM_UNIFORM ||
shProg->Uniforms->Parameters[j].Type == PROGRAM_SAMPLER) { shProg->Uniforms->Parameters[j].Type == PROGRAM_SAMPLER) {
if (ind == index) { if (ind == index) {
GLuint uSize = shProg->Uniforms->Parameters[j].Size;
GLenum uType = shProg->Uniforms->Parameters[j].DataType;
/* found it */ /* found it */
copy_string(nameOut, maxLength, length, copy_string(nameOut, maxLength, length,
shProg->Uniforms->Parameters[j].Name); shProg->Uniforms->Parameters[j].Name);
if (size) if (size) {
*size = shProg->Uniforms->Parameters[j].Size; /* convert from floats to 'type' (eg: sizeof(mat4x4)=1) */
*size = uSize / sizeof_glsl_type(uType);
}
if (type) if (type)
*type = shProg->Uniforms->Parameters[j].DataType; *type = uType;
return; return;
} }
ind++; ind++;
@@ -903,9 +955,40 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location,
if (shProg) { if (shProg) {
GLint i; GLint i;
if (location >= 0 && location < shProg->Uniforms->NumParameters) { if (location >= 0 && location < shProg->Uniforms->NumParameters) {
for (i = 0; i < shProg->Uniforms->Parameters[location].Size; i++) { GLuint uSize;
params[i] = shProg->Uniforms->ParameterValues[location][i]; GLenum uType;
GLint rows = 0;
uType = shProg->Uniforms->Parameters[location].DataType;
uSize = sizeof_glsl_type(uType);
/* Matrix types need special handling, because they span several
* parameters, and may also not be fully packed.
*/
switch (shProg->Uniforms->Parameters[location].DataType) {
case GL_FLOAT_MAT2:
case GL_FLOAT_MAT3x2:
case GL_FLOAT_MAT4x2:
rows = 2;
break;
case GL_FLOAT_MAT2x3:
case GL_FLOAT_MAT3:
case GL_FLOAT_MAT4x3:
rows = 3;
break;
case GL_FLOAT_MAT2x4:
case GL_FLOAT_MAT3x4:
case GL_FLOAT_MAT4:
rows = 4;
} }
if (rows != 0) {
GLint r, c;
for (c = 0, i = 0; c * 4 < uSize; c++)
for (r = 0; r < rows; r++, i++)
params[i] = shProg->Uniforms->ParameterValues[location + c][r];
}
else
for (i = 0; i < uSize; i++) {
params[i] = shProg->Uniforms->ParameterValues[location][i];
}
} }
else { else {
_mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformfv(location)"); _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformfv(location)");
@@ -1059,19 +1142,28 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,
{ {
struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
GLint elems, i, k; GLint elems, i, k;
GLenum uType;
GLsizei maxCount;
if (!shProg || !shProg->LinkStatus) { if (!shProg || !shProg->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)"); _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)");
return; return;
} }
if (location == -1)
return; /* The standard specifies this as a no-op */
/* The spec says this is GL_INVALID_OPERATION, although it seems like it
* ought to be GL_INVALID_VALUE
*/
if (location < 0 || location >= (GLint) shProg->Uniforms->NumParameters) { if (location < 0 || location >= (GLint) shProg->Uniforms->NumParameters) {
_mesa_error(ctx, GL_INVALID_VALUE, "glUniform(location)"); _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(location)");
return; return;
} }
FLUSH_VERTICES(ctx, _NEW_PROGRAM); FLUSH_VERTICES(ctx, _NEW_PROGRAM);
uType = shProg->Uniforms->Parameters[location].DataType;
/* /*
* If we're setting a sampler, we must use glUniformi1()! * If we're setting a sampler, we must use glUniformi1()!
*/ */
@@ -1119,11 +1211,37 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,
return; return;
} }
if (count * elems > shProg->Uniforms->Parameters[location].Size) { /* OpenGL requires types to match exactly, except that one can convert
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(count too large)"); * float or int array to boolean array.
return; */
switch (uType)
{
case GL_BOOL:
case GL_BOOL_VEC2:
case GL_BOOL_VEC3:
case GL_BOOL_VEC4:
if (elems != sizeof_glsl_type(uType)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(count mismatch)");
}
break;
case PROGRAM_SAMPLER:
break;
default:
if (shProg->Uniforms->Parameters[location].Type != PROGRAM_SAMPLER
&& uType != type) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(type mismatch)");
}
break;
} }
/* XXX if this is a base type, then count must equal 1. However, we
* don't have enough information from the compiler to distinguish a
* base type from a 1-element array of that type. The standard allows
* count to overrun an array, in which case the overflow is ignored.
*/
maxCount = shProg->Uniforms->Parameters[location].Size / elems;
if (count > maxCount) count = maxCount;
for (k = 0; k < count; k++) { for (k = 0; k < count; k++) {
GLfloat *uniformVal = shProg->Uniforms->ParameterValues[location + k]; GLfloat *uniformVal = shProg->Uniforms->ParameterValues[location + k];
if (type == GL_INT || if (type == GL_INT ||
@@ -1141,6 +1259,13 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,
uniformVal[i] = fValues[i]; uniformVal[i] = fValues[i];
} }
} }
if (uType == GL_BOOL ||
uType == GL_BOOL_VEC2 ||
uType == GL_BOOL_VEC3 ||
uType == GL_BOOL_VEC4) {
for (i = 0; i < elems; i++)
uniformVal[i] = uniformVal[i] ? 1.0f : 0.0f;
}
} }
if (shProg->Uniforms->Parameters[location].Type == PROGRAM_SAMPLER) { if (shProg->Uniforms->Parameters[location].Type == PROGRAM_SAMPLER) {
@@ -1161,20 +1286,30 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,
GLenum matrixType, GLint location, GLsizei count, GLenum matrixType, GLint location, GLsizei count,
GLboolean transpose, const GLfloat *values) GLboolean transpose, const GLfloat *values)
{ {
GLsizei maxCount, i;
struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
if (!shProg || !shProg->LinkStatus) { if (!shProg || !shProg->LinkStatus) {
_mesa_error(ctx, GL_INVALID_OPERATION, _mesa_error(ctx, GL_INVALID_OPERATION,
"glUniformMatrix(program not linked)"); "glUniformMatrix(program not linked)");
return; return;
} }
if (location < 0 || location >= shProg->Uniforms->NumParameters) { if (location == -1)
_mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(location)"); return; /* The standard specifies this as a no-op */
/* The spec says this is GL_INVALID_OPERATION, although it seems like it
* ought to be GL_INVALID_VALUE
*/
if (location < 0 || location >= (GLint) shProg->Uniforms->NumParameters) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix(location)");
return; return;
} }
if (values == NULL) { if (values == NULL) {
_mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix"); _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix");
return; return;
} }
if (count < 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(count < 0)");
return;
}
FLUSH_VERTICES(ctx, _NEW_PROGRAM); FLUSH_VERTICES(ctx, _NEW_PROGRAM);
@@ -1183,23 +1318,30 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,
* the rows. * the rows.
*/ */
/* XXXX need to test 3x3 and 2x2 matrices... */ /* XXXX need to test 3x3 and 2x2 matrices... */
if (transpose) { maxCount = shProg->Uniforms->Parameters[location].Size / (4 * cols);
GLuint row, col; if (count > maxCount)
for (col = 0; col < cols; col++) { count = maxCount;
GLfloat *v = shProg->Uniforms->ParameterValues[location + col]; for (i = 0; i < count; i++) {
for (row = 0; row < rows; row++) { if (transpose) {
v[row] = values[row * cols + col]; GLuint row, col;
for (col = 0; col < cols; col++) {
GLfloat *v = shProg->Uniforms->ParameterValues[location + col];
for (row = 0; row < rows; row++) {
v[row] = values[row * cols + col];
}
} }
} }
} else {
else { GLuint row, col;
GLuint row, col; for (col = 0; col < cols; col++) {
for (col = 0; col < cols; col++) { GLfloat *v = shProg->Uniforms->ParameterValues[location + col];
GLfloat *v = shProg->Uniforms->ParameterValues[location + col]; for (row = 0; row < rows; row++) {
for (row = 0; row < rows; row++) { v[row] = values[col * rows + row];
v[row] = values[col * rows + row]; }
} }
} }
location += cols;
values += rows * cols;
} }
} }
@@ -343,6 +343,7 @@ vec4 asin(const vec4 v)
__retVal.x = asin(v.x); __retVal.x = asin(v.x);
__retVal.y = asin(v.y); __retVal.y = asin(v.y);
__retVal.z = asin(v.z); __retVal.z = asin(v.z);
__retVal.w = asin(v.w);
} }
float acos(const float x) float acos(const float x)
@@ -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, 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, 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, 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, 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,
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,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,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, 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,
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, 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,
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, 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,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, 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,
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, 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,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, 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,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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,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, 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,
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, 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,
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, 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,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, 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,
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, 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,
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,122,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,122,0,0,0,20,
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,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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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,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,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, 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,
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, 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,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, 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,
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,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,
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, 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,
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, 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,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, 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,
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, 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,
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, 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, 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,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, 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,
@@ -250,7 +250,7 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,
} }
} }
else if (strcmp(var, "gl_FrontLightModelProduct") == 0) { else if (strcmp(var, "gl_FrontLightModelProduct") == 0) {
if (strcmp(field, "ambient") == 0) { if (strcmp(field, "sceneColor") == 0) {
tokens[0] = STATE_LIGHTMODEL_SCENECOLOR; tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;
tokens[1] = 0; 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) { else if (strcmp(var, "gl_BackLightModelProduct") == 0) {
if (strcmp(field, "ambient") == 0) { if (strcmp(field, "sceneColor") == 0) {
tokens[0] = STATE_LIGHTMODEL_SCENECOLOR; tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;
tokens[1] = 1; tokens[1] = 1;
} }
@@ -397,6 +397,8 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,
* var.field * var.field
* var[i].field * var[i].field
* var[i][j] * var[i][j]
*
* \return -1 upon error, else position in paramList of the state var/data
*/ */
GLint GLint
_slang_alloc_statevar(slang_ir_node *n, _slang_alloc_statevar(slang_ir_node *n,
@@ -414,9 +416,13 @@ _slang_alloc_statevar(slang_ir_node *n,
if (n->Opcode == IR_ELEMENT) { if (n->Opcode == IR_ELEMENT) {
/* XXX can only handle constant indexes for now */ /* XXX can only handle constant indexes for now */
assert(n->Children[1]->Opcode == IR_FLOAT); if (n->Children[1]->Opcode == IR_FLOAT) {
index1 = (GLint) n->Children[1]->Value[0]; index1 = (GLint) n->Children[1]->Value[0];
n = n->Children[0]; n = n->Children[0];
}
else {
return -1;
}
} }
if (n->Opcode == IR_ELEMENT) { if (n->Opcode == IR_ELEMENT) {
@@ -2344,7 +2344,8 @@ _slang_gen_field(slang_assemble_ctx * A, slang_operation *oper)
return n; return n;
} }
else if ( ti.spec.type == SLANG_SPEC_FLOAT 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; const GLuint rows = 1;
slang_swizzle swz; slang_swizzle swz;
slang_ir_node *n; slang_ir_node *n;
+24 -4
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 2005-2007 Brian Paul All Rights Reserved. * Copyright (C) 2005-2007 Brian Paul All Rights Reserved.
* *
@@ -677,6 +677,7 @@ static struct prog_instruction *
emit_clamp(slang_emit_info *emitInfo, slang_ir_node *n) emit_clamp(slang_emit_info *emitInfo, slang_ir_node *n)
{ {
struct prog_instruction *inst; struct prog_instruction *inst;
slang_ir_node tmpNode;
assert(n->Opcode == IR_CLAMP); assert(n->Opcode == IR_CLAMP);
/* ch[0] = value /* ch[0] = value
@@ -722,18 +723,27 @@ emit_clamp(slang_emit_info *emitInfo, slang_ir_node *n)
emit(emitInfo, n->Children[1]); emit(emitInfo, n->Children[1]);
emit(emitInfo, n->Children[2]); emit(emitInfo, n->Children[2]);
/* Some GPUs don't allow reading from output registers. So if the
* dest for this clamp() is an output reg, we can't use that reg for
* the intermediate result. Use a temp register instead.
*/
_mesa_bzero(&tmpNode, sizeof(tmpNode));
alloc_temp_storage(emitInfo, &tmpNode, n->Store->Size);
/* tmp = max(ch[0], ch[1]) */ /* tmp = max(ch[0], ch[1]) */
inst = new_instruction(emitInfo, OPCODE_MAX); inst = new_instruction(emitInfo, OPCODE_MAX);
storage_to_dst_reg(&inst->DstReg, n->Store, n->Writemask); storage_to_dst_reg(&inst->DstReg, tmpNode.Store, n->Writemask);
storage_to_src_reg(&inst->SrcReg[0], n->Children[0]->Store); storage_to_src_reg(&inst->SrcReg[0], n->Children[0]->Store);
storage_to_src_reg(&inst->SrcReg[1], n->Children[1]->Store); storage_to_src_reg(&inst->SrcReg[1], n->Children[1]->Store);
/* tmp = min(tmp, ch[2]) */ /* n->dest = min(tmp, ch[2]) */
inst = new_instruction(emitInfo, OPCODE_MIN); inst = new_instruction(emitInfo, OPCODE_MIN);
storage_to_dst_reg(&inst->DstReg, n->Store, n->Writemask); storage_to_dst_reg(&inst->DstReg, n->Store, n->Writemask);
storage_to_src_reg(&inst->SrcReg[0], n->Store); storage_to_src_reg(&inst->SrcReg[0], tmpNode.Store);
storage_to_src_reg(&inst->SrcReg[1], n->Children[2]->Store); storage_to_src_reg(&inst->SrcReg[1], n->Children[2]->Store);
free_temp_storage(emitInfo->vt, &tmpNode);
return inst; return inst;
} }
@@ -859,12 +869,18 @@ emit_return(slang_emit_info *emitInfo, slang_ir_node *n)
static struct prog_instruction * static struct prog_instruction *
emit_kill(slang_emit_info *emitInfo) emit_kill(slang_emit_info *emitInfo)
{ {
struct gl_fragment_program *fp;
struct prog_instruction *inst; struct prog_instruction *inst;
/* NV-KILL - discard fragment depending on condition code. /* NV-KILL - discard fragment depending on condition code.
* Note that ARB-KILL depends on sign of vector operand. * Note that ARB-KILL depends on sign of vector operand.
*/ */
inst = new_instruction(emitInfo, OPCODE_KIL_NV); inst = new_instruction(emitInfo, OPCODE_KIL_NV);
inst->DstReg.CondMask = COND_TR; /* always branch */ 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; return inst;
} }
@@ -1486,6 +1502,10 @@ emit_struct_field(slang_emit_info *emitInfo, slang_ir_node *n)
{ {
if (n->Store->File == PROGRAM_STATE_VAR) { if (n->Store->File == PROGRAM_STATE_VAR) {
n->Store->Index = _slang_alloc_statevar(n, emitInfo->prog->Parameters); 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 { else {
GLint offset = n->FieldOffset / 4; GLint offset = n->FieldOffset / 4;
@@ -141,6 +141,7 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
return; return;
INIT_SPAN(line.span, GL_LINE, 0, 0, SPAN_XY | SPAN_COVERAGE); INIT_SPAN(line.span, GL_LINE, 0, 0, SPAN_XY | SPAN_COVERAGE);
line.span.facing = swrast->PointLineFacing;
line.xAdj = line.dx / line.len * line.halfWidth; line.xAdj = line.dx / line.len * line.halfWidth;
line.yAdj = line.dy / line.len * line.halfWidth; line.yAdj = line.dy / line.len * line.halfWidth;
+7 -3
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -78,7 +78,7 @@
GLfloat texWidth[FRAG_ATTRIB_MAX]; GLfloat texWidth[FRAG_ATTRIB_MAX];
GLfloat texHeight[FRAG_ATTRIB_MAX]; GLfloat texHeight[FRAG_ATTRIB_MAX];
#endif #endif
GLfloat bf = SWRAST_CONTEXT(ctx)->_BackfaceSign; GLfloat bf = SWRAST_CONTEXT(ctx)->_BackfaceCullSign;
(void) swrast; (void) swrast;
@@ -116,6 +116,7 @@
majDx = vMax->win[0] - vMin->win[0]; majDx = vMax->win[0] - vMin->win[0];
majDy = vMax->win[1] - vMin->win[1]; majDy = vMax->win[1] - vMin->win[1];
/* front/back-face determination and cullling */
{ {
const GLfloat botDx = vMid->win[0] - vMin->win[0]; const GLfloat botDx = vMid->win[0] - vMin->win[0];
const GLfloat botDy = vMid->win[1] - vMin->win[1]; const GLfloat botDy = vMid->win[1] - vMin->win[1];
@@ -124,6 +125,8 @@
if (area * bf < 0 || area == 0 || IS_INF_OR_NAN(area)) if (area * bf < 0 || area == 0 || IS_INF_OR_NAN(area))
return; return;
ltor = (GLboolean) (area < 0.0F); ltor = (GLboolean) (area < 0.0F);
span.facing = area * swrast->_BackfaceSign > 0.0F;
} }
/* Plane equation setup: /* Plane equation setup:
@@ -336,7 +339,7 @@
} }
/* skip fragments with zero coverage */ /* skip fragments with zero coverage */
while (startX >= 0) { while (startX > 0) {
coverage = compute_coveragef(pMin, pMax, pMid, startX, iy); coverage = compute_coveragef(pMin, pMax, pMid, startX, iy);
if (coverage > 0.0F) if (coverage > 0.0F)
break; break;
@@ -350,6 +353,7 @@
/* (cx,cy) = center of fragment */ /* (cx,cy) = center of fragment */
const GLfloat cx = ix + 0.5F, cy = iy + 0.5F; const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
SWspanarrays *array = span.array; SWspanarrays *array = span.array;
ASSERT(ix >= 0);
#ifdef DO_INDEX #ifdef DO_INDEX
array->coverage[ix] = (GLfloat) compute_coveragei(pMin, pMax, pMid, ix, iy); array->coverage[ix] = (GLfloat) compute_coveragei(pMin, pMax, pMid, ix, iy);
#else #else
+17 -10
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -117,8 +117,8 @@ _swrast_update_rasterflags( GLcontext *ctx )
/** /**
* Examine polycon culls tate to compute the _BackfaceSign field. * Examine polycon culls tate to compute the _BackfaceCullSign field.
* _BackfaceSign will be 0 if no culling, -1 if culling back-faces, * _BackfaceCullSign will be 0 if no culling, -1 if culling back-faces,
* and 1 if culling front-faces. The Polygon FrontFace state also * and 1 if culling front-faces. The Polygon FrontFace state also
* factors in. * factors in.
*/ */
@@ -128,31 +128,32 @@ _swrast_update_polygon( GLcontext *ctx )
GLfloat backface_sign; GLfloat backface_sign;
if (ctx->Polygon.CullFlag) { if (ctx->Polygon.CullFlag) {
backface_sign = 1.0;
switch (ctx->Polygon.CullFaceMode) { switch (ctx->Polygon.CullFaceMode) {
case GL_BACK: case GL_BACK:
if (ctx->Polygon.FrontFace == GL_CCW) backface_sign = -1.0;
backface_sign = -1.0;
break; break;
case GL_FRONT: case GL_FRONT:
if (ctx->Polygon.FrontFace != GL_CCW) backface_sign = 1.0;
backface_sign = -1.0;
break; break;
case GL_FRONT_AND_BACK: case GL_FRONT_AND_BACK:
/* fallthrough */ /* fallthrough */
default: default:
backface_sign = 0.0; backface_sign = 0.0;
break;
} }
} }
else { else {
backface_sign = 0.0; backface_sign = 0.0;
} }
SWRAST_CONTEXT(ctx)->_BackfaceSign = backface_sign; SWRAST_CONTEXT(ctx)->_BackfaceCullSign = backface_sign;
/* This is for front/back-face determination, but not for culling */
SWRAST_CONTEXT(ctx)->_BackfaceSign
= (ctx->Polygon.FrontFace == GL_CW) ? -1.0 : 1.0;
} }
/** /**
* Update the _PreferPixelFog field to indicate if we need to compute * Update the _PreferPixelFog field to indicate if we need to compute
* fog blend factors (from the fog coords) per-fragment. * fog blend factors (from the fog coords) per-fragment.
@@ -720,6 +721,12 @@ _swrast_ResetLineStipple( GLcontext *ctx )
SWRAST_CONTEXT(ctx)->StippleCounter = 0; SWRAST_CONTEXT(ctx)->StippleCounter = 0;
} }
void
_swrast_SetFacing(GLcontext *ctx, GLuint facing)
{
SWRAST_CONTEXT(ctx)->PointLineFacing = facing;
}
void void
_swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value ) _swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value )
{ {
+3 -1
View File
@@ -128,7 +128,8 @@ typedef struct
* _swrast_validate_derived(): * _swrast_validate_derived():
*/ */
GLbitfield _RasterMask; GLbitfield _RasterMask;
GLfloat _BackfaceSign; GLfloat _BackfaceSign; /** +1 or -1 */
GLfloat _BackfaceCullSign; /** +1, 0, or -1 */
GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */
GLboolean _AnyTextureCombine; GLboolean _AnyTextureCombine;
GLboolean _FogEnabled; GLboolean _FogEnabled;
@@ -151,6 +152,7 @@ typedef struct
/* Working values: /* Working values:
*/ */
GLuint StippleCounter; /**< Line stipple counter */ GLuint StippleCounter; /**< Line stipple counter */
GLuint PointLineFacing;
GLbitfield NewState; GLbitfield NewState;
GLuint StateChanges; GLuint StateChanges;
GLenum Primitive; /* current primitive being drawn (ala glBegin) */ GLenum Primitive; /* current primitive being drawn (ala glBegin) */
+4 -4
View File
@@ -860,7 +860,8 @@ _swrast_DrawPixels( GLcontext *ctx,
format, type, pixels)) { format, type, pixels)) {
_mesa_error(ctx, GL_INVALID_OPERATION, _mesa_error(ctx, GL_INVALID_OPERATION,
"glDrawPixels(invalid PBO access)"); "glDrawPixels(invalid PBO access)");
goto end; RENDER_FINISH(swrast, ctx);
return;
} }
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
GL_READ_ONLY_ARB, GL_READ_ONLY_ARB,
@@ -868,7 +869,8 @@ _swrast_DrawPixels( GLcontext *ctx,
if (!buf) { if (!buf) {
/* buffer is already mapped - that's an error */ /* buffer is already mapped - that's an error */
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawPixels(PBO is mapped)"); _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawPixels(PBO is mapped)");
goto end; RENDER_FINISH(swrast, ctx);
return;
} }
pixels = ADD_POINTERS(buf, pixels); pixels = ADD_POINTERS(buf, pixels);
} }
@@ -908,8 +910,6 @@ _swrast_DrawPixels( GLcontext *ctx,
/* don't return yet, clean-up */ /* don't return yet, clean-up */
} }
end:
RENDER_FINISH(swrast,ctx); RENDER_FINISH(swrast,ctx);
if (unpack->BufferObj->Name) { if (unpack->BufferObj->Name) {
+18 -14
View File
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -40,10 +40,12 @@ fetch_texel( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
{ {
GLchan rgba[4]; GLchan rgba[4];
SWcontext *swrast = SWRAST_CONTEXT(ctx); 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!!! */ /* XXX use a float-valued TextureSample routine here!!! */
swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current, swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord,
1, (const GLfloat (*)[4]) texcoord,
&lambda, &rgba); &lambda, &rgba);
color[0] = CHAN_TO_FLOAT(rgba[0]); color[0] = CHAN_TO_FLOAT(rgba[0]);
color[1] = CHAN_TO_FLOAT(rgba[1]); color[1] = CHAN_TO_FLOAT(rgba[1]);
@@ -59,7 +61,7 @@ fetch_texel( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
static void static void
fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4], fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],
const GLfloat texdx[4], const GLfloat texdy[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); SWcontext *swrast = SWRAST_CONTEXT(ctx);
const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current; const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
@@ -68,15 +70,17 @@ fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],
const GLfloat texH = (GLfloat) texImg->HeightScale; const GLfloat texH = (GLfloat) texImg->HeightScale;
GLchan rgba[4]; GLchan rgba[4];
GLfloat lambda = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */ GLfloat lambda
texdx[1], texdy[1], /* dt/dx, dt/dy */ = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */
texdx[3], texdy[2], /* dq/dx, dq/dy */ texdx[1], texdy[1], /* dt/dx, dt/dy */
texW, texH, texdx[3], texdy[2], /* dq/dx, dq/dy */
texcoord[0], texcoord[1], texcoord[3], texW, texH,
1.0F / texcoord[3]); texcoord[0], texcoord[1], texcoord[3],
1.0F / texcoord[3]) + lodBias;
swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current, lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod);
1, (const GLfloat (*)[4]) texcoord,
swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord,
&lambda, &rgba); &lambda, &rgba);
color[0] = CHAN_TO_FLOAT(rgba[0]); color[0] = CHAN_TO_FLOAT(rgba[0]);
color[1] = CHAN_TO_FLOAT(rgba[1]); color[1] = CHAN_TO_FLOAT(rgba[1]);
@@ -114,7 +118,7 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine,
if (ctx->Shader.CurrentProgram) { if (ctx->Shader.CurrentProgram) {
/* Store front/back facing value in register FOGC.Y */ /* Store front/back facing value in register FOGC.Y */
machine->Attribs[FRAG_ATTRIB_FOGC][col][1] = (GLfloat) ctx->_Facing; machine->Attribs[FRAG_ATTRIB_FOGC][col][1] = 1.0 - span->facing;
} }
machine->CurElement = col; machine->CurElement = col;
+3
View File
@@ -317,6 +317,9 @@ NAME( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
span.attrStepX[FRAG_ATTRIB_WPOS][3] = 0.0F; span.attrStepX[FRAG_ATTRIB_WPOS][3] = 0.0F;
span.attrStepY[FRAG_ATTRIB_WPOS][3] = 0.0F; span.attrStepY[FRAG_ATTRIB_WPOS][3] = 0.0F;
span.facing = swrast->PointLineFacing;
/* /*
* Draw * Draw
*/ */
+5 -4
View File
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -105,6 +105,7 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
*/ */
span->interpMask = SPAN_FOG; span->interpMask = SPAN_FOG;
span->arrayMask = SPAN_XY | SPAN_Z; span->arrayMask = SPAN_XY | SPAN_Z;
span->facing = swrast->PointLineFacing;
span->attrStart[FRAG_ATTRIB_FOGC][0] = vert->attrib[FRAG_ATTRIB_FOGC][0]; span->attrStart[FRAG_ATTRIB_FOGC][0] = vert->attrib[FRAG_ATTRIB_FOGC][0];
span->attrStepX[FRAG_ATTRIB_FOGC][0] = 0.0; span->attrStepX[FRAG_ATTRIB_FOGC][0] = 0.0;
span->attrStepY[FRAG_ATTRIB_FOGC][0] = 0.0; span->attrStepY[FRAG_ATTRIB_FOGC][0] = 0.0;
@@ -217,9 +218,9 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
} }
else { else {
/* even size */ /* even size */
xmin = (GLint) vert->win[0] - iRadius; xmin = (GLint) (vert->win[0] + 0.5) - iRadius;
xmax = xmin + iSize - 1; xmax = xmin + iSize - 1;
ymin = (GLint) vert->win[1] - iRadius; ymin = (GLint) (vert->win[1] + 0.5) - iRadius;
ymax = ymin + iSize - 1; ymax = ymin + iSize - 1;
} }
#endif /*SMOOTH*/ #endif /*SMOOTH*/
+9 -7
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -129,7 +129,8 @@ read_depth_pixels( GLcontext *ctx,
rb->GetRow(ctx, rb, width, x, y, dest); rb->GetRow(ctx, rb, width, x, y, dest);
/* convert range from 24-bit to 32-bit */ /* convert range from 24-bit to 32-bit */
for (k = 0; k < width; k++) { for (k = 0; k < width; k++) {
dest[k] = (dest[k] << 8) | (dest[k] >> 24); /* Note: put MSByte of 24-bit value into LSByte */
dest[k] = (dest[k] << 8) | ((dest[k] >> 16) & 0xff);
} }
} }
} }
@@ -569,7 +570,8 @@ _swrast_ReadPixels( GLcontext *ctx,
/* Do all needed clipping here, so that we can forget about it later */ /* Do all needed clipping here, so that we can forget about it later */
if (!_mesa_clip_readpixels(ctx, &x, &y, &width, &height, &clippedPacking)) { if (!_mesa_clip_readpixels(ctx, &x, &y, &width, &height, &clippedPacking)) {
/* The ReadPixels region is totally outside the window bounds */ /* The ReadPixels region is totally outside the window bounds */
goto end; RENDER_FINISH(swrast, ctx);
return;
} }
if (clippedPacking.BufferObj->Name) { if (clippedPacking.BufferObj->Name) {
@@ -579,7 +581,8 @@ _swrast_ReadPixels( GLcontext *ctx,
format, type, pixels)) { format, type, pixels)) {
_mesa_error(ctx, GL_INVALID_OPERATION, _mesa_error(ctx, GL_INVALID_OPERATION,
"glReadPixels(invalid PBO access)"); "glReadPixels(invalid PBO access)");
goto end; RENDER_FINISH(swrast, ctx);
return;
} }
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
GL_WRITE_ONLY_ARB, GL_WRITE_ONLY_ARB,
@@ -587,7 +590,8 @@ _swrast_ReadPixels( GLcontext *ctx,
if (!buf) { if (!buf) {
/* buffer is already mapped - that's an error */ /* buffer is already mapped - that's an error */
_mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)"); _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)");
goto end; RENDER_FINISH(swrast, ctx);
return;
} }
pixels = ADD_POINTERS(buf, pixels); pixels = ADD_POINTERS(buf, pixels);
} }
@@ -628,8 +632,6 @@ _swrast_ReadPixels( GLcontext *ctx,
/* don't return yet, clean-up */ /* don't return yet, clean-up */
} }
end:
RENDER_FINISH(swrast, ctx); RENDER_FINISH(swrast, ctx);
if (clippedPacking.BufferObj->Name) { if (clippedPacking.BufferObj->Name) {
+12 -23
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.0.3
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -1043,7 +1043,7 @@ sample_2d_linear_repeat(GLcontext *ctx,
ASSERT(tObj->WrapS == GL_REPEAT); ASSERT(tObj->WrapS == GL_REPEAT);
ASSERT(tObj->WrapT == GL_REPEAT); ASSERT(tObj->WrapT == GL_REPEAT);
ASSERT(img->Border == 0); ASSERT(img->Border == 0);
ASSERT(img->_BaseFormat != GL_COLOR_INDEX); ASSERT(img->TexFormat->BaseFormat != GL_COLOR_INDEX);
ASSERT(img->_IsPowerOfTwo); ASSERT(img->_IsPowerOfTwo);
COMPUTE_LINEAR_REPEAT_TEXEL_LOCATION(texcoord[0], u, width, i0, i1); COMPUTE_LINEAR_REPEAT_TEXEL_LOCATION(texcoord[0], u, width, i0, i1);
@@ -1198,6 +1198,7 @@ sample_linear_2d( GLcontext *ctx,
(void) lambda; (void) lambda;
if (tObj->WrapS == GL_REPEAT && if (tObj->WrapS == GL_REPEAT &&
tObj->WrapT == GL_REPEAT && tObj->WrapT == GL_REPEAT &&
image->Border == 0 &&
image->_IsPowerOfTwo) { image->_IsPowerOfTwo) {
for (i=0;i<n;i++) { for (i=0;i<n;i++) {
sample_2d_linear_repeat(ctx, tObj, image, texcoords[i], rgba[i]); sample_2d_linear_repeat(ctx, tObj, image, texcoords[i], rgba[i]);
@@ -1237,7 +1238,7 @@ opt_sample_rgb_2d( GLcontext *ctx,
ASSERT(tObj->WrapS==GL_REPEAT); ASSERT(tObj->WrapS==GL_REPEAT);
ASSERT(tObj->WrapT==GL_REPEAT); ASSERT(tObj->WrapT==GL_REPEAT);
ASSERT(img->Border==0); ASSERT(img->Border==0);
ASSERT(img->_BaseFormat==GL_RGB); ASSERT(img->TexFormat->MesaFormat==MESA_FORMAT_RGB);
ASSERT(img->_IsPowerOfTwo); ASSERT(img->_IsPowerOfTwo);
for (k=0; k<n; k++) { for (k=0; k<n; k++) {
@@ -1278,7 +1279,7 @@ opt_sample_rgba_2d( GLcontext *ctx,
ASSERT(tObj->WrapS==GL_REPEAT); ASSERT(tObj->WrapS==GL_REPEAT);
ASSERT(tObj->WrapT==GL_REPEAT); ASSERT(tObj->WrapT==GL_REPEAT);
ASSERT(img->Border==0); ASSERT(img->Border==0);
ASSERT(img->_BaseFormat==GL_RGBA); ASSERT(img->TexFormat->MesaFormat==MESA_FORMAT_RGBA);
ASSERT(img->_IsPowerOfTwo); ASSERT(img->_IsPowerOfTwo);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
@@ -1308,7 +1309,7 @@ sample_lambda_2d( GLcontext *ctx,
const GLboolean repeatNoBorderPOT = (tObj->WrapS == GL_REPEAT) const GLboolean repeatNoBorderPOT = (tObj->WrapS == GL_REPEAT)
&& (tObj->WrapT == GL_REPEAT) && (tObj->WrapT == GL_REPEAT)
&& (tImg->Border == 0 && (tImg->Width == tImg->RowStride)) && (tImg->Border == 0 && (tImg->Width == tImg->RowStride))
&& (tImg->_BaseFormat != GL_COLOR_INDEX) && (tImg->TexFormat->BaseFormat != GL_COLOR_INDEX)
&& tImg->_IsPowerOfTwo; && tImg->_IsPowerOfTwo;
ASSERT(lambda != NULL); ASSERT(lambda != NULL);
@@ -1323,16 +1324,10 @@ sample_lambda_2d( GLcontext *ctx,
if (repeatNoBorderPOT) { if (repeatNoBorderPOT) {
switch (tImg->TexFormat->MesaFormat) { switch (tImg->TexFormat->MesaFormat) {
case MESA_FORMAT_RGB: case MESA_FORMAT_RGB:
case MESA_FORMAT_RGB888:
/*case MESA_FORMAT_BGR888:*/
opt_sample_rgb_2d(ctx, tObj, m, texcoords + minStart, opt_sample_rgb_2d(ctx, tObj, m, texcoords + minStart,
NULL, rgba + minStart); NULL, rgba + minStart);
break; break;
case MESA_FORMAT_RGBA: case MESA_FORMAT_RGBA:
case MESA_FORMAT_RGBA8888:
case MESA_FORMAT_ARGB8888:
/*case MESA_FORMAT_ABGR8888:*/
/*case MESA_FORMAT_BGRA8888:*/
opt_sample_rgba_2d(ctx, tObj, m, texcoords + minStart, opt_sample_rgba_2d(ctx, tObj, m, texcoords + minStart,
NULL, rgba + minStart); NULL, rgba + minStart);
break; break;
@@ -1386,16 +1381,10 @@ sample_lambda_2d( GLcontext *ctx,
if (repeatNoBorderPOT) { if (repeatNoBorderPOT) {
switch (tImg->TexFormat->MesaFormat) { switch (tImg->TexFormat->MesaFormat) {
case MESA_FORMAT_RGB: case MESA_FORMAT_RGB:
case MESA_FORMAT_RGB888:
/*case MESA_FORMAT_BGR888:*/
opt_sample_rgb_2d(ctx, tObj, m, texcoords + magStart, opt_sample_rgb_2d(ctx, tObj, m, texcoords + magStart,
NULL, rgba + magStart); NULL, rgba + magStart);
break; break;
case MESA_FORMAT_RGBA: case MESA_FORMAT_RGBA:
case MESA_FORMAT_RGBA8888:
case MESA_FORMAT_ARGB8888:
/*case MESA_FORMAT_ABGR8888:*/
/*case MESA_FORMAT_BGRA8888:*/
opt_sample_rgba_2d(ctx, tObj, m, texcoords + magStart, opt_sample_rgba_2d(ctx, tObj, m, texcoords + magStart,
NULL, rgba + magStart); NULL, rgba + magStart);
break; break;
@@ -2102,7 +2091,7 @@ sample_nearest_rect(GLcontext *ctx,
ASSERT(tObj->WrapT == GL_CLAMP || ASSERT(tObj->WrapT == GL_CLAMP ||
tObj->WrapT == GL_CLAMP_TO_EDGE || tObj->WrapT == GL_CLAMP_TO_EDGE ||
tObj->WrapT == GL_CLAMP_TO_BORDER); tObj->WrapT == GL_CLAMP_TO_BORDER);
ASSERT(img->_BaseFormat != GL_COLOR_INDEX); ASSERT(img->TexFormat->BaseFormat != GL_COLOR_INDEX);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
GLint row, col; GLint row, col;
@@ -2138,7 +2127,7 @@ sample_linear_rect(GLcontext *ctx,
ASSERT(tObj->WrapT == GL_CLAMP || ASSERT(tObj->WrapT == GL_CLAMP ||
tObj->WrapT == GL_CLAMP_TO_EDGE || tObj->WrapT == GL_CLAMP_TO_EDGE ||
tObj->WrapT == GL_CLAMP_TO_BORDER); tObj->WrapT == GL_CLAMP_TO_BORDER);
ASSERT(img->_BaseFormat != GL_COLOR_INDEX); ASSERT(img->TexFormat->BaseFormat != GL_COLOR_INDEX);
/* XXX lots of opportunity for optimization in this loop */ /* XXX lots of opportunity for optimization in this loop */
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
@@ -2286,8 +2275,8 @@ sample_depth_texture( GLcontext *ctx,
(void) lambda; (void) lambda;
ASSERT(tObj->Image[0][tObj->BaseLevel]->_BaseFormat == GL_DEPTH_COMPONENT || ASSERT(img->TexFormat->BaseFormat == GL_DEPTH_COMPONENT ||
tObj->Image[0][tObj->BaseLevel]->_BaseFormat == GL_DEPTH_STENCIL_EXT); img->TexFormat->BaseFormat == GL_DEPTH_STENCIL_EXT);
ASSERT(tObj->Target == GL_TEXTURE_1D || ASSERT(tObj->Target == GL_TEXTURE_1D ||
tObj->Target == GL_TEXTURE_2D || tObj->Target == GL_TEXTURE_2D ||
@@ -2604,7 +2593,7 @@ sample_depth_texture2(const GLcontext *ctx,
* GL_TEXTURE_COMPARE_SGIX == GL_TRUE but the current texture object * GL_TEXTURE_COMPARE_SGIX == GL_TRUE but the current texture object
* isn't a depth texture. * isn't a depth texture.
*/ */
if (texImage->_BaseFormat != GL_DEPTH_COMPONENT) { if (texImage->TexFormat->BaseFormat != GL_DEPTH_COMPONENT) {
_mesa_problem(ctx,"GL_TEXTURE_COMPARE_SGIX enabled with non-depth texture"); _mesa_problem(ctx,"GL_TEXTURE_COMPARE_SGIX enabled with non-depth texture");
return; return;
} }
@@ -2707,7 +2696,7 @@ _swrast_choose_texture_sample_func( GLcontext *ctx,
} }
else { else {
const GLboolean needLambda = (GLboolean) (t->MinFilter != t->MagFilter); const GLboolean needLambda = (GLboolean) (t->MinFilter != t->MagFilter);
const GLenum format = t->Image[0][t->BaseLevel]->_BaseFormat; const GLenum format = t->Image[0][t->BaseLevel]->TexFormat->BaseFormat;
switch (t->Target) { switch (t->Target) {
case GL_TEXTURE_1D: case GL_TEXTURE_1D:
+1 -1
View File
@@ -58,7 +58,7 @@ _swrast_culltriangle( GLcontext *ctx,
GLfloat fy = v2->win[1] - v0->win[1]; GLfloat fy = v2->win[1] - v0->win[1];
GLfloat c = ex*fy-ey*fx; GLfloat c = ex*fy-ey*fx;
if (c * SWRAST_CONTEXT(ctx)->_BackfaceSign > 0) if (c * SWRAST_CONTEXT(ctx)->_BackfaceCullSign > 0)
return 0; return 0;
return 1; return 1;
+6 -7
View File
@@ -292,19 +292,18 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
#else #else
const GLfloat area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy; const GLfloat area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy;
#endif #endif
/* Do backface culling */
if (area * bf < 0.0)
return;
if (IS_INF_OR_NAN(area) || area == 0.0F) if (IS_INF_OR_NAN(area) || area == 0.0F)
return; return;
if (area * bf * swrast->_BackfaceCullSign < 0.0)
return;
oneOverArea = 1.0F / area; oneOverArea = 1.0F / area;
/* 0 = front, 1 = back */
span.facing = oneOverArea * bf > 0.0F;
} }
span.facing = ctx->_Facing; /* for 2-sided stencil test */
/* Edge setup. For a triangle strip these could be reused... */ /* Edge setup. For a triangle strip these could be reused... */
{ {
#if TRIANGLE_WALK_DOUBLE #if TRIANGLE_WALK_DOUBLE
+7
View File
@@ -140,6 +140,13 @@ _swrast_Accum(GLcontext *ctx, GLenum op, GLfloat value);
extern void extern void
_swrast_ResetLineStipple( GLcontext *ctx ); _swrast_ResetLineStipple( GLcontext *ctx );
/**
* Indicates front/back facing for subsequent points/lines when drawing
* unfilled polygons. Needed for two-side stencil.
*/
extern void
_swrast_SetFacing(GLcontext *ctx, GLuint facing);
/* These will always render the correct point/line/triangle for the /* These will always render the correct point/line/triangle for the
* current state. * current state.
* *
@@ -186,6 +186,9 @@ _swsetup_RenderStart( GLcontext *ctx )
swsetup->NewState = 0; swsetup->NewState = 0;
/* This will change if drawing unfilled tris */
_swrast_SetFacing(ctx, 0);
_swrast_render_start(ctx); _swrast_render_start(ctx);
/* Important */ /* Important */
@@ -1,8 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.1 * Version: 7.1
* *
* Copyright (C) 1999-2004 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -68,6 +68,8 @@ static void _swsetup_render_line_tri( GLcontext *ctx,
return; return;
} }
_swrast_SetFacing(ctx, facing);
if (ctx->Light.ShadeModel == GL_FLAT) { if (ctx->Light.ShadeModel == GL_FLAT) {
COPY_CHAN4(c[0], v0->color); COPY_CHAN4(c[0], v0->color);
COPY_CHAN4(c[1], v1->color); COPY_CHAN4(c[1], v1->color);
@@ -127,6 +129,8 @@ static void _swsetup_render_point_tri( GLcontext *ctx,
return; return;
} }
_swrast_SetFacing(ctx, facing);
if (ctx->Light.ShadeModel == GL_FLAT) { if (ctx->Light.ShadeModel == GL_FLAT) {
/* save colors/indexes for v0, v1 vertices */ /* save colors/indexes for v0, v1 vertices */
COPY_CHAN4(c[0], v0->color); COPY_CHAN4(c[0], v0->color);
@@ -290,10 +294,8 @@ void _swsetup_choose_trifuncs( GLcontext *ctx )
ctx->Polygon.OffsetFill) ctx->Polygon.OffsetFill)
ind |= SS_OFFSET_BIT; ind |= SS_OFFSET_BIT;
/* Note: gl_FrontFacing lives in fragment input FOGC.Y at this time */
if ((ctx->Light.Enabled && ctx->Light.Model.TwoSide) || if ((ctx->Light.Enabled && ctx->Light.Model.TwoSide) ||
(ctx->VertexProgram._Enabled && ctx->VertexProgram.TwoSideEnabled) || (ctx->VertexProgram._Current && ctx->VertexProgram.TwoSideEnabled))
(ctx->FragmentProgram._Current && ctx->FragmentProgram._Current->Base.InputsRead & (1 << FRAG_ATTRIB_FOGC)))
ind |= SS_TWOSIDE_BIT; ind |= SS_TWOSIDE_BIT;
/* We piggyback the two-sided stencil front/back determination on the /* We piggyback the two-sided stencil front/back determination on the
@@ -311,6 +313,4 @@ void _swsetup_choose_trifuncs( GLcontext *ctx )
tnl->Driver.Render.Quad = quad_tab[ind]; tnl->Driver.Render.Quad = quad_tab[ind];
tnl->Driver.Render.Line = swsetup_line; tnl->Driver.Render.Line = swsetup_line;
tnl->Driver.Render.Points = swsetup_points; tnl->Driver.Render.Points = swsetup_points;
ctx->_Facing = 0;
} }
@@ -43,7 +43,6 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
v[1] = &verts[e1]; v[1] = &verts[e1];
v[2] = &verts[e2]; v[2] = &verts[e2];
if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT)) if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT))
{ {
GLfloat ex = v[0]->win[0] - v[2]->win[0]; GLfloat ex = v[0]->win[0] - v[2]->win[0];
@@ -55,7 +54,6 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT)) if (IND & (SS_TWOSIDE_BIT | SS_UNFILLED_BIT))
{ {
facing = (cc < 0.0) ^ ctx->Polygon._FrontBit; facing = (cc < 0.0) ^ ctx->Polygon._FrontBit;
ctx->_Facing = facing;
if (IND & SS_UNFILLED_BIT) if (IND & SS_UNFILLED_BIT)
mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode; mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode;
+200 -142
View File
@@ -1,6 +1,6 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 6.5.3 * Version: 7.1
* *
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
* *
@@ -30,29 +30,150 @@
*/ */
#include "glheader.h" #include "main/glheader.h"
#include "colormac.h" #include "main/colormac.h"
#include "context.h" #include "main/context.h"
#include "macros.h" #include "main/macros.h"
#include "imports.h" #include "main/imports.h"
#include "prog_instruction.h" #include "shader/prog_instruction.h"
#include "prog_statevars.h" #include "shader/prog_statevars.h"
#include "prog_execute.h" #include "shader/prog_execute.h"
#include "swrast/s_context.h"
#include "swrast/s_texfilter.h"
#include "tnl.h" #include "tnl/tnl.h"
#include "t_context.h" #include "tnl/t_context.h"
#include "t_pipeline.h" #include "tnl/t_pipeline.h"
#include "swrast/s_context.h" #include "swrast/s_context.h"
#include "swrast/s_texfilter.h" #include "swrast/s_texfilter.h"
/*!
* Private storage for the vertex program pipeline stage.
*/
struct vp_stage_data {
/** The results of running the vertex program go into these arrays. */
GLvector4f results[VERT_RESULT_MAX];
GLvector4f ndcCoords; /**< normalized device coords */
GLubyte *clipmask; /**< clip flags */
GLubyte ormask, andmask; /**< for clipping */
};
#define VP_STAGE_DATA(stage) ((struct vp_stage_data *)(stage->privatePtr))
static void
userclip( GLcontext *ctx,
GLvector4f *clip,
GLubyte *clipmask,
GLubyte *clipormask,
GLubyte *clipandmask )
{
GLuint p;
for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {
if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
GLuint nr, i;
const GLfloat a = ctx->Transform._ClipUserPlane[p][0];
const GLfloat b = ctx->Transform._ClipUserPlane[p][1];
const GLfloat c = ctx->Transform._ClipUserPlane[p][2];
const GLfloat d = ctx->Transform._ClipUserPlane[p][3];
GLfloat *coord = (GLfloat *)clip->data;
GLuint stride = clip->stride;
GLuint count = clip->count;
for (nr = 0, i = 0 ; i < count ; i++) {
GLfloat dp = (coord[0] * a +
coord[1] * b +
coord[2] * c +
coord[3] * d);
if (dp < 0) {
nr++;
clipmask[i] |= CLIP_USER_BIT;
}
STRIDE_F(coord, stride);
}
if (nr > 0) {
*clipormask |= CLIP_USER_BIT;
if (nr == count) {
*clipandmask |= CLIP_USER_BIT;
return;
}
}
}
}
}
static GLboolean
do_ndc_cliptest(GLcontext *ctx, struct vp_stage_data *store)
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct vertex_buffer *VB = &tnl->vb;
/* Cliptest and perspective divide. Clip functions must clear
* the clipmask.
*/
store->ormask = 0;
store->andmask = CLIP_FRUSTUM_BITS;
if (tnl->NeedNdcCoords) {
VB->NdcPtr =
_mesa_clip_tab[VB->ClipPtr->size]( VB->ClipPtr,
&store->ndcCoords,
store->clipmask,
&store->ormask,
&store->andmask );
}
else {
VB->NdcPtr = NULL;
_mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr,
NULL,
store->clipmask,
&store->ormask,
&store->andmask );
}
if (store->andmask) {
/* All vertices are outside the frustum */
return GL_FALSE;
}
/* Test userclip planes. This contributes to VB->ClipMask.
*/
/** XXX NEW_SLANG _Enabled ??? */
if (ctx->Transform.ClipPlanesEnabled && (!ctx->VertexProgram._Enabled ||
ctx->VertexProgram.Current->IsPositionInvariant)) {
userclip( ctx,
VB->ClipPtr,
store->clipmask,
&store->ormask,
&store->andmask );
if (store->andmask) {
return GL_FALSE;
}
}
VB->ClipAndMask = store->andmask;
VB->ClipOrMask = store->ormask;
VB->ClipMask = store->clipmask;
return GL_TRUE;
}
/** /**
* XXX the texture sampling code in this module is a bit of a hack. * XXX the texture sampling code in this module is a bit of a hack.
* The texture sampling code is in swrast, though it doesn't have any * The texture sampling code is in swrast, though it doesn't have any
* real dependencies on the rest of swrast. It should probably be * real dependencies on the rest of swrast. It should probably be
* moved into main/ someday. * moved into main/ someday.
*/ */
static void static void
vp_fetch_texel(GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda, vp_fetch_texel(GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
GLuint unit, GLfloat color[4]) GLuint unit, GLfloat color[4])
@@ -85,22 +206,6 @@ _tnl_program_string(GLcontext *ctx, GLenum target, struct gl_program *program)
} }
/*!
* Private storage for the vertex program pipeline stage.
*/
struct vp_stage_data {
/** The results of running the vertex program go into these arrays. */
GLvector4f results[VERT_RESULT_MAX];
GLvector4f ndcCoords; /**< normalized device coords */
GLubyte *clipmask; /**< clip flags */
GLubyte ormask, andmask; /**< for clipping */
};
#define VP_STAGE_DATA(stage) ((struct vp_stage_data *)(stage->privatePtr))
/** /**
* Initialize virtual machine state prior to executing vertex program. * Initialize virtual machine state prior to executing vertex program.
*/ */
@@ -143,92 +248,44 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine)
/** /**
* Copy the 16 elements of a matrix into four consecutive program * Map the texture images which the vertex program will access (if any).
* registers starting at 'pos'.
*/ */
static void static void
load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16]) map_textures(GLcontext *ctx, const struct gl_vertex_program *vp)
{ {
GLuint i; GLuint u;
for (i = 0; i < 4; i++) {
registers[pos + i][0] = mat[0 + i]; if (!ctx->Driver.MapTexture)
registers[pos + i][1] = mat[4 + i]; return;
registers[pos + i][2] = mat[8 + i];
registers[pos + i][3] = mat[12 + i]; for (u = 0; u < ctx->Const.MaxVertexTextureImageUnits; u++) {
if (vp->Base.TexturesUsed[u]) {
/* Note: _Current *should* correspond to the target indicated
* in TexturesUsed[u].
*/
ctx->Driver.MapTexture(ctx, ctx->Texture.Unit[u]._Current);
}
} }
} }
/** /**
* As above, but transpose the matrix. * Unmap the texture images which were used by the vertex program (if any).
*/ */
static void static void
load_transpose_matrix(GLfloat registers[][4], GLuint pos, unmap_textures(GLcontext *ctx, const struct gl_vertex_program *vp)
const GLfloat mat[16])
{ {
MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat)); GLuint u;
}
if (!ctx->Driver.MapTexture)
return;
/** for (u = 0; u < ctx->Const.MaxVertexTextureImageUnits; u++) {
* Load current vertex program's parameter registers with tracked if (vp->Base.TexturesUsed[u]) {
* matrices (if NV program). This only needs to be done per /* Note: _Current *should* correspond to the target indicated
* glBegin/glEnd, not per-vertex. * in TexturesUsed[u].
*/ */
void ctx->Driver.UnmapTexture(ctx, ctx->Texture.Unit[u]._Current);
_mesa_load_tracked_matrices(GLcontext *ctx)
{
GLuint i;
for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {
/* point 'mat' at source matrix */
GLmatrix *mat;
if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
mat = ctx->ModelviewMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
mat = ctx->ProjectionMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
mat = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top;
}
else if (ctx->VertexProgram.TrackMatrix[i] == GL_COLOR) {
mat = ctx->ColorMatrixStack.Top;
}
else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
/* XXX verify the combined matrix is up to date */
mat = &ctx->_ModelProjectMatrix;
}
else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
ASSERT(n < MAX_PROGRAM_MATRICES);
mat = ctx->ProgramMatrixStack[n].Top;
}
else {
/* no matrix is tracked, but we leave the register values as-is */
assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
continue;
}
/* load the matrix values into sequential registers */
if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
}
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
_math_matrix_analyse(mat); /* update the inverse */
ASSERT(!_math_matrix_is_dirty(mat));
load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
}
else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
}
else {
assert(ctx->VertexProgram.TrackMatrixTransform[i]
== GL_INVERSE_TRANSPOSE_NV);
_math_matrix_analyse(mat); /* update the inverse */
ASSERT(!_math_matrix_is_dirty(mat));
load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
} }
} }
} }
@@ -259,6 +316,7 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
_mesa_load_state_parameters(ctx, program->Base.Parameters); _mesa_load_state_parameters(ctx, program->Base.Parameters);
} }
/* make list of outputs to save some time below */
numOutputs = 0; numOutputs = 0;
for (i = 0; i < VERT_RESULT_MAX; i++) { for (i = 0; i < VERT_RESULT_MAX; i++) {
if (program->Base.OutputsWritten & (1 << i)) { if (program->Base.OutputsWritten & (1 << i)) {
@@ -266,6 +324,8 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
} }
} }
map_textures(ctx, program);
for (i = 0; i < VB->Count; i++) { for (i = 0; i < VB->Count; i++) {
GLuint attr; GLuint attr;
@@ -317,6 +377,8 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
#endif #endif
} }
unmap_textures(ctx, program);
/* Fixup fog and point size results if needed */ /* Fixup fog and point size results if needed */
if (program->IsNVProgram) { if (program->IsNVProgram) {
if (ctx->Fog.Enabled && if (ctx->Fog.Enabled &&
@@ -334,12 +396,39 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
} }
} }
/* Setup the VB pointers so that the next pipeline stages get if (program->IsPositionInvariant) {
* their data from the right place (the program output arrays). /* We need the exact same transform as in the fixed function path here
*/ * to guarantee invariance, depending on compiler optimization flags
VB->ClipPtr = &store->results[VERT_RESULT_HPOS]; * results could be different otherwise.
VB->ClipPtr->size = 4; */
VB->ClipPtr->count = VB->Count; VB->ClipPtr = TransformRaw( &store->results[0],
&ctx->_ModelProjectMatrix,
VB->AttribPtr[0] );
/* Drivers expect this to be clean to element 4...
*/
switch (VB->ClipPtr->size) {
case 1:
/* impossible */
case 2:
_mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 2 );
/* fall-through */
case 3:
_mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 3 );
/* fall-through */
case 4:
break;
}
}
else {
/* Setup the VB pointers so that the next pipeline stages get
* their data from the right place (the program output arrays).
*/
VB->ClipPtr = &store->results[VERT_RESULT_HPOS];
VB->ClipPtr->size = 4;
VB->ClipPtr->count = VB->Count;
}
VB->ColorPtr[0] = &store->results[VERT_RESULT_COL0]; VB->ColorPtr[0] = &store->results[VERT_RESULT_COL0];
VB->ColorPtr[1] = &store->results[VERT_RESULT_BFC0]; VB->ColorPtr[1] = &store->results[VERT_RESULT_BFC0];
VB->SecondaryColorPtr[0] = &store->results[VERT_RESULT_COL1]; VB->SecondaryColorPtr[0] = &store->results[VERT_RESULT_COL1];
@@ -365,41 +454,10 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
} }
} }
/* Cliptest and perspective divide. Clip functions must clear
* the clipmask. /* Perform NDC and cliptest operations:
*/ */
store->ormask = 0; return do_ndc_cliptest(ctx, store);
store->andmask = CLIP_FRUSTUM_BITS;
if (tnl->NeedNdcCoords) {
VB->NdcPtr =
_mesa_clip_tab[VB->ClipPtr->size]( VB->ClipPtr,
&store->ndcCoords,
store->clipmask,
&store->ormask,
&store->andmask );
}
else {
VB->NdcPtr = NULL;
_mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr,
NULL,
store->clipmask,
&store->ormask,
&store->andmask );
}
if (store->andmask) /* All vertices are outside the frustum */
return GL_FALSE;
/* This is where we'd do clip testing against the user-defined
* clipping planes, but they're not supported by vertex programs.
*/
VB->ClipOrMask = store->ormask;
VB->ClipMask = store->clipmask;
return GL_TRUE;
} }
+2 -2
View File
@@ -648,12 +648,12 @@ void _tnl_generate_sse_emit( GLcontext *ctx )
p.ctx = ctx; p.ctx = ctx;
p.inputs_safe = 0; /* for now */ p.inputs_safe = 0; /* for now */
p.outputs_safe = 1; /* for now */ p.outputs_safe = 0; /* for now */
p.have_sse2 = cpu_has_xmm2; p.have_sse2 = cpu_has_xmm2;
p.identity = x86_make_reg(file_XMM, 6); p.identity = x86_make_reg(file_XMM, 6);
p.chan0 = x86_make_reg(file_XMM, 7); p.chan0 = x86_make_reg(file_XMM, 7);
if (!x86_init_func(&p.func, MAX_SSE_CODE_SIZE)) { if (!x86_init_func_size(&p.func, MAX_SSE_CODE_SIZE)) {
vtx->emit = NULL; vtx->emit = NULL;
return; return;
} }
+2 -6
View File
@@ -1,9 +1,8 @@
/* /*
* Mesa 3-D graphics library * Mesa 3-D graphics library
* Version: 3.5 * Version: 7.1
* *
* Copyright (C) 1999-2001 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -82,7 +81,4 @@ _tnl_draw_prims( GLcontext *ctx,
GLuint min_index, GLuint min_index,
GLuint max_index); GLuint max_index);
extern void
_mesa_load_tracked_matrices(GLcontext *ctx);
#endif #endif
@@ -155,10 +155,6 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
{ {
facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit; facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit;
if (DO_TWOSTENCIL && ctx->Stencil.TestTwoSide) {
ctx->_Facing = facing; /* mixed mode rendering: for 2-sided stencil test */
}
if (DO_UNFILLED) { if (DO_UNFILLED) {
if (facing) { if (facing) {
mode = ctx->Polygon.BackMode; mode = ctx->Polygon.BackMode;
@@ -421,10 +417,6 @@ static void TAG(quad)( GLcontext *ctx,
{ {
facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit; facing = AREA_IS_CCW( cc ) ^ ctx->Polygon._FrontBit;
if (DO_TWOSTENCIL && ctx->Stencil.TestTwoSide) {
ctx->_Facing = facing; /* mixed mode rendering: for 2-sided stencil test */
}
if (DO_UNFILLED) { if (DO_UNFILLED) {
if (facing) { if (facing) {
mode = ctx->Polygon.BackMode; mode = ctx->Polygon.BackMode;
+1
View File
@@ -242,6 +242,7 @@ void _vbo_DestroyContext( GLcontext *ctx )
} }
vbo_exec_destroy(ctx); vbo_exec_destroy(ctx);
vbo_save_destroy(ctx);
FREE(vbo_context(ctx)); FREE(vbo_context(ctx));
ctx->swtnl_im = NULL; ctx->swtnl_im = NULL;
} }
+3
View File
@@ -162,4 +162,7 @@ void vbo_exec_do_EvalCoord2f( struct vbo_exec_context *exec,
void vbo_exec_do_EvalCoord1f( struct vbo_exec_context *exec, void vbo_exec_do_EvalCoord1f( struct vbo_exec_context *exec,
GLfloat u); GLfloat u);
extern GLboolean
vbo_validate_shaders(GLcontext *ctx);
#endif #endif
+23 -8
View File
@@ -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 /* Build a list of primitives on the fly. Keep
* ctx->Driver.CurrentExecPrimitive uptodate as well. * ctx->Driver.CurrentExecPrimitive uptodate as well.
*/ */
@@ -491,18 +508,16 @@ static void GLAPIENTRY vbo_exec_Begin( GLenum mode )
if (ctx->NewState) { if (ctx->NewState) {
_mesa_update_state( ctx ); _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)); CALL_Begin(ctx->Exec, (mode));
return; 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 /* Heuristic: attempt to isolate attributes occuring outside
* begin/end pairs. * begin/end pairs.
*/ */
+15
View File
@@ -245,6 +245,11 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count)
if (ctx->NewState) if (ctx->NewState)
_mesa_update_state( ctx ); _mesa_update_state( ctx );
if (!vbo_validate_shaders(ctx)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawArrays(bad shader)");
return;
}
bind_arrays( ctx ); bind_arrays( ctx );
prim[0].begin = 1; prim[0].begin = 1;
@@ -280,6 +285,11 @@ vbo_exec_DrawRangeElements(GLenum mode,
if (ctx->NewState) if (ctx->NewState)
_mesa_update_state( ctx ); _mesa_update_state( ctx );
if (!vbo_validate_shaders(ctx)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawRangeElements(bad shader)");
return;
}
bind_arrays( ctx ); bind_arrays( ctx );
ib.count = count; 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 )) if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices ))
return; return;
if (!vbo_validate_shaders(ctx)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawElements(bad shader)");
return;
}
if (ctx->Array.ElementArrayBufferObj->Name) { if (ctx->Array.ElementArrayBufferObj->Name) {
const GLvoid *map = ctx->Driver.MapBuffer(ctx, const GLvoid *map = ctx->Driver.MapBuffer(ctx,
GL_ELEMENT_ARRAY_BUFFER_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB,
+15
View File
@@ -69,6 +69,21 @@ void vbo_save_init( GLcontext *ctx )
void vbo_save_destroy( GLcontext *ctx ) void vbo_save_destroy( GLcontext *ctx )
{ {
struct vbo_context *vbo = vbo_context(ctx);
struct vbo_save_context *save = &vbo->save;
if (save->prim_store) {
if ( --save->prim_store->refcount == 0 ) {
FREE( save->prim_store );
save->prim_store = NULL;
}
if ( --save->vertex_store->refcount == 0 ) {
if (save->vertex_store->bufferobj)
ctx->Driver.DeleteBuffer( ctx, save->vertex_store->bufferobj );
FREE( save->vertex_store );
save->vertex_store = NULL;
}
}
} }
+171 -82
View File
@@ -1,4 +1,4 @@
#if defined(USE_X86_ASM) || defined(SLANG_X86) #if defined(__i386__) || defined(__386__)
#include "imports.h" #include "imports.h"
#include "x86sse.h" #include "x86sse.h"
@@ -6,54 +6,78 @@
#define DISASSEM 0 #define DISASSEM 0
#define X86_TWOB 0x0f #define X86_TWOB 0x0f
static unsigned char *cptr( void (*label)() )
{
return (unsigned char *)(unsigned long)label;
}
static void do_realloc( struct x86_function *p )
{
if (p->size == 0) {
p->size = 1024;
p->store = _mesa_exec_malloc(p->size);
p->csr = p->store;
}
else {
unsigned used = p->csr - p->store;
unsigned char *tmp = p->store;
p->size *= 2;
p->store = _mesa_exec_malloc(p->size);
memcpy(p->store, tmp, used);
p->csr = p->store + used;
_mesa_exec_free(tmp);
}
}
/* Emit bytes to the instruction stream: /* Emit bytes to the instruction stream:
*/ */
static void emit_1b( struct x86_function *p, GLbyte b0 ) static unsigned char *reserve( struct x86_function *p, int bytes )
{ {
*(GLbyte *)(p->csr++) = b0; if (p->csr + bytes - p->store > p->size)
} do_realloc(p);
static void emit_1i( struct x86_function *p, GLint i0 ) {
{ unsigned char *csr = p->csr;
*(GLint *)(p->csr) = i0; p->csr += bytes;
p->csr += 4; return csr;
}
static void disassem( struct x86_function *p, const char *fn )
{
#if DISASSEM && 0
if (fn && fn != p->fn) {
_mesa_printf("0x%x: %s\n", p->csr, fn);
p->fn = fn;
} }
#endif
} }
static void emit_1ub_fn( struct x86_function *p, GLubyte b0, const char *fn )
static void emit_1b( struct x86_function *p, char b0 )
{ {
disassem(p, fn); char *csr = (char *)reserve(p, 1);
*(p->csr++) = b0; *csr = b0;
} }
static void emit_2ub_fn( struct x86_function *p, GLubyte b0, GLubyte b1, const char *fn ) static void emit_1i( struct x86_function *p, int i0 )
{ {
disassem(p, fn); int *icsr = (int *)reserve(p, sizeof(i0));
*(p->csr++) = b0; *icsr = i0;
*(p->csr++) = b1;
} }
static void emit_3ub_fn( struct x86_function *p, GLubyte b0, GLubyte b1, GLubyte b2, const char *fn ) static void emit_1ub( struct x86_function *p, unsigned char b0 )
{ {
disassem(p, fn); unsigned char *csr = reserve(p, 1);
*(p->csr++) = b0; *csr++ = b0;
*(p->csr++) = b1;
*(p->csr++) = b2;
} }
#define emit_1ub(p, b0) emit_1ub_fn(p, b0, __FUNCTION__) static void emit_2ub( struct x86_function *p, unsigned char b0, unsigned char b1 )
#define emit_2ub(p, b0, b1) emit_2ub_fn(p, b0, b1, __FUNCTION__) {
#define emit_3ub(p, b0, b1, b2) emit_3ub_fn(p, b0, b1, b2, __FUNCTION__) unsigned char *csr = reserve(p, 2);
*csr++ = b0;
*csr++ = b1;
}
static void emit_3ub( struct x86_function *p, unsigned char b0, unsigned char b1, unsigned char b2 )
{
unsigned char *csr = reserve(p, 3);
*csr++ = b0;
*csr++ = b1;
*csr++ = b2;
}
/* Build a modRM byte + possible displacement. No treatment of SIB /* Build a modRM byte + possible displacement. No treatment of SIB
@@ -63,7 +87,7 @@ static void emit_modrm( struct x86_function *p,
struct x86_reg reg, struct x86_reg reg,
struct x86_reg regmem ) struct x86_reg regmem )
{ {
GLubyte val = 0; unsigned char val = 0;
assert(reg.mod == mod_REG); assert(reg.mod == mod_REG);
@@ -71,13 +95,13 @@ static void emit_modrm( struct x86_function *p,
val |= reg.idx << 3; /* reg field */ val |= reg.idx << 3; /* reg field */
val |= regmem.idx; /* r/m field */ val |= regmem.idx; /* r/m field */
emit_1ub_fn(p, val, 0); emit_1ub(p, val);
/* Oh-oh we've stumbled into the SIB thing. /* Oh-oh we've stumbled into the SIB thing.
*/ */
if (regmem.file == file_REG32 && if (regmem.file == file_REG32 &&
regmem.idx == reg_SP) { regmem.idx == reg_SP) {
emit_1ub_fn(p, 0x24, 0); /* simplistic! */ emit_1ub(p, 0x24); /* simplistic! */
} }
switch (regmem.mod) { switch (regmem.mod) {
@@ -98,7 +122,7 @@ static void emit_modrm( struct x86_function *p,
static void emit_modrm_noreg( struct x86_function *p, static void emit_modrm_noreg( struct x86_function *p,
GLuint op, unsigned op,
struct x86_reg regmem ) struct x86_reg regmem )
{ {
struct x86_reg dummy = x86_make_reg(file_REG32, op); struct x86_reg dummy = x86_make_reg(file_REG32, op);
@@ -111,21 +135,21 @@ static void emit_modrm_noreg( struct x86_function *p,
* the arguments presented. * the arguments presented.
*/ */
static void emit_op_modrm( struct x86_function *p, static void emit_op_modrm( struct x86_function *p,
GLubyte op_dst_is_reg, unsigned char op_dst_is_reg,
GLubyte op_dst_is_mem, unsigned char op_dst_is_mem,
struct x86_reg dst, struct x86_reg dst,
struct x86_reg src ) struct x86_reg src )
{ {
switch (dst.mod) { switch (dst.mod) {
case mod_REG: case mod_REG:
emit_1ub_fn(p, op_dst_is_reg, 0); emit_1ub(p, op_dst_is_reg);
emit_modrm(p, dst, src); emit_modrm(p, dst, src);
break; break;
case mod_INDIRECT: case mod_INDIRECT:
case mod_DISP32: case mod_DISP32:
case mod_DISP8: case mod_DISP8:
assert(src.mod == mod_REG); assert(src.mod == mod_REG);
emit_1ub_fn(p, op_dst_is_mem, 0); emit_1ub(p, op_dst_is_mem);
emit_modrm(p, src, dst); emit_modrm(p, src, dst);
break; break;
default: default:
@@ -156,7 +180,7 @@ struct x86_reg x86_make_reg( enum x86_reg_file file,
} }
struct x86_reg x86_make_disp( struct x86_reg reg, struct x86_reg x86_make_disp( struct x86_reg reg,
GLint disp ) int disp )
{ {
assert(reg.file == file_REG32); assert(reg.file == file_REG32);
@@ -185,7 +209,7 @@ struct x86_reg x86_get_base_reg( struct x86_reg reg )
return x86_make_reg( reg.file, reg.idx ); return x86_make_reg( reg.file, reg.idx );
} }
GLubyte *x86_get_label( struct x86_function *p ) unsigned char *x86_get_label( struct x86_function *p )
{ {
return p->csr; return p->csr;
} }
@@ -199,13 +223,13 @@ GLubyte *x86_get_label( struct x86_function *p )
void x86_jcc( struct x86_function *p, void x86_jcc( struct x86_function *p,
enum x86_cc cc, enum x86_cc cc,
GLubyte *label ) unsigned char *label )
{ {
GLint offset = label - (x86_get_label(p) + 2); int offset = label - (x86_get_label(p) + 2);
if (offset <= 127 && offset >= -128) { if (offset <= 127 && offset >= -128) {
emit_1ub(p, 0x70 + cc); emit_1ub(p, 0x70 + cc);
emit_1b(p, (GLbyte) offset); emit_1b(p, (char) offset);
} }
else { else {
offset = label - (x86_get_label(p) + 6); offset = label - (x86_get_label(p) + 6);
@@ -216,7 +240,7 @@ void x86_jcc( struct x86_function *p,
/* Always use a 32bit offset for forward jumps: /* Always use a 32bit offset for forward jumps:
*/ */
GLubyte *x86_jcc_forward( struct x86_function *p, unsigned char *x86_jcc_forward( struct x86_function *p,
enum x86_cc cc ) enum x86_cc cc )
{ {
emit_2ub(p, 0x0f, 0x80 + cc); emit_2ub(p, 0x0f, 0x80 + cc);
@@ -224,14 +248,14 @@ GLubyte *x86_jcc_forward( struct x86_function *p,
return x86_get_label(p); return x86_get_label(p);
} }
GLubyte *x86_jmp_forward( struct x86_function *p) unsigned char *x86_jmp_forward( struct x86_function *p)
{ {
emit_1ub(p, 0xe9); emit_1ub(p, 0xe9);
emit_1i(p, 0); emit_1i(p, 0);
return x86_get_label(p); return x86_get_label(p);
} }
GLubyte *x86_call_forward( struct x86_function *p) unsigned char *x86_call_forward( struct x86_function *p)
{ {
emit_1ub(p, 0xe8); emit_1ub(p, 0xe8);
emit_1i(p, 0); emit_1i(p, 0);
@@ -241,28 +265,41 @@ GLubyte *x86_call_forward( struct x86_function *p)
/* Fixup offset from forward jump: /* Fixup offset from forward jump:
*/ */
void x86_fixup_fwd_jump( struct x86_function *p, void x86_fixup_fwd_jump( struct x86_function *p,
GLubyte *fixup ) unsigned char *fixup )
{ {
*(int *)(fixup - 4) = x86_get_label(p) - fixup; *(int *)(fixup - 4) = x86_get_label(p) - fixup;
} }
void x86_jmp( struct x86_function *p, GLubyte *label) void x86_jmp( struct x86_function *p, unsigned char *label)
{ {
emit_1ub(p, 0xe9); emit_1ub(p, 0xe9);
emit_1i(p, label - x86_get_label(p) - 4); emit_1i(p, label - x86_get_label(p) - 4);
} }
void x86_call( struct x86_function *p, GLubyte *label) #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_1ub(p, 0xe8);
emit_1i(p, label - x86_get_label(p) - 4); emit_1i(p, cptr(label) - x86_get_label(p) - 4);
} }
#else
void x86_call( struct x86_function *p, struct x86_reg reg)
{
emit_1ub(p, 0xff);
emit_modrm(p, reg, reg);
}
#endif
/* michal: /* michal:
* Temporary. As I need immediate operands, and dont want to mess with the codegen, * Temporary. As I need immediate operands, and dont want to mess with the codegen,
* I load the immediate into general purpose register and use it. * I load the immediate into general purpose register and use it.
*/ */
void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, GLint imm ) void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm )
{ {
assert(dst.mod == mod_REG); assert(dst.mod == mod_REG);
emit_1ub(p, 0xb8 + dst.idx); emit_1ub(p, 0xb8 + dst.idx);
@@ -502,6 +539,14 @@ void sse_addss( struct x86_function *p,
emit_modrm( p, dst, src ); emit_modrm( p, dst, src );
} }
void sse_andnps( struct x86_function *p,
struct x86_reg dst,
struct x86_reg src )
{
emit_2ub(p, X86_TWOB, 0x55);
emit_modrm( p, dst, src );
}
void sse_andps( struct x86_function *p, void sse_andps( struct x86_function *p,
struct x86_reg dst, struct x86_reg dst,
struct x86_reg src ) struct x86_reg src )
@@ -510,6 +555,13 @@ void sse_andps( struct x86_function *p,
emit_modrm( p, dst, src ); emit_modrm( p, dst, src );
} }
void sse_rsqrtps( struct x86_function *p,
struct x86_reg dst,
struct x86_reg src )
{
emit_2ub(p, X86_TWOB, 0x52);
emit_modrm( p, dst, src );
}
void sse_rsqrtss( struct x86_function *p, void sse_rsqrtss( struct x86_function *p,
struct x86_reg dst, struct x86_reg dst,
@@ -538,6 +590,21 @@ void sse_movlhps( struct x86_function *p,
emit_modrm( p, dst, src ); emit_modrm( p, dst, src );
} }
void sse_orps( struct x86_function *p,
struct x86_reg dst,
struct x86_reg src )
{
emit_2ub(p, X86_TWOB, 0x56);
emit_modrm( p, dst, src );
}
void sse_xorps( struct x86_function *p,
struct x86_reg dst,
struct x86_reg src )
{
emit_2ub(p, X86_TWOB, 0x57);
emit_modrm( p, dst, src );
}
void sse_cvtps2pi( struct x86_function *p, void sse_cvtps2pi( struct x86_function *p,
struct x86_reg dst, struct x86_reg dst,
@@ -559,7 +626,7 @@ void sse_cvtps2pi( struct x86_function *p,
void sse_shufps( struct x86_function *p, void sse_shufps( struct x86_function *p,
struct x86_reg dest, struct x86_reg dest,
struct x86_reg arg0, struct x86_reg arg0,
GLubyte shuf) unsigned char shuf)
{ {
emit_2ub(p, X86_TWOB, 0xC6); emit_2ub(p, X86_TWOB, 0xC6);
emit_modrm(p, dest, arg0); emit_modrm(p, dest, arg0);
@@ -569,13 +636,21 @@ void sse_shufps( struct x86_function *p,
void sse_cmpps( struct x86_function *p, void sse_cmpps( struct x86_function *p,
struct x86_reg dest, struct x86_reg dest,
struct x86_reg arg0, struct x86_reg arg0,
GLubyte cc) unsigned char cc)
{ {
emit_2ub(p, X86_TWOB, 0xC2); emit_2ub(p, X86_TWOB, 0xC2);
emit_modrm(p, dest, arg0); emit_modrm(p, dest, arg0);
emit_1ub(p, cc); emit_1ub(p, cc);
} }
void sse_pmovmskb( struct x86_function *p,
struct x86_reg dest,
struct x86_reg src)
{
emit_3ub(p, 0x66, X86_TWOB, 0xD7);
emit_modrm(p, dest, src);
}
/*********************************************************************** /***********************************************************************
* SSE2 instructions * SSE2 instructions
*/ */
@@ -586,13 +661,21 @@ void sse_cmpps( struct x86_function *p,
void sse2_pshufd( struct x86_function *p, void sse2_pshufd( struct x86_function *p,
struct x86_reg dest, struct x86_reg dest,
struct x86_reg arg0, struct x86_reg arg0,
GLubyte shuf) unsigned char shuf)
{ {
emit_3ub(p, 0x66, X86_TWOB, 0x70); emit_3ub(p, 0x66, X86_TWOB, 0x70);
emit_modrm(p, dest, arg0); emit_modrm(p, dest, arg0);
emit_1ub(p, shuf); emit_1ub(p, shuf);
} }
void sse2_cvttps2dq( struct x86_function *p,
struct x86_reg dst,
struct x86_reg src )
{
emit_3ub( p, 0xF3, X86_TWOB, 0x5B );
emit_modrm( p, dst, src );
}
void sse2_cvtps2dq( struct x86_function *p, void sse2_cvtps2dq( struct x86_function *p,
struct x86_reg dst, struct x86_reg dst,
struct x86_reg src ) struct x86_reg src )
@@ -625,6 +708,14 @@ void sse2_packuswb( struct x86_function *p,
emit_modrm( p, dst, src ); emit_modrm( p, dst, src );
} }
void sse2_rcpps( struct x86_function *p,
struct x86_reg dst,
struct x86_reg src )
{
emit_2ub(p, X86_TWOB, 0x53);
emit_modrm( p, dst, src );
}
void sse2_rcpss( struct x86_function *p, void sse2_rcpss( struct x86_function *p,
struct x86_reg dst, struct x86_reg dst,
struct x86_reg src ) struct x86_reg src )
@@ -712,11 +803,11 @@ void x87_fclex( struct x86_function *p )
static void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86_reg arg, static void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86_reg arg,
GLubyte dst0ub0, unsigned char dst0ub0,
GLubyte dst0ub1, unsigned char dst0ub1,
GLubyte arg0ub0, unsigned char arg0ub0,
GLubyte arg0ub1, unsigned char arg0ub1,
GLubyte argmem_noreg) unsigned char argmem_noreg)
{ {
assert(dst.file == file_x87); assert(dst.file == file_x87);
@@ -729,7 +820,7 @@ static void x87_arith_op( struct x86_function *p, struct x86_reg dst, struct x86
assert(0); assert(0);
} }
else if (dst.idx == 0) { else if (dst.idx == 0) {
assert(arg.file = file_REG32); assert(arg.file == file_REG32);
emit_1ub(p, 0xd8); emit_1ub(p, 0xd8);
emit_modrm_noreg(p, argmem_noreg, arg); emit_modrm_noreg(p, argmem_noreg, arg);
} }
@@ -1056,44 +1147,42 @@ void mmx_movq( struct x86_function *p,
* account any push/pop activity: * account any push/pop activity:
*/ */
struct x86_reg x86_fn_arg( struct x86_function *p, struct x86_reg x86_fn_arg( struct x86_function *p,
GLuint arg ) unsigned arg )
{ {
return x86_make_disp(x86_make_reg(file_REG32, reg_SP), return x86_make_disp(x86_make_reg(file_REG32, reg_SP),
p->stack_offset + arg * 4); /* ??? */ p->stack_offset + arg * 4); /* ??? */
} }
/** void x86_init_func( struct x86_function *p )
* Initialize an x86_function object, allocating space for up to
* 'code_size' bytes of code.
*/
GLboolean x86_init_func( struct x86_function *p, GLuint code_size )
{ {
assert(!p->store); p->size = 0;
p->store = NULL;
p->csr = p->store;
}
int x86_init_func_size( struct x86_function *p, unsigned code_size )
{
p->size = code_size;
p->store = _mesa_exec_malloc(code_size); p->store = _mesa_exec_malloc(code_size);
if (p->store) { p->csr = p->store;
p->csr = p->store; return p->store != NULL;
return GL_TRUE;
}
else {
p->csr = NULL;
return GL_FALSE;
}
} }
void x86_release_func( struct x86_function *p ) void x86_release_func( struct x86_function *p )
{ {
if (p->store) _mesa_exec_free(p->store);
_mesa_exec_free(p->store); p->store = NULL;
p->store = p->csr = NULL; p->csr = NULL;
p->size = 0;
} }
void (*x86_get_func( struct x86_function *p ))(void) void (*x86_get_func( struct x86_function *p ))(void)
{ {
if (DISASSEM) if (DISASSEM && p->store)
_mesa_printf("disassemble %p %p\n", p->store, p->csr); _mesa_printf("disassemble %p %p\n", p->store, p->csr);
return (void (*)(void))p->store; return (void (*)(void)) (unsigned long) p->store;
} }
#else #else
+37 -26
View File
@@ -2,26 +2,25 @@
#ifndef _X86SSE_H_ #ifndef _X86SSE_H_
#define _X86SSE_H_ #define _X86SSE_H_
#if defined(USE_X86_ASM) || defined(SLANG_X86) #if defined(__i386__) || defined(__386__)
#include "glheader.h"
/* It is up to the caller to ensure that instructions issued are /* It is up to the caller to ensure that instructions issued are
* suitable for the host cpu. There are no checks made in this module * suitable for the host cpu. There are no checks made in this module
* for mmx/sse/sse2 support on the cpu. * for mmx/sse/sse2 support on the cpu.
*/ */
struct x86_reg { struct x86_reg {
GLuint file:3; unsigned file:3;
GLuint idx:3; unsigned idx:3;
GLuint mod:2; /* mod_REG if this is just a register */ unsigned mod:2; /* mod_REG if this is just a register */
GLint disp:24; /* only +/- 23bits of offset - should be enough... */ int disp:24; /* only +/- 23bits of offset - should be enough... */
}; };
struct x86_function { struct x86_function {
GLubyte *store; unsigned size;
GLubyte *csr; unsigned char *store;
GLuint stack_offset; unsigned char *csr;
GLint need_emms; unsigned stack_offset;
int need_emms;
const char *fn; const char *fn;
}; };
@@ -80,7 +79,8 @@ enum sse_cc {
*/ */
GLboolean x86_init_func( struct x86_function *p, GLuint code_size ); void x86_init_func( struct x86_function *p );
int x86_init_func_size( struct x86_function *p, unsigned code_size );
void x86_release_func( struct x86_function *p ); void x86_release_func( struct x86_function *p );
void (*x86_get_func( struct x86_function *p ))( void ); void (*x86_get_func( struct x86_function *p ))( void );
@@ -92,7 +92,7 @@ struct x86_reg x86_make_reg( enum x86_reg_file file,
enum x86_reg_name idx ); enum x86_reg_name idx );
struct x86_reg x86_make_disp( struct x86_reg reg, struct x86_reg x86_make_disp( struct x86_reg reg,
GLint disp ); int disp );
struct x86_reg x86_deref( struct x86_reg reg ); struct x86_reg x86_deref( struct x86_reg reg );
@@ -101,31 +101,32 @@ struct x86_reg x86_get_base_reg( struct x86_reg reg );
/* Labels, jumps and fixup: /* Labels, jumps and fixup:
*/ */
GLubyte *x86_get_label( struct x86_function *p ); unsigned char *x86_get_label( struct x86_function *p );
void x86_jcc( struct x86_function *p, void x86_jcc( struct x86_function *p,
enum x86_cc cc, enum x86_cc cc,
GLubyte *label ); unsigned char *label );
GLubyte *x86_jcc_forward( struct x86_function *p, unsigned char *x86_jcc_forward( struct x86_function *p,
enum x86_cc cc ); enum x86_cc cc );
GLubyte *x86_jmp_forward( struct x86_function *p); unsigned char *x86_jmp_forward( struct x86_function *p);
GLubyte *x86_call_forward( struct x86_function *p); unsigned char *x86_call_forward( struct x86_function *p);
void x86_fixup_fwd_jump( struct x86_function *p, void x86_fixup_fwd_jump( struct x86_function *p,
GLubyte *fixup ); unsigned char *fixup );
void x86_jmp( struct x86_function *p, GLubyte *label ); void x86_jmp( struct x86_function *p, unsigned char *label );
void x86_call( struct x86_function *p, GLubyte *label ); /* void x86_call( struct x86_function *p, void (*label)() ); */
void x86_call( struct x86_function *p, struct x86_reg reg);
/* michal: /* michal:
* Temporary. As I need immediate operands, and dont want to mess with the codegen, * Temporary. As I need immediate operands, and dont want to mess with the codegen,
* I load the immediate into general purpose register and use it. * I load the immediate into general purpose register and use it.
*/ */
void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, GLint imm ); void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm );
/* Macro for sse_shufps() and sse2_pshufd(): /* Macro for sse_shufps() and sse2_pshufd():
@@ -141,19 +142,24 @@ void mmx_packssdw( struct x86_function *p, struct x86_reg dst, struct x86_reg sr
void mmx_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void mmx_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse2_cvtps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 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_movd( 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_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 ); void sse2_packsswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse2_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse2_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse2_pshufd( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, GLubyte shuf ); void sse2_pshufd( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0,
unsigned char shuf );
void sse2_rcpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse2_rcpss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse2_rcpss( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_addps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_addps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_addss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_addss( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_cvtps2pi( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_cvtps2pi( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_divss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_divss( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_andnps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_andps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_andps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_cmpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src, GLubyte cc ); void sse_cmpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src,
unsigned char cc );
void sse_maxps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_maxps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_maxss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_maxss( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_minps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_minps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
@@ -166,9 +172,14 @@ void sse_movss( struct x86_function *p, struct x86_reg dst, struct x86_reg src )
void sse_movups( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_movups( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_mulps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_mulps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_mulss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_mulss( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_orps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_xorps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
void sse_subps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_subps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
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_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, GLubyte shuf ); void sse_shufps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0,
unsigned char shuf );
void sse_pmovmskb( struct x86_function *p, struct x86_reg dest, struct x86_reg src );
void x86_add( 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 ); void x86_and( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
@@ -239,7 +250,7 @@ void x87_fucom( struct x86_function *p, struct x86_reg arg );
* account any push/pop activity. Note - doesn't track explict * account any push/pop activity. Note - doesn't track explict
* manipulation of ESP by other instructions. * manipulation of ESP by other instructions.
*/ */
struct x86_reg x86_fn_arg( struct x86_function *p, GLuint arg ); struct x86_reg x86_fn_arg( struct x86_function *p, unsigned arg );
#endif #endif
#endif #endif