Commit ae27f9a6 authored by Keith Whitwell's avatar Keith Whitwell
Browse files

Fix problems when sizeof(Node) != sizeof(float)

parent 80704437
......@@ -618,11 +618,7 @@ static GLuint translate_id( GLsizei n, GLenum type, const GLvoid *list )
/***** Public *****/
/**********************************************************************/
/**
* Do one-time initialiazations for display lists.
*/
void
_mesa_init_lists( void )
void _mesa_init_lists( void )
{
static int init_flag = 0;
......@@ -793,32 +789,6 @@ _mesa_init_lists( void )
}
/**
* Wrapper for _mesa_unpack_image() that handles pixel buffer objects.
* \todo This won't suffice when the PBO is really in VRAM/GPU memory.
*/
static GLvoid *
unpack_image( GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *unpack )
{
if (unpack->BufferObj->Name == 0) {
/* no PBO */
return _mesa_unpack_image(width, height, depth, format, type,
pixels, unpack);
}
else if (_mesa_validate_pbo_access(unpack, width, height, depth, format,
type, pixels)) {
const GLubyte *src = ADD_POINTERS(unpack->BufferObj->Data, pixels);
return _mesa_unpack_image(width, height, depth, format, type,
src, unpack);
}
/* bad access! */
return NULL;
}
/*
* Allocate space for a display list instruction.
* \param opcode - type of instruction
......@@ -1285,8 +1255,8 @@ static void GLAPIENTRY save_ColorTable( GLenum target, GLenum internalFormat,
format, type, table );
}
else {
GLvoid *image = unpack_image(width, 1, 1, format, type, table,
&ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type, table,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_TABLE, 6 );
......@@ -1374,8 +1344,8 @@ static void GLAPIENTRY save_ColorSubTable( GLenum target, GLsizei start, GLsizei
const GLvoid *table)
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = unpack_image(count, 1, 1, format, type, table,
&ctx->Unpack);
GLvoid *image = _mesa_unpack_image(count, 1, 1, format, type, table,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_COLOR_SUB_TABLE, 6 );
......@@ -1445,8 +1415,8 @@ save_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width,
GLenum format, GLenum type, const GLvoid *filter)
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = unpack_image(width, 1, 1, format, type, filter,
&ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type, filter,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_FILTER_1D, 6 );
......@@ -1474,8 +1444,8 @@ save_ConvolutionFilter2D(GLenum target, GLenum internalFormat,
GLenum type, const GLvoid *filter)
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = unpack_image(width, height, 1, format, type, filter,
&ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type, filter,
&ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_CONVOLUTION_FILTER_2D, 7 );
......@@ -1839,8 +1809,8 @@ static void GLAPIENTRY save_DrawPixels( GLsizei width, GLsizei height,
const GLvoid *pixels )
{
GET_CURRENT_CONTEXT(ctx);
GLvoid *image = unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_DRAW_PIXELS, 5 );
......@@ -3395,8 +3365,8 @@ static void GLAPIENTRY save_TexImage1D( GLenum target,
border, format, type, pixels );
}
else {
GLvoid *image = unpack_image(width, 1, 1, format, type,
pixels, &ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type,
pixels, &ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_IMAGE1D, 8 );
......@@ -3434,8 +3404,8 @@ static void GLAPIENTRY save_TexImage2D( GLenum target,
height, border, format, type, pixels );
}
else {
GLvoid *image = unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
Node *n;
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_IMAGE2D, 9 );
......@@ -3476,8 +3446,8 @@ static void GLAPIENTRY save_TexImage3D( GLenum target,
}
else {
Node *n;
GLvoid *image = unpack_image(width, height, depth, format, type,
pixels, &ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, height, depth, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_IMAGE3D, 10 );
if (n) {
......@@ -3509,8 +3479,8 @@ static void GLAPIENTRY save_TexSubImage1D( GLenum target, GLint level, GLint xof
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
GLvoid *image = unpack_image(width, 1, 1, format, type,
pixels, &ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_SUB_IMAGE1D, 7 );
if (n) {
......@@ -3540,8 +3510,8 @@ static void GLAPIENTRY save_TexSubImage2D( GLenum target, GLint level,
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
GLvoid *image = unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, height, 1, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_SUB_IMAGE2D, 9 );
if (n) {
......@@ -3573,8 +3543,8 @@ static void GLAPIENTRY save_TexSubImage3D( GLenum target, GLint level,
{
GET_CURRENT_CONTEXT(ctx);
Node *n;
GLvoid *image = unpack_image(width, height, depth, format, type,
pixels, &ctx->Unpack);
GLvoid *image = _mesa_unpack_image(width, height, depth, format, type,
pixels, &ctx->Unpack);
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
n = ALLOC_INSTRUCTION( ctx, OPCODE_TEX_SUB_IMAGE3D, 11 );
if (n) {
......@@ -5313,8 +5283,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_BITMAP:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->Bitmap)( (GLsizei) n[1].i, (GLsizei) n[2].i,
n[3].f, n[4].f, n[5].f, n[6].f, (const GLubyte *) n[7].data );
ctx->Unpack = save; /* restore */
......@@ -5384,8 +5354,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_COLOR_TABLE:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ColorTable)( n[1].e, n[2].e, n[3].i, n[4].e,
n[5].e, n[6].data );
ctx->Unpack = save; /* restore */
......@@ -5413,8 +5383,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_COLOR_SUB_TABLE:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ColorSubTable)( n[1].e, n[2].i, n[3].i,
n[4].e, n[5].e, n[6].data );
ctx->Unpack = save; /* restore */
......@@ -5422,8 +5392,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_CONVOLUTION_FILTER_1D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ConvolutionFilter1D)( n[1].e, n[2].i, n[3].i,
n[4].e, n[5].e, n[6].data );
ctx->Unpack = save; /* restore */
......@@ -5431,8 +5401,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_CONVOLUTION_FILTER_2D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->ConvolutionFilter2D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].e, n[6].e, n[7].data );
ctx->Unpack = save; /* restore */
......@@ -5516,8 +5486,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_DRAW_PIXELS:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->DrawPixels)( n[1].i, n[2].i, n[3].e, n[4].e,
n[5].data );
ctx->Unpack = save; /* restore */
......@@ -5785,8 +5755,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_TEX_IMAGE1D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexImage1D)(
n[1].e, /* target */
n[2].i, /* level */
......@@ -5801,8 +5771,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_TEX_IMAGE2D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexImage2D)(
n[1].e, /* target */
n[2].i, /* level */
......@@ -5818,8 +5788,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_TEX_IMAGE3D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexImage3D)(
n[1].e, /* target */
n[2].i, /* level */
......@@ -5836,8 +5806,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_TEX_SUB_IMAGE1D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexSubImage1D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].e,
n[6].e, n[7].data );
......@@ -5846,8 +5816,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_TEX_SUB_IMAGE2D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexSubImage2D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].e,
n[6].i, n[7].e, n[8].e, n[9].data );
......@@ -5856,8 +5826,8 @@ execute_list( GLcontext *ctx, GLuint list )
break;
case OPCODE_TEX_SUB_IMAGE3D:
{
const struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = ctx->DefaultPacking;
struct gl_pixelstore_attrib save = ctx->Unpack;
ctx->Unpack = _mesa_native_packing;
(*ctx->Exec->TexSubImage3D)( n[1].e, n[2].i, n[3].i,
n[4].i, n[5].i, n[6].i, n[7].i,
n[8].i, n[9].e, n[10].e,
......@@ -5980,16 +5950,42 @@ execute_list( GLcontext *ctx, GLuint list )
(*ctx->Exec->VertexAttrib1fNV)(n[1].e, n[2].f);
break;
case OPCODE_ATTR_2F:
(*ctx->Exec->VertexAttrib2fvNV)(n[1].e, &n[2].f);
/* Really shouldn't have to do this - the Node structure
* is convenient, but it would be better to store the data
* packed appropriately so that it can be sent directly
* on. With x86_64 becoming common, this will start to
* matter more.
*/
if (sizeof(Node)==sizeof(GLfloat))
(*ctx->Exec->VertexAttrib2fvNV)(n[1].e, &n[2].f);
else
(*ctx->Exec->VertexAttrib2fNV)(n[1].e, n[2].f, n[3].f);
break;
case OPCODE_ATTR_3F:
(*ctx->Exec->VertexAttrib3fvNV)(n[1].e, &n[2].f);
if (sizeof(Node)==sizeof(GLfloat))
(*ctx->Exec->VertexAttrib3fvNV)(n[1].e, &n[2].f);
else
(*ctx->Exec->VertexAttrib3fNV)(n[1].e, n[2].f, n[3].f,
n[4].f);
break;
case OPCODE_ATTR_4F:
(*ctx->Exec->VertexAttrib4fvNV)(n[1].e, &n[2].f);
if (sizeof(Node)==sizeof(GLfloat))
(*ctx->Exec->VertexAttrib4fvNV)(n[1].e, &n[2].f);
else
(*ctx->Exec->VertexAttrib4fNV)(n[1].e, n[2].f, n[3].f,
n[4].f, n[5].f);
break;
case OPCODE_MATERIAL:
(*ctx->Exec->Materialfv)(n[1].e, n[2].e, &n[3].f);
if (sizeof(Node)==sizeof(GLfloat))
(*ctx->Exec->Materialfv)(n[1].e, n[2].e, &n[3].f);
else {
GLfloat f[4];
f[0] = n[3].f;
f[1] = n[4].f;
f[2] = n[5].f;
f[3] = n[6].f;
(*ctx->Exec->Materialfv)(n[1].e, n[2].e, f);
}
break;
case OPCODE_INDEX:
(*ctx->Exec->Indexi)(n[1].i);
......@@ -6010,7 +6006,7 @@ execute_list( GLcontext *ctx, GLuint list )
(*ctx->Exec->EvalCoord1f)(n[1].f);
break;
case OPCODE_EVAL_C2:
(*ctx->Exec->EvalCoord2fv)(&n[1].f);
(*ctx->Exec->EvalCoord2f)(n[1].f, n[2].f);
break;
case OPCODE_EVAL_P1:
(*ctx->Exec->EvalPoint1)(n[1].i);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment