mesa: re-remove s3v and trident driver files
These were removed from master but a few files came back from the texformat-rework branch.
This commit is contained in:
@@ -1,544 +0,0 @@
|
|||||||
/*
|
|
||||||
* Author: Max Lingua <sunmax@libero.it>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "main/glheader.h"
|
|
||||||
#include "main/mtypes.h"
|
|
||||||
#include "main/simple_list.h"
|
|
||||||
#include "main/enums.h"
|
|
||||||
#include "main/mm.h"
|
|
||||||
#include "main/texstore.h"
|
|
||||||
#include "main/teximage.h"
|
|
||||||
#include "swrast/swrast.h"
|
|
||||||
|
|
||||||
#include "s3v_context.h"
|
|
||||||
#include "s3v_tex.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern void s3vSwapOutTexObj(s3vContextPtr vmesa, s3vTextureObjectPtr t);
|
|
||||||
extern void s3vDestroyTexObj(s3vContextPtr vmesa, s3vTextureObjectPtr t);
|
|
||||||
|
|
||||||
/*
|
|
||||||
static GLuint s3vComputeLodBias(GLfloat bias)
|
|
||||||
{
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
DEBUG_TEX(("*** s3vComputeLodBias ***\n"));
|
|
||||||
#endif
|
|
||||||
return bias;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void s3vSetTexWrapping(s3vContextPtr vmesa,
|
|
||||||
s3vTextureObjectPtr t,
|
|
||||||
GLenum wraps, GLenum wrapt)
|
|
||||||
{
|
|
||||||
GLuint t0 = t->TextureCMD;
|
|
||||||
GLuint cmd = vmesa->CMD;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vSetTexWrapping: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
t0 &= ~TEX_WRAP_MASK;
|
|
||||||
cmd &= ~TEX_WRAP_MASK;
|
|
||||||
|
|
||||||
if ((wraps != GL_CLAMP) || (wrapt != GL_CLAMP)) {
|
|
||||||
DEBUG(("TEX_WRAP_ON\n"));
|
|
||||||
t0 |= TEX_WRAP_ON;
|
|
||||||
cmd |= TEX_WRAP_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd |= TEX_WRAP_ON; /* FIXME: broken if off */
|
|
||||||
t->TextureCMD = t0;
|
|
||||||
vmesa->CMD = cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void s3vSetTexFilter(s3vContextPtr vmesa,
|
|
||||||
s3vTextureObjectPtr t,
|
|
||||||
GLenum minf, GLenum magf)
|
|
||||||
{
|
|
||||||
GLuint t0 = t->TextureCMD;
|
|
||||||
GLuint cmd = vmesa->CMD;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vSetTexFilter: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
t0 &= ~TEX_FILTER_MASK;
|
|
||||||
cmd &= ~TEX_FILTER_MASK;
|
|
||||||
|
|
||||||
switch (minf) {
|
|
||||||
case GL_NEAREST:
|
|
||||||
DEBUG(("GL_NEAREST\n"));
|
|
||||||
t0 |= NEAREST;
|
|
||||||
cmd |= NEAREST;
|
|
||||||
break;
|
|
||||||
case GL_LINEAR:
|
|
||||||
DEBUG(("GL_LINEAR\n"));
|
|
||||||
t0 |= LINEAR;
|
|
||||||
cmd |= LINEAR;
|
|
||||||
break;
|
|
||||||
case GL_NEAREST_MIPMAP_NEAREST:
|
|
||||||
DEBUG(("GL_MIPMAP_NEAREST\n"));
|
|
||||||
t0 |= MIP_NEAREST;
|
|
||||||
cmd |= MIP_NEAREST;
|
|
||||||
break;
|
|
||||||
case GL_LINEAR_MIPMAP_NEAREST:
|
|
||||||
DEBUG(("GL_LINEAR_MIPMAP_NEAREST\n"));
|
|
||||||
t0 |= LINEAR_MIP_NEAREST;
|
|
||||||
cmd |= LINEAR_MIP_NEAREST;
|
|
||||||
break;
|
|
||||||
case GL_NEAREST_MIPMAP_LINEAR:
|
|
||||||
DEBUG(("GL_NEAREST_MIPMAP_LINEAR\n"));
|
|
||||||
t0 |= MIP_LINEAR;
|
|
||||||
cmd |= MIP_LINEAR;
|
|
||||||
break;
|
|
||||||
case GL_LINEAR_MIPMAP_LINEAR:
|
|
||||||
DEBUG(("GL_LINEAR_MIPMAP_LINEAR\n"));
|
|
||||||
t0 |= LINEAR_MIP_LINEAR;
|
|
||||||
cmd |= LINEAR_MIP_LINEAR;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* FIXME: bilinear? */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
switch (magf) {
|
|
||||||
case GL_NEAREST:
|
|
||||||
break;
|
|
||||||
case GL_LINEAR:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
t->TextureCMD = t0;
|
|
||||||
|
|
||||||
DEBUG(("CMD was = 0x%x\n", vmesa->CMD));
|
|
||||||
DEBUG(("CMD is = 0x%x\n", cmd));
|
|
||||||
|
|
||||||
vmesa->CMD = cmd;
|
|
||||||
/* CMDCHANGE(); */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void s3vSetTexBorderColor(s3vContextPtr vmesa,
|
|
||||||
s3vTextureObjectPtr t,
|
|
||||||
const GLfloat color[4])
|
|
||||||
{
|
|
||||||
GLubyte c[4];
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
|
|
||||||
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vSetTexBorderColor: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*FIXME: it should depend on tex col format */
|
|
||||||
/* switch(t0 ... t->TextureColorMode) */
|
|
||||||
|
|
||||||
/* case TEX_COL_ARGB1555: */
|
|
||||||
t->TextureBorderColor = S3VIRGEPACKCOLOR555(c[0], c[1], c[2], c[3]);
|
|
||||||
|
|
||||||
DEBUG(("TextureBorderColor = 0x%x\n", t->TextureBorderColor));
|
|
||||||
|
|
||||||
vmesa->TextureBorderColor = t->TextureBorderColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void s3vTexParameter( GLcontext *ctx, GLenum target,
|
|
||||||
struct gl_texture_object *tObj,
|
|
||||||
GLenum pname, const GLfloat *params )
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT(ctx);
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr) tObj->DriverData;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vTexParameter: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!t) return;
|
|
||||||
|
|
||||||
/* Can't do the update now as we don't know whether to flush
|
|
||||||
* vertices or not. Setting vmesa->new_state means that
|
|
||||||
* s3vUpdateTextureState() will be called before any triangles are
|
|
||||||
* rendered. If a statechange has occurred, it will be detected at
|
|
||||||
* that point, and buffered vertices flushed.
|
|
||||||
*/
|
|
||||||
switch (pname) {
|
|
||||||
case GL_TEXTURE_MIN_FILTER:
|
|
||||||
case GL_TEXTURE_MAG_FILTER:
|
|
||||||
s3vSetTexFilter( vmesa, t, tObj->MinFilter, tObj->MagFilter );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GL_TEXTURE_WRAP_S:
|
|
||||||
case GL_TEXTURE_WRAP_T:
|
|
||||||
s3vSetTexWrapping( vmesa, t, tObj->WrapS, tObj->WrapT );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GL_TEXTURE_BORDER_COLOR:
|
|
||||||
s3vSetTexBorderColor( vmesa, t, tObj->BorderColor );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GL_TEXTURE_BASE_LEVEL:
|
|
||||||
case GL_TEXTURE_MAX_LEVEL:
|
|
||||||
case GL_TEXTURE_MIN_LOD:
|
|
||||||
case GL_TEXTURE_MAX_LOD:
|
|
||||||
/* This isn't the most efficient solution but there doesn't appear to
|
|
||||||
* be a nice alternative for Virge. Since there's no LOD clamping,
|
|
||||||
* we just have to rely on loading the right subset of mipmap levels
|
|
||||||
* to simulate a clamped LOD.
|
|
||||||
*/
|
|
||||||
s3vSwapOutTexObj( vmesa, t );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t == vmesa->CurrentTexObj[0])
|
|
||||||
vmesa->dirty |= S3V_UPLOAD_TEX0;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (t == vmesa->CurrentTexObj[1]) {
|
|
||||||
vmesa->dirty |= S3V_UPLOAD_TEX1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void s3vTexEnv( GLcontext *ctx, GLenum target,
|
|
||||||
GLenum pname, const GLfloat *param )
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT( ctx );
|
|
||||||
GLuint unit = ctx->Texture.CurrentUnit;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vTexEnv: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Only one env color. Need a fallback if env colors are different
|
|
||||||
* and texture setup references env color in both units.
|
|
||||||
*/
|
|
||||||
switch (pname) {
|
|
||||||
case GL_TEXTURE_ENV_COLOR: {
|
|
||||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
|
||||||
GLfloat *fc = texUnit->EnvColor;
|
|
||||||
GLuint r, g, b, a, col;
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(r, fc[0]);
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(g, fc[1]);
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(b, fc[2]);
|
|
||||||
CLAMPED_FLOAT_TO_UBYTE(a, fc[3]);
|
|
||||||
|
|
||||||
col = ((a << 24) |
|
|
||||||
(r << 16) |
|
|
||||||
(g << 8) |
|
|
||||||
(b << 0));
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GL_TEXTURE_ENV_MODE:
|
|
||||||
vmesa->TexEnvImageFmt[unit] = 0; /* force recalc of env state */
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_LOD_BIAS_EXT: {
|
|
||||||
/*
|
|
||||||
struct gl_texture_object *tObj =
|
|
||||||
ctx->Texture.Unit[unit]._Current;
|
|
||||||
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr) tObj->DriverData;
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void s3vTexImage1D( GLcontext *ctx, GLenum target, GLint level,
|
|
||||||
GLint internalFormat,
|
|
||||||
GLint width, GLint border,
|
|
||||||
GLenum format, GLenum type,
|
|
||||||
const GLvoid *pixels,
|
|
||||||
const struct gl_pixelstore_attrib *pack,
|
|
||||||
struct gl_texture_object *texObj,
|
|
||||||
struct gl_texture_image *texImage )
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT( ctx );
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr) texObj->DriverData;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vTexImage1D: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if (t) {
|
|
||||||
#if _TEXFLUSH
|
|
||||||
DMAFLUSH();
|
|
||||||
#endif
|
|
||||||
s3vSwapOutTexObj( vmesa, t );
|
|
||||||
/*
|
|
||||||
s3vDestroyTexObj( vmesa, t );
|
|
||||||
texObj->DriverData = 0;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
_mesa_store_teximage1d( ctx, target, level, internalFormat,
|
|
||||||
width, border, format, type,
|
|
||||||
pixels, pack, texObj, texImage );
|
|
||||||
}
|
|
||||||
|
|
||||||
static void s3vTexSubImage1D( GLcontext *ctx,
|
|
||||||
GLenum target,
|
|
||||||
GLint level,
|
|
||||||
GLint xoffset,
|
|
||||||
GLsizei width,
|
|
||||||
GLenum format, GLenum type,
|
|
||||||
const GLvoid *pixels,
|
|
||||||
const struct gl_pixelstore_attrib *pack,
|
|
||||||
struct gl_texture_object *texObj,
|
|
||||||
struct gl_texture_image *texImage )
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT( ctx );
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr) texObj->DriverData;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vTexSubImage1D: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if (t) {
|
|
||||||
#if _TEXFLUSH
|
|
||||||
DMAFLUSH();
|
|
||||||
#endif
|
|
||||||
s3vSwapOutTexObj( vmesa, t );
|
|
||||||
/*
|
|
||||||
s3vDestroyTexObj( vmesa, t );
|
|
||||||
texObj->DriverData = 0;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
_mesa_store_texsubimage1d(ctx, target, level, xoffset, width,
|
|
||||||
format, type, pixels, pack, texObj,
|
|
||||||
texImage);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void s3vTexImage2D( GLcontext *ctx, GLenum target, GLint level,
|
|
||||||
GLint internalFormat,
|
|
||||||
GLint width, GLint height, GLint border,
|
|
||||||
GLenum format, GLenum type, const GLvoid *pixels,
|
|
||||||
const struct gl_pixelstore_attrib *packing,
|
|
||||||
struct gl_texture_object *texObj,
|
|
||||||
struct gl_texture_image *texImage )
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT( ctx );
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr) texObj->DriverData;
|
|
||||||
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vTexImage2D: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if (t) {
|
|
||||||
#if _TEXFLUSH
|
|
||||||
DMAFLUSH();
|
|
||||||
#endif
|
|
||||||
s3vSwapOutTexObj( vmesa, t );
|
|
||||||
/*
|
|
||||||
s3vDestroyTexObj( vmesa, t );
|
|
||||||
texObj->DriverData = 0;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
_mesa_store_teximage2d( ctx, target, level, internalFormat,
|
|
||||||
width, height, border, format, type,
|
|
||||||
pixels, packing, texObj, texImage );
|
|
||||||
}
|
|
||||||
|
|
||||||
static void s3vTexSubImage2D( GLcontext *ctx,
|
|
||||||
GLenum target,
|
|
||||||
GLint level,
|
|
||||||
GLint xoffset, GLint yoffset,
|
|
||||||
GLsizei width, GLsizei height,
|
|
||||||
GLenum format, GLenum type,
|
|
||||||
const GLvoid *pixels,
|
|
||||||
const struct gl_pixelstore_attrib *packing,
|
|
||||||
struct gl_texture_object *texObj,
|
|
||||||
struct gl_texture_image *texImage )
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT( ctx );
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr) texObj->DriverData;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vTexSubImage2D: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if (t) {
|
|
||||||
#if _TEXFLUSH
|
|
||||||
DMAFLUSH();
|
|
||||||
#endif
|
|
||||||
s3vSwapOutTexObj( vmesa, t );
|
|
||||||
/*
|
|
||||||
s3vDestroyTexObj( vmesa, t );
|
|
||||||
texObj->DriverData = 0;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
_mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
|
|
||||||
height, format, type, pixels, packing, texObj,
|
|
||||||
texImage);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void s3vBindTexture( GLcontext *ctx, GLenum target,
|
|
||||||
struct gl_texture_object *tObj )
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT( ctx );
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr) tObj->DriverData;
|
|
||||||
GLuint cmd = vmesa->CMD;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vBindTexture: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!t) {
|
|
||||||
/*
|
|
||||||
GLfloat bias = ctx->Texture.Unit[ctx->Texture.CurrentUnit].LodBias;
|
|
||||||
*/
|
|
||||||
t = CALLOC_STRUCT(s3v_texture_object_t);
|
|
||||||
|
|
||||||
/* Initialize non-image-dependent parts of the state:
|
|
||||||
*/
|
|
||||||
t->globj = tObj;
|
|
||||||
#if 0
|
|
||||||
if (target == GL_TEXTURE_2D) {
|
|
||||||
} else
|
|
||||||
if (target == GL_TEXTURE_1D) {
|
|
||||||
}
|
|
||||||
|
|
||||||
#if X_BYTE_ORDER == X_LITTLE_ENDIAN
|
|
||||||
t->TextureFormat = (TF_LittleEndian |
|
|
||||||
#else
|
|
||||||
t->TextureFormat = (TF_BigEndian |
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
t->dirty_images = ~0;
|
|
||||||
|
|
||||||
tObj->DriverData = t;
|
|
||||||
make_empty_list( t );
|
|
||||||
#if 0
|
|
||||||
s3vSetTexWrapping( vmesa, t, tObj->WrapS, tObj->WrapT );
|
|
||||||
s3vSetTexFilter( vmesa, t, tObj->MinFilter, tObj->MagFilter );
|
|
||||||
s3vSetTexBorderColor( vmesa, t, tObj->BorderColor );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd = vmesa->CMD & ~MIP_MASK;
|
|
||||||
vmesa->dirty |= S3V_UPLOAD_TEX0;
|
|
||||||
vmesa->TexOffset = t->TextureBaseAddr[tObj->BaseLevel];
|
|
||||||
vmesa->TexStride = t->Pitch;
|
|
||||||
cmd |= MIPMAP_LEVEL(t->WidthLog2);
|
|
||||||
vmesa->CMD = cmd;
|
|
||||||
vmesa->restore_primitive = -1;
|
|
||||||
#if 0
|
|
||||||
printf("t->TextureBaseAddr[0] = 0x%x\n", t->TextureBaseAddr[0]);
|
|
||||||
printf("t->TextureBaseAddr[1] = 0x%x\n", t->TextureBaseAddr[1]);
|
|
||||||
printf("t->TextureBaseAddr[2] = 0x%x\n", t->TextureBaseAddr[2]);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void s3vDeleteTexture( GLcontext *ctx, struct gl_texture_object *tObj )
|
|
||||||
{
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr)tObj->DriverData;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vDeleteTexture: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (t) {
|
|
||||||
s3vContextPtr vmesa = S3V_CONTEXT( ctx );
|
|
||||||
|
|
||||||
#if _TEXFLUSH
|
|
||||||
if (vmesa) {
|
|
||||||
DMAFLUSH();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
s3vDestroyTexObj( vmesa, t );
|
|
||||||
tObj->DriverData = 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GLboolean s3vIsTextureResident( GLcontext *ctx,
|
|
||||||
struct gl_texture_object *tObj )
|
|
||||||
{
|
|
||||||
s3vTextureObjectPtr t = (s3vTextureObjectPtr)tObj->DriverData;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vIsTextureResident: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return (t && t->MemBlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void s3vInitTextureObjects( GLcontext *ctx )
|
|
||||||
{
|
|
||||||
/* s3vContextPtr vmesa = S3V_CONTEXT(ctx); */
|
|
||||||
struct gl_texture_object *texObj;
|
|
||||||
GLuint tmp = ctx->Texture.CurrentUnit;
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vInitTextureObjects: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
ctx->Texture.CurrentUnit = 0;
|
|
||||||
|
|
||||||
texObj = ctx->Texture.Unit[0].CurrentTex[TEXTURE_1D_INDEX];
|
|
||||||
s3vBindTexture( ctx, GL_TEXTURE_1D, texObj );
|
|
||||||
|
|
||||||
texObj = ctx->Texture.Unit[0].CurrentTex[TEXTURE_2D_INDEX];
|
|
||||||
s3vBindTexture( ctx, GL_TEXTURE_2D, texObj );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
ctx->Texture.CurrentUnit = 1;
|
|
||||||
|
|
||||||
texObj = ctx->Texture.Unit[1].CurrentTex[TEXTURE_1D_INDEX];
|
|
||||||
s3vBindTexture( ctx, GL_TEXTURE_1D, texObj );
|
|
||||||
|
|
||||||
texObj = ctx->Texture.Unit[1].CurrentTex[TEXTURE_2D_INDEX];
|
|
||||||
s3vBindTexture( ctx, GL_TEXTURE_2D, texObj );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ctx->Texture.CurrentUnit = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void s3vInitTextureFuncs( GLcontext *ctx )
|
|
||||||
{
|
|
||||||
#if TEX_DEBUG_ON
|
|
||||||
static unsigned int times=0;
|
|
||||||
DEBUG_TEX(("*** s3vInitTextureFuncs: #%i ***\n", ++times));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ctx->Driver.TexEnv = s3vTexEnv;
|
|
||||||
ctx->Driver.TexImage2D = s3vTexImage2D;
|
|
||||||
ctx->Driver.TexSubImage2D = s3vTexSubImage2D;
|
|
||||||
ctx->Driver.BindTexture = s3vBindTexture;
|
|
||||||
ctx->Driver.DeleteTexture = s3vDeleteTexture;
|
|
||||||
ctx->Driver.TexParameter = s3vTexParameter;
|
|
||||||
ctx->Driver.UpdateTexturePalette = 0;
|
|
||||||
ctx->Driver.IsTextureResident = s3vIsTextureResident;
|
|
||||||
|
|
||||||
s3vInitTextureObjects( ctx );
|
|
||||||
}
|
|
||||||
@@ -1,341 +0,0 @@
|
|||||||
/*
|
|
||||||
* Author: Max Lingua <sunmax@libero.it>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "s3v_context.h"
|
|
||||||
#include "s3v_vb.h"
|
|
||||||
#include "s3v_dri.h"
|
|
||||||
#include "main/context.h"
|
|
||||||
#include "main/matrix.h"
|
|
||||||
#include "main/framebuffer.h"
|
|
||||||
#include "main/renderbuffer.h"
|
|
||||||
#include "main/viewport.h"
|
|
||||||
|
|
||||||
#include "swrast/swrast.h"
|
|
||||||
#include "swrast_setup/swrast_setup.h"
|
|
||||||
#include "tnl/tnl.h"
|
|
||||||
#include "vbo/vbo.h"
|
|
||||||
|
|
||||||
/* #define DEBUG(str) printf str */
|
|
||||||
|
|
||||||
static const __DRIconfig **
|
|
||||||
s3vInitScreen(__DRIscreen *sPriv)
|
|
||||||
{
|
|
||||||
sPriv->private = (void *) s3vCreateScreen( sPriv );
|
|
||||||
|
|
||||||
if (!sPriv->private) {
|
|
||||||
s3vDestroyScreen( sPriv );
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
s3vDestroyContext(__DRIcontextPrivate *driContextPriv)
|
|
||||||
{
|
|
||||||
s3vContextPtr vmesa = (s3vContextPtr)driContextPriv->driverPrivate;
|
|
||||||
|
|
||||||
if (vmesa) {
|
|
||||||
_swsetup_DestroyContext( vmesa->glCtx );
|
|
||||||
_tnl_DestroyContext( vmesa->glCtx );
|
|
||||||
_vbo_DestroyContext( vmesa->glCtx );
|
|
||||||
_swrast_DestroyContext( vmesa->glCtx );
|
|
||||||
|
|
||||||
s3vFreeVB( vmesa->glCtx );
|
|
||||||
|
|
||||||
/* free the Mesa context */
|
|
||||||
vmesa->glCtx->DriverCtx = NULL;
|
|
||||||
_mesa_destroy_context(vmesa->glCtx);
|
|
||||||
|
|
||||||
_mesa_free(vmesa);
|
|
||||||
driContextPriv->driverPrivate = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
s3vCreateBuffer( __DRIscreenPrivate *driScrnPriv,
|
|
||||||
__DRIdrawablePrivate *driDrawPriv,
|
|
||||||
const __GLcontextModes *mesaVis,
|
|
||||||
GLboolean isPixmap )
|
|
||||||
{
|
|
||||||
s3vScreenPtr screen = (s3vScreenPtr) driScrnPriv->private;
|
|
||||||
|
|
||||||
if (isPixmap) {
|
|
||||||
return GL_FALSE; /* not implemented */
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);
|
|
||||||
|
|
||||||
{
|
|
||||||
driRenderbuffer *frontRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, screen->cpp,
|
|
||||||
screen->frontOffset, screen->frontPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
s3vSetSpanFunctions(frontRb, mesaVis);
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mesaVis->doubleBufferMode) {
|
|
||||||
driRenderbuffer *backRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, screen->cpp,
|
|
||||||
screen->backOffset, screen->backPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
s3vSetSpanFunctions(backRb, mesaVis);
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);
|
|
||||||
backRb->backBuffer = GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mesaVis->depthBits == 16) {
|
|
||||||
driRenderbuffer *depthRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_Z16, NULL, screen->cpp,
|
|
||||||
screen->depthOffset, screen->depthPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
s3vSetSpanFunctions(depthRb, mesaVis);
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
|
|
||||||
}
|
|
||||||
else if (mesaVis->depthBits == 24) {
|
|
||||||
driRenderbuffer *depthRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_Z24_S8, NULL, screen->cpp,
|
|
||||||
screen->depthOffset, screen->depthPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
s3vSetSpanFunctions(depthRb, mesaVis);
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* no h/w stencil yet?
|
|
||||||
if (mesaVis->stencilBits > 0) {
|
|
||||||
driRenderbuffer *stencilRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_S8, NULL,
|
|
||||||
screen->cpp, screen->depthOffset,
|
|
||||||
screen->depthPitch, driDrawPriv);
|
|
||||||
s3vSetSpanFunctions(stencilRb, mesaVis);
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
_mesa_add_soft_renderbuffers(fb,
|
|
||||||
GL_FALSE, /* color */
|
|
||||||
GL_FALSE, /* depth */
|
|
||||||
mesaVis->stencilBits > 0,
|
|
||||||
mesaVis->accumRedBits > 0,
|
|
||||||
GL_FALSE, /* alpha */
|
|
||||||
GL_FALSE /* aux */);
|
|
||||||
driDrawPriv->driverPrivate = (void *) fb;
|
|
||||||
|
|
||||||
return (driDrawPriv->driverPrivate != NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
s3vDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
|
|
||||||
{
|
|
||||||
_mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
s3vSwapBuffers(__DRIdrawablePrivate *drawablePrivate)
|
|
||||||
{
|
|
||||||
__DRIdrawablePrivate *dPriv = (__DRIdrawablePrivate *) drawablePrivate;
|
|
||||||
__DRIscreenPrivate *sPriv;
|
|
||||||
GLcontext *ctx;
|
|
||||||
s3vContextPtr vmesa;
|
|
||||||
s3vScreenPtr s3vscrn;
|
|
||||||
|
|
||||||
vmesa = (s3vContextPtr) dPriv->driContextPriv->driverPrivate;
|
|
||||||
sPriv = vmesa->driScreen;
|
|
||||||
s3vscrn = vmesa->s3vScreen;
|
|
||||||
ctx = vmesa->glCtx;
|
|
||||||
|
|
||||||
DEBUG(("*** s3vSwapBuffers ***\n"));
|
|
||||||
|
|
||||||
/* DMAFLUSH(); */
|
|
||||||
|
|
||||||
_mesa_notifySwapBuffers( ctx );
|
|
||||||
|
|
||||||
vmesa = (s3vContextPtr) dPriv->driContextPriv->driverPrivate;
|
|
||||||
/* driScrnPriv = vmesa->driScreen; */
|
|
||||||
|
|
||||||
/* if (vmesa->EnabledFlags & S3V_BACK_BUFFER) */
|
|
||||||
|
|
||||||
/* _mesa_notifySwapBuffers( ctx ); */
|
|
||||||
#if 1
|
|
||||||
{
|
|
||||||
int x0, y0, x1, y1;
|
|
||||||
/*
|
|
||||||
int nRect = dPriv->numClipRects;
|
|
||||||
XF86DRIClipRectPtr pRect = dPriv->pClipRects;
|
|
||||||
|
|
||||||
__DRIscreenPrivate *driScrnPriv = vmesa->driScreen;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
DEBUG(("s3vSwapBuffers: S3V_BACK_BUFFER = 1 - nClip = %i\n", nRect));
|
|
||||||
*/
|
|
||||||
/* vmesa->drawOffset=vmesa->s3vScreen->backOffset; */
|
|
||||||
|
|
||||||
x0 = dPriv->x;
|
|
||||||
y0 = dPriv->y;
|
|
||||||
|
|
||||||
x1 = x0 + dPriv->w - 1;
|
|
||||||
y1 = y0 + dPriv->h - 1;
|
|
||||||
|
|
||||||
DMAOUT_CHECK(BITBLT_SRC_BASE, 15);
|
|
||||||
DMAOUT(vmesa->s3vScreen->backOffset);
|
|
||||||
DMAOUT(0); /* 0xc0000000 */
|
|
||||||
DMAOUT( ((x0 << 16) | x1) );
|
|
||||||
DMAOUT( ((y0 << 16) | y1) );
|
|
||||||
DMAOUT( (vmesa->DestStride << 16) | vmesa->SrcStride );
|
|
||||||
DMAOUT( (~(0)) );
|
|
||||||
DMAOUT( (~(0)) );
|
|
||||||
DMAOUT(0);
|
|
||||||
DMAOUT(0);
|
|
||||||
/* FIXME */
|
|
||||||
DMAOUT(0);
|
|
||||||
DMAOUT(0);
|
|
||||||
DMAOUT( (0x01 | /* Autoexecute */
|
|
||||||
0x02 | /* clip */
|
|
||||||
0x04 | /* 16 bit */
|
|
||||||
0x20 | /* draw */
|
|
||||||
0x400 | /* word alignment (bit 10=1) */
|
|
||||||
(0x2 << 11) | /* offset = 1 byte */
|
|
||||||
(0xCC << 17) | /* rop #204 */
|
|
||||||
(0x3 << 25)) ); /* l-r, t-b */
|
|
||||||
DMAOUT(vmesa->ScissorWH);
|
|
||||||
DMAOUT( /* 0 */ vmesa->SrcXY );
|
|
||||||
DMAOUT( (dPriv->x << 16) | dPriv->y );
|
|
||||||
DMAFINISH();
|
|
||||||
|
|
||||||
DMAFLUSH();
|
|
||||||
|
|
||||||
vmesa->restore_primitive = -1;
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
s3vMakeCurrent(__DRIcontextPrivate *driContextPriv,
|
|
||||||
__DRIdrawablePrivate *driDrawPriv,
|
|
||||||
__DRIdrawablePrivate *driReadPriv)
|
|
||||||
{
|
|
||||||
int x1,x2,y1,y2;
|
|
||||||
int cx, cy, cw, ch;
|
|
||||||
unsigned int src_stride, dest_stride;
|
|
||||||
int cl;
|
|
||||||
|
|
||||||
s3vContextPtr vmesa;
|
|
||||||
__DRIdrawablePrivate *dPriv = driDrawPriv;
|
|
||||||
vmesa = (s3vContextPtr) dPriv->driContextPriv->driverPrivate;
|
|
||||||
|
|
||||||
DEBUG(("s3vMakeCurrent\n"));
|
|
||||||
|
|
||||||
DEBUG(("dPriv->x=%i y=%i w=%i h=%i\n", dPriv->x, dPriv->y,
|
|
||||||
dPriv->w, dPriv->h));
|
|
||||||
|
|
||||||
if (driContextPriv) {
|
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
|
||||||
s3vContextPtr oldVirgeCtx = ctx ? S3V_CONTEXT(ctx) : NULL;
|
|
||||||
s3vContextPtr newVirgeCtx = (s3vContextPtr) driContextPriv->driverPrivate;
|
|
||||||
|
|
||||||
if ( newVirgeCtx != oldVirgeCtx ) {
|
|
||||||
|
|
||||||
newVirgeCtx->dirty = ~0;
|
|
||||||
cl = 1;
|
|
||||||
DEBUG(("newVirgeCtx != oldVirgeCtx\n"));
|
|
||||||
/* s3vUpdateClipping(newVirgeCtx->glCtx ); */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newVirgeCtx->driDrawable != driDrawPriv) {
|
|
||||||
newVirgeCtx->driDrawable = driDrawPriv;
|
|
||||||
DEBUG(("driDrawable != driDrawPriv\n"));
|
|
||||||
s3vUpdateWindow ( newVirgeCtx->glCtx );
|
|
||||||
s3vUpdateViewportOffset( newVirgeCtx->glCtx );
|
|
||||||
/* s3vUpdateClipping(newVirgeCtx->glCtx ); */
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
s3vUpdateWindow ( newVirgeCtx->glCtx );
|
|
||||||
s3vUpdateViewportOffset( newVirgeCtx->glCtx );
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
_mesa_make_current( newVirgeCtx->glCtx,
|
|
||||||
(GLframebuffer *) driDrawPriv->driverPrivate,
|
|
||||||
(GLframebuffer *) driReadPriv->driverPrivate );
|
|
||||||
|
|
||||||
_mesa_set_viewport(newVirgeCtx->glCtx, 0, 0,
|
|
||||||
newVirgeCtx->driDrawable->w,
|
|
||||||
newVirgeCtx->driDrawable->h);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
newVirgeCtx->Window &= ~W_GIDMask;
|
|
||||||
newVirgeCtx->Window |= (driDrawPriv->index << 5);
|
|
||||||
CHECK_DMA_BUFFER(newVirgeCtx,1);
|
|
||||||
WRITE(newVirgeCtx->buf, S3VWindow, newVirgeCtx->Window);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
newVirgeCtx->new_state |= S3V_NEW_WINDOW; /* FIXME */
|
|
||||||
|
|
||||||
_mesa_make_current( newVirgeCtx->glCtx,
|
|
||||||
(GLframebuffer *) driDrawPriv->driverPrivate,
|
|
||||||
(GLframebuffer *) driReadPriv->driverPrivate );
|
|
||||||
|
|
||||||
if (!newVirgeCtx->glCtx->Viewport.Width) {
|
|
||||||
_mesa_set_viewport(newVirgeCtx->glCtx, 0, 0,
|
|
||||||
driDrawPriv->w, driDrawPriv->h);
|
|
||||||
|
|
||||||
/* s3vUpdateClipping(newVirgeCtx->glCtx ); */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (cl) {
|
|
||||||
s3vUpdateClipping(newVirgeCtx->glCtx );
|
|
||||||
cl =0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
newVirgeCtx->new_state |= S3V_NEW_CLIP;
|
|
||||||
|
|
||||||
if (1) {
|
|
||||||
cx = dPriv->x;
|
|
||||||
cw = dPriv->w;
|
|
||||||
cy = dPriv->y;
|
|
||||||
ch = dPriv->h;
|
|
||||||
}
|
|
||||||
|
|
||||||
x1 = y1 = 0;
|
|
||||||
x2 = cw-1;
|
|
||||||
y2 = ch-1;
|
|
||||||
|
|
||||||
/* src_stride = vmesa->s3vScreen->w * vmesa->s3vScreen->cpp;
|
|
||||||
dest_stride = ((x2+31)&~31) * vmesa->s3vScreen->cpp; */
|
|
||||||
src_stride = vmesa->driScreen->fbWidth * 2;
|
|
||||||
dest_stride = ((x2+31)&~31) * 2;
|
|
||||||
} else {
|
|
||||||
_mesa_make_current( NULL, NULL, NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
s3vUnbindContext( __DRIcontextPrivate *driContextPriv )
|
|
||||||
{
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct __DriverAPIRec driDriverAPI = {
|
|
||||||
.InitScreen = s3vInitScreen,
|
|
||||||
.DestroyScreen = s3vDestroyScreen,
|
|
||||||
.CreateContext = s3vCreateContext,
|
|
||||||
.DestroyContext = s3vDestroyContext,
|
|
||||||
.CreateBuffer = s3vCreateBuffer,
|
|
||||||
.DestroyBuffer = s3vDestroyBuffer,
|
|
||||||
.SwapBuffers = s3vSwapBuffers,
|
|
||||||
.MakeCurrent = s3vMakeCurrent,
|
|
||||||
.UnbindContext = s3vUnbindContext,
|
|
||||||
};
|
|
||||||
@@ -1,465 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2002 by Alan Hourihane, Sychdyn, North Wales, UK.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
* documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
* the above copyright notice appear in all copies and that both that
|
|
||||||
* copyright notice and this permission notice appear in supporting
|
|
||||||
* documentation, and that the name of Alan Hourihane not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the software without
|
|
||||||
* specific, written prior permission. Alan Hourihane makes no representations
|
|
||||||
* about the suitability of this software for any purpose. It is provided
|
|
||||||
* "as is" without express or implied warranty.
|
|
||||||
*
|
|
||||||
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
||||||
* EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
||||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
|
|
||||||
*
|
|
||||||
* Trident CyberBladeXP driver.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include "trident_dri.h"
|
|
||||||
#include "trident_context.h"
|
|
||||||
#include "trident_lock.h"
|
|
||||||
|
|
||||||
#include "swrast/swrast.h"
|
|
||||||
#include "swrast_setup/swrast_setup.h"
|
|
||||||
#include "vbo/vbo.h"
|
|
||||||
|
|
||||||
#include "tnl/tnl.h"
|
|
||||||
#include "tnl/t_pipeline.h"
|
|
||||||
|
|
||||||
#include "main/context.h"
|
|
||||||
#include "main/simple_list.h"
|
|
||||||
#include "main/matrix.h"
|
|
||||||
#include "main/extensions.h"
|
|
||||||
#include "main/framebuffer.h"
|
|
||||||
#include "main/renderbuffer.h"
|
|
||||||
#include "main/viewport.h"
|
|
||||||
#if defined(USE_X86_ASM)
|
|
||||||
#include "x86/common_x86_asm.h"
|
|
||||||
#endif
|
|
||||||
#include "main/simple_list.h"
|
|
||||||
#include "main/mm.h"
|
|
||||||
#include "drirenderbuffer.h"
|
|
||||||
|
|
||||||
#include "drivers/common/driverfuncs.h"
|
|
||||||
#include "dri_util.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
static const struct tnl_pipeline_stage *trident_pipeline[] = {
|
|
||||||
&_tnl_vertex_transform_stage,
|
|
||||||
&_tnl_normal_transform_stage,
|
|
||||||
&_tnl_lighting_stage,
|
|
||||||
&_tnl_texgen_stage,
|
|
||||||
&_tnl_texture_transform_stage,
|
|
||||||
&_tnl_render_stage,
|
|
||||||
0,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
tridentCreateContext( const __GLcontextModes *glVisual,
|
|
||||||
__DRIcontextPrivate *driContextPriv,
|
|
||||||
void *sharedContextPrivate)
|
|
||||||
{
|
|
||||||
GLcontext *ctx, *shareCtx;
|
|
||||||
__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
|
|
||||||
tridentContextPtr tmesa;
|
|
||||||
tridentScreenPtr tridentscrn;
|
|
||||||
struct dd_function_table functions;
|
|
||||||
#if 0
|
|
||||||
drm_trident_sarea_t *saPriv=(drm_trident_sarea_t *)(((char*)sPriv->pSAREA)+
|
|
||||||
sizeof(XF86DRISAREARec));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
tmesa = (tridentContextPtr) CALLOC( sizeof(*tmesa) );
|
|
||||||
if ( !tmesa ) return GL_FALSE;
|
|
||||||
|
|
||||||
/* Allocate the Mesa context */
|
|
||||||
if (sharedContextPrivate)
|
|
||||||
shareCtx = ((tridentContextPtr) sharedContextPrivate)->glCtx;
|
|
||||||
else
|
|
||||||
shareCtx = NULL;
|
|
||||||
|
|
||||||
_mesa_init_driver_functions(&functions);
|
|
||||||
|
|
||||||
tmesa->glCtx =
|
|
||||||
_mesa_create_context(glVisual, shareCtx, &functions, (void *)tmesa);
|
|
||||||
|
|
||||||
if (!tmesa->glCtx) {
|
|
||||||
FREE(tmesa);
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmesa->driContext = driContextPriv;
|
|
||||||
tmesa->driScreen = sPriv;
|
|
||||||
tmesa->driDrawable = NULL; /* Set by XMesaMakeCurrent */
|
|
||||||
|
|
||||||
tmesa->hHWContext = driContextPriv->hHWContext;
|
|
||||||
tmesa->driHwLock = (drmLock *)&sPriv->pSAREA->lock;
|
|
||||||
tmesa->driFd = sPriv->fd;
|
|
||||||
#if 0
|
|
||||||
tmesa->sarea = saPriv;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
tridentscrn = tmesa->tridentScreen = (tridentScreenPtr)(sPriv->private);
|
|
||||||
|
|
||||||
ctx = tmesa->glCtx;
|
|
||||||
|
|
||||||
ctx->Const.MaxTextureLevels = 13; /* 4K by 4K? Is that right? */
|
|
||||||
ctx->Const.MaxTextureUnits = 1; /* Permedia 3 */
|
|
||||||
|
|
||||||
ctx->Const.MinLineWidth = 0.0;
|
|
||||||
ctx->Const.MaxLineWidth = 255.0;
|
|
||||||
|
|
||||||
ctx->Const.MinLineWidthAA = 0.0;
|
|
||||||
ctx->Const.MaxLineWidthAA = 65536.0;
|
|
||||||
|
|
||||||
ctx->Const.MinPointSize = 0.0;
|
|
||||||
ctx->Const.MaxPointSize = 255.0;
|
|
||||||
|
|
||||||
ctx->Const.MinPointSizeAA = 0.5; /* 4x4 quality mode */
|
|
||||||
ctx->Const.MaxPointSizeAA = 16.0;
|
|
||||||
ctx->Const.PointSizeGranularity = 0.25;
|
|
||||||
|
|
||||||
ctx->Const.MaxDrawBuffers = 1;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
tmesa->texHeap = mmInit( 0, tmesa->tridentScreen->textureSize );
|
|
||||||
|
|
||||||
make_empty_list(&tmesa->TexObjList);
|
|
||||||
make_empty_list(&tmesa->SwappedOut);
|
|
||||||
|
|
||||||
tmesa->CurrentTexObj[0] = 0;
|
|
||||||
tmesa->CurrentTexObj[1] = 0; /* Permedia 3, second texture */
|
|
||||||
|
|
||||||
tmesa->RenderIndex = ~0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize the software rasterizer and helper modules.
|
|
||||||
*/
|
|
||||||
_swrast_CreateContext( ctx );
|
|
||||||
_vbo_CreateContext( ctx );
|
|
||||||
_tnl_CreateContext( ctx );
|
|
||||||
_swsetup_CreateContext( ctx );
|
|
||||||
|
|
||||||
/* Install the customized pipeline:
|
|
||||||
*/
|
|
||||||
_tnl_destroy_pipeline( ctx );
|
|
||||||
_tnl_install_pipeline( ctx, trident_pipeline );
|
|
||||||
|
|
||||||
/* Configure swrast to match hardware characteristics:
|
|
||||||
*/
|
|
||||||
_swrast_allow_pixel_fog( ctx, GL_FALSE );
|
|
||||||
_swrast_allow_vertex_fog( ctx, GL_TRUE );
|
|
||||||
|
|
||||||
tridentInitVB( ctx );
|
|
||||||
tridentDDInitExtensions( ctx );
|
|
||||||
tridentDDInitDriverFuncs( ctx );
|
|
||||||
tridentDDInitStateFuncs( ctx );
|
|
||||||
#if 0
|
|
||||||
tridentDDInitSpanFuncs( ctx );
|
|
||||||
tridentDDInitTextureFuncs( ctx );
|
|
||||||
#endif
|
|
||||||
tridentDDInitTriFuncs( ctx );
|
|
||||||
tridentDDInitState( tmesa );
|
|
||||||
|
|
||||||
driContextPriv->driverPrivate = (void *)tmesa;
|
|
||||||
|
|
||||||
UNLOCK_HARDWARE(tmesa);
|
|
||||||
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
tridentDestroyContext(__DRIcontextPrivate *driContextPriv)
|
|
||||||
{
|
|
||||||
tridentContextPtr tmesa = (tridentContextPtr)driContextPriv->driverPrivate;
|
|
||||||
|
|
||||||
if (tmesa) {
|
|
||||||
_swsetup_DestroyContext( tmesa->glCtx );
|
|
||||||
_tnl_DestroyContext( tmesa->glCtx );
|
|
||||||
_vbo_DestroyContext( tmesa->glCtx );
|
|
||||||
_swrast_DestroyContext( tmesa->glCtx );
|
|
||||||
|
|
||||||
/* free the Mesa context */
|
|
||||||
tmesa->glCtx->DriverCtx = NULL;
|
|
||||||
_mesa_destroy_context(tmesa->glCtx);
|
|
||||||
|
|
||||||
_mesa_free(tmesa);
|
|
||||||
driContextPriv->driverPrivate = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
tridentCreateBuffer( __DRIscreenPrivate *driScrnPriv,
|
|
||||||
__DRIdrawablePrivate *driDrawPriv,
|
|
||||||
const __GLcontextModes *mesaVis,
|
|
||||||
GLboolean isPixmap )
|
|
||||||
{
|
|
||||||
tridentScreenPtr screen = (tridentScreenPtr) driScrnPriv->private;
|
|
||||||
|
|
||||||
if (isPixmap) {
|
|
||||||
return GL_FALSE; /* not implemented */
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);
|
|
||||||
|
|
||||||
{
|
|
||||||
driRenderbuffer *frontRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, screen->cpp,
|
|
||||||
screen->frontOffset, screen->frontPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
/*
|
|
||||||
tridentSetSpanFunctions(frontRb, mesaVis);
|
|
||||||
*/
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mesaVis->doubleBufferMode) {
|
|
||||||
driRenderbuffer *backRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_ARGB8888, NULL, screen->cpp,
|
|
||||||
screen->backOffset, screen->backPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
/*
|
|
||||||
tridentSetSpanFunctions(backRb, mesaVis);
|
|
||||||
*/
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mesaVis->depthBits == 16) {
|
|
||||||
driRenderbuffer *depthRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_Z16, NULL, screen->cpp,
|
|
||||||
screen->depthOffset, screen->depthPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
/*
|
|
||||||
tridentSetSpanFunctions(depthRb, mesaVis);
|
|
||||||
*/
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
|
|
||||||
}
|
|
||||||
else if (mesaVis->depthBits == 24) {
|
|
||||||
driRenderbuffer *depthRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_Z24_S8, NULL, screen->cpp,
|
|
||||||
screen->depthOffset, screen->depthPitch,
|
|
||||||
driDrawPriv);
|
|
||||||
/*
|
|
||||||
tridentSetSpanFunctions(depthRb, mesaVis);
|
|
||||||
*/
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* no h/w stencil?
|
|
||||||
if (mesaVis->stencilBits > 0 && !swStencil) {
|
|
||||||
driRenderbuffer *stencilRb
|
|
||||||
= driNewRenderbuffer(MESA_FORMAT_S8);
|
|
||||||
tridentSetSpanFunctions(stencilRb, mesaVis);
|
|
||||||
_mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
_mesa_add_soft_renderbuffers(fb,
|
|
||||||
GL_FALSE, /* color */
|
|
||||||
GL_FALSE, /* depth */
|
|
||||||
mesaVis->stencilBits > 0,
|
|
||||||
mesaVis->accumRedBits > 0,
|
|
||||||
GL_FALSE, /* alpha */
|
|
||||||
GL_FALSE /* aux */);
|
|
||||||
driDrawPriv->driverPrivate = (void *) fb;
|
|
||||||
|
|
||||||
return (driDrawPriv->driverPrivate != NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
tridentDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
|
|
||||||
{
|
|
||||||
_mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
tridentSwapBuffers(__DRIdrawablePrivate *drawablePrivate)
|
|
||||||
{
|
|
||||||
__DRIdrawablePrivate *dPriv = (__DRIdrawablePrivate *) drawablePrivate;
|
|
||||||
|
|
||||||
if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
|
|
||||||
tridentContextPtr tmesa;
|
|
||||||
GLcontext *ctx;
|
|
||||||
tmesa = (tridentContextPtr) dPriv->driContextPriv->driverPrivate;
|
|
||||||
ctx = tmesa->glCtx;
|
|
||||||
if (ctx->Visual.doubleBufferMode) {
|
|
||||||
_mesa_notifySwapBuffers( ctx ); /* flush pending rendering comands */
|
|
||||||
tridentCopyBuffer( dPriv );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* XXX this shouldn't be an error but we can't handle it for now */
|
|
||||||
_mesa_problem(NULL, "tridentSwapBuffers: drawable has no context!\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
tridentMakeCurrent(__DRIcontextPrivate *driContextPriv,
|
|
||||||
__DRIdrawablePrivate *driDrawPriv,
|
|
||||||
__DRIdrawablePrivate *driReadPriv)
|
|
||||||
{
|
|
||||||
if (driContextPriv) {
|
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
|
||||||
tridentContextPtr oldCtx = ctx ? TRIDENT_CONTEXT(ctx) : NULL;
|
|
||||||
tridentContextPtr newCtx = (tridentContextPtr) driContextPriv->driverPrivate;
|
|
||||||
|
|
||||||
if ( newCtx != oldCtx ) {
|
|
||||||
newCtx->dirty = ~0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newCtx->driDrawable != driDrawPriv) {
|
|
||||||
newCtx->driDrawable = driDrawPriv;
|
|
||||||
#if 0
|
|
||||||
tridentUpdateWindow ( newCtx->glCtx );
|
|
||||||
tridentUpdateViewportOffset( newCtx->glCtx );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
newCtx->drawOffset = newCtx->tridentScreen->backOffset;
|
|
||||||
newCtx->drawPitch = newCtx->tridentScreen->backPitch;
|
|
||||||
|
|
||||||
_mesa_make_current( newCtx->glCtx,
|
|
||||||
(GLframebuffer *) driDrawPriv->driverPrivate,
|
|
||||||
(GLframebuffer *) driReadPriv->driverPrivate );
|
|
||||||
|
|
||||||
if (!newCtx->glCtx->Viewport.Width) {
|
|
||||||
_mesa_set_viewport(newCtx->glCtx, 0, 0,
|
|
||||||
driDrawPriv->w, driDrawPriv->h);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_mesa_make_current( NULL, NULL, NULL );
|
|
||||||
}
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
tridentUnbindContext( __DRIcontextPrivate *driContextPriv )
|
|
||||||
{
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static tridentScreenPtr
|
|
||||||
tridentCreateScreen( __DRIscreenPrivate *sPriv )
|
|
||||||
{
|
|
||||||
TRIDENTDRIPtr tDRIPriv = (TRIDENTDRIPtr)sPriv->pDevPriv;
|
|
||||||
tridentScreenPtr tridentScreen;
|
|
||||||
|
|
||||||
if (sPriv->devPrivSize != sizeof(TRIDENTDRIRec)) {
|
|
||||||
fprintf(stderr,"\nERROR! sizeof(TRIDENTDRIRec) does not match passed size from device driver\n");
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate the private area */
|
|
||||||
tridentScreen = (tridentScreenPtr) CALLOC( sizeof(*tridentScreen) );
|
|
||||||
if ( !tridentScreen ) return NULL;
|
|
||||||
|
|
||||||
tridentScreen->driScreen = sPriv;
|
|
||||||
|
|
||||||
tridentScreen->frontOffset = tDRIPriv->frontOffset;
|
|
||||||
tridentScreen->backOffset = tDRIPriv->backOffset;
|
|
||||||
tridentScreen->depthOffset = tDRIPriv->depthOffset;
|
|
||||||
tridentScreen->frontPitch = tDRIPriv->frontPitch;
|
|
||||||
tridentScreen->backPitch = tDRIPriv->backPitch;
|
|
||||||
tridentScreen->depthPitch = tDRIPriv->depthPitch;
|
|
||||||
tridentScreen->width = tDRIPriv->width;
|
|
||||||
tridentScreen->height = tDRIPriv->height;
|
|
||||||
|
|
||||||
printf("%d %d\n",tridentScreen->width,tridentScreen->height);
|
|
||||||
printf("%d %d\n",tridentScreen->frontPitch,tridentScreen->backPitch);
|
|
||||||
printf("offset 0x%x 0x%x\n",tridentScreen->backOffset,tridentScreen->depthOffset);
|
|
||||||
|
|
||||||
tridentScreen->mmio.handle = tDRIPriv->regs;
|
|
||||||
tridentScreen->mmio.size = 0x20000;
|
|
||||||
|
|
||||||
if (drmMap(sPriv->fd,
|
|
||||||
tridentScreen->mmio.handle, tridentScreen->mmio.size,
|
|
||||||
(drmAddressPtr)&tridentScreen->mmio.map)) {
|
|
||||||
FREE(tridentScreen);
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
printf("MAPPED at %p\n", tridentScreen->mmio.map);
|
|
||||||
|
|
||||||
return tridentScreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Destroy the device specific screen private data struct.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
tridentDestroyScreen( __DRIscreenPrivate *sPriv )
|
|
||||||
{
|
|
||||||
tridentScreenPtr tridentScreen = (tridentScreenPtr)sPriv->private;
|
|
||||||
|
|
||||||
FREE(tridentScreen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GLboolean
|
|
||||||
tridentInitDriver(__DRIscreenPrivate *sPriv)
|
|
||||||
{
|
|
||||||
sPriv->private = (void *) tridentCreateScreen( sPriv );
|
|
||||||
|
|
||||||
if (!sPriv->private) {
|
|
||||||
tridentDestroyScreen( sPriv );
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the driver specific part of the createNewScreen entry point.
|
|
||||||
*
|
|
||||||
* \todo maybe fold this into intelInitDriver
|
|
||||||
*
|
|
||||||
* \return the __GLcontextModes supported by this driver
|
|
||||||
*/
|
|
||||||
const __DRIconfig **tridentInitScreen(__DRIscreenPrivate *psp)
|
|
||||||
{
|
|
||||||
static const __DRIversion ddx_expected = { 4, 0, 0 };
|
|
||||||
static const __DRIversion dri_expected = { 3, 1, 0 };
|
|
||||||
static const __DRIversion drm_expected = { 1, 0, 0 };
|
|
||||||
|
|
||||||
if ( ! driCheckDriDdxDrmVersions2( "Trident",
|
|
||||||
&psp->dri_version, & dri_expected,
|
|
||||||
&psp->ddx_version, & ddx_expected,
|
|
||||||
&psp->drm_version, & drm_expected ) )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!tridentInitDriver(psp))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Wait... what? This driver doesn't report any modes... */
|
|
||||||
#if 0
|
|
||||||
TRIDENTDRIPtr dri_priv = (TRIDENTDRIPtr) psp->pDevPriv;
|
|
||||||
*driver_modes = tridentFillInModes( dri_priv->bytesPerPixel * 8,
|
|
||||||
GL_TRUE );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct __DriverAPIRec driDriverAPI = {
|
|
||||||
tridentInitScreen,
|
|
||||||
tridentDestroyScreen,
|
|
||||||
tridentCreateContext,
|
|
||||||
tridentDestroyContext,
|
|
||||||
tridentCreateBuffer,
|
|
||||||
tridentDestroyBuffer,
|
|
||||||
tridentSwapBuffers,
|
|
||||||
tridentMakeCurrent,
|
|
||||||
tridentUnbindContext,
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user