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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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) || \
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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) */
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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*/
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user