Port glXCopyContext bug from 4.0 branch.

This commit is contained in:
Brian Paul
2002-06-17 23:36:31 +00:00
parent d373819b8c
commit 85d816028a
6 changed files with 183 additions and 71 deletions

View File

@@ -1,4 +1,4 @@
/* $Id: attrib.c,v 1.68 2002/06/15 03:03:06 brianp Exp $ */
/* $Id: attrib.c,v 1.69 2002/06/17 23:36:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -72,42 +72,6 @@ new_attrib_node( GLbitfield kind )
}
/*
* Copy texture object state from one texture object to another.
*/
static void
copy_texobj_state( struct gl_texture_object *dest,
const struct gl_texture_object *src )
{
dest->Name = src->Name;
/*dest->Target = src->Target*/
dest->Priority = src->Priority;
dest->BorderColor[0] = src->BorderColor[0];
dest->BorderColor[1] = src->BorderColor[1];
dest->BorderColor[2] = src->BorderColor[2];
dest->BorderColor[3] = src->BorderColor[3];
dest->WrapS = src->WrapS;
dest->WrapT = src->WrapT;
dest->WrapR = src->WrapR;
dest->MinFilter = src->MinFilter;
dest->MagFilter = src->MagFilter;
dest->MinLod = src->MinLod;
dest->MaxLod = src->MaxLod;
dest->BaseLevel = src->BaseLevel;
dest->MaxLevel = src->MaxLevel;
dest->MaxAnisotropy = src->MaxAnisotropy;
dest->CompareFlag = src->CompareFlag;
dest->CompareOperator = src->CompareOperator;
dest->ShadowAmbient = src->ShadowAmbient;
dest->_MaxLevel = src->_MaxLevel;
dest->_MaxLambda = src->_MaxLambda;
dest->Palette = src->Palette;
dest->Complete = src->Complete;
}
void
_mesa_PushAttrib(GLbitfield mask)
{
@@ -387,11 +351,16 @@ _mesa_PushAttrib(GLbitfield mask)
MEMCPY( attr, &ctx->Texture, sizeof(struct gl_texture_attrib) );
/* copy state of the currently bound texture objects */
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
copy_texobj_state(&attr->Unit[u].Saved1D, attr->Unit[u].Current1D);
copy_texobj_state(&attr->Unit[u].Saved2D, attr->Unit[u].Current2D);
copy_texobj_state(&attr->Unit[u].Saved3D, attr->Unit[u].Current3D);
copy_texobj_state(&attr->Unit[u].SavedCubeMap, attr->Unit[u].CurrentCubeMap);
copy_texobj_state(&attr->Unit[u].SavedRect, attr->Unit[u].CurrentRect);
_mesa_copy_texture_object(&attr->Unit[u].Saved1D,
attr->Unit[u].Current1D);
_mesa_copy_texture_object(&attr->Unit[u].Saved2D,
attr->Unit[u].Current2D);
_mesa_copy_texture_object(&attr->Unit[u].Saved3D,
attr->Unit[u].Current3D);
_mesa_copy_texture_object(&attr->Unit[u].SavedCubeMap,
attr->Unit[u].CurrentCubeMap);
_mesa_copy_texture_object(&attr->Unit[u].SavedRect,
attr->Unit[u].CurrentRect);
}
newnode = new_attrib_node( GL_TEXTURE_BIT );
newnode->data = attr;

View File

@@ -1,4 +1,4 @@
/* $Id: context.c,v 1.169 2002/06/16 01:10:41 brianp Exp $ */
/* $Id: context.c,v 1.170 2002/06/17 23:36:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -49,6 +49,7 @@
#include "state.h"
#include "teximage.h"
#include "texobj.h"
#include "texstate.h"
#include "mtypes.h"
#include "varray.h"
#include "vpstate.h"
@@ -461,6 +462,8 @@ _mesa_initialize_framebuffer( GLframebuffer *buffer,
assert(buffer);
assert(visual);
BZERO(buffer, sizeof(GLframebuffer));
/* sanity checks */
if (softwareDepth ) {
assert(visual->depthBits > 0);
@@ -1978,72 +1981,104 @@ void
_mesa_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
{
if (mask & GL_ACCUM_BUFFER_BIT) {
MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
/* OK to memcpy */
dst->Accum = src->Accum;
}
if (mask & GL_COLOR_BUFFER_BIT) {
MEMCPY( &dst->Color, &src->Color, sizeof(struct gl_colorbuffer_attrib) );
/* OK to memcpy */
dst->Color = src->Color;
}
if (mask & GL_CURRENT_BIT) {
MEMCPY( &dst->Current, &src->Current, sizeof(struct gl_current_attrib) );
/* OK to memcpy */
dst->Current = src->Current;
}
if (mask & GL_DEPTH_BUFFER_BIT) {
MEMCPY( &dst->Depth, &src->Depth, sizeof(struct gl_depthbuffer_attrib) );
/* OK to memcpy */
dst->Depth = src->Depth;
}
if (mask & GL_ENABLE_BIT) {
/* no op */
}
if (mask & GL_EVAL_BIT) {
MEMCPY( &dst->Eval, &src->Eval, sizeof(struct gl_eval_attrib) );
/* OK to memcpy */
dst->Eval = src->Eval;
}
if (mask & GL_FOG_BIT) {
MEMCPY( &dst->Fog, &src->Fog, sizeof(struct gl_fog_attrib) );
/* OK to memcpy */
dst->Fog = src->Fog;
}
if (mask & GL_HINT_BIT) {
MEMCPY( &dst->Hint, &src->Hint, sizeof(struct gl_hint_attrib) );
/* OK to memcpy */
dst->Hint = src->Hint;
}
if (mask & GL_LIGHTING_BIT) {
MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light_attrib) );
/* gl_reinit_light_attrib( &dst->Light ); */
GLuint i;
/* begin with memcpy */
MEMCPY( &dst->Light, &src->Light, sizeof(struct gl_light) );
/* fixup linked lists to prevent pointer insanity */
make_empty_list( &(dst->Light.EnabledList) );
for (i = 0; i < MAX_LIGHTS; i++) {
if (dst->Light.Light[i].Enabled) {
insert_at_tail(&(dst->Light.EnabledList), &(dst->Light.Light[i]));
}
}
}
if (mask & GL_LINE_BIT) {
MEMCPY( &dst->Line, &src->Line, sizeof(struct gl_line_attrib) );
/* OK to memcpy */
dst->Line = src->Line;
}
if (mask & GL_LIST_BIT) {
MEMCPY( &dst->List, &src->List, sizeof(struct gl_list_attrib) );
/* OK to memcpy */
dst->List = src->List;
}
if (mask & GL_PIXEL_MODE_BIT) {
MEMCPY( &dst->Pixel, &src->Pixel, sizeof(struct gl_pixel_attrib) );
/* OK to memcpy */
dst->Pixel = src->Pixel;
}
if (mask & GL_POINT_BIT) {
MEMCPY( &dst->Point, &src->Point, sizeof(struct gl_point_attrib) );
/* OK to memcpy */
dst->Point = src->Point;
}
if (mask & GL_POLYGON_BIT) {
MEMCPY( &dst->Polygon, &src->Polygon, sizeof(struct gl_polygon_attrib) );
/* OK to memcpy */
dst->Polygon = src->Polygon;
}
if (mask & GL_POLYGON_STIPPLE_BIT) {
/* Use loop instead of MEMCPY due to problem with Portland Group's
* C compiler. Reported by John Stone.
*/
int i;
for (i=0;i<32;i++) {
GLuint i;
for (i = 0; i < 32; i++) {
dst->PolygonStipple[i] = src->PolygonStipple[i];
}
}
if (mask & GL_SCISSOR_BIT) {
MEMCPY( &dst->Scissor, &src->Scissor, sizeof(struct gl_scissor_attrib) );
/* OK to memcpy */
dst->Scissor = src->Scissor;
}
if (mask & GL_STENCIL_BUFFER_BIT) {
MEMCPY( &dst->Stencil, &src->Stencil, sizeof(struct gl_stencil_attrib) );
/* OK to memcpy */
dst->Stencil = src->Stencil;
}
if (mask & GL_TEXTURE_BIT) {
MEMCPY( &dst->Texture, &src->Texture, sizeof(struct gl_texture_attrib) );
/* Cannot memcpy because of pointers */
_mesa_copy_texture_state(src, dst);
}
if (mask & GL_TRANSFORM_BIT) {
MEMCPY( &dst->Transform, &src->Transform, sizeof(struct gl_transform_attrib) );
/* OK to memcpy */
dst->Transform = src->Transform;
}
if (mask & GL_VIEWPORT_BIT) {
MEMCPY( &dst->Viewport, &src->Viewport, sizeof(struct gl_viewport_attrib) );
/* Cannot use memcpy, because of pointers in GLmatrix _WindowMap */
dst->Viewport.X = src->Viewport.X;
dst->Viewport.Y = src->Viewport.Y;
dst->Viewport.Width = src->Viewport.Width;
dst->Viewport.Height = src->Viewport.Height;
dst->Viewport.Near = src->Viewport.Near;
dst->Viewport.Far = src->Viewport.Far;
_math_matrix_copy(&dst->Viewport._WindowMap, &src->Viewport._WindowMap);
}
/* XXX FIXME: Call callbacks?
*/
dst->NewState = _NEW_ALL;

View File

@@ -1,4 +1,4 @@
/* $Id: texobj.c,v 1.55 2002/06/15 03:03:09 brianp Exp $ */
/* $Id: texobj.c,v 1.56 2002/06/17 23:36:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -175,6 +175,43 @@ void _mesa_free_texture_object( struct gl_shared_state *shared,
}
/*
* Copy texture object state from one texture object to another.
*/
void
_mesa_copy_texture_object( struct gl_texture_object *dest,
const struct gl_texture_object *src )
{
dest->Name = src->Name;
dest->Priority = src->Priority;
dest->BorderColor[0] = src->BorderColor[0];
dest->BorderColor[1] = src->BorderColor[1];
dest->BorderColor[2] = src->BorderColor[2];
dest->BorderColor[3] = src->BorderColor[3];
dest->WrapS = src->WrapS;
dest->WrapT = src->WrapT;
dest->WrapR = src->WrapR;
dest->MinFilter = src->MinFilter;
dest->MagFilter = src->MagFilter;
dest->MinLod = src->MinLod;
dest->MaxLod = src->MaxLod;
dest->BaseLevel = src->BaseLevel;
dest->MaxLevel = src->MaxLevel;
dest->MaxAnisotropy = src->MaxAnisotropy;
dest->CompareFlag = src->CompareFlag;
dest->CompareOperator = src->CompareOperator;
dest->ShadowAmbient = src->ShadowAmbient;
dest->CompareMode = src->CompareMode;
dest->CompareFunc = src->CompareFunc;
dest->DepthMode = src->DepthMode;
dest->_MaxLevel = src->_MaxLevel;
dest->_MaxLambda = src->_MaxLambda;
dest->GenerateMipmap = src->GenerateMipmap;
dest->Palette = src->Palette;
dest->Complete = src->Complete;
}
/*
* Report why a texture object is incomplete. (for debug only)
*/

View File

@@ -1,4 +1,4 @@
/* $Id: texobj.h,v 1.7 2002/06/15 03:03:09 brianp Exp $ */
/* $Id: texobj.h,v 1.8 2002/06/17 23:36:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -47,6 +47,11 @@ _mesa_free_texture_object( struct gl_shared_state *shared,
struct gl_texture_object *t );
extern void
_mesa_copy_texture_object( struct gl_texture_object *dest,
const struct gl_texture_object *src );
extern void
_mesa_test_texobj_completeness( const GLcontext *ctx,
struct gl_texture_object *t );

View File

@@ -1,4 +1,4 @@
/* $Id: texstate.c,v 1.75 2002/06/15 03:03:09 brianp Exp $ */
/* $Id: texstate.c,v 1.76 2002/06/17 23:36:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -56,6 +56,68 @@
void
_mesa_copy_texture_state( const GLcontext *src, GLcontext *dst )
{
GLuint i;
ASSERT(src);
ASSERT(dst);
dst->Texture.CurrentUnit = src->Texture.CurrentUnit;
dst->Texture._GenFlags = src->Texture._GenFlags;
dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled;
dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled;
dst->Texture.SharedPalette = src->Texture.SharedPalette;
/* per-unit state */
for (i = 0; i < src->Const.MaxTextureUnits; i++) {
dst->Texture.Unit[i].Enabled = src->Texture.Unit[i].Enabled;
dst->Texture.Unit[i].EnvMode = src->Texture.Unit[i].EnvMode;
COPY_4V(dst->Texture.Unit[i].EnvColor, src->Texture.Unit[i].EnvColor);
dst->Texture.Unit[i].TexGenEnabled = src->Texture.Unit[i].TexGenEnabled;
dst->Texture.Unit[i].GenModeS = src->Texture.Unit[i].GenModeS;
dst->Texture.Unit[i].GenModeT = src->Texture.Unit[i].GenModeT;
dst->Texture.Unit[i].GenModeR = src->Texture.Unit[i].GenModeR;
dst->Texture.Unit[i].GenModeQ = src->Texture.Unit[i].GenModeQ;
dst->Texture.Unit[i]._GenBitS = src->Texture.Unit[i]._GenBitS;
dst->Texture.Unit[i]._GenBitT = src->Texture.Unit[i]._GenBitT;
dst->Texture.Unit[i]._GenBitR = src->Texture.Unit[i]._GenBitR;
dst->Texture.Unit[i]._GenBitQ = src->Texture.Unit[i]._GenBitQ;
dst->Texture.Unit[i]._GenFlags = src->Texture.Unit[i]._GenFlags;
COPY_4V(dst->Texture.Unit[i].ObjectPlaneS, src->Texture.Unit[i].ObjectPlaneS);
COPY_4V(dst->Texture.Unit[i].ObjectPlaneT, src->Texture.Unit[i].ObjectPlaneT);
COPY_4V(dst->Texture.Unit[i].ObjectPlaneR, src->Texture.Unit[i].ObjectPlaneR);
COPY_4V(dst->Texture.Unit[i].ObjectPlaneQ, src->Texture.Unit[i].ObjectPlaneQ);
COPY_4V(dst->Texture.Unit[i].EyePlaneS, src->Texture.Unit[i].EyePlaneS);
COPY_4V(dst->Texture.Unit[i].EyePlaneT, src->Texture.Unit[i].EyePlaneT);
COPY_4V(dst->Texture.Unit[i].EyePlaneR, src->Texture.Unit[i].EyePlaneR);
COPY_4V(dst->Texture.Unit[i].EyePlaneQ, src->Texture.Unit[i].EyePlaneQ);
dst->Texture.Unit[i].LodBias = src->Texture.Unit[i].LodBias;
/* GL_EXT_texture_env_combine */
dst->Texture.Unit[i].CombineModeRGB = src->Texture.Unit[i].CombineModeRGB;
dst->Texture.Unit[i].CombineModeA = src->Texture.Unit[i].CombineModeA;
COPY_3V(dst->Texture.Unit[i].CombineSourceRGB, src->Texture.Unit[i].CombineSourceRGB);
COPY_3V(dst->Texture.Unit[i].CombineSourceA, src->Texture.Unit[i].CombineSourceA);
COPY_3V(dst->Texture.Unit[i].CombineOperandRGB, src->Texture.Unit[i].CombineOperandRGB);
COPY_3V(dst->Texture.Unit[i].CombineOperandA, src->Texture.Unit[i].CombineOperandA);
dst->Texture.Unit[i].CombineScaleShiftRGB = src->Texture.Unit[i].CombineScaleShiftRGB;
dst->Texture.Unit[i].CombineScaleShiftA = src->Texture.Unit[i].CombineScaleShiftA;
/* texture object state */
_mesa_copy_texture_object(dst->Texture.Unit[i].Current1D,
src->Texture.Unit[i].Current1D);
_mesa_copy_texture_object(dst->Texture.Unit[i].Current2D,
src->Texture.Unit[i].Current2D);
_mesa_copy_texture_object(dst->Texture.Unit[i].Current3D,
src->Texture.Unit[i].Current3D);
_mesa_copy_texture_object(dst->Texture.Unit[i].CurrentCubeMap,
src->Texture.Unit[i].CurrentCubeMap);
}
}
/**********************************************************************/
/* Texture Environment */
/**********************************************************************/

View File

@@ -1,10 +1,10 @@
/* $Id: texstate.h,v 1.8 2001/06/18 17:26:08 brianp Exp $ */
/* $Id: texstate.h,v 1.9 2002/06/17 23:36:31 brianp Exp $ */
/*
* Mesa 3-D graphics library
* Version: 3.5
* Version: 4.1
*
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
* Copyright (C) 1999-2002 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"),
@@ -32,6 +32,10 @@
#include "mtypes.h"
extern void
_mesa_copy_texture_state( const GLcontext *src, GLcontext *dst );
/*** Called from API ***/
extern void