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 */
|
||||
/* glext.h last updated 2007/02/12 */
|
||||
/* glext.h last updated 2008/03/24 */
|
||||
/* Current version at http://www.opengl.org/registry/ */
|
||||
#define GL_GLEXT_VERSION 39
|
||||
#define GL_GLEXT_VERSION 40
|
||||
|
||||
#ifndef GL_VERSION_1_2
|
||||
#define GL_UNSIGNED_BYTE_3_3_2 0x8032
|
||||
@@ -3091,8 +3091,8 @@ extern "C" {
|
||||
#ifndef GL_EXT_framebuffer_blit
|
||||
#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
|
||||
#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
|
||||
#define GL_READ_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT
|
||||
#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CAA
|
||||
#define GL_DRAW_FRAMEBUFFER_BINDING_EXT GL_FRAMEBUFFER_BINDING_EXT
|
||||
#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
|
||||
#endif
|
||||
|
||||
#ifndef GL_EXT_framebuffer_multisample
|
||||
@@ -3379,6 +3379,9 @@ extern "C" {
|
||||
#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E
|
||||
#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);
|
||||
#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
|
||||
}
|
||||
|
||||
@@ -112,6 +112,8 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
|
||||
driver->DeleteTexture = _mesa_delete_texture_object;
|
||||
driver->NewTextureImage = _mesa_new_texture_image;
|
||||
driver->FreeTexImageData = _mesa_free_texture_image_data;
|
||||
driver->MapTexture = NULL;
|
||||
driver->UnmapTexture = NULL;
|
||||
driver->TextureMemCpy = _mesa_memcpy;
|
||||
driver->IsTextureResident = NULL;
|
||||
driver->PrioritizeTexture = NULL;
|
||||
|
||||
@@ -271,6 +271,14 @@ draw_buffer_enum_to_bitmask(GLenum buffer)
|
||||
return BUFFER_BIT_COLOR2;
|
||||
case GL_COLOR_ATTACHMENT3_EXT:
|
||||
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:
|
||||
/* error */
|
||||
return BAD_MASK;
|
||||
@@ -320,6 +328,14 @@ read_buffer_enum_to_index(GLenum buffer)
|
||||
return BUFFER_COLOR2;
|
||||
case GL_COLOR_ATTACHMENT3_EXT:
|
||||
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:
|
||||
/* error */
|
||||
return -1;
|
||||
|
||||
@@ -209,7 +209,7 @@
|
||||
/** For GL_ARB_vertex_shader */
|
||||
/*@{*/
|
||||
#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)
|
||||
/*@}*/
|
||||
|
||||
|
||||
@@ -640,7 +640,12 @@ delete_framebuffer_cb(GLuint id, void *data, void *userData)
|
||||
*/
|
||||
/*assert(fb->RefCount == 1);*/
|
||||
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);
|
||||
#endif
|
||||
#if FEATURE_ARB_vertex_program
|
||||
_mesa_delete_program(ctx, ss->DefaultVertexProgram);
|
||||
ctx->Driver.DeleteProgram(ctx, ss->DefaultVertexProgram);
|
||||
#endif
|
||||
#if FEATURE_ARB_fragment_program
|
||||
_mesa_delete_program(ctx, ss->DefaultFragmentProgram);
|
||||
ctx->Driver.DeleteProgram(ctx, ss->DefaultFragmentProgram);
|
||||
#endif
|
||||
|
||||
#if FEATURE_ATI_fragment_shader
|
||||
@@ -749,7 +754,7 @@ _mesa_init_current(GLcontext *ctx)
|
||||
}
|
||||
|
||||
/* 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_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 );
|
||||
@@ -977,7 +982,6 @@ init_attrib_groups(GLcontext *ctx)
|
||||
/* Miscellaneous */
|
||||
ctx->NewState = _NEW_ALL;
|
||||
ctx->ErrorValue = (GLenum) GL_NO_ERROR;
|
||||
ctx->_Facing = 0;
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -272,10 +272,10 @@ do { \
|
||||
(((CTX)->Light.Enabled && \
|
||||
(CTX)->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) \
|
||||
|| (CTX)->Fog.ColorSumEnabled \
|
||||
|| ((CTX)->VertexProgram._Enabled && \
|
||||
((CTX)->VertexProgram.Current->Base.InputsRead & VERT_BIT_COLOR1)) \
|
||||
|| ((CTX)->FragmentProgram._Enabled && \
|
||||
((CTX)->FragmentProgram.Current->Base.InputsRead & FRAG_BIT_COL1)) \
|
||||
|| ((CTX)->VertexProgram._Current && \
|
||||
((CTX)->VertexProgram._Current->Base.InputsRead & VERT_BIT_COLOR1)) \
|
||||
|| ((CTX)->FragmentProgram._Current && \
|
||||
((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 );
|
||||
|
||||
/** 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
|
||||
* like it belongs here, except that the driver is the only entity
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* 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
|
||||
* 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 (bitmap) {
|
||||
/* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */
|
||||
GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig);
|
||||
GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig);
|
||||
ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );
|
||||
}
|
||||
/* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */
|
||||
GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig);
|
||||
GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig);
|
||||
ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );
|
||||
}
|
||||
#if _HAVE_FULL_GL
|
||||
else if (ctx->RenderMode == GL_FEEDBACK) {
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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:
|
||||
if (ctx->Light.Enabled == state)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_LIGHT);
|
||||
ctx->Light.Enabled = state;
|
||||
if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
|
||||
ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
|
||||
else
|
||||
ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE;
|
||||
FLUSH_VERTICES(ctx, _NEW_LIGHT);
|
||||
ctx->Light.Enabled = state;
|
||||
break;
|
||||
case GL_LINE_SMOOTH:
|
||||
if (ctx->Line.SmoothFlag == state)
|
||||
|
||||
@@ -302,7 +302,7 @@ test_attachment_completeness(const GLcontext *ctx, GLenum format,
|
||||
/* OK */
|
||||
}
|
||||
else if (ctx->Extensions.EXT_packed_depth_stencil &&
|
||||
att->Renderbuffer->_BaseFormat == GL_DEPTH_STENCIL_EXT) {
|
||||
texImage->TexFormat->BaseFormat == GL_DEPTH_STENCIL_EXT) {
|
||||
/* OK */
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1864,6 +1864,10 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
|
||||
CHECK_EXT1(EXT_framebuffer_object, "GetBooleanv");
|
||||
params[0] = INT_TO_BOOLEAN(ctx->Const.MaxRenderbufferSize);
|
||||
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:
|
||||
CHECK_EXT1(ARB_fragment_shader, "GetBooleanv");
|
||||
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");
|
||||
params[0] = (GLfloat)(ctx->Const.MaxRenderbufferSize);
|
||||
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:
|
||||
CHECK_EXT1(ARB_fragment_shader, "GetFloatv");
|
||||
params[0] = (GLfloat)(ctx->Const.FragmentProgram.MaxUniformComponents);
|
||||
@@ -5526,6 +5534,10 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
|
||||
CHECK_EXT1(EXT_framebuffer_object, "GetIntegerv");
|
||||
params[0] = ctx->Const.MaxRenderbufferSize;
|
||||
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:
|
||||
CHECK_EXT1(ARB_fragment_shader, "GetIntegerv");
|
||||
params[0] = ctx->Const.FragmentProgram.MaxUniformComponents;
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
#endif
|
||||
|
||||
|
||||
#if (!defined(__GNUC__) || __GNUC__ < 3) && !defined(__IBMC__)
|
||||
#if (!defined(__GNUC__) || __GNUC__ < 3) && (!defined(__IBMC__) || __IBMC__ < 900)
|
||||
# define __builtin_expect(x, y) x
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.2
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -159,7 +159,7 @@ typedef union { GLfloat f; GLint i; } fi_type;
|
||||
***/
|
||||
#if defined(__i386__) || defined(__386__) || defined(__sparc__) || \
|
||||
defined(__s390x__) || defined(__powerpc__) || \
|
||||
defined(__amd64__) || \
|
||||
defined(__amd64__) || defined(__x86_64__) || \
|
||||
defined(ia64) || defined(__ia64__) || \
|
||||
defined(__hppa__) || defined(hpux) || \
|
||||
defined(__mips) || defined(_MIPS_ARCH) || \
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* 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 */
|
||||
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 MinSize, MaxSize; /**< GL_EXT_point_parameters */
|
||||
GLfloat Threshold; /**< GL_EXT_point_parameters */
|
||||
@@ -3032,12 +3032,6 @@ struct __GLcontextRec
|
||||
|
||||
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 */
|
||||
/*@{*/
|
||||
GLboolean FirstTimeCurrent;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.0.1
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -57,6 +57,7 @@ _mesa_PointSize( GLfloat size )
|
||||
|
||||
FLUSH_VERTICES(ctx, _NEW_POINT);
|
||||
ctx->Point.Size = size;
|
||||
/* _Size is only used for non-attenuated path */
|
||||
ctx->Point._Size = CLAMP(ctx->Point.Size,
|
||||
ctx->Point.MinSize,
|
||||
ctx->Point.MaxSize);
|
||||
@@ -150,6 +151,10 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_POINT);
|
||||
ctx->Point.MinSize = params[0];
|
||||
/* re-clamp _Size */
|
||||
ctx->Point._Size = CLAMP(ctx->Point.Size,
|
||||
ctx->Point.MinSize,
|
||||
ctx->Point.MaxSize);
|
||||
}
|
||||
else {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM,
|
||||
@@ -168,6 +173,10 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, _NEW_POINT);
|
||||
ctx->Point.MaxSize = params[0];
|
||||
/* re-clamp _Size */
|
||||
ctx->Point._Size = CLAMP(ctx->Point.Size,
|
||||
ctx->Point.MinSize,
|
||||
ctx->Point.MaxSize);
|
||||
}
|
||||
else {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM,
|
||||
|
||||
@@ -960,7 +960,7 @@ update_program(GLcontext *ctx)
|
||||
ctx->FragmentProgram._Enabled = ctx->FragmentProgram.Enabled
|
||||
&& ctx->FragmentProgram.Current->Base.Instructions;
|
||||
ctx->ATIFragmentShader._Enabled = ctx->ATIFragmentShader.Enabled
|
||||
&& ctx->ATIFragmentShader.Current->Instructions;
|
||||
&& ctx->ATIFragmentShader.Current->Instructions[0];
|
||||
|
||||
/*
|
||||
* 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++) {
|
||||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
|
||||
|
||||
if (!texUnit->_ReallyEnabled)
|
||||
|
||||
if (!texUnit->_ReallyEnabled || !texUnit->Enabled)
|
||||
continue;
|
||||
|
||||
key->unit[i].enabled = 1;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* 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
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -2177,9 +2177,6 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!pixels)
|
||||
return;
|
||||
|
||||
_mesa_lock_texture(ctx, texObj);
|
||||
{
|
||||
texImage = _mesa_select_tex_image(ctx, texObj, target, level);
|
||||
@@ -2554,8 +2551,8 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
|
||||
}
|
||||
else {
|
||||
/* no error, set the tex image parameters */
|
||||
_mesa_init_teximage_fields(ctx, target, texImage, width, height, 1,
|
||||
border, internalFormat);
|
||||
_mesa_init_teximage_fields(ctx, target, texImage, width, height,
|
||||
depth, border, internalFormat);
|
||||
texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx,
|
||||
internalFormat, format, type);
|
||||
}
|
||||
|
||||
@@ -854,7 +854,8 @@ _mesa_BindTexture( GLenum target, GLuint texName )
|
||||
newTexObj = ctx->Shared->DefaultRect;
|
||||
break;
|
||||
default:
|
||||
; /* Bad targets are caught above */
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glBindTexture(target)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -926,6 +927,7 @@ _mesa_BindTexture( GLenum target, GLuint texName )
|
||||
_mesa_reference_texobj(&texUnit->CurrentRect, newTexObj);
|
||||
break;
|
||||
default:
|
||||
/* Bad target should be caught above */
|
||||
_mesa_problem(ctx, "bad target in BindTexture");
|
||||
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]); */
|
||||
|
||||
if (srcRowStride == dstRowStride &&
|
||||
srcComponents == dstComponents &&
|
||||
srcRowStride == srcWidth * srcComponents &&
|
||||
dimensions < 3) {
|
||||
/* 1 and 2D images only */
|
||||
|
||||
@@ -443,7 +443,7 @@ void GLAPIENTRY
|
||||
_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
|
||||
GLsizei stride, const GLvoid *ptr)
|
||||
{
|
||||
const GLboolean normalized = GL_FALSE;
|
||||
GLboolean normalized = GL_FALSE;
|
||||
GLsizei elementSize;
|
||||
GET_CURRENT_CONTEXT(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 */
|
||||
switch (type) {
|
||||
case GL_UNSIGNED_BYTE:
|
||||
normalized = GL_TRUE;
|
||||
elementSize = size * sizeof(GLubyte);
|
||||
break;
|
||||
case GL_SHORT:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* 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
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -30,8 +30,8 @@
|
||||
/* Mesa version */
|
||||
#define MESA_MAJOR 7
|
||||
#define MESA_MINOR 0
|
||||
#define MESA_PATCH 2
|
||||
#define MESA_VERSION_STRING "7.0.2"
|
||||
#define MESA_PATCH 3
|
||||
#define MESA_VERSION_STRING "7.0.3"
|
||||
|
||||
/* To make version comparison easy */
|
||||
#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->Base.InputsRead |= (1 << *inputReg);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1759,7 +1757,7 @@ parse_param_elements (GLcontext * ctx, const GLubyte ** inst,
|
||||
{
|
||||
GLint idx;
|
||||
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];
|
||||
|
||||
switch (*(*inst)++) {
|
||||
@@ -2565,6 +2563,11 @@ parse_src_reg (GLcontext * ctx, const GLubyte ** inst,
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -3916,7 +3919,7 @@ _mesa_parse_arb_vertex_program(GLcontext *ctx, GLenum target,
|
||||
ASSERT(target == GL_VERTEX_PROGRAM_ARB);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
|
||||
struct gl_vertex_program *prog = ctx->VertexProgram.Current;
|
||||
_mesa_parse_arb_vertex_program(ctx, target, string, len, prog);
|
||||
|
||||
if (ctx->Driver.ProgramStringNotify)
|
||||
if (ctx->Program.ErrorPos == -1 && ctx->Driver.ProgramStringNotify)
|
||||
ctx->Driver.ProgramStringNotify( ctx, target, &prog->Base );
|
||||
}
|
||||
else if (target == GL_FRAGMENT_PROGRAM_ARB
|
||||
@@ -237,7 +237,7 @@ _mesa_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
|
||||
struct gl_fragment_program *prog = ctx->FragmentProgram.Current;
|
||||
_mesa_parse_arb_fragment_program(ctx, target, string, len, prog);
|
||||
|
||||
if (ctx->Driver.ProgramStringNotify)
|
||||
if (ctx->Program.ErrorPos == -1 && ctx->Driver.ProgramStringNotify)
|
||||
ctx->Driver.ProgramStringNotify( ctx, target, &prog->Base );
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -905,6 +905,8 @@
|
||||
"stateTexEnvProperty\n"
|
||||
" \"color\" .emit TEX_ENV_COLOR;\n"
|
||||
"optLegacyTexUnitNum\n"
|
||||
" optLegacyTexUnitNum_1 .or .true .emit 0x00;\n"
|
||||
"optLegacyTexUnitNum_1\n"
|
||||
" lbracket_ne .and legacyTexUnitNum .and rbracket;\n"
|
||||
"legacyTexUnitNum\n"
|
||||
" integer;\n"
|
||||
@@ -1221,11 +1223,11 @@
|
||||
"white_char\n"
|
||||
" ' ' .or '\\t' .or '\\n' .or '\\r';\n"
|
||||
"comment_block\n"
|
||||
" '#' .and .loop comment_char .and new_line;\n"
|
||||
" '#' .and .loop comment_char .and optional_new_line;\n"
|
||||
"comment_char\n"
|
||||
" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
|
||||
"new_line\n"
|
||||
" '\\n' .or crlf .or '\\0';\n"
|
||||
"optional_new_line\n"
|
||||
" '\\n' .or crlf .or .true;\n"
|
||||
"crlf\n"
|
||||
" '\\r' .and '\\n';\n"
|
||||
"semicolon\n"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -46,9 +46,6 @@
|
||||
#include "slang_library_noise.h"
|
||||
|
||||
|
||||
/* See comments below for info about this */
|
||||
#define LAMBDA_ZERO 1
|
||||
|
||||
/* debug predicate */
|
||||
#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.
|
||||
*/
|
||||
@@ -1306,33 +1333,18 @@ _mesa_execute_program(GLcontext * ctx,
|
||||
}
|
||||
break;
|
||||
case OPCODE_TEX: /* Both ARB and NV frag prog */
|
||||
/* Texel lookup */
|
||||
/* Simple texel lookup */
|
||||
{
|
||||
/* Note: only use the precomputed lambda value when we're
|
||||
* sampling texture unit [K] with texcoord[K].
|
||||
* Otherwise, the lambda value may have no relation to the
|
||||
* instruction's texcoord or texture image. Using the wrong
|
||||
* lambda is usually bad news.
|
||||
* The rest of the time, just use zero (until we get a more
|
||||
* sophisticated way of computing lambda).
|
||||
*/
|
||||
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);
|
||||
GLfloat texcoord[4], color[4];
|
||||
fetch_vector4(&inst->SrcReg[0], machine, texcoord);
|
||||
|
||||
fetch_texel(ctx, machine, inst, texcoord, 0.0, color);
|
||||
|
||||
if (DEBUG_PROG) {
|
||||
printf("TEX (%g, %g, %g, %g) = texture[%d][%g, %g, %g, %g], "
|
||||
"lod %f\n",
|
||||
printf("TEX (%g, %g, %g, %g) = texture[%d][%g, %g, %g, %g]\n",
|
||||
color[0], color[1], color[2], color[3],
|
||||
inst->TexSrcUnit,
|
||||
coord[0], coord[1], coord[2], coord[3], lambda);
|
||||
texcoord[0], texcoord[1], texcoord[2], texcoord[3]);
|
||||
}
|
||||
store_vector4(inst, machine, color);
|
||||
}
|
||||
@@ -1342,21 +1354,18 @@ _mesa_execute_program(GLcontext * ctx,
|
||||
{
|
||||
const struct gl_texture_unit *texUnit
|
||||
= &ctx->Texture.Unit[inst->TexSrcUnit];
|
||||
GLfloat coord[4], color[4], lambda, bias;
|
||||
#if 0
|
||||
if (inst->SrcReg[0].File == PROGRAM_INPUT &&
|
||||
inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit)
|
||||
lambda = span->array->lambda[inst->TexSrcUnit][column];
|
||||
else
|
||||
#endif
|
||||
lambda = 0.0;
|
||||
fetch_vector4(&inst->SrcReg[0], machine, coord);
|
||||
/* coord[3] is the bias to add to lambda */
|
||||
bias = texUnit->LodBias + coord[3];
|
||||
if (texUnit->_Current)
|
||||
bias += texUnit->_Current->LodBias;
|
||||
machine->FetchTexelLod(ctx, coord, lambda + bias,
|
||||
inst->TexSrcUnit, color);
|
||||
GLfloat texcoord[4], color[4], lodBias;
|
||||
|
||||
fetch_vector4(&inst->SrcReg[0], machine, texcoord);
|
||||
|
||||
/* texcoord[3] is the bias to add to lambda */
|
||||
lodBias = texUnit->LodBias + texcoord[3];
|
||||
if (texUnit->_Current) {
|
||||
lodBias += texUnit->_Current->LodBias;
|
||||
}
|
||||
|
||||
fetch_texel(ctx, machine, inst, texcoord, lodBias, color);
|
||||
|
||||
store_vector4(inst, machine, color);
|
||||
}
|
||||
break;
|
||||
@@ -1368,6 +1377,7 @@ _mesa_execute_program(GLcontext * ctx,
|
||||
fetch_vector4(&inst->SrcReg[1], machine, dtdx);
|
||||
fetch_vector4(&inst->SrcReg[2], machine, dtdy);
|
||||
machine->FetchTexelDeriv(ctx, texcoord, dtdx, dtdy,
|
||||
0.0, /* lodBias */
|
||||
inst->TexSrcUnit, color);
|
||||
store_vector4(inst, machine, color);
|
||||
}
|
||||
@@ -1375,14 +1385,8 @@ _mesa_execute_program(GLcontext * ctx,
|
||||
case OPCODE_TXP: /* GL_ARB_fragment_program only */
|
||||
/* Texture lookup w/ projective divide */
|
||||
{
|
||||
GLfloat texcoord[4], color[4], lambda;
|
||||
#if 0
|
||||
if (inst->SrcReg[0].File == PROGRAM_INPUT &&
|
||||
inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit)
|
||||
lambda = span->array->lambda[inst->TexSrcUnit][column];
|
||||
else
|
||||
#endif
|
||||
lambda = 0.0;
|
||||
GLfloat texcoord[4], color[4];
|
||||
|
||||
fetch_vector4(&inst->SrcReg[0], machine, texcoord);
|
||||
/* Not so sure about this test - if texcoord[3] is
|
||||
* 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[2] /= texcoord[3];
|
||||
}
|
||||
machine->FetchTexelLod(ctx, texcoord, lambda,
|
||||
inst->TexSrcUnit, color);
|
||||
|
||||
fetch_texel(ctx, machine, inst, texcoord, 0.0, color);
|
||||
|
||||
store_vector4(inst, machine, color);
|
||||
}
|
||||
break;
|
||||
case OPCODE_TXP_NV: /* GL_NV_fragment_program only */
|
||||
/* Texture lookup w/ projective divide */
|
||||
/* Texture lookup w/ projective divide, as above, but do not
|
||||
* do the divide by w if sampling from a cube map.
|
||||
*/
|
||||
{
|
||||
GLfloat texcoord[4], color[4], lambda;
|
||||
#if 0
|
||||
if (inst->SrcReg[0].File == PROGRAM_INPUT &&
|
||||
inst->SrcReg[0].Index == FRAG_ATTRIB_TEX0 + inst->TexSrcUnit)
|
||||
lambda = span->array->lambda[inst->TexSrcUnit][column];
|
||||
else
|
||||
#endif
|
||||
lambda = 0.0;
|
||||
GLfloat texcoord[4], color[4];
|
||||
|
||||
fetch_vector4(&inst->SrcReg[0], machine, texcoord);
|
||||
if (inst->TexSrcTarget != TEXTURE_CUBE_INDEX &&
|
||||
texcoord[3] != 0.0) {
|
||||
@@ -1416,8 +1417,9 @@ _mesa_execute_program(GLcontext * ctx,
|
||||
texcoord[1] /= texcoord[3];
|
||||
texcoord[2] /= texcoord[3];
|
||||
}
|
||||
machine->FetchTexelLod(ctx, texcoord, lambda,
|
||||
inst->TexSrcUnit, color);
|
||||
|
||||
fetch_texel(ctx, machine, inst, texcoord, 0.0, color);
|
||||
|
||||
store_vector4(inst, machine, color);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -32,6 +32,7 @@ typedef void (*FetchTexelLodFunc)(GLcontext *ctx, const GLfloat texcoord[4],
|
||||
typedef void (*FetchTexelDerivFunc)(GLcontext *ctx, const GLfloat texcoord[4],
|
||||
const GLfloat texdx[4],
|
||||
const GLfloat texdy[4],
|
||||
GLfloat lodBias,
|
||||
GLuint unit, GLfloat color[4]);
|
||||
|
||||
|
||||
|
||||
@@ -384,7 +384,7 @@ sizeof_state_reference(const GLint *stateTokens)
|
||||
* PARAM ambient = state.material.front.ambient;
|
||||
*
|
||||
* \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.
|
||||
*/
|
||||
GLint
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.0
|
||||
* Version: 7.1
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -181,7 +181,7 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
|
||||
ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i];
|
||||
}
|
||||
/* [3] = material alpha */
|
||||
value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3];
|
||||
value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][3];
|
||||
return;
|
||||
case STATE_DIFFUSE:
|
||||
for (i = 0; i < 3; i++) {
|
||||
@@ -197,7 +197,7 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
|
||||
ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i];
|
||||
}
|
||||
/* [3] = material alpha */
|
||||
value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3];
|
||||
value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][3];
|
||||
return;
|
||||
default:
|
||||
_mesa_problem(ctx, "Invalid lightprod state in fetch_state");
|
||||
@@ -349,7 +349,7 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
|
||||
value[0] = ctx->Viewport.Near; /* near */
|
||||
value[1] = ctx->Viewport.Far; /* far */
|
||||
value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */
|
||||
value[3] = 0;
|
||||
value[3] = 1.0;
|
||||
return;
|
||||
case STATE_FRAGMENT_PROGRAM:
|
||||
{
|
||||
@@ -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
|
||||
* 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
|
||||
* 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]);
|
||||
|
||||
|
||||
extern void
|
||||
_mesa_load_tracked_matrices(GLcontext *ctx);
|
||||
|
||||
|
||||
#endif /* PROG_STATEVARS_H */
|
||||
|
||||
@@ -343,7 +343,7 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)
|
||||
clone->Format = prog->Format;
|
||||
clone->Instructions = _mesa_alloc_instructions(prog->NumInstructions);
|
||||
if (!clone->Instructions) {
|
||||
_mesa_delete_program(ctx, clone);
|
||||
ctx->Driver.DeleteProgram(ctx, clone);
|
||||
return NULL;
|
||||
}
|
||||
_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 */
|
||||
shProg->VertexProgram->Base.Parameters = NULL;
|
||||
}
|
||||
_mesa_delete_program(ctx, &shProg->VertexProgram->Base);
|
||||
ctx->Driver.DeleteProgram(ctx, &shProg->VertexProgram->Base);
|
||||
shProg->VertexProgram = NULL;
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ _mesa_clear_shader_program_data(GLcontext *ctx,
|
||||
/* to prevent a double-free in the next call */
|
||||
shProg->FragmentProgram->Base.Parameters = NULL;
|
||||
}
|
||||
_mesa_delete_program(ctx, &shProg->FragmentProgram->Base);
|
||||
ctx->Driver.DeleteProgram(ctx, &shProg->FragmentProgram->Base);
|
||||
shProg->FragmentProgram = NULL;
|
||||
}
|
||||
|
||||
@@ -247,7 +247,7 @@ _mesa_free_shader(GLcontext *ctx, struct gl_shader *sh)
|
||||
_mesa_free(sh->InfoLog);
|
||||
for (i = 0; i < sh->NumPrograms; i++) {
|
||||
assert(sh->Programs[i]);
|
||||
_mesa_delete_program(ctx, sh->Programs[i]);
|
||||
ctx->Driver.DeleteProgram(ctx, sh->Programs[i]);
|
||||
}
|
||||
if (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()
|
||||
*/
|
||||
@@ -633,9 +681,9 @@ _mesa_get_active_attrib(GLcontext *ctx, GLuint program, GLuint index,
|
||||
shProg->Attributes->Parameters[index].Name);
|
||||
sz = shProg->Attributes->Parameters[index].Size;
|
||||
if (size)
|
||||
*size = sz;
|
||||
if (type)
|
||||
*type = vec_types[sz]; /* XXX this is a temporary hack */
|
||||
*size = 1; /* attributes may not be arrays */
|
||||
if (type && sz > 0 && sz <= 4) /* 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 ||
|
||||
shProg->Uniforms->Parameters[j].Type == PROGRAM_SAMPLER) {
|
||||
if (ind == index) {
|
||||
GLuint uSize = shProg->Uniforms->Parameters[j].Size;
|
||||
GLenum uType = shProg->Uniforms->Parameters[j].DataType;
|
||||
/* found it */
|
||||
copy_string(nameOut, maxLength, length,
|
||||
shProg->Uniforms->Parameters[j].Name);
|
||||
if (size)
|
||||
*size = shProg->Uniforms->Parameters[j].Size;
|
||||
if (size) {
|
||||
/* convert from floats to 'type' (eg: sizeof(mat4x4)=1) */
|
||||
*size = uSize / sizeof_glsl_type(uType);
|
||||
}
|
||||
if (type)
|
||||
*type = shProg->Uniforms->Parameters[j].DataType;
|
||||
*type = uType;
|
||||
return;
|
||||
}
|
||||
ind++;
|
||||
@@ -903,9 +955,40 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location,
|
||||
if (shProg) {
|
||||
GLint i;
|
||||
if (location >= 0 && location < shProg->Uniforms->NumParameters) {
|
||||
for (i = 0; i < shProg->Uniforms->Parameters[location].Size; i++) {
|
||||
params[i] = shProg->Uniforms->ParameterValues[location][i];
|
||||
GLuint uSize;
|
||||
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 {
|
||||
_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;
|
||||
GLint elems, i, k;
|
||||
GLenum uType;
|
||||
GLsizei maxCount;
|
||||
|
||||
if (!shProg || !shProg->LinkStatus) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)");
|
||||
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) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glUniform(location)");
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(location)");
|
||||
return;
|
||||
}
|
||||
|
||||
FLUSH_VERTICES(ctx, _NEW_PROGRAM);
|
||||
|
||||
uType = shProg->Uniforms->Parameters[location].DataType;
|
||||
/*
|
||||
* If we're setting a sampler, we must use glUniformi1()!
|
||||
*/
|
||||
@@ -1119,11 +1211,37 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,
|
||||
return;
|
||||
}
|
||||
|
||||
if (count * elems > shProg->Uniforms->Parameters[location].Size) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(count too large)");
|
||||
return;
|
||||
/* OpenGL requires types to match exactly, except that one can convert
|
||||
* float or int array to boolean array.
|
||||
*/
|
||||
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++) {
|
||||
GLfloat *uniformVal = shProg->Uniforms->ParameterValues[location + k];
|
||||
if (type == GL_INT ||
|
||||
@@ -1141,6 +1259,13 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,
|
||||
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) {
|
||||
@@ -1161,20 +1286,30 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,
|
||||
GLenum matrixType, GLint location, GLsizei count,
|
||||
GLboolean transpose, const GLfloat *values)
|
||||
{
|
||||
GLsizei maxCount, i;
|
||||
struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
|
||||
if (!shProg || !shProg->LinkStatus) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glUniformMatrix(program not linked)");
|
||||
return;
|
||||
}
|
||||
if (location < 0 || location >= shProg->Uniforms->NumParameters) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(location)");
|
||||
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) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix(location)");
|
||||
return;
|
||||
}
|
||||
if (values == NULL) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix");
|
||||
return;
|
||||
}
|
||||
if (count < 0) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(count < 0)");
|
||||
return;
|
||||
}
|
||||
|
||||
FLUSH_VERTICES(ctx, _NEW_PROGRAM);
|
||||
|
||||
@@ -1183,23 +1318,30 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,
|
||||
* the rows.
|
||||
*/
|
||||
/* XXXX need to test 3x3 and 2x2 matrices... */
|
||||
if (transpose) {
|
||||
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];
|
||||
maxCount = shProg->Uniforms->Parameters[location].Size / (4 * cols);
|
||||
if (count > maxCount)
|
||||
count = maxCount;
|
||||
for (i = 0; i < count; i++) {
|
||||
if (transpose) {
|
||||
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 {
|
||||
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[col * rows + row];
|
||||
else {
|
||||
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[col * rows + row];
|
||||
}
|
||||
}
|
||||
}
|
||||
location += cols;
|
||||
values += rows * cols;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -343,6 +343,7 @@ vec4 asin(const vec4 v)
|
||||
__retVal.x = asin(v.x);
|
||||
__retVal.y = asin(v.y);
|
||||
__retVal.z = asin(v.z);
|
||||
__retVal.w = asin(v.w);
|
||||
}
|
||||
|
||||
float acos(const float x)
|
||||
|
||||
@@ -181,47 +181,48 @@
|
||||
0,1,0,12,0,97,115,105,110,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,
|
||||
115,105,110,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,115,105,
|
||||
110,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,115,105,110,0,
|
||||
18,118,0,59,122,0,0,0,20,0,0,1,0,9,0,97,99,111,115,0,1,1,0,9,120,0,0,0,1,3,2,1,9,1,104,97,108,102,
|
||||
80,105,0,2,17,51,0,49,52,49,53,57,50,54,0,0,17,48,0,53,0,0,48,0,0,9,18,95,95,114,101,116,86,97,108,
|
||||
0,18,104,97,108,102,80,105,0,58,97,115,105,110,0,18,120,0,0,0,47,20,0,0,1,0,10,0,97,99,111,115,0,1,
|
||||
1,0,10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120,
|
||||
0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20,
|
||||
0,0,1,0,11,0,97,99,111,115,0,1,1,0,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,
|
||||
97,99,111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99,
|
||||
111,115,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,99,111,115,
|
||||
0,18,118,0,59,122,0,0,0,20,0,0,1,0,12,0,97,99,111,115,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,
|
||||
116,86,97,108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,
|
||||
97,108,0,59,121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,
|
||||
59,122,0,58,97,99,111,115,0,18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,
|
||||
58,97,99,111,115,0,18,118,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,120,0,0,0,1,9,18,
|
||||
95,95,114,101,116,86,97,108,0,58,97,115,105,110,0,18,120,0,58,105,110,118,101,114,115,101,115,113,
|
||||
114,116,0,18,120,0,18,120,0,48,17,49,0,48,0,0,46,0,0,48,0,0,20,0,0,1,0,10,0,97,116,97,110,0,1,1,0,
|
||||
10,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,
|
||||
110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,
|
||||
121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97,
|
||||
110,0,1,1,0,11,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,
|
||||
58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,
|
||||
97,108,0,59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,9,18,95,
|
||||
95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,122,0,
|
||||
0,0,20,0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,
|
||||
101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,
|
||||
0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,
|
||||
0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111,
|
||||
118,101,114,95,120,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,116,97,
|
||||
110,0,18,121,95,111,118,101,114,95,120,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,121,0,
|
||||
0,1,1,0,9,120,0,0,0,1,10,18,120,0,17,48,0,48,0,0,38,0,8,17,48,0,48,0,0,0,9,14,0,3,2,0,9,1,122,0,2,
|
||||
58,97,116,97,110,0,18,121,0,18,120,0,49,0,0,0,0,10,18,120,0,17,48,0,48,0,0,40,0,2,10,18,121,0,17,
|
||||
48,0,48,0,0,40,0,8,18,122,0,17,51,0,49,52,49,53,57,51,0,0,47,0,9,14,0,8,18,122,0,17,51,0,49,52,49,
|
||||
53,57,51,0,0,46,0,0,9,14,0,8,18,122,0,0,0,1,0,10,0,97,116,97,110,0,1,1,0,10,117,0,0,1,1,0,10,118,0,
|
||||
0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,
|
||||
59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,
|
||||
0,18,118,0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97,110,0,1,1,0,11,117,0,0,1,1,0,11,118,0,0,0,1,9,18,
|
||||
95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0,
|
||||
0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0,
|
||||
59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,117,0,59,122,0,
|
||||
0,18,118,0,59,122,0,0,0,20,0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,117,0,0,1,1,0,12,118,0,0,0,1,9,18,
|
||||
95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0,
|
||||
0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0,
|
||||
18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,115,105,110,0,18,118,
|
||||
0,59,119,0,0,0,20,0,0,1,0,9,0,97,99,111,115,0,1,1,0,9,120,0,0,0,1,3,2,1,9,1,104,97,108,102,80,105,
|
||||
0,2,17,51,0,49,52,49,53,57,50,54,0,0,17,48,0,53,0,0,48,0,0,9,18,95,95,114,101,116,86,97,108,0,18,
|
||||
104,97,108,102,80,105,0,58,97,115,105,110,0,18,120,0,0,0,47,20,0,0,1,0,10,0,97,99,111,115,0,1,1,0,
|
||||
10,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120,0,0,
|
||||
0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20,0,0,
|
||||
1,0,11,0,97,99,111,115,0,1,1,0,11,118,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,99,
|
||||
111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,99,111,115,
|
||||
0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,99,111,115,0,18,118,
|
||||
0,59,122,0,0,0,20,0,0,1,0,12,0,97,99,111,115,0,1,1,0,12,118,0,0,0,1,9,18,95,95,114,101,116,86,97,
|
||||
108,0,59,120,0,58,97,99,111,115,0,18,118,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,
|
||||
121,0,58,97,99,111,115,0,18,118,0,59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,
|
||||
97,99,111,115,0,18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,99,
|
||||
111,115,0,18,118,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,120,0,0,0,1,9,18,95,95,114,
|
||||
101,116,86,97,108,0,58,97,115,105,110,0,18,120,0,58,105,110,118,101,114,115,101,115,113,114,116,0,
|
||||
18,120,0,18,120,0,48,17,49,0,48,0,0,46,0,0,48,0,0,20,0,0,1,0,10,0,97,116,97,110,0,1,1,0,10,121,95,
|
||||
111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,
|
||||
121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,
|
||||
97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97,110,0,1,
|
||||
1,0,11,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,
|
||||
97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,
|
||||
59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,121,0,0,0,20,0,9,18,95,95,114,
|
||||
101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,122,0,0,0,20,
|
||||
0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,121,95,111,118,101,114,95,120,0,0,0,1,9,18,95,95,114,101,116,
|
||||
86,97,108,0,59,120,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,120,0,0,0,20,0,9,18,
|
||||
95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,121,95,111,118,101,114,95,120,0,59,
|
||||
121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,121,95,111,118,
|
||||
101,114,95,120,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,116,97,110,0,
|
||||
18,121,95,111,118,101,114,95,120,0,59,119,0,0,0,20,0,0,1,0,9,0,97,116,97,110,0,1,1,0,9,121,0,0,1,1,
|
||||
0,9,120,0,0,0,1,10,18,120,0,17,48,0,48,0,0,38,0,8,17,48,0,48,0,0,0,9,14,0,3,2,0,9,1,122,0,2,58,97,
|
||||
116,97,110,0,18,121,0,18,120,0,49,0,0,0,0,10,18,120,0,17,48,0,48,0,0,40,0,2,10,18,121,0,17,48,0,48,
|
||||
0,0,40,0,8,18,122,0,17,51,0,49,52,49,53,57,51,0,0,47,0,9,14,0,8,18,122,0,17,51,0,49,52,49,53,57,51,
|
||||
0,0,46,0,0,9,14,0,8,18,122,0,0,0,1,0,10,0,97,116,97,110,0,1,1,0,10,117,0,0,1,1,0,10,118,0,0,0,1,9,
|
||||
18,95,95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,
|
||||
0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,
|
||||
0,59,121,0,0,0,20,0,0,1,0,11,0,97,116,97,110,0,1,1,0,11,117,0,0,1,1,0,11,118,0,0,0,1,9,18,95,95,
|
||||
114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0,0,20,0,
|
||||
9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0,59,121,
|
||||
0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,117,0,59,122,0,0,18,
|
||||
118,0,59,122,0,0,0,20,0,0,1,0,12,0,97,116,97,110,0,1,1,0,12,117,0,0,1,1,0,12,118,0,0,0,1,9,18,95,
|
||||
95,114,101,116,86,97,108,0,59,120,0,58,97,116,97,110,0,18,117,0,59,120,0,0,18,118,0,59,120,0,0,0,
|
||||
20,0,9,18,95,95,114,101,116,86,97,108,0,59,121,0,58,97,116,97,110,0,18,117,0,59,121,0,0,18,118,0,
|
||||
59,121,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,122,0,58,97,116,97,110,0,18,117,0,59,122,0,
|
||||
0,18,118,0,59,122,0,0,0,20,0,9,18,95,95,114,101,116,86,97,108,0,59,119,0,58,97,116,97,110,0,18,117,
|
||||
0,59,119,0,0,18,118,0,59,119,0,0,0,20,0,0,1,0,9,0,112,111,119,0,1,1,0,9,97,0,0,1,1,0,9,98,0,0,0,1,
|
||||
|
||||
@@ -250,7 +250,7 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,
|
||||
}
|
||||
}
|
||||
else if (strcmp(var, "gl_FrontLightModelProduct") == 0) {
|
||||
if (strcmp(field, "ambient") == 0) {
|
||||
if (strcmp(field, "sceneColor") == 0) {
|
||||
tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;
|
||||
tokens[1] = 0;
|
||||
}
|
||||
@@ -259,7 +259,7 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,
|
||||
}
|
||||
}
|
||||
else if (strcmp(var, "gl_BackLightModelProduct") == 0) {
|
||||
if (strcmp(field, "ambient") == 0) {
|
||||
if (strcmp(field, "sceneColor") == 0) {
|
||||
tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;
|
||||
tokens[1] = 1;
|
||||
}
|
||||
@@ -397,6 +397,8 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,
|
||||
* var.field
|
||||
* var[i].field
|
||||
* var[i][j]
|
||||
*
|
||||
* \return -1 upon error, else position in paramList of the state var/data
|
||||
*/
|
||||
GLint
|
||||
_slang_alloc_statevar(slang_ir_node *n,
|
||||
@@ -414,9 +416,13 @@ _slang_alloc_statevar(slang_ir_node *n,
|
||||
|
||||
if (n->Opcode == IR_ELEMENT) {
|
||||
/* XXX can only handle constant indexes for now */
|
||||
assert(n->Children[1]->Opcode == IR_FLOAT);
|
||||
index1 = (GLint) n->Children[1]->Value[0];
|
||||
n = n->Children[0];
|
||||
if (n->Children[1]->Opcode == IR_FLOAT) {
|
||||
index1 = (GLint) n->Children[1]->Value[0];
|
||||
n = n->Children[0];
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (n->Opcode == IR_ELEMENT) {
|
||||
|
||||
@@ -2344,7 +2344,8 @@ _slang_gen_field(slang_assemble_ctx * A, slang_operation *oper)
|
||||
return n;
|
||||
}
|
||||
else if ( ti.spec.type == SLANG_SPEC_FLOAT
|
||||
|| ti.spec.type == SLANG_SPEC_INT) {
|
||||
|| ti.spec.type == SLANG_SPEC_INT
|
||||
|| ti.spec.type == SLANG_SPEC_BOOL) {
|
||||
const GLuint rows = 1;
|
||||
slang_swizzle swz;
|
||||
slang_ir_node *n;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 2005-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -677,6 +677,7 @@ static struct prog_instruction *
|
||||
emit_clamp(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
{
|
||||
struct prog_instruction *inst;
|
||||
slang_ir_node tmpNode;
|
||||
|
||||
assert(n->Opcode == IR_CLAMP);
|
||||
/* 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[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]) */
|
||||
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[1], n->Children[1]->Store);
|
||||
|
||||
/* tmp = min(tmp, ch[2]) */
|
||||
/* n->dest = min(tmp, ch[2]) */
|
||||
inst = new_instruction(emitInfo, OPCODE_MIN);
|
||||
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);
|
||||
|
||||
free_temp_storage(emitInfo->vt, &tmpNode);
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
||||
@@ -859,12 +869,18 @@ emit_return(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
static struct prog_instruction *
|
||||
emit_kill(slang_emit_info *emitInfo)
|
||||
{
|
||||
struct gl_fragment_program *fp;
|
||||
struct prog_instruction *inst;
|
||||
/* NV-KILL - discard fragment depending on condition code.
|
||||
* Note that ARB-KILL depends on sign of vector operand.
|
||||
*/
|
||||
inst = new_instruction(emitInfo, OPCODE_KIL_NV);
|
||||
inst->DstReg.CondMask = COND_TR; /* always branch */
|
||||
|
||||
assert(emitInfo->prog->Target == GL_FRAGMENT_PROGRAM_ARB);
|
||||
fp = (struct gl_fragment_program *) emitInfo->prog;
|
||||
fp->UsesKill = GL_TRUE;
|
||||
|
||||
return inst;
|
||||
}
|
||||
|
||||
@@ -1486,6 +1502,10 @@ emit_struct_field(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
{
|
||||
if (n->Store->File == PROGRAM_STATE_VAR) {
|
||||
n->Store->Index = _slang_alloc_statevar(n, emitInfo->prog->Parameters);
|
||||
if (n->Store->Index < 0) {
|
||||
slang_info_log_error(emitInfo->log, "Error parsing state variable");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
GLint offset = n->FieldOffset / 4;
|
||||
|
||||
@@ -141,6 +141,7 @@ NAME(line)(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1)
|
||||
return;
|
||||
|
||||
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.yAdj = line.dy / line.len * line.halfWidth;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -78,7 +78,7 @@
|
||||
GLfloat texWidth[FRAG_ATTRIB_MAX];
|
||||
GLfloat texHeight[FRAG_ATTRIB_MAX];
|
||||
#endif
|
||||
GLfloat bf = SWRAST_CONTEXT(ctx)->_BackfaceSign;
|
||||
GLfloat bf = SWRAST_CONTEXT(ctx)->_BackfaceCullSign;
|
||||
|
||||
(void) swrast;
|
||||
|
||||
@@ -116,6 +116,7 @@
|
||||
majDx = vMax->win[0] - vMin->win[0];
|
||||
majDy = vMax->win[1] - vMin->win[1];
|
||||
|
||||
/* front/back-face determination and cullling */
|
||||
{
|
||||
const GLfloat botDx = vMid->win[0] - vMin->win[0];
|
||||
const GLfloat botDy = vMid->win[1] - vMin->win[1];
|
||||
@@ -124,6 +125,8 @@
|
||||
if (area * bf < 0 || area == 0 || IS_INF_OR_NAN(area))
|
||||
return;
|
||||
ltor = (GLboolean) (area < 0.0F);
|
||||
|
||||
span.facing = area * swrast->_BackfaceSign > 0.0F;
|
||||
}
|
||||
|
||||
/* Plane equation setup:
|
||||
@@ -336,7 +339,7 @@
|
||||
}
|
||||
|
||||
/* skip fragments with zero coverage */
|
||||
while (startX >= 0) {
|
||||
while (startX > 0) {
|
||||
coverage = compute_coveragef(pMin, pMax, pMid, startX, iy);
|
||||
if (coverage > 0.0F)
|
||||
break;
|
||||
@@ -350,6 +353,7 @@
|
||||
/* (cx,cy) = center of fragment */
|
||||
const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
|
||||
SWspanarrays *array = span.array;
|
||||
ASSERT(ix >= 0);
|
||||
#ifdef DO_INDEX
|
||||
array->coverage[ix] = (GLfloat) compute_coveragei(pMin, pMax, pMid, ix, iy);
|
||||
#else
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -117,8 +117,8 @@ _swrast_update_rasterflags( GLcontext *ctx )
|
||||
|
||||
|
||||
/**
|
||||
* Examine polycon culls tate to compute the _BackfaceSign field.
|
||||
* _BackfaceSign will be 0 if no culling, -1 if culling back-faces,
|
||||
* Examine polycon culls tate to compute the _BackfaceCullSign field.
|
||||
* _BackfaceCullSign will be 0 if no culling, -1 if culling back-faces,
|
||||
* and 1 if culling front-faces. The Polygon FrontFace state also
|
||||
* factors in.
|
||||
*/
|
||||
@@ -128,31 +128,32 @@ _swrast_update_polygon( GLcontext *ctx )
|
||||
GLfloat backface_sign;
|
||||
|
||||
if (ctx->Polygon.CullFlag) {
|
||||
backface_sign = 1.0;
|
||||
switch (ctx->Polygon.CullFaceMode) {
|
||||
case GL_BACK:
|
||||
if (ctx->Polygon.FrontFace == GL_CCW)
|
||||
backface_sign = -1.0;
|
||||
backface_sign = -1.0;
|
||||
break;
|
||||
case GL_FRONT:
|
||||
if (ctx->Polygon.FrontFace != GL_CCW)
|
||||
backface_sign = -1.0;
|
||||
backface_sign = 1.0;
|
||||
break;
|
||||
case GL_FRONT_AND_BACK:
|
||||
/* fallthrough */
|
||||
default:
|
||||
backface_sign = 0.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
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
|
||||
* fog blend factors (from the fog coords) per-fragment.
|
||||
@@ -720,6 +721,12 @@ _swrast_ResetLineStipple( GLcontext *ctx )
|
||||
SWRAST_CONTEXT(ctx)->StippleCounter = 0;
|
||||
}
|
||||
|
||||
void
|
||||
_swrast_SetFacing(GLcontext *ctx, GLuint facing)
|
||||
{
|
||||
SWRAST_CONTEXT(ctx)->PointLineFacing = facing;
|
||||
}
|
||||
|
||||
void
|
||||
_swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value )
|
||||
{
|
||||
|
||||
@@ -128,7 +128,8 @@ typedef struct
|
||||
* _swrast_validate_derived():
|
||||
*/
|
||||
GLbitfield _RasterMask;
|
||||
GLfloat _BackfaceSign;
|
||||
GLfloat _BackfaceSign; /** +1 or -1 */
|
||||
GLfloat _BackfaceCullSign; /** +1, 0, or -1 */
|
||||
GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */
|
||||
GLboolean _AnyTextureCombine;
|
||||
GLboolean _FogEnabled;
|
||||
@@ -151,6 +152,7 @@ typedef struct
|
||||
/* Working values:
|
||||
*/
|
||||
GLuint StippleCounter; /**< Line stipple counter */
|
||||
GLuint PointLineFacing;
|
||||
GLbitfield NewState;
|
||||
GLuint StateChanges;
|
||||
GLenum Primitive; /* current primitive being drawn (ala glBegin) */
|
||||
|
||||
@@ -860,7 +860,8 @@ _swrast_DrawPixels( GLcontext *ctx,
|
||||
format, type, pixels)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glDrawPixels(invalid PBO access)");
|
||||
goto end;
|
||||
RENDER_FINISH(swrast, ctx);
|
||||
return;
|
||||
}
|
||||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
|
||||
GL_READ_ONLY_ARB,
|
||||
@@ -868,7 +869,8 @@ _swrast_DrawPixels( GLcontext *ctx,
|
||||
if (!buf) {
|
||||
/* buffer is already mapped - that's an error */
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawPixels(PBO is mapped)");
|
||||
goto end;
|
||||
RENDER_FINISH(swrast, ctx);
|
||||
return;
|
||||
}
|
||||
pixels = ADD_POINTERS(buf, pixels);
|
||||
}
|
||||
@@ -908,8 +910,6 @@ _swrast_DrawPixels( GLcontext *ctx,
|
||||
/* don't return yet, clean-up */
|
||||
}
|
||||
|
||||
end:
|
||||
|
||||
RENDER_FINISH(swrast,ctx);
|
||||
|
||||
if (unpack->BufferObj->Name) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.2
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -40,10 +40,12 @@ fetch_texel( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
|
||||
{
|
||||
GLchan rgba[4];
|
||||
SWcontext *swrast = SWRAST_CONTEXT(ctx);
|
||||
const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
|
||||
|
||||
lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod);
|
||||
|
||||
/* XXX use a float-valued TextureSample routine here!!! */
|
||||
swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current,
|
||||
1, (const GLfloat (*)[4]) texcoord,
|
||||
swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord,
|
||||
&lambda, &rgba);
|
||||
color[0] = CHAN_TO_FLOAT(rgba[0]);
|
||||
color[1] = CHAN_TO_FLOAT(rgba[1]);
|
||||
@@ -59,7 +61,7 @@ fetch_texel( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
|
||||
static void
|
||||
fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],
|
||||
const GLfloat texdx[4], const GLfloat texdy[4],
|
||||
GLuint unit, GLfloat color[4] )
|
||||
GLfloat lodBias, GLuint unit, GLfloat color[4] )
|
||||
{
|
||||
SWcontext *swrast = SWRAST_CONTEXT(ctx);
|
||||
const struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
|
||||
@@ -68,15 +70,17 @@ fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],
|
||||
const GLfloat texH = (GLfloat) texImg->HeightScale;
|
||||
GLchan rgba[4];
|
||||
|
||||
GLfloat lambda = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */
|
||||
texdx[1], texdy[1], /* dt/dx, dt/dy */
|
||||
texdx[3], texdy[2], /* dq/dx, dq/dy */
|
||||
texW, texH,
|
||||
texcoord[0], texcoord[1], texcoord[3],
|
||||
1.0F / texcoord[3]);
|
||||
GLfloat lambda
|
||||
= _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */
|
||||
texdx[1], texdy[1], /* dt/dx, dt/dy */
|
||||
texdx[3], texdy[2], /* dq/dx, dq/dy */
|
||||
texW, texH,
|
||||
texcoord[0], texcoord[1], texcoord[3],
|
||||
1.0F / texcoord[3]) + lodBias;
|
||||
|
||||
swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current,
|
||||
1, (const GLfloat (*)[4]) texcoord,
|
||||
lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod);
|
||||
|
||||
swrast->TextureSample[unit](ctx, texObj, 1, (const GLfloat (*)[4]) texcoord,
|
||||
&lambda, &rgba);
|
||||
color[0] = CHAN_TO_FLOAT(rgba[0]);
|
||||
color[1] = CHAN_TO_FLOAT(rgba[1]);
|
||||
@@ -114,7 +118,7 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine,
|
||||
|
||||
if (ctx->Shader.CurrentProgram) {
|
||||
/* 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;
|
||||
|
||||
@@ -317,6 +317,9 @@ NAME( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
|
||||
span.attrStepX[FRAG_ATTRIB_WPOS][3] = 0.0F;
|
||||
span.attrStepY[FRAG_ATTRIB_WPOS][3] = 0.0F;
|
||||
|
||||
span.facing = swrast->PointLineFacing;
|
||||
|
||||
|
||||
/*
|
||||
* Draw
|
||||
*/
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* 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
|
||||
* 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->arrayMask = SPAN_XY | SPAN_Z;
|
||||
span->facing = swrast->PointLineFacing;
|
||||
span->attrStart[FRAG_ATTRIB_FOGC][0] = vert->attrib[FRAG_ATTRIB_FOGC][0];
|
||||
span->attrStepX[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 {
|
||||
/* even size */
|
||||
xmin = (GLint) vert->win[0] - iRadius;
|
||||
xmin = (GLint) (vert->win[0] + 0.5) - iRadius;
|
||||
xmax = xmin + iSize - 1;
|
||||
ymin = (GLint) vert->win[1] - iRadius;
|
||||
ymin = (GLint) (vert->win[1] + 0.5) - iRadius;
|
||||
ymax = ymin + iSize - 1;
|
||||
}
|
||||
#endif /*SMOOTH*/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -129,7 +129,8 @@ read_depth_pixels( GLcontext *ctx,
|
||||
rb->GetRow(ctx, rb, width, x, y, dest);
|
||||
/* convert range from 24-bit to 32-bit */
|
||||
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 */
|
||||
if (!_mesa_clip_readpixels(ctx, &x, &y, &width, &height, &clippedPacking)) {
|
||||
/* The ReadPixels region is totally outside the window bounds */
|
||||
goto end;
|
||||
RENDER_FINISH(swrast, ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
if (clippedPacking.BufferObj->Name) {
|
||||
@@ -579,7 +581,8 @@ _swrast_ReadPixels( GLcontext *ctx,
|
||||
format, type, pixels)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glReadPixels(invalid PBO access)");
|
||||
goto end;
|
||||
RENDER_FINISH(swrast, ctx);
|
||||
return;
|
||||
}
|
||||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
|
||||
GL_WRITE_ONLY_ARB,
|
||||
@@ -587,7 +590,8 @@ _swrast_ReadPixels( GLcontext *ctx,
|
||||
if (!buf) {
|
||||
/* buffer is already mapped - that's an error */
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)");
|
||||
goto end;
|
||||
RENDER_FINISH(swrast, ctx);
|
||||
return;
|
||||
}
|
||||
pixels = ADD_POINTERS(buf, pixels);
|
||||
}
|
||||
@@ -628,8 +632,6 @@ _swrast_ReadPixels( GLcontext *ctx,
|
||||
/* don't return yet, clean-up */
|
||||
}
|
||||
|
||||
|
||||
end:
|
||||
RENDER_FINISH(swrast, ctx);
|
||||
|
||||
if (clippedPacking.BufferObj->Name) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.0.3
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -1043,7 +1043,7 @@ sample_2d_linear_repeat(GLcontext *ctx,
|
||||
ASSERT(tObj->WrapS == GL_REPEAT);
|
||||
ASSERT(tObj->WrapT == GL_REPEAT);
|
||||
ASSERT(img->Border == 0);
|
||||
ASSERT(img->_BaseFormat != GL_COLOR_INDEX);
|
||||
ASSERT(img->TexFormat->BaseFormat != GL_COLOR_INDEX);
|
||||
ASSERT(img->_IsPowerOfTwo);
|
||||
|
||||
COMPUTE_LINEAR_REPEAT_TEXEL_LOCATION(texcoord[0], u, width, i0, i1);
|
||||
@@ -1198,6 +1198,7 @@ sample_linear_2d( GLcontext *ctx,
|
||||
(void) lambda;
|
||||
if (tObj->WrapS == GL_REPEAT &&
|
||||
tObj->WrapT == GL_REPEAT &&
|
||||
image->Border == 0 &&
|
||||
image->_IsPowerOfTwo) {
|
||||
for (i=0;i<n;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->WrapT==GL_REPEAT);
|
||||
ASSERT(img->Border==0);
|
||||
ASSERT(img->_BaseFormat==GL_RGB);
|
||||
ASSERT(img->TexFormat->MesaFormat==MESA_FORMAT_RGB);
|
||||
ASSERT(img->_IsPowerOfTwo);
|
||||
|
||||
for (k=0; k<n; k++) {
|
||||
@@ -1278,7 +1279,7 @@ opt_sample_rgba_2d( GLcontext *ctx,
|
||||
ASSERT(tObj->WrapS==GL_REPEAT);
|
||||
ASSERT(tObj->WrapT==GL_REPEAT);
|
||||
ASSERT(img->Border==0);
|
||||
ASSERT(img->_BaseFormat==GL_RGBA);
|
||||
ASSERT(img->TexFormat->MesaFormat==MESA_FORMAT_RGBA);
|
||||
ASSERT(img->_IsPowerOfTwo);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
@@ -1308,7 +1309,7 @@ sample_lambda_2d( GLcontext *ctx,
|
||||
const GLboolean repeatNoBorderPOT = (tObj->WrapS == GL_REPEAT)
|
||||
&& (tObj->WrapT == GL_REPEAT)
|
||||
&& (tImg->Border == 0 && (tImg->Width == tImg->RowStride))
|
||||
&& (tImg->_BaseFormat != GL_COLOR_INDEX)
|
||||
&& (tImg->TexFormat->BaseFormat != GL_COLOR_INDEX)
|
||||
&& tImg->_IsPowerOfTwo;
|
||||
|
||||
ASSERT(lambda != NULL);
|
||||
@@ -1323,16 +1324,10 @@ sample_lambda_2d( GLcontext *ctx,
|
||||
if (repeatNoBorderPOT) {
|
||||
switch (tImg->TexFormat->MesaFormat) {
|
||||
case MESA_FORMAT_RGB:
|
||||
case MESA_FORMAT_RGB888:
|
||||
/*case MESA_FORMAT_BGR888:*/
|
||||
opt_sample_rgb_2d(ctx, tObj, m, texcoords + minStart,
|
||||
NULL, rgba + minStart);
|
||||
break;
|
||||
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,
|
||||
NULL, rgba + minStart);
|
||||
break;
|
||||
@@ -1386,16 +1381,10 @@ sample_lambda_2d( GLcontext *ctx,
|
||||
if (repeatNoBorderPOT) {
|
||||
switch (tImg->TexFormat->MesaFormat) {
|
||||
case MESA_FORMAT_RGB:
|
||||
case MESA_FORMAT_RGB888:
|
||||
/*case MESA_FORMAT_BGR888:*/
|
||||
opt_sample_rgb_2d(ctx, tObj, m, texcoords + magStart,
|
||||
NULL, rgba + magStart);
|
||||
break;
|
||||
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,
|
||||
NULL, rgba + magStart);
|
||||
break;
|
||||
@@ -2102,7 +2091,7 @@ sample_nearest_rect(GLcontext *ctx,
|
||||
ASSERT(tObj->WrapT == GL_CLAMP ||
|
||||
tObj->WrapT == GL_CLAMP_TO_EDGE ||
|
||||
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++) {
|
||||
GLint row, col;
|
||||
@@ -2138,7 +2127,7 @@ sample_linear_rect(GLcontext *ctx,
|
||||
ASSERT(tObj->WrapT == GL_CLAMP ||
|
||||
tObj->WrapT == GL_CLAMP_TO_EDGE ||
|
||||
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 */
|
||||
for (i = 0; i < n; i++) {
|
||||
@@ -2286,8 +2275,8 @@ sample_depth_texture( GLcontext *ctx,
|
||||
|
||||
(void) lambda;
|
||||
|
||||
ASSERT(tObj->Image[0][tObj->BaseLevel]->_BaseFormat == GL_DEPTH_COMPONENT ||
|
||||
tObj->Image[0][tObj->BaseLevel]->_BaseFormat == GL_DEPTH_STENCIL_EXT);
|
||||
ASSERT(img->TexFormat->BaseFormat == GL_DEPTH_COMPONENT ||
|
||||
img->TexFormat->BaseFormat == GL_DEPTH_STENCIL_EXT);
|
||||
|
||||
ASSERT(tObj->Target == GL_TEXTURE_1D ||
|
||||
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
|
||||
* 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");
|
||||
return;
|
||||
}
|
||||
@@ -2707,7 +2696,7 @@ _swrast_choose_texture_sample_func( GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
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) {
|
||||
case GL_TEXTURE_1D:
|
||||
|
||||
@@ -58,7 +58,7 @@ _swrast_culltriangle( GLcontext *ctx,
|
||||
GLfloat fy = v2->win[1] - v0->win[1];
|
||||
GLfloat c = ex*fy-ey*fx;
|
||||
|
||||
if (c * SWRAST_CONTEXT(ctx)->_BackfaceSign > 0)
|
||||
if (c * SWRAST_CONTEXT(ctx)->_BackfaceCullSign > 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -292,19 +292,18 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
|
||||
#else
|
||||
const GLfloat area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy;
|
||||
#endif
|
||||
/* Do backface culling */
|
||||
if (area * bf < 0.0)
|
||||
return;
|
||||
|
||||
if (IS_INF_OR_NAN(area) || area == 0.0F)
|
||||
return;
|
||||
|
||||
if (area * bf * swrast->_BackfaceCullSign < 0.0)
|
||||
return;
|
||||
|
||||
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... */
|
||||
{
|
||||
#if TRIANGLE_WALK_DOUBLE
|
||||
|
||||
@@ -140,6 +140,13 @@ _swrast_Accum(GLcontext *ctx, GLenum op, GLfloat value);
|
||||
extern void
|
||||
_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
|
||||
* current state.
|
||||
*
|
||||
|
||||
@@ -186,6 +186,9 @@ _swsetup_RenderStart( GLcontext *ctx )
|
||||
|
||||
swsetup->NewState = 0;
|
||||
|
||||
/* This will change if drawing unfilled tris */
|
||||
_swrast_SetFacing(ctx, 0);
|
||||
|
||||
_swrast_render_start(ctx);
|
||||
|
||||
/* Important */
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* 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
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -68,6 +68,8 @@ static void _swsetup_render_line_tri( GLcontext *ctx,
|
||||
return;
|
||||
}
|
||||
|
||||
_swrast_SetFacing(ctx, facing);
|
||||
|
||||
if (ctx->Light.ShadeModel == GL_FLAT) {
|
||||
COPY_CHAN4(c[0], v0->color);
|
||||
COPY_CHAN4(c[1], v1->color);
|
||||
@@ -127,6 +129,8 @@ static void _swsetup_render_point_tri( GLcontext *ctx,
|
||||
return;
|
||||
}
|
||||
|
||||
_swrast_SetFacing(ctx, facing);
|
||||
|
||||
if (ctx->Light.ShadeModel == GL_FLAT) {
|
||||
/* save colors/indexes for v0, v1 vertices */
|
||||
COPY_CHAN4(c[0], v0->color);
|
||||
@@ -290,10 +294,8 @@ void _swsetup_choose_trifuncs( GLcontext *ctx )
|
||||
ctx->Polygon.OffsetFill)
|
||||
ind |= SS_OFFSET_BIT;
|
||||
|
||||
/* Note: gl_FrontFacing lives in fragment input FOGC.Y at this time */
|
||||
if ((ctx->Light.Enabled && ctx->Light.Model.TwoSide) ||
|
||||
(ctx->VertexProgram._Enabled && ctx->VertexProgram.TwoSideEnabled) ||
|
||||
(ctx->FragmentProgram._Current && ctx->FragmentProgram._Current->Base.InputsRead & (1 << FRAG_ATTRIB_FOGC)))
|
||||
(ctx->VertexProgram._Current && ctx->VertexProgram.TwoSideEnabled))
|
||||
ind |= SS_TWOSIDE_BIT;
|
||||
|
||||
/* 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.Line = swsetup_line;
|
||||
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[2] = &verts[e2];
|
||||
|
||||
|
||||
if (IND & (SS_TWOSIDE_BIT | SS_OFFSET_BIT | SS_UNFILLED_BIT))
|
||||
{
|
||||
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))
|
||||
{
|
||||
facing = (cc < 0.0) ^ ctx->Polygon._FrontBit;
|
||||
ctx->_Facing = facing;
|
||||
|
||||
if (IND & SS_UNFILLED_BIT)
|
||||
mode = facing ? ctx->Polygon.BackMode : ctx->Polygon.FrontMode;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.1
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -30,29 +30,150 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "glheader.h"
|
||||
#include "colormac.h"
|
||||
#include "context.h"
|
||||
#include "macros.h"
|
||||
#include "imports.h"
|
||||
#include "prog_instruction.h"
|
||||
#include "prog_statevars.h"
|
||||
#include "prog_execute.h"
|
||||
#include "main/glheader.h"
|
||||
#include "main/colormac.h"
|
||||
#include "main/context.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/imports.h"
|
||||
#include "shader/prog_instruction.h"
|
||||
#include "shader/prog_statevars.h"
|
||||
#include "shader/prog_execute.h"
|
||||
#include "swrast/s_context.h"
|
||||
#include "swrast/s_texfilter.h"
|
||||
|
||||
#include "tnl.h"
|
||||
#include "t_context.h"
|
||||
#include "t_pipeline.h"
|
||||
#include "tnl/tnl.h"
|
||||
#include "tnl/t_context.h"
|
||||
#include "tnl/t_pipeline.h"
|
||||
|
||||
#include "swrast/s_context.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.
|
||||
* The texture sampling code is in swrast, though it doesn't have any
|
||||
* real dependencies on the rest of swrast. It should probably be
|
||||
* moved into main/ someday.
|
||||
*/
|
||||
|
||||
static void
|
||||
vp_fetch_texel(GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
|
||||
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.
|
||||
*/
|
||||
@@ -143,92 +248,44 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine)
|
||||
|
||||
|
||||
/**
|
||||
* Copy the 16 elements of a matrix into four consecutive program
|
||||
* registers starting at 'pos'.
|
||||
* Map the texture images which the vertex program will access (if any).
|
||||
*/
|
||||
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;
|
||||
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];
|
||||
GLuint u;
|
||||
|
||||
if (!ctx->Driver.MapTexture)
|
||||
return;
|
||||
|
||||
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
|
||||
load_transpose_matrix(GLfloat registers[][4], GLuint pos,
|
||||
const GLfloat mat[16])
|
||||
unmap_textures(GLcontext *ctx, const struct gl_vertex_program *vp)
|
||||
{
|
||||
MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat));
|
||||
}
|
||||
GLuint u;
|
||||
|
||||
if (!ctx->Driver.MapTexture)
|
||||
return;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
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.UnmapTexture(ctx, ctx->Texture.Unit[u]._Current);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -259,6 +316,7 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
|
||||
_mesa_load_state_parameters(ctx, program->Base.Parameters);
|
||||
}
|
||||
|
||||
/* make list of outputs to save some time below */
|
||||
numOutputs = 0;
|
||||
for (i = 0; i < VERT_RESULT_MAX; 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++) {
|
||||
GLuint attr;
|
||||
|
||||
@@ -317,6 +377,8 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
|
||||
#endif
|
||||
}
|
||||
|
||||
unmap_textures(ctx, program);
|
||||
|
||||
/* Fixup fog and point size results if needed */
|
||||
if (program->IsNVProgram) {
|
||||
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
|
||||
* 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;
|
||||
if (program->IsPositionInvariant) {
|
||||
/* We need the exact same transform as in the fixed function path here
|
||||
* to guarantee invariance, depending on compiler optimization flags
|
||||
* results could be different otherwise.
|
||||
*/
|
||||
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[1] = &store->results[VERT_RESULT_BFC0];
|
||||
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;
|
||||
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;
|
||||
return do_ndc_cliptest(ctx, store);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -648,12 +648,12 @@ void _tnl_generate_sse_emit( GLcontext *ctx )
|
||||
|
||||
p.ctx = ctx;
|
||||
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.identity = x86_make_reg(file_XMM, 6);
|
||||
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;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
|
||||
/*
|
||||
* 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
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -82,7 +81,4 @@ _tnl_draw_prims( GLcontext *ctx,
|
||||
GLuint min_index,
|
||||
GLuint max_index);
|
||||
|
||||
extern void
|
||||
_mesa_load_tracked_matrices(GLcontext *ctx);
|
||||
|
||||
#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;
|
||||
|
||||
if (DO_TWOSTENCIL && ctx->Stencil.TestTwoSide) {
|
||||
ctx->_Facing = facing; /* mixed mode rendering: for 2-sided stencil test */
|
||||
}
|
||||
|
||||
if (DO_UNFILLED) {
|
||||
if (facing) {
|
||||
mode = ctx->Polygon.BackMode;
|
||||
@@ -421,10 +417,6 @@ static void TAG(quad)( GLcontext *ctx,
|
||||
{
|
||||
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 (facing) {
|
||||
mode = ctx->Polygon.BackMode;
|
||||
|
||||
@@ -242,6 +242,7 @@ void _vbo_DestroyContext( GLcontext *ctx )
|
||||
}
|
||||
|
||||
vbo_exec_destroy(ctx);
|
||||
vbo_save_destroy(ctx);
|
||||
FREE(vbo_context(ctx));
|
||||
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,
|
||||
GLfloat u);
|
||||
|
||||
extern GLboolean
|
||||
vbo_validate_shaders(GLcontext *ctx);
|
||||
|
||||
#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
|
||||
* ctx->Driver.CurrentExecPrimitive uptodate as well.
|
||||
*/
|
||||
@@ -491,18 +508,16 @@ static void GLAPIENTRY vbo_exec_Begin( GLenum mode )
|
||||
if (ctx->NewState) {
|
||||
_mesa_update_state( ctx );
|
||||
|
||||
/* XXX also need to check if shader enabled, but invalid */
|
||||
if ((ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) ||
|
||||
(ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBegin (invalid vertex/fragment program)");
|
||||
return;
|
||||
}
|
||||
|
||||
CALL_Begin(ctx->Exec, (mode));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!vbo_validate_shaders(ctx)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glBegin (invalid vertex/fragment program)");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Heuristic: attempt to isolate attributes occuring outside
|
||||
* begin/end pairs.
|
||||
*/
|
||||
|
||||
@@ -245,6 +245,11 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count)
|
||||
if (ctx->NewState)
|
||||
_mesa_update_state( ctx );
|
||||
|
||||
if (!vbo_validate_shaders(ctx)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawArrays(bad shader)");
|
||||
return;
|
||||
}
|
||||
|
||||
bind_arrays( ctx );
|
||||
|
||||
prim[0].begin = 1;
|
||||
@@ -280,6 +285,11 @@ vbo_exec_DrawRangeElements(GLenum mode,
|
||||
if (ctx->NewState)
|
||||
_mesa_update_state( ctx );
|
||||
|
||||
if (!vbo_validate_shaders(ctx)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawRangeElements(bad shader)");
|
||||
return;
|
||||
}
|
||||
|
||||
bind_arrays( ctx );
|
||||
|
||||
ib.count = count;
|
||||
@@ -340,6 +350,11 @@ vbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *ind
|
||||
if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices ))
|
||||
return;
|
||||
|
||||
if (!vbo_validate_shaders(ctx)) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glDrawElements(bad shader)");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ctx->Array.ElementArrayBufferObj->Name) {
|
||||
const GLvoid *map = ctx->Driver.MapBuffer(ctx,
|
||||
GL_ELEMENT_ARRAY_BUFFER_ARB,
|
||||
|
||||
@@ -69,6 +69,21 @@ void vbo_save_init( 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 "x86sse.h"
|
||||
@@ -6,54 +6,78 @@
|
||||
#define DISASSEM 0
|
||||
#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:
|
||||
*/
|
||||
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 )
|
||||
{
|
||||
*(GLint *)(p->csr) = i0;
|
||||
p->csr += 4;
|
||||
}
|
||||
|
||||
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;
|
||||
{
|
||||
unsigned char *csr = p->csr;
|
||||
p->csr += bytes;
|
||||
return csr;
|
||||
}
|
||||
#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);
|
||||
*(p->csr++) = b0;
|
||||
char *csr = (char *)reserve(p, 1);
|
||||
*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);
|
||||
*(p->csr++) = b0;
|
||||
*(p->csr++) = b1;
|
||||
int *icsr = (int *)reserve(p, sizeof(i0));
|
||||
*icsr = i0;
|
||||
}
|
||||
|
||||
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);
|
||||
*(p->csr++) = b0;
|
||||
*(p->csr++) = b1;
|
||||
*(p->csr++) = b2;
|
||||
unsigned char *csr = reserve(p, 1);
|
||||
*csr++ = b0;
|
||||
}
|
||||
|
||||
#define emit_1ub(p, b0) emit_1ub_fn(p, b0, __FUNCTION__)
|
||||
#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__)
|
||||
static void emit_2ub( struct x86_function *p, unsigned char b0, unsigned char b1 )
|
||||
{
|
||||
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
|
||||
@@ -63,7 +87,7 @@ static void emit_modrm( struct x86_function *p,
|
||||
struct x86_reg reg,
|
||||
struct x86_reg regmem )
|
||||
{
|
||||
GLubyte val = 0;
|
||||
unsigned char val = 0;
|
||||
|
||||
assert(reg.mod == mod_REG);
|
||||
|
||||
@@ -71,13 +95,13 @@ static void emit_modrm( struct x86_function *p,
|
||||
val |= reg.idx << 3; /* reg 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.
|
||||
*/
|
||||
if (regmem.file == file_REG32 &&
|
||||
regmem.idx == reg_SP) {
|
||||
emit_1ub_fn(p, 0x24, 0); /* simplistic! */
|
||||
emit_1ub(p, 0x24); /* simplistic! */
|
||||
}
|
||||
|
||||
switch (regmem.mod) {
|
||||
@@ -98,7 +122,7 @@ static void emit_modrm( struct x86_function *p,
|
||||
|
||||
|
||||
static void emit_modrm_noreg( struct x86_function *p,
|
||||
GLuint op,
|
||||
unsigned op,
|
||||
struct x86_reg regmem )
|
||||
{
|
||||
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.
|
||||
*/
|
||||
static void emit_op_modrm( struct x86_function *p,
|
||||
GLubyte op_dst_is_reg,
|
||||
GLubyte op_dst_is_mem,
|
||||
unsigned char op_dst_is_reg,
|
||||
unsigned char op_dst_is_mem,
|
||||
struct x86_reg dst,
|
||||
struct x86_reg src )
|
||||
{
|
||||
switch (dst.mod) {
|
||||
case mod_REG:
|
||||
emit_1ub_fn(p, op_dst_is_reg, 0);
|
||||
emit_1ub(p, op_dst_is_reg);
|
||||
emit_modrm(p, dst, src);
|
||||
break;
|
||||
case mod_INDIRECT:
|
||||
case mod_DISP32:
|
||||
case mod_DISP8:
|
||||
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);
|
||||
break;
|
||||
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,
|
||||
GLint disp )
|
||||
int disp )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
|
||||
GLubyte *x86_get_label( struct x86_function *p )
|
||||
unsigned char *x86_get_label( struct x86_function *p )
|
||||
{
|
||||
return p->csr;
|
||||
}
|
||||
@@ -199,13 +223,13 @@ GLubyte *x86_get_label( struct x86_function *p )
|
||||
|
||||
void x86_jcc( struct x86_function *p,
|
||||
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) {
|
||||
emit_1ub(p, 0x70 + cc);
|
||||
emit_1b(p, (GLbyte) offset);
|
||||
emit_1b(p, (char) offset);
|
||||
}
|
||||
else {
|
||||
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:
|
||||
*/
|
||||
GLubyte *x86_jcc_forward( struct x86_function *p,
|
||||
unsigned char *x86_jcc_forward( struct x86_function *p,
|
||||
enum x86_cc cc )
|
||||
{
|
||||
emit_2ub(p, 0x0f, 0x80 + cc);
|
||||
@@ -224,14 +248,14 @@ GLubyte *x86_jcc_forward( struct x86_function *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_1i(p, 0);
|
||||
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_1i(p, 0);
|
||||
@@ -241,28 +265,41 @@ GLubyte *x86_call_forward( struct x86_function *p)
|
||||
/* Fixup offset from forward jump:
|
||||
*/
|
||||
void x86_fixup_fwd_jump( struct x86_function *p,
|
||||
GLubyte *fixup )
|
||||
unsigned char *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_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_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:
|
||||
* 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.
|
||||
*/
|
||||
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);
|
||||
emit_1ub(p, 0xb8 + dst.idx);
|
||||
@@ -502,6 +539,14 @@ void sse_addss( struct x86_function *p,
|
||||
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,
|
||||
struct x86_reg dst,
|
||||
struct x86_reg src )
|
||||
@@ -510,6 +555,13 @@ void sse_andps( struct x86_function *p,
|
||||
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,
|
||||
struct x86_reg dst,
|
||||
@@ -538,6 +590,21 @@ void sse_movlhps( struct x86_function *p,
|
||||
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,
|
||||
struct x86_reg dst,
|
||||
@@ -559,7 +626,7 @@ void sse_cvtps2pi( struct x86_function *p,
|
||||
void sse_shufps( struct x86_function *p,
|
||||
struct x86_reg dest,
|
||||
struct x86_reg arg0,
|
||||
GLubyte shuf)
|
||||
unsigned char shuf)
|
||||
{
|
||||
emit_2ub(p, X86_TWOB, 0xC6);
|
||||
emit_modrm(p, dest, arg0);
|
||||
@@ -569,13 +636,21 @@ void sse_shufps( struct x86_function *p,
|
||||
void sse_cmpps( struct x86_function *p,
|
||||
struct x86_reg dest,
|
||||
struct x86_reg arg0,
|
||||
GLubyte cc)
|
||||
unsigned char cc)
|
||||
{
|
||||
emit_2ub(p, X86_TWOB, 0xC2);
|
||||
emit_modrm(p, dest, arg0);
|
||||
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
|
||||
*/
|
||||
@@ -586,13 +661,21 @@ void sse_cmpps( struct x86_function *p,
|
||||
void sse2_pshufd( struct x86_function *p,
|
||||
struct x86_reg dest,
|
||||
struct x86_reg arg0,
|
||||
GLubyte shuf)
|
||||
unsigned char shuf)
|
||||
{
|
||||
emit_3ub(p, 0x66, X86_TWOB, 0x70);
|
||||
emit_modrm(p, dest, arg0);
|
||||
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,
|
||||
struct x86_reg dst,
|
||||
struct x86_reg src )
|
||||
@@ -625,6 +708,14 @@ void sse2_packuswb( struct x86_function *p,
|
||||
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,
|
||||
struct x86_reg dst,
|
||||
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,
|
||||
GLubyte dst0ub0,
|
||||
GLubyte dst0ub1,
|
||||
GLubyte arg0ub0,
|
||||
GLubyte arg0ub1,
|
||||
GLubyte argmem_noreg)
|
||||
unsigned char dst0ub0,
|
||||
unsigned char dst0ub1,
|
||||
unsigned char arg0ub0,
|
||||
unsigned char arg0ub1,
|
||||
unsigned char argmem_noreg)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else if (dst.idx == 0) {
|
||||
assert(arg.file = file_REG32);
|
||||
assert(arg.file == file_REG32);
|
||||
emit_1ub(p, 0xd8);
|
||||
emit_modrm_noreg(p, argmem_noreg, arg);
|
||||
}
|
||||
@@ -1056,44 +1147,42 @@ void mmx_movq( struct x86_function *p,
|
||||
* account any push/pop activity:
|
||||
*/
|
||||
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),
|
||||
p->stack_offset + arg * 4); /* ??? */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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 )
|
||||
void x86_init_func( struct x86_function *p )
|
||||
{
|
||||
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);
|
||||
if (p->store) {
|
||||
p->csr = p->store;
|
||||
return GL_TRUE;
|
||||
}
|
||||
else {
|
||||
p->csr = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
p->csr = p->store;
|
||||
return p->store != NULL;
|
||||
}
|
||||
|
||||
void x86_release_func( struct x86_function *p )
|
||||
{
|
||||
if (p->store)
|
||||
_mesa_exec_free(p->store);
|
||||
p->store = p->csr = NULL;
|
||||
_mesa_exec_free(p->store);
|
||||
p->store = NULL;
|
||||
p->csr = NULL;
|
||||
p->size = 0;
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
return (void (*)(void))p->store;
|
||||
return (void (*)(void)) (unsigned long) p->store;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@@ -2,26 +2,25 @@
|
||||
#ifndef _X86SSE_H_
|
||||
#define _X86SSE_H_
|
||||
|
||||
#if defined(USE_X86_ASM) || defined(SLANG_X86)
|
||||
|
||||
#include "glheader.h"
|
||||
#if defined(__i386__) || defined(__386__)
|
||||
|
||||
/* 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
|
||||
* for mmx/sse/sse2 support on the cpu.
|
||||
*/
|
||||
struct x86_reg {
|
||||
GLuint file:3;
|
||||
GLuint idx:3;
|
||||
GLuint mod:2; /* mod_REG if this is just a register */
|
||||
GLint disp:24; /* only +/- 23bits of offset - should be enough... */
|
||||
unsigned file:3;
|
||||
unsigned idx:3;
|
||||
unsigned mod:2; /* mod_REG if this is just a register */
|
||||
int disp:24; /* only +/- 23bits of offset - should be enough... */
|
||||
};
|
||||
|
||||
struct x86_function {
|
||||
GLubyte *store;
|
||||
GLubyte *csr;
|
||||
GLuint stack_offset;
|
||||
GLint need_emms;
|
||||
unsigned size;
|
||||
unsigned char *store;
|
||||
unsigned char *csr;
|
||||
unsigned stack_offset;
|
||||
int need_emms;
|
||||
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_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 );
|
||||
|
||||
struct x86_reg x86_make_disp( struct x86_reg reg,
|
||||
GLint disp );
|
||||
int disp );
|
||||
|
||||
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:
|
||||
*/
|
||||
GLubyte *x86_get_label( struct x86_function *p );
|
||||
unsigned char *x86_get_label( struct x86_function *p );
|
||||
|
||||
void x86_jcc( struct x86_function *p,
|
||||
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 );
|
||||
|
||||
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,
|
||||
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:
|
||||
* 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.
|
||||
*/
|
||||
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():
|
||||
@@ -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 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_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_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 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_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_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_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_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 );
|
||||
@@ -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_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_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_rsqrtps( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
|
||||
void sse_rsqrtss( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
|
||||
void sse_shufps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, 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_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
|
||||
* 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
|
||||
|
||||
Reference in New Issue
Block a user