mirror of
https://gitee.com/openharmony/third_party_mesa3d
synced 2025-02-17 16:39:31 +00:00
Kill off trident.
Hm. I could have said "chew trident and spit it out," or perhaps "spear trident," instead. Dohoho.
This commit is contained in:
parent
8e4657a9d4
commit
fd7ee2bcb7
@ -64,4 +64,4 @@ GALLIUM_WINSYS_DRM_DIRS = intel
|
||||
GALLIUM_STATE_TRACKERS_DIRS = egl
|
||||
|
||||
DRI_DIRS = i810 i915 i965 mach64 mga r128 r200 r300 radeon \
|
||||
savage sis tdfx trident unichrome ffb swrast
|
||||
savage sis tdfx unichrome ffb swrast
|
||||
|
@ -11,6 +11,6 @@ ARCH_FLAGS = -DDEBUG
|
||||
#DRI_DIRS = i915tex i915
|
||||
#DRI_DIRS = i965
|
||||
#DRI_DIRS = radeon r200 r300
|
||||
#DRI_DIRS = unichrome sis trident
|
||||
#DRI_DIRS = unichrome sis
|
||||
#DRI_DIRS = i810 mga r128 tdfx
|
||||
|
||||
|
@ -69,4 +69,4 @@ WINDOW_SYSTEM=dri
|
||||
# gamma are missing because they have not been converted to use the new
|
||||
# interface.
|
||||
DRI_DIRS = i810 i915 mach64 mga r128 r200 r300 radeon \
|
||||
savage sis tdfx trident unichrome ffb
|
||||
savage sis tdfx unichrome ffb
|
||||
|
@ -769,7 +769,7 @@ if test "$mesa_driver" = dri; then
|
||||
# default drivers
|
||||
if test "x$DRI_DIRS" = "xyes"; then
|
||||
DRI_DIRS="i810 i915 i965 mach64 mga r128 r200 r300 r600 radeon \
|
||||
savage sis tdfx trident unichrome ffb swrast"
|
||||
savage sis tdfx unichrome ffb swrast"
|
||||
fi
|
||||
|
||||
DRI_DIRS=`echo "$DRI_DIRS" | $SED 's/ */ /g'`
|
||||
|
@ -1,25 +0,0 @@
|
||||
# src/mesa/drivers/dri/trident/Makefile
|
||||
|
||||
TOP = ../../../../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
LIBNAME = trident_dri.so
|
||||
|
||||
# Not yet
|
||||
# MINIGLX_SOURCES = server/trident_dri.c
|
||||
|
||||
DRIVER_SOURCES = \
|
||||
trident_context.c \
|
||||
trident_state.c \
|
||||
trident_vb.c \
|
||||
trident_dd.c \
|
||||
trident_tris.c
|
||||
|
||||
C_SOURCES = \
|
||||
$(COMMON_SOURCES) \
|
||||
$(DRIVER_SOURCES)
|
||||
|
||||
ASM_SOURCES =
|
||||
|
||||
include ../Makefile.template
|
||||
|
@ -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(GL_RGBA, 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(GL_RGBA, 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(GL_DEPTH_COMPONENT16, 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(GL_DEPTH_COMPONENT24, 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(GL_STENCIL_INDEX8_EXT);
|
||||
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,
|
||||
};
|
@ -1,242 +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.
|
||||
*
|
||||
*/
|
||||
#ifndef _TRIDENT_CONTEXT_H_
|
||||
#define _TRIDENT_CONTEXT_H_
|
||||
|
||||
#include "dri_util.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/mtypes.h"
|
||||
#include "drm.h"
|
||||
#include "main/mm.h"
|
||||
|
||||
#define SUBPIXEL_X (0.0F)
|
||||
#define SUBPIXEL_Y (0.125F)
|
||||
|
||||
#define _TRIDENT_NEW_VERTEX (_NEW_TEXTURE | \
|
||||
_DD_NEW_TRI_UNFILLED | \
|
||||
_DD_NEW_TRI_LIGHT_TWOSIDE)
|
||||
|
||||
#define TRIDENT_FALLBACK_TEXTURE 0x01
|
||||
#define TRIDENT_FALLBACK_DRAW_BUFFER 0x02
|
||||
|
||||
#define TRIDENT_NEW_CLIP 0x01
|
||||
|
||||
#define TRIDENT_UPLOAD_COMMAND_D 0x00000001
|
||||
#define TRIDENT_UPLOAD_CONTEXT 0x04000000
|
||||
#define TRIDENT_UPLOAD_CLIPRECTS 0x80000000
|
||||
|
||||
#define TAG(x) trident##x
|
||||
#include "tnl_dd/t_dd_vertex.h"
|
||||
#undef TAG
|
||||
|
||||
/* these require that base be dword-aligned */
|
||||
static INLINE void MMIO_OUT32(unsigned char *base, unsigned int offset,
|
||||
unsigned int val)
|
||||
{
|
||||
unsigned int *addr = (unsigned int *)(base + offset);
|
||||
*addr = val;
|
||||
}
|
||||
|
||||
static INLINE unsigned int MMIO_IN32(unsigned char *base, unsigned int offset)
|
||||
{
|
||||
unsigned int *addr = (unsigned int *)(base + offset);
|
||||
return *addr;
|
||||
}
|
||||
|
||||
#define MMIO_OUT8(base, offset, val) *((base) + (offset)) = (val)
|
||||
#define MMIO_IN8(base, offset) *((base) + (offset))
|
||||
|
||||
struct trident_context;
|
||||
typedef struct trident_context tridentContextRec;
|
||||
typedef struct trident_context *tridentContextPtr;
|
||||
|
||||
typedef void (*trident_quad_func)( tridentContextPtr,
|
||||
const tridentVertex *,
|
||||
const tridentVertex *,
|
||||
const tridentVertex *,
|
||||
const tridentVertex * );
|
||||
typedef void (*trident_tri_func)( tridentContextPtr,
|
||||
const tridentVertex *,
|
||||
const tridentVertex *,
|
||||
const tridentVertex * );
|
||||
typedef void (*trident_line_func)( tridentContextPtr,
|
||||
const tridentVertex *,
|
||||
const tridentVertex * );
|
||||
typedef void (*trident_point_func)( tridentContextPtr,
|
||||
const tridentVertex * );
|
||||
|
||||
typedef struct {
|
||||
drm_handle_t handle; /* Handle to the DRM region */
|
||||
drmSize size; /* Size of the DRM region */
|
||||
unsigned char *map; /* Mapping of the DRM region */
|
||||
} tridentRegionRec, *tridentRegionPtr;
|
||||
|
||||
typedef struct {
|
||||
__DRIscreenPrivate *driScreen; /* Back pointer to DRI screen */
|
||||
|
||||
drmBufMapPtr buffers;
|
||||
|
||||
unsigned int frontOffset;
|
||||
unsigned int frontPitch;
|
||||
unsigned int backOffset;
|
||||
unsigned int backPitch;
|
||||
unsigned int depthOffset;
|
||||
unsigned int depthPitch;
|
||||
unsigned int width;
|
||||
unsigned int height;
|
||||
unsigned int cpp;
|
||||
|
||||
#if 0
|
||||
unsigned int sarea_priv_offset;
|
||||
#endif
|
||||
|
||||
tridentRegionRec mmio;
|
||||
} tridentScreenRec, *tridentScreenPtr;
|
||||
|
||||
/**
|
||||
* tridentRenderbuffer, derived from Mesa's gl_renderbuffer
|
||||
*/
|
||||
typedef struct {
|
||||
struct gl_renderbuffer Base;
|
||||
/* XXX per-window info should go here */
|
||||
int foo, bar;
|
||||
} tridentRenderbuffer;
|
||||
|
||||
|
||||
struct trident_context {
|
||||
GLcontext *glCtx; /* Mesa context */
|
||||
|
||||
__DRIcontextPrivate *driContext;
|
||||
__DRIscreenPrivate *driScreen;
|
||||
__DRIdrawablePrivate *driDrawable;
|
||||
|
||||
GLuint new_gl_state;
|
||||
GLuint new_state;
|
||||
GLuint dirty;
|
||||
|
||||
#if 0
|
||||
drm_trident_sarea_t *sarea;
|
||||
#endif
|
||||
|
||||
/* Temporaries for translating away float colors:
|
||||
*/
|
||||
struct gl_client_array UbyteColor;
|
||||
struct gl_client_array UbyteSecondaryColor;
|
||||
|
||||
/* Mirrors of some DRI state
|
||||
*/
|
||||
int lastStamp; /* mirror driDrawable->lastStamp */
|
||||
|
||||
drm_context_t hHWContext;
|
||||
drmLock *driHwLock;
|
||||
int driFd;
|
||||
|
||||
tridentScreenPtr tridentScreen; /* Screen private DRI data */
|
||||
|
||||
/* Visual, drawable, cliprect and scissor information
|
||||
*/
|
||||
GLenum DrawBuffer;
|
||||
GLint drawOffset, drawPitch;
|
||||
GLint drawX, drawY; /* origin of drawable in draw buffer */
|
||||
GLint readOffset, readPitch;
|
||||
|
||||
GLuint numClipRects; /* Cliprects for the draw buffer */
|
||||
drm_clip_rect_t *pClipRects;
|
||||
|
||||
GLint scissor;
|
||||
drm_clip_rect_t ScissorRect; /* Current software scissor */
|
||||
|
||||
GLuint Fallback;
|
||||
GLuint RenderIndex;
|
||||
GLuint SetupNewInputs;
|
||||
GLuint SetupIndex;
|
||||
GLfloat hw_viewport[16];
|
||||
GLfloat depth_scale;
|
||||
GLuint vertex_format;
|
||||
GLuint vertex_size;
|
||||
GLuint vertex_stride_shift;
|
||||
GLubyte *verts;
|
||||
|
||||
GLint tmu_source[2];
|
||||
|
||||
GLuint hw_primitive;
|
||||
GLenum render_primitive;
|
||||
|
||||
trident_point_func draw_point;
|
||||
trident_line_func draw_line;
|
||||
trident_tri_func draw_tri;
|
||||
trident_quad_func draw_quad;
|
||||
|
||||
#if 0
|
||||
gammaTextureObjectPtr CurrentTexObj[2];
|
||||
struct gamma_texture_object_t TexObjList;
|
||||
struct gamma_texture_object_t SwappedOut;
|
||||
GLenum TexEnvImageFmt[2];
|
||||
|
||||
struct mem_block *texHeap;
|
||||
|
||||
int lastSwap;
|
||||
int texAge;
|
||||
int ctxAge;
|
||||
int dirtyAge;
|
||||
int lastStamp;
|
||||
#endif
|
||||
|
||||
/* Chip state */
|
||||
|
||||
int commandD;
|
||||
|
||||
/* Context State */
|
||||
|
||||
int ClearColor;
|
||||
};
|
||||
|
||||
void tridentDDInitExtensions( GLcontext *ctx );
|
||||
void tridentDDInitDriverFuncs( GLcontext *ctx );
|
||||
void tridentDDInitSpanFuncs( GLcontext *ctx );
|
||||
void tridentDDInitState( tridentContextPtr tmesa );
|
||||
void tridentInitHW( tridentContextPtr tmesa );
|
||||
void tridentDDInitStateFuncs( GLcontext *ctx );
|
||||
void tridentDDInitTextureFuncs( GLcontext *ctx );
|
||||
void tridentDDInitTriFuncs( GLcontext *ctx );
|
||||
|
||||
extern void tridentBuildVertices( GLcontext *ctx,
|
||||
GLuint start,
|
||||
GLuint count,
|
||||
GLuint newinputs );
|
||||
extern void tridentInitVB( GLcontext *ctx );
|
||||
extern void tridentCopyBuffer( const __DRIdrawablePrivate *dPriv );
|
||||
extern void tridentFallback( tridentContextPtr tmesa, GLuint bit,
|
||||
GLboolean mode );
|
||||
extern void tridentCheckTexSizes( GLcontext *ctx );
|
||||
extern void tridentChooseVertexState( GLcontext *ctx );
|
||||
extern void tridentDDUpdateHWState( GLcontext *ctx );
|
||||
extern void tridentUploadHwStateLocked( tridentContextPtr tmesa );
|
||||
|
||||
#define TRIDENT_CONTEXT(ctx) ((tridentContextPtr)(ctx->DriverCtx))
|
||||
|
||||
#endif /* _TRIDENT_CONTEXT_H_ */
|
@ -1,110 +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_context.h"
|
||||
#include "trident_lock.h"
|
||||
#if defined(USE_X86_ASM)
|
||||
#include "x86/common_x86_asm.h"
|
||||
#endif
|
||||
|
||||
#include "swrast/swrast.h"
|
||||
#include "main/context.h"
|
||||
#include "main/framebuffer.h"
|
||||
|
||||
#define TRIDENT_DATE "20041223"
|
||||
|
||||
/* Return the width and height of the current color buffer.
|
||||
*/
|
||||
static void tridentDDGetBufferSize( GLframebuffer *framebuffer,
|
||||
GLuint *width, GLuint *height )
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
|
||||
LOCK_HARDWARE(tmesa);
|
||||
*width = tmesa->driDrawable->w;
|
||||
*height = tmesa->driDrawable->h;
|
||||
UNLOCK_HARDWARE(tmesa);
|
||||
}
|
||||
|
||||
|
||||
/* Return various strings for glGetString().
|
||||
*/
|
||||
static const GLubyte *tridentDDGetString( GLcontext *ctx, GLenum name )
|
||||
{
|
||||
static char buffer[128];
|
||||
|
||||
switch ( name ) {
|
||||
case GL_VENDOR:
|
||||
return (GLubyte *)"Alan Hourihane";
|
||||
|
||||
case GL_RENDERER:
|
||||
sprintf( buffer, "Mesa DRI Trident " TRIDENT_DATE );
|
||||
|
||||
/* Append any CPU-specific information.
|
||||
*/
|
||||
#ifdef USE_X86_ASM
|
||||
if ( _mesa_x86_cpu_features ) {
|
||||
strncat( buffer, " x86", 4 );
|
||||
}
|
||||
#ifdef USE_MMX_ASM
|
||||
if ( cpu_has_mmx ) {
|
||||
strncat( buffer, "/MMX", 4 );
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_3DNOW_ASM
|
||||
if ( cpu_has_3dnow ) {
|
||||
strncat( buffer, "/3DNow!", 7 );
|
||||
}
|
||||
#endif
|
||||
#ifdef USE_SSE_ASM
|
||||
if ( cpu_has_xmm ) {
|
||||
strncat( buffer, "/SSE", 4 );
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return (GLubyte *)buffer;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable the extensions supported by this driver.
|
||||
*/
|
||||
void tridentDDInitExtensions( GLcontext *ctx )
|
||||
{
|
||||
/* None... */
|
||||
}
|
||||
|
||||
/* Initialize the driver's misc functions.
|
||||
*/
|
||||
void tridentDDInitDriverFuncs( GLcontext *ctx )
|
||||
{
|
||||
ctx->Driver.GetBufferSize = tridentDDGetBufferSize;
|
||||
ctx->Driver.GetString = tridentDDGetString;
|
||||
ctx->Driver.Error = NULL;
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
#ifndef _TRIDENT_DRI_
|
||||
#define _TRIDENT_DRI_
|
||||
|
||||
#include "xf86drm.h"
|
||||
|
||||
typedef struct {
|
||||
drm_handle_t regs;
|
||||
drmSize regsSize;
|
||||
drmAddress regsMap;
|
||||
int deviceID;
|
||||
int width;
|
||||
int height;
|
||||
int mem;
|
||||
int frontOffset;
|
||||
int frontPitch;
|
||||
int backOffset;
|
||||
int backPitch;
|
||||
int depthOffset;
|
||||
int depthPitch;
|
||||
int cpp;
|
||||
#if 0
|
||||
int textureOffset;
|
||||
int textureSize;
|
||||
#endif
|
||||
unsigned int sarea_priv_offset;
|
||||
} TRIDENTDRIRec, *TRIDENTDRIPtr;
|
||||
|
||||
#endif
|
@ -1,11 +0,0 @@
|
||||
/* XXX tridentGetLock doesn't exist... */
|
||||
|
||||
#define LOCK_HARDWARE(tmesa) \
|
||||
do { \
|
||||
char __ret = 0; \
|
||||
DRM_CAS(tmesa->driHwLock, tmesa->hHWContext, \
|
||||
DRM_LOCK_HELD | tmesa->hHWContext, __ret); \
|
||||
} while (0)
|
||||
|
||||
#define UNLOCK_HARDWARE(tmesa) \
|
||||
DRM_UNLOCK(tmesa->driFd, tmesa->driHwLock, tmesa->hHWContext)
|
@ -1,548 +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_context.h"
|
||||
#include "trident_lock.h"
|
||||
#include "vbo/vbo.h"
|
||||
#include "swrast/swrast.h"
|
||||
#include "swrast_setup/swrast_setup.h"
|
||||
#include "tnl/tnl.h"
|
||||
#include "main/framebuffer.h"
|
||||
|
||||
#define TRIDENTPACKCOLOR332(r, g, b) \
|
||||
(((r) & 0xe0) | (((g) & 0xe0) >> 3) | (((b) & 0xc0) >> 6))
|
||||
|
||||
#define TRIDENTPACKCOLOR1555(r, g, b, a) \
|
||||
((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
|
||||
((a) ? 0x8000 : 0))
|
||||
|
||||
#define TRIDENTPACKCOLOR565(r, g, b) \
|
||||
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
|
||||
|
||||
#define TRIDENTPACKCOLOR888(r, g, b) \
|
||||
(((r) << 16) | ((g) << 8) | (b))
|
||||
|
||||
#define TRIDENTPACKCOLOR8888(r, g, b, a) \
|
||||
(((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
|
||||
|
||||
#define TRIDENTPACKCOLOR4444(r, g, b, a) \
|
||||
((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
|
||||
|
||||
static INLINE GLuint tridentPackColor( GLuint cpp,
|
||||
GLubyte r, GLubyte g,
|
||||
GLubyte b, GLubyte a )
|
||||
{
|
||||
switch ( cpp ) {
|
||||
case 2:
|
||||
return TRIDENTPACKCOLOR565( r, g, b );
|
||||
case 4:
|
||||
return TRIDENTPACKCOLOR8888( r, g, b, a );
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void tridentUploadHwStateLocked( tridentContextPtr tmesa )
|
||||
{
|
||||
unsigned char *MMIO = tmesa->tridentScreen->mmio.map;
|
||||
#if 0
|
||||
ATISAREAPrivPtr sarea = tmesa->sarea;
|
||||
trident_context_regs_t *regs = &(sarea->ContextState);
|
||||
#endif
|
||||
|
||||
if ( tmesa->dirty & TRIDENT_UPLOAD_COMMAND_D ) {
|
||||
MMIO_OUT32(MMIO, 0x00281C, tmesa->commandD );
|
||||
tmesa->dirty &= ~TRIDENT_UPLOAD_COMMAND_D;
|
||||
}
|
||||
|
||||
if ( tmesa->dirty & TRIDENT_UPLOAD_CLIPRECTS ) {
|
||||
/* XXX FIX ME ! */
|
||||
MMIO_OUT32(MMIO, 0x002C80 , 0x20008000 | tmesa->tridentScreen->height );
|
||||
MMIO_OUT32(MMIO, 0x002C84 , 0x20000000 | tmesa->tridentScreen->width );
|
||||
tmesa->dirty &= ~TRIDENT_UPLOAD_CLIPRECTS;
|
||||
}
|
||||
|
||||
tmesa->dirty = 0;
|
||||
}
|
||||
|
||||
/* Copy the back color buffer to the front color buffer.
|
||||
*/
|
||||
void tridentCopyBuffer( const __DRIdrawablePrivate *dPriv )
|
||||
{
|
||||
unsigned char *MMIO;
|
||||
tridentContextPtr tmesa;
|
||||
GLint nbox, i;
|
||||
int busy;
|
||||
drm_clip_rect_t *pbox;
|
||||
|
||||
assert(dPriv);
|
||||
assert(dPriv->driContextPriv);
|
||||
assert(dPriv->driContextPriv->driverPrivate);
|
||||
|
||||
tmesa = (tridentContextPtr) dPriv->driContextPriv->driverPrivate;
|
||||
MMIO = tmesa->tridentScreen->mmio.map;
|
||||
|
||||
LOCK_HARDWARE( tmesa );
|
||||
|
||||
/* use front buffer cliprects */
|
||||
nbox = dPriv->numClipRects;
|
||||
pbox = dPriv->pClipRects;
|
||||
|
||||
for ( i = 0 ; i < nbox ; i++ ) {
|
||||
#if 0
|
||||
GLint nr = MIN2( i + MACH64_NR_SAREA_CLIPRECTS , nbox );
|
||||
drm_clip_rect_t *b = tmesa->sarea->boxes;
|
||||
GLint n = 0;
|
||||
|
||||
for ( ; i < nr ; i++ ) {
|
||||
*b++ = pbox[i];
|
||||
n++;
|
||||
}
|
||||
tmesa->sarea->nbox = n;
|
||||
#endif
|
||||
|
||||
MMIO_OUT32(MMIO, 0x2150, tmesa->tridentScreen->frontPitch << 20 | tmesa->tridentScreen->frontOffset>>4);
|
||||
MMIO_OUT32(MMIO, 0x2154, tmesa->tridentScreen->backPitch << 20 | tmesa->tridentScreen->backOffset>>4);
|
||||
MMIO_OUT8(MMIO, 0x2127, 0xCC); /* Copy Rop */
|
||||
MMIO_OUT32(MMIO, 0x2128, 0x4); /* scr2scr */
|
||||
MMIO_OUT32(MMIO, 0x2138, (pbox->x1 << 16) | pbox->y1);
|
||||
MMIO_OUT32(MMIO, 0x213C, (pbox->x1 << 16) | pbox->y1);
|
||||
MMIO_OUT32(MMIO, 0x2140, (pbox->x2 - pbox->x1) << 16 | (pbox->y2 - pbox->y1) );
|
||||
MMIO_OUT8(MMIO, 0x2124, 0x01); /* BLT */
|
||||
#define GE_BUSY 0x80
|
||||
for (;;) {
|
||||
busy = MMIO_IN8(MMIO, 0x2120);
|
||||
if ( !(busy & GE_BUSY) )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
UNLOCK_HARDWARE( tmesa );
|
||||
|
||||
#if 0
|
||||
tmesa->dirty |= (MACH64_UPLOAD_CONTEXT |
|
||||
MACH64_UPLOAD_MISC |
|
||||
MACH64_UPLOAD_CLIPRECTS);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void tridentDDClear( GLcontext *ctx, GLbitfield mask )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
unsigned char *MMIO = tmesa->tridentScreen->mmio.map;
|
||||
int busy;
|
||||
GLuint flags = 0;
|
||||
GLint i;
|
||||
GLint cx, cy, cw, ch;
|
||||
|
||||
#define DRM_TRIDENT_FRONT 0x01
|
||||
#define DRM_TRIDENT_BACK 0x02
|
||||
#define DRM_TRIDENT_DEPTH 0x04
|
||||
|
||||
if ( tmesa->new_state )
|
||||
tridentDDUpdateHWState( ctx );
|
||||
|
||||
if ( mask & BUFFER_BIT_FRONT_LEFT ) {
|
||||
flags |= DRM_TRIDENT_FRONT;
|
||||
mask &= ~BUFFER_BIT_FRONT_LEFT;
|
||||
}
|
||||
|
||||
if ( mask & BUFFER_BIT_BACK_LEFT ) {
|
||||
flags |= DRM_TRIDENT_BACK;
|
||||
mask &= ~BUFFER_BIT_BACK_LEFT;
|
||||
}
|
||||
|
||||
if ( ( mask & BUFFER_BIT_DEPTH ) && ctx->Depth.Mask ) {
|
||||
flags |= DRM_TRIDENT_DEPTH;
|
||||
mask &= ~BUFFER_BIT_DEPTH;
|
||||
}
|
||||
|
||||
LOCK_HARDWARE(tmesa);
|
||||
|
||||
/* get region after locking: */
|
||||
cx = ctx->DrawBuffer->_Xmin;
|
||||
cy = ctx->DrawBuffer->_Ymin;
|
||||
cw = ctx->DrawBuffer->_Xmax - cx;
|
||||
ch = ctx->DrawBuffer->_Ymax - cy;
|
||||
|
||||
if ( flags ) {
|
||||
|
||||
cx += tmesa->drawX;
|
||||
cy += tmesa->drawY;
|
||||
|
||||
/* HACK!!!
|
||||
*/
|
||||
if ( tmesa->dirty & ~TRIDENT_UPLOAD_CLIPRECTS ) {
|
||||
tridentUploadHwStateLocked( tmesa );
|
||||
}
|
||||
|
||||
for ( i = 0 ; i < tmesa->numClipRects ; i++ ) {
|
||||
#if 0
|
||||
int nr = MIN2( i + TRIDENT_NR_SAREA_CLIPRECTS, tmesa->numClipRects );
|
||||
drm_clip_rect_t *box = tmesa->pClipRects;
|
||||
drm_clip_rect_t *b = tmesa->sarea->boxes;
|
||||
GLint n = 0;
|
||||
|
||||
if ( !all ) {
|
||||
for ( ; i < nr ; i++ ) {
|
||||
GLint x = box[i].x1;
|
||||
GLint y = box[i].y1;
|
||||
GLint w = box[i].x2 - x;
|
||||
GLint h = box[i].y2 - y;
|
||||
|
||||
if ( x < cx ) w -= cx - x, x = cx;
|
||||
if ( y < cy ) h -= cy - y, y = cy;
|
||||
if ( x + w > cx + cw ) w = cx + cw - x;
|
||||
if ( y + h > cy + ch ) h = cy + ch - y;
|
||||
if ( w <= 0 ) continue;
|
||||
if ( h <= 0 ) continue;
|
||||
|
||||
b->x1 = x;
|
||||
b->y1 = y;
|
||||
b->x2 = x + w;
|
||||
b->y2 = y + h;
|
||||
b++;
|
||||
n++;
|
||||
}
|
||||
} else {
|
||||
for ( ; i < nr ; i++ ) {
|
||||
*b++ = box[i];
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
tmesa->sarea->nbox = n;
|
||||
#endif
|
||||
|
||||
if (flags & DRM_TRIDENT_BACK) {
|
||||
MMIO_OUT32(MMIO, 0x2150, tmesa->tridentScreen->backPitch << 20 | tmesa->tridentScreen->backOffset>>4);
|
||||
MMIO_OUT8(MMIO, 0x2127, 0xF0); /* Pat Rop */
|
||||
MMIO_OUT32(MMIO, 0x2158, tmesa->ClearColor);
|
||||
MMIO_OUT32(MMIO, 0x2128, 0x4000); /* solidfill */
|
||||
MMIO_OUT32(MMIO, 0x2138, cx << 16 | cy);
|
||||
MMIO_OUT32(MMIO, 0x2140, cw << 16 | ch);
|
||||
MMIO_OUT8(MMIO, 0x2124, 0x01); /* BLT */
|
||||
#define GE_BUSY 0x80
|
||||
for (;;) {
|
||||
busy = MMIO_IN8(MMIO, 0x2120);
|
||||
if ( !(busy & GE_BUSY) )
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (flags & DRM_TRIDENT_DEPTH) {
|
||||
MMIO_OUT32(MMIO, 0x2150, tmesa->tridentScreen->depthPitch << 20 | tmesa->tridentScreen->depthOffset>>4);
|
||||
MMIO_OUT8(MMIO, 0x2127, 0xF0); /* Pat Rop */
|
||||
MMIO_OUT32(MMIO, 0x2158, tmesa->ClearColor);
|
||||
MMIO_OUT32(MMIO, 0x2128, 0x4000); /* solidfill */
|
||||
MMIO_OUT32(MMIO, 0x2138, cx << 16 | cy);
|
||||
MMIO_OUT32(MMIO, 0x2140, cw << 16 | ch);
|
||||
MMIO_OUT8(MMIO, 0x2124, 0x01); /* BLT */
|
||||
#define GE_BUSY 0x80
|
||||
for (;;) {
|
||||
busy = MMIO_IN8(MMIO, 0x2120);
|
||||
if ( !(busy & GE_BUSY) )
|
||||
break;
|
||||
}
|
||||
}
|
||||
MMIO_OUT32(MMIO, 0x2150, tmesa->tridentScreen->frontPitch << 20 | tmesa->tridentScreen->frontOffset>>4);
|
||||
if (flags & DRM_TRIDENT_FRONT) {
|
||||
MMIO_OUT8(MMIO, 0x2127, 0xF0); /* Pat Rop */
|
||||
MMIO_OUT32(MMIO, 0x2158, tmesa->ClearColor);
|
||||
MMIO_OUT32(MMIO, 0x2128, 0x4000); /* solidfill */
|
||||
MMIO_OUT32(MMIO, 0x2138, cx << 16 | cy);
|
||||
MMIO_OUT32(MMIO, 0x2140, cw << 16 | ch);
|
||||
MMIO_OUT8(MMIO, 0x2124, 0x01); /* BLT */
|
||||
#define GE_BUSY 0x80
|
||||
for (;;) {
|
||||
busy = MMIO_IN8(MMIO, 0x2120);
|
||||
if ( !(busy & GE_BUSY) )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#if 0
|
||||
tmesa->dirty |= (TRIDENT_UPLOAD_CONTEXT |
|
||||
TRIDENT_UPLOAD_MISC |
|
||||
TRIDENT_UPLOAD_CLIPRECTS);
|
||||
#endif
|
||||
}
|
||||
|
||||
UNLOCK_HARDWARE(tmesa);
|
||||
|
||||
if ( mask )
|
||||
_swrast_Clear( ctx, mask );
|
||||
}
|
||||
|
||||
static void tridentDDShadeModel( GLcontext *ctx, GLenum mode )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
GLuint s = tmesa->commandD;
|
||||
|
||||
#define TRIDENT_FLAT_SHADE 0x000000E0
|
||||
#define TRIDENT_FLAT_SHADE_VERTEX_C 0x00000060
|
||||
#define TRIDENT_FLAT_SHADE_GOURAUD 0x00000080
|
||||
|
||||
s &= ~TRIDENT_FLAT_SHADE;
|
||||
|
||||
switch ( mode ) {
|
||||
case GL_FLAT:
|
||||
s |= TRIDENT_FLAT_SHADE_VERTEX_C;
|
||||
break;
|
||||
case GL_SMOOTH:
|
||||
s |= TRIDENT_FLAT_SHADE_GOURAUD;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if ( tmesa->commandD != s ) {
|
||||
tmesa->commandD = s;
|
||||
|
||||
tmesa->dirty |= TRIDENT_UPLOAD_COMMAND_D;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
tridentCalcViewport( GLcontext *ctx )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
const GLfloat *v = ctx->Viewport._WindowMap.m;
|
||||
GLfloat *m = tmesa->hw_viewport;
|
||||
|
||||
/* See also trident_translate_vertex.
|
||||
*/
|
||||
m[MAT_SX] = v[MAT_SX];
|
||||
m[MAT_TX] = v[MAT_TX] + tmesa->drawX + SUBPIXEL_X;
|
||||
m[MAT_SY] = - v[MAT_SY];
|
||||
m[MAT_TY] = - v[MAT_TY] + tmesa->driDrawable->h + tmesa->drawY + SUBPIXEL_Y;
|
||||
#if 0
|
||||
m[MAT_SZ] = v[MAT_SZ] * tmesa->depth_scale;
|
||||
m[MAT_TZ] = v[MAT_TZ] * tmesa->depth_scale;
|
||||
#else
|
||||
m[MAT_SZ] = v[MAT_SZ];
|
||||
m[MAT_TZ] = v[MAT_TZ];
|
||||
#endif
|
||||
|
||||
tmesa->SetupNewInputs = ~0;
|
||||
}
|
||||
|
||||
static void tridentDDViewport( GLcontext *ctx,
|
||||
GLint x, GLint y,
|
||||
GLsizei width, GLsizei height )
|
||||
{
|
||||
tridentCalcViewport( ctx );
|
||||
}
|
||||
|
||||
static void tridentDDDepthRange( GLcontext *ctx,
|
||||
GLclampd nearval, GLclampd farval )
|
||||
{
|
||||
tridentCalcViewport( ctx );
|
||||
}
|
||||
|
||||
static void
|
||||
tridentSetCliprects( tridentContextPtr tmesa, GLenum mode )
|
||||
{
|
||||
__DRIdrawablePrivate *dPriv = tmesa->driDrawable;
|
||||
|
||||
switch ( mode ) {
|
||||
case GL_FRONT_LEFT:
|
||||
if (dPriv->numClipRects == 0) {
|
||||
static drm_clip_rect_t zeroareacliprect = {0,0,0,0};
|
||||
tmesa->numClipRects = 1;
|
||||
tmesa->pClipRects = &zeroareacliprect;
|
||||
} else {
|
||||
tmesa->numClipRects = dPriv->numClipRects;
|
||||
tmesa->pClipRects = (drm_clip_rect_t *)dPriv->pClipRects;
|
||||
}
|
||||
tmesa->drawX = dPriv->x;
|
||||
tmesa->drawY = dPriv->y;
|
||||
break;
|
||||
case GL_BACK_LEFT:
|
||||
if ( dPriv->numBackClipRects == 0 ) {
|
||||
if (dPriv->numClipRects == 0) {
|
||||
static drm_clip_rect_t zeroareacliprect = {0,0,0,0};
|
||||
tmesa->numClipRects = 1;
|
||||
tmesa->pClipRects = &zeroareacliprect;
|
||||
} else {
|
||||
tmesa->numClipRects = dPriv->numClipRects;
|
||||
tmesa->pClipRects = (drm_clip_rect_t *)dPriv->pClipRects;
|
||||
tmesa->drawX = dPriv->x;
|
||||
tmesa->drawY = dPriv->y;
|
||||
}
|
||||
}
|
||||
else {
|
||||
tmesa->numClipRects = dPriv->numBackClipRects;
|
||||
tmesa->pClipRects = (drm_clip_rect_t *)dPriv->pBackClipRects;
|
||||
tmesa->drawX = dPriv->backX;
|
||||
tmesa->drawY = dPriv->backY;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
#if 0
|
||||
tmesa->dirty |= TRIDENT_UPLOAD_CLIPRECTS;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
static GLboolean tridentDDSetDrawBuffer( GLcontext *ctx, GLenum mode )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
int found = GL_TRUE;
|
||||
|
||||
if ( tmesa->DrawBuffer != mode ) {
|
||||
tmesa->DrawBuffer = mode;
|
||||
|
||||
switch ( mode ) {
|
||||
case GL_FRONT_LEFT:
|
||||
tridentFallback( tmesa, TRIDENT_FALLBACK_DRAW_BUFFER, GL_FALSE );
|
||||
tmesa->drawOffset = tmesa->tridentScreen->frontOffset;
|
||||
tmesa->drawPitch = tmesa->tridentScreen->frontPitch;
|
||||
tridentSetCliprects( tmesa, GL_FRONT_LEFT );
|
||||
break;
|
||||
case GL_BACK_LEFT:
|
||||
tridentFallback( tmesa, TRIDENT_FALLBACK_DRAW_BUFFER, GL_FALSE );
|
||||
tmesa->drawOffset = tmesa->tridentScreen->backOffset;
|
||||
tmesa->drawPitch = tmesa->tridentScreen->backPitch;
|
||||
tridentSetCliprects( tmesa, GL_BACK_LEFT );
|
||||
break;
|
||||
default:
|
||||
tridentFallback( tmesa, TRIDENT_FALLBACK_DRAW_BUFFER, GL_TRUE );
|
||||
found = GL_FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
#if 0
|
||||
tmesa->setup.dst_off_pitch = (((tmesa->drawPitch/8) << 22) |
|
||||
(tmesa->drawOffset >> 3));
|
||||
|
||||
tmesa->dirty |= MACH64_UPLOAD_DST_OFF_PITCH | MACH64_UPLOAD_CONTEXT;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
static void tridentDDClearColor( GLcontext *ctx,
|
||||
const GLchan color[4] )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
|
||||
tmesa->ClearColor = tridentPackColor( tmesa->tridentScreen->cpp,
|
||||
color[0], color[1],
|
||||
color[2], color[3] );
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
tridentDDUpdateState( GLcontext *ctx, GLuint new_state )
|
||||
{
|
||||
_swrast_InvalidateState( ctx, new_state );
|
||||
_swsetup_InvalidateState( ctx, new_state );
|
||||
_vbo_InvalidateState( ctx, new_state );
|
||||
_tnl_InvalidateState( ctx, new_state );
|
||||
TRIDENT_CONTEXT(ctx)->new_gl_state |= new_state;
|
||||
}
|
||||
|
||||
|
||||
/* Initialize the context's hardware state.
|
||||
*/
|
||||
void tridentDDInitState( tridentContextPtr tmesa )
|
||||
{
|
||||
tmesa->new_state = 0;
|
||||
|
||||
switch ( tmesa->glCtx->Visual.depthBits ) {
|
||||
case 16:
|
||||
tmesa->depth_scale = 1.0 / (GLfloat)0xffff;
|
||||
break;
|
||||
case 24:
|
||||
tmesa->depth_scale = 1.0 / (GLfloat)0xffffff;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void tridentDDUpdateHWState( GLcontext *ctx )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
int new_state = tmesa->new_state;
|
||||
|
||||
if ( new_state )
|
||||
{
|
||||
tmesa->new_state = 0;
|
||||
|
||||
#if 0
|
||||
/* Update the various parts of the context's state.
|
||||
*/
|
||||
if ( new_state & GAMMA_NEW_ALPHA )
|
||||
tridentUpdateAlphaMode( ctx );
|
||||
|
||||
if ( new_state & GAMMA_NEW_DEPTH )
|
||||
tridentUpdateZMode( ctx );
|
||||
|
||||
if ( new_state & GAMMA_NEW_FOG )
|
||||
gammaUpdateFogAttrib( ctx );
|
||||
|
||||
if ( new_state & GAMMA_NEW_CLIP )
|
||||
gammaUpdateClipping( ctx );
|
||||
|
||||
if ( new_state & GAMMA_NEW_POLYGON )
|
||||
gammaUpdatePolygon( ctx );
|
||||
|
||||
if ( new_state & GAMMA_NEW_CULL )
|
||||
gammaUpdateCull( ctx );
|
||||
|
||||
if ( new_state & GAMMA_NEW_MASKS )
|
||||
gammaUpdateMasks( ctx );
|
||||
|
||||
if ( new_state & GAMMA_NEW_STIPPLE )
|
||||
gammaUpdateStipple( ctx );
|
||||
#endif
|
||||
}
|
||||
|
||||
/* HACK ! */
|
||||
|
||||
#if 0
|
||||
gammaEmitHwState( tmesa );
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Initialize the driver's state functions.
|
||||
*/
|
||||
void tridentDDInitStateFuncs( GLcontext *ctx )
|
||||
{
|
||||
ctx->Driver.UpdateState = tridentDDUpdateState;
|
||||
|
||||
ctx->Driver.Clear = tridentDDClear;
|
||||
ctx->Driver.DepthRange = tridentDDDepthRange;
|
||||
ctx->Driver.ShadeModel = tridentDDShadeModel;
|
||||
ctx->Driver.Viewport = tridentDDViewport;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,434 +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 "main/glheader.h"
|
||||
#include "main/mtypes.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/colormac.h"
|
||||
|
||||
#include "swrast_setup/swrast_setup.h"
|
||||
#include "swrast/swrast.h"
|
||||
#include "tnl/t_context.h"
|
||||
#include "tnl/tnl.h"
|
||||
|
||||
#include "trident_context.h"
|
||||
|
||||
#define TRIDENT_TEX1_BIT 0x1
|
||||
#define TRIDENT_TEX0_BIT 0x2
|
||||
#define TRIDENT_RGBA_BIT 0x4
|
||||
#define TRIDENT_SPEC_BIT 0x8
|
||||
#define TRIDENT_FOG_BIT 0x10
|
||||
#define TRIDENT_XYZW_BIT 0x20
|
||||
#define TRIDENT_PTEX_BIT 0x40
|
||||
#define TRIDENT_MAX_SETUP 0x80
|
||||
|
||||
static struct {
|
||||
void (*emit)( GLcontext *, GLuint, GLuint, void *, GLuint );
|
||||
tnl_interp_func interp;
|
||||
tnl_copy_pv_func copy_pv;
|
||||
GLboolean (*check_tex_sizes)( GLcontext *ctx );
|
||||
GLuint vertex_size;
|
||||
GLuint vertex_stride_shift;
|
||||
GLuint vertex_format;
|
||||
} setup_tab[TRIDENT_MAX_SETUP];
|
||||
|
||||
#define TINY_VERTEX_FORMAT 1
|
||||
#define NOTEX_VERTEX_FORMAT 2
|
||||
#define TEX0_VERTEX_FORMAT 3
|
||||
#define TEX1_VERTEX_FORMAT 4
|
||||
#define PROJ_TEX1_VERTEX_FORMAT 5
|
||||
#define TEX2_VERTEX_FORMAT 6
|
||||
#define TEX3_VERTEX_FORMAT 7
|
||||
#define PROJ_TEX3_VERTEX_FORMAT 8
|
||||
|
||||
#define DO_XYZW (IND & TRIDENT_XYZW_BIT)
|
||||
#define DO_RGBA (IND & TRIDENT_RGBA_BIT)
|
||||
#define DO_SPEC (IND & TRIDENT_SPEC_BIT)
|
||||
#define DO_FOG (IND & TRIDENT_FOG_BIT)
|
||||
#define DO_TEX0 (IND & TRIDENT_TEX0_BIT)
|
||||
#define DO_TEX1 (IND & TRIDENT_TEX1_BIT)
|
||||
#define DO_TEX2 0
|
||||
#define DO_TEX3 0
|
||||
#define DO_PTEX (IND & TRIDENT_PTEX_BIT)
|
||||
|
||||
#define VERTEX tridentVertex
|
||||
#define VERTEX_COLOR trident_color_t
|
||||
#define LOCALVARS tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
#define GET_VIEWPORT_MAT() tmesa->hw_viewport
|
||||
#define GET_TEXSOURCE(n) tmesa->tmu_source[n]
|
||||
#define GET_VERTEX_FORMAT() tmesa->vertex_format
|
||||
#define GET_VERTEX_SIZE() tmesa->vertex_size
|
||||
#define GET_VERTEX_STORE() tmesa->verts
|
||||
#define GET_VERTEX_STRIDE_SHIFT() tmesa->vertex_stride_shift
|
||||
#define GET_UBYTE_COLOR_STORE() &tmesa->UbyteColor
|
||||
#define GET_UBYTE_SPEC_COLOR_STORE() &tmesa->UbyteSecondaryColor
|
||||
|
||||
#define HAVE_HW_VIEWPORT 0
|
||||
#define HAVE_HW_DIVIDE 0
|
||||
#define HAVE_RGBA_COLOR 0
|
||||
#define HAVE_TINY_VERTICES 1
|
||||
#define HAVE_NOTEX_VERTICES 1
|
||||
#define HAVE_TEX0_VERTICES 1
|
||||
#define HAVE_TEX1_VERTICES 1
|
||||
#define HAVE_TEX2_VERTICES 0
|
||||
#define HAVE_TEX3_VERTICES 0
|
||||
#define HAVE_PTEX_VERTICES 0
|
||||
|
||||
#define UNVIEWPORT_VARS \
|
||||
const GLfloat dx = - tmesa->drawX - SUBPIXEL_X; \
|
||||
const GLfloat dy = (tmesa->driDrawable->h + \
|
||||
tmesa->drawY + SUBPIXEL_Y); \
|
||||
const GLfloat sz = 1.0 / tmesa->depth_scale
|
||||
|
||||
#define UNVIEWPORT_X(x) x + dx;
|
||||
#define UNVIEWPORT_Y(y) - y + dy;
|
||||
#define UNVIEWPORT_Z(z) z * sz;
|
||||
|
||||
#define PTEX_FALLBACK() tridentFallback(TRIDENT_CONTEXT(ctx), TRIDENT_FALLBACK_TEXTURE, 1)
|
||||
|
||||
#define IMPORT_FLOAT_COLORS trident_import_float_colors
|
||||
#define IMPORT_FLOAT_SPEC_COLORS trident_import_float_spec_colors
|
||||
|
||||
#define INTERP_VERTEX setup_tab[tmesa->SetupIndex].interp
|
||||
#define COPY_PV_VERTEX setup_tab[tmesa->SetupIndex].copy_pv
|
||||
|
||||
/***********************************************************************
|
||||
* Generate pv-copying and translation functions *
|
||||
***********************************************************************/
|
||||
|
||||
#define TAG(x) trident_##x
|
||||
#include "tnl_dd/t_dd_vb.c"
|
||||
|
||||
/***********************************************************************
|
||||
* Generate vertex emit and interp functions *
|
||||
***********************************************************************/
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT)
|
||||
#define TAG(x) x##_wg
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_SPEC_BIT)
|
||||
#define TAG(x) x##_wgs
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_wgt0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_wgt0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_TEX0_BIT|TRIDENT_PTEX_BIT)
|
||||
#define TAG(x) x##_wgpt0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_wgst0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_wgst0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT|TRIDENT_PTEX_BIT)
|
||||
#define TAG(x) x##_wgspt0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT)
|
||||
#define TAG(x) x##_wgf
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_SPEC_BIT)
|
||||
#define TAG(x) x##_wgfs
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_wgft0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_wgft0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_TEX0_BIT|TRIDENT_PTEX_BIT)
|
||||
#define TAG(x) x##_wgfpt0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_wgfst0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_wgfst0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT|TRIDENT_PTEX_BIT)
|
||||
#define TAG(x) x##_wgfspt0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_t0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_t0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_FOG_BIT)
|
||||
#define TAG(x) x##_f
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_FOG_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_ft0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_FOG_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_ft0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT)
|
||||
#define TAG(x) x##_g
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_SPEC_BIT)
|
||||
#define TAG(x) x##_gs
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_gt0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_gt0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_gst0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_gst0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT)
|
||||
#define TAG(x) x##_gf
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_SPEC_BIT)
|
||||
#define TAG(x) x##_gfs
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_gft0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_gft0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT)
|
||||
#define TAG(x) x##_gfst0
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
#define IND (TRIDENT_RGBA_BIT|TRIDENT_FOG_BIT|TRIDENT_SPEC_BIT|TRIDENT_TEX0_BIT|TRIDENT_TEX1_BIT)
|
||||
#define TAG(x) x##_gfst0t1
|
||||
#include "tnl_dd/t_dd_vbtmp.h"
|
||||
|
||||
static void init_setup_tab( void )
|
||||
{
|
||||
init_wg();
|
||||
init_wgs();
|
||||
init_wgt0();
|
||||
init_wgt0t1();
|
||||
init_wgpt0();
|
||||
init_wgst0();
|
||||
init_wgst0t1();
|
||||
init_wgspt0();
|
||||
init_wgf();
|
||||
init_wgfs();
|
||||
init_wgft0();
|
||||
init_wgft0t1();
|
||||
init_wgfpt0();
|
||||
init_wgfst0();
|
||||
init_wgfst0t1();
|
||||
init_wgfspt0();
|
||||
init_t0();
|
||||
init_t0t1();
|
||||
init_f();
|
||||
init_ft0();
|
||||
init_ft0t1();
|
||||
init_g();
|
||||
init_gs();
|
||||
init_gt0();
|
||||
init_gt0t1();
|
||||
init_gst0();
|
||||
init_gst0t1();
|
||||
init_gf();
|
||||
init_gfs();
|
||||
init_gft0();
|
||||
init_gft0t1();
|
||||
init_gfst0();
|
||||
init_gfst0t1();
|
||||
}
|
||||
|
||||
void tridentBuildVertices( GLcontext *ctx,
|
||||
GLuint start,
|
||||
GLuint count,
|
||||
GLuint newinputs )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT( ctx );
|
||||
GLubyte *v = ((GLubyte *)tmesa->verts + (start<<tmesa->vertex_stride_shift));
|
||||
GLuint stride = 1<<tmesa->vertex_stride_shift;
|
||||
|
||||
newinputs |= tmesa->SetupNewInputs;
|
||||
tmesa->SetupNewInputs = 0;
|
||||
|
||||
if (!newinputs)
|
||||
return;
|
||||
|
||||
if (newinputs & VERT_BIT_POS) {
|
||||
setup_tab[tmesa->SetupIndex].emit( ctx, start, count, v, stride );
|
||||
} else {
|
||||
GLuint ind = 0;
|
||||
|
||||
if (newinputs & VERT_BIT_COLOR0)
|
||||
ind |= TRIDENT_RGBA_BIT;
|
||||
|
||||
if (newinputs & VERT_BIT_COLOR1)
|
||||
ind |= TRIDENT_SPEC_BIT;
|
||||
|
||||
if (newinputs & VERT_BIT_TEX0)
|
||||
ind |= TRIDENT_TEX0_BIT;
|
||||
|
||||
if (newinputs & VERT_BIT_TEX1)
|
||||
ind |= TRIDENT_TEX1_BIT;
|
||||
|
||||
if (newinputs & VERT_BIT_FOG)
|
||||
ind |= TRIDENT_FOG_BIT;
|
||||
|
||||
if (tmesa->SetupIndex & TRIDENT_PTEX_BIT)
|
||||
ind = ~0;
|
||||
|
||||
ind &= tmesa->SetupIndex;
|
||||
|
||||
if (ind) {
|
||||
setup_tab[ind].emit( ctx, start, count, v, stride );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tridentCheckTexSizes( GLcontext *ctx )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT( ctx );
|
||||
|
||||
if (!setup_tab[tmesa->SetupIndex].check_tex_sizes(ctx)) {
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
|
||||
/* Invalidate stored verts
|
||||
*/
|
||||
tmesa->SetupNewInputs = ~0;
|
||||
tmesa->SetupIndex |= TRIDENT_PTEX_BIT;
|
||||
|
||||
if (!tmesa->Fallback &&
|
||||
!(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
|
||||
tnl->Driver.Render.Interp = setup_tab[tmesa->SetupIndex].interp;
|
||||
tnl->Driver.Render.CopyPV = setup_tab[tmesa->SetupIndex].copy_pv;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tridentChooseVertexState( GLcontext *ctx )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT( ctx );
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
GLuint ind = TRIDENT_XYZW_BIT|TRIDENT_RGBA_BIT;
|
||||
|
||||
if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
|
||||
ind |= TRIDENT_SPEC_BIT;
|
||||
|
||||
if (ctx->Fog.Enabled)
|
||||
ind |= TRIDENT_FOG_BIT;
|
||||
|
||||
if (ctx->Texture.Unit[0]._ReallyEnabled) {
|
||||
ind |= TRIDENT_TEX0_BIT;
|
||||
if (ctx->Texture.Unit[1]._ReallyEnabled) {
|
||||
ind |= TRIDENT_TEX1_BIT;
|
||||
}
|
||||
}
|
||||
|
||||
tmesa->SetupIndex = ind;
|
||||
|
||||
if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) {
|
||||
tnl->Driver.Render.Interp = trident_interp_extras;
|
||||
tnl->Driver.Render.CopyPV = trident_copy_pv_extras;
|
||||
} else {
|
||||
tnl->Driver.Render.Interp = setup_tab[ind].interp;
|
||||
tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv;
|
||||
}
|
||||
|
||||
if (setup_tab[ind].vertex_format != tmesa->vertex_format) {
|
||||
tmesa->vertex_format = setup_tab[ind].vertex_format;
|
||||
tmesa->vertex_size = setup_tab[ind].vertex_size;
|
||||
tmesa->vertex_stride_shift = setup_tab[ind].vertex_stride_shift;
|
||||
}
|
||||
}
|
||||
|
||||
void tridentInitVB( GLcontext *ctx )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
GLuint size = TNL_CONTEXT(ctx)->vb.Size;
|
||||
|
||||
tmesa->verts = (GLubyte *)ALIGN_MALLOC( size * 16 * 4, 32 );
|
||||
|
||||
{
|
||||
static int firsttime = 1;
|
||||
if (firsttime) {
|
||||
init_setup_tab();
|
||||
firsttime = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tridentFreeVB( GLcontext *ctx )
|
||||
{
|
||||
tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
|
||||
|
||||
if (tmesa->verts) {
|
||||
ALIGN_FREE(tmesa->verts);
|
||||
tmesa->verts = 0;
|
||||
}
|
||||
|
||||
if (tmesa->UbyteSecondaryColor.Ptr) {
|
||||
ALIGN_FREE((void *)tmesa->UbyteSecondaryColor.Ptr);
|
||||
tmesa->UbyteSecondaryColor.Ptr = 0;
|
||||
}
|
||||
|
||||
if (tmesa->UbyteColor.Ptr) {
|
||||
ALIGN_FREE((void *)tmesa->UbyteColor.Ptr);
|
||||
tmesa->UbyteColor.Ptr = 0;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user