/* * Author: Max Lingua */ #include "s3v_context.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" #if defined(USE_X86_ASM) #include "x86/common_x86_asm.h" #endif #include "main/simple_list.h" #include "main/mm.h" #include "drivers/common/driverfuncs.h" #include "s3v_vb.h" #include "s3v_tris.h" #if 0 extern const struct tnl_pipeline_stage _s3v_render_stage; static const struct tnl_pipeline_stage *s3v_pipeline[] = { &_tnl_vertex_transform_stage, &_tnl_normal_transform_stage, &_tnl_lighting_stage, &_tnl_fog_coordinate_stage, &_tnl_texgen_stage, &_tnl_texture_transform_stage, /* REMOVE: point attenuation stage */ #if 1 &_s3v_render_stage, /* ADD: unclipped rastersetup-to-dma */ #endif &_tnl_render_stage, 0, }; #endif GLboolean s3vCreateContext(const __GLcontextModes *glVisual, __DRIcontextPrivate *driContextPriv, void *sharedContextPrivate) { GLcontext *ctx, *shareCtx; __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; s3vContextPtr vmesa; s3vScreenPtr s3vScrn; S3VSAREAPtr saPriv=(S3VSAREAPtr)(((char*)sPriv->pSAREA) + sizeof(drm_sarea_t)); struct dd_function_table functions; DEBUG_WHERE(("*** s3vCreateContext ***\n")); vmesa = (s3vContextPtr) CALLOC( sizeof(*vmesa) ); if ( !vmesa ) return GL_FALSE; /* Allocate the Mesa context */ if (sharedContextPrivate) shareCtx = ((s3vContextPtr) sharedContextPrivate)->glCtx; else shareCtx = NULL; _mesa_init_driver_functions(&functions); vmesa->glCtx = _mesa_create_context(glVisual, shareCtx, &functions, (void *)vmesa); if (!vmesa->glCtx) { FREE(vmesa); return GL_FALSE; } vmesa->driContext = driContextPriv; vmesa->driScreen = sPriv; vmesa->driDrawable = NULL; /* Set by XMesaMakeCurrent */ vmesa->hHWContext = driContextPriv->hHWContext; vmesa->driHwLock = (drmLock *)&sPriv->pSAREA->lock; vmesa->driFd = sPriv->fd; vmesa->sarea = saPriv; s3vScrn = vmesa->s3vScreen = (s3vScreenPtr)(sPriv->private); ctx = vmesa->glCtx; ctx->Const.MaxTextureLevels = 11; /* it is (11-1) -> 1024 * 1024 FIXME */ ctx->Const.MaxTextureUnits = 1; /* FIXME: or 2 ? */ /* No wide points. */ ctx->Const.MinPointSize = 1.0; ctx->Const.MinPointSizeAA = 1.0; ctx->Const.MaxPointSize = 1.0; ctx->Const.MaxPointSizeAA = 1.0; /* No wide lines. */ ctx->Const.MinLineWidth = 1.0; ctx->Const.MinLineWidthAA = 1.0; ctx->Const.MaxLineWidth = 1.0; ctx->Const.MaxLineWidthAA = 1.0; ctx->Const.LineWidthGranularity = 1.0; ctx->Const.MaxDrawBuffers = 1; vmesa->texHeap = mmInit( 0, vmesa->s3vScreen->textureSize ); DEBUG(("vmesa->s3vScreen->textureSize = 0x%x\n", vmesa->s3vScreen->textureSize)); /* NOTE */ /* mmInit(offset, size); */ /* allocates a structure like this: struct mem_block_t { struct mem_block_t *next; struct mem_block_t *heap; int ofs,size; int align; int free:1; int reserved:1; }; */ make_empty_list(&vmesa->TexObjList); make_empty_list(&vmesa->SwappedOut); vmesa->CurrentTexObj[0] = 0; vmesa->CurrentTexObj[1] = 0; /* FIXME */ vmesa->RenderIndex = ~0; /* Initialize the software rasterizer and helper modules. */ _swrast_CreateContext( ctx ); _vbo_CreateContext( ctx ); _tnl_CreateContext( ctx ); _swsetup_CreateContext( ctx ); /* Install the customized pipeline: */ #if 0 _tnl_destroy_pipeline( ctx ); _tnl_install_pipeline( ctx, s3v_pipeline ); #endif /* Configure swrast to match hardware characteristics: */ #if 0 _swrast_allow_pixel_fog( ctx, GL_FALSE ); _swrast_allow_vertex_fog( ctx, GL_TRUE ); #endif vmesa->_3d_mode = 0; /* 3D lines / gouraud tris */ vmesa->CMD = ( AUTO_EXEC_ON | HW_CLIP_ON | DEST_COL_1555 | FOG_OFF | ALPHA_OFF | Z_OFF | Z_UPDATE_OFF | Z_LESS | TEX_WRAP_ON | TEX_MODULATE | LINEAR | TEX_COL_ARGB1555 | CMD_3D ); vmesa->_alpha[0] = vmesa->_alpha[1] = ALPHA_OFF; vmesa->alpha_cmd = vmesa->_alpha[0]; vmesa->_tri[0] = DO_GOURAUD_TRI; vmesa->_tri[1] = DO_TEX_LIT_TRI; vmesa->prim_cmd = vmesa->_tri[0]; /* printf("first vmesa->CMD = 0x%x\n", vmesa->CMD); */ vmesa->TexOffset = vmesa->s3vScreen->texOffset; s3vInitVB( ctx ); s3vInitExtensions( ctx ); s3vInitDriverFuncs( ctx ); s3vInitStateFuncs( ctx ); s3vInitSpanFuncs( ctx ); s3vInitTextureFuncs( ctx ); s3vInitTriFuncs( ctx ); s3vInitState( vmesa ); driContextPriv->driverPrivate = (void *)vmesa; /* HACK */ vmesa->bufSize = S3V_DMA_BUF_SZ; DEBUG(("vmesa->bufSize = %i\n", vmesa->bufSize)); DEBUG(("vmesa->bufCount = %i\n", vmesa->bufCount)); /* dma init */ DEBUG_BUFS(("GET_FIRST_DMA\n")); vmesa->_bufNum = 0; GET_FIRST_DMA(vmesa->driFd, vmesa->hHWContext, 1, &(vmesa->bufIndex[0]), &(vmesa->bufSize), &vmesa->_buf[0], &vmesa->bufCount, s3vScrn); GET_FIRST_DMA(vmesa->driFd, vmesa->hHWContext, 1, &(vmesa->bufIndex[1]), &(vmesa->bufSize), &vmesa->_buf[1], &vmesa->bufCount, s3vScrn); vmesa->buf = vmesa->_buf[vmesa->_bufNum]; /* vmesa->CMD = (AUTO_EXEC_ON | HW_CLIP_ON | DEST_COL_1555 | FOG_OFF | ALPHA_OFF | Z_OFF | Z_UPDATE_OFF | DO_GOURAUD_TRI | CMD_3D); vmesa->TexOffset = vmesa->s3vScreen->texOffset; */ /* ... but we should support only 15 bit in virge (out of 8/15/24)... */ DEBUG(("glVisual->depthBits = %i\n", glVisual->depthBits)); switch (glVisual->depthBits) { case 8: break; case 15: case 16: vmesa->depth_scale = 1.0f / 0xffff; break; case 24: vmesa->depth_scale = 1.0f / 0xffffff; break; default: break; } vmesa->cull_zero = 0.0f; vmesa->DepthSize = glVisual->depthBits; vmesa->Flags = S3V_FRONT_BUFFER; vmesa->Flags |= (glVisual->doubleBufferMode ? S3V_BACK_BUFFER : 0); vmesa->Flags |= (vmesa->DepthSize > 0 ? S3V_DEPTH_BUFFER : 0); vmesa->EnabledFlags = S3V_FRONT_BUFFER; vmesa->EnabledFlags |= (glVisual->doubleBufferMode ? S3V_BACK_BUFFER : 0); if (vmesa->Flags & S3V_BACK_BUFFER) { vmesa->readOffset = vmesa->drawOffset = vmesa->s3vScreen->backOffset; } else { vmesa->readOffset = vmesa->drawOffset = 0; } s3vInitHW( vmesa ); driContextPriv->driverPrivate = (void *)vmesa; return GL_TRUE; }