#include "sis_context.h"
#include "sis_dd.h"
#include "sis_lock.h"
#include "sis_alloc.h"
#include "sis_state.h"
#include "swrast/swrast.h"
#include "utils.h"
#define DRIVER_DATE "20030810"
static void
sisDDGetBufferSize( GLframebuffer *buffer,
GLuint *width, GLuint *height )
{
GET_CURRENT_CONTEXT(ctx);
sisContextPtr smesa = SIS_CONTEXT(ctx);
LOCK_HARDWARE();
*width = smesa->driDrawable->w;
*height = smesa->driDrawable->h;
UNLOCK_HARDWARE();
}
static const GLubyte *
sisDDGetString( GLcontext *ctx, GLenum name )
{
sisContextPtr smesa = SIS_CONTEXT(ctx);
static char buffer[128];
unsigned offset;
GLuint agp_mode = (smesa->AGPSize > 0);
switch ( name )
{
case GL_VENDOR:
return (GLubyte *)"Eric Anholt";
case GL_RENDERER:
offset = driGetRendererString( buffer, "SiS", DRIVER_DATE, agp_mode );
return (GLubyte *)buffer;
default:
return NULL;
}
}
static void
sisDDFlush( GLcontext *ctx )
{
}
static void
sisDDFinish( GLcontext *ctx )
{
sisContextPtr smesa = SIS_CONTEXT(ctx);
sisDDFlush( ctx );
WaitEngIdle( smesa );
}
void
sisUpdateBufferSize( sisContextPtr smesa )
{
__GLSiSHardware *current = &smesa->current;
__GLSiSHardware *prev = &smesa->prev;
GLuint z_depth;
smesa->frontOffset = smesa->driDrawable->x * smesa->bytesPerPixel +
smesa->driDrawable->y * smesa->frontPitch;
if ( smesa->width == smesa->driDrawable->w &&
smesa->height == smesa->driDrawable->h )
{
return;
}
smesa->width = smesa->driDrawable->w;
smesa->height = smesa->driDrawable->h;
smesa->bottom = smesa->height - 1;
if ( smesa->backbuffer )
sisFreeBackbuffer( smesa );
if ( smesa->depthbuffer )
sisFreeZStencilBuffer( smesa );
if ( smesa->glCtx->Visual.depthBits > 0 )
sisAllocZStencilBuffer( smesa );
if ( smesa->glCtx->Visual.doubleBufferMode )
sisAllocBackbuffer( smesa );
switch (smesa->zFormat)
{
case SiS_ZFORMAT_Z16:
z_depth = 2;
break;
case SiS_ZFORMAT_Z32:
case SiS_ZFORMAT_S8Z24:
z_depth = 4;
break;
default:
assert( 0 );
}
current->hwZ &= ~MASK_ZBufferPitch;
current->hwZ |= smesa->width * z_depth >> 2;
current->hwOffsetZ = smesa->depthOffset >> 2;
if ((current->hwOffsetZ != prev->hwOffsetZ) || (current->hwZ != prev->hwZ)) {
prev->hwOffsetZ = current->hwOffsetZ;
prev->hwZ = current->hwZ;
smesa->GlobalFlag |= GFLAG_ZSETTING;
}
sisUpdateClipping( smesa->glCtx );
}
void
sisDDInitDriverFuncs( GLcontext *ctx )
{
ctx->Driver.GetBufferSize = sisDDGetBufferSize;
ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
ctx->Driver.GetString = sisDDGetString;
ctx->Driver.Finish = sisDDFinish;
ctx->Driver.Flush = sisDDFlush;
ctx->Driver.Error = NULL;
}