/*
Copyright (C) 1996-1997 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

*/
// d_init.c: rasterization driver initialization

#include "quakedef.h"
#include "d_local.h"

#define NUM_MIPS	4

static cvar_t d_subdiv16 = { "d_subdiv16", "1" };
static cvar_t d_mipcap = { "d_mipcap", "0" };
static cvar_t d_mipscale = { "d_mipscale", "1" };

surfcache_t *d_initial_rover;
qboolean d_roverwrapped;
int d_minmip;
float d_scalemip[NUM_MIPS - 1];

static float basemip[NUM_MIPS - 1] = { 1.0, 0.5 * 0.8, 0.25 * 0.8 };

void (*D_DrawSpans)(espan_t *pspan);

void
D_RegisterVariables()
{
    Cvar_RegisterVariable(&d_subdiv16);
    Cvar_RegisterVariable(&d_mipcap);
    Cvar_RegisterVariable(&d_mipscale);
}

/*
===============
D_Init
===============
*/
void
D_Init(void)
{
    r_skydirect = 1;
    r_recursiveaffinetriangles = true;
    r_pixbytes = 1;
    r_aliasuvscale = 1.0;
}


/*
===============
D_CopyRects

this function is only required if the CPU doesn't have direct access to the
back buffer, and there's some driver interface function that the driver
doesn't support and requires Quake to do in software (such as drawing the
console); Quake will then draw into wherever the driver points vid.buffer
and will call this function before swapping buffers
===============
*/
void
D_CopyRects(vrect_t *prects, int transparent) { }


/*
===============
D_EnableBackBufferAccess
===============
*/
void
D_EnableBackBufferAccess(void)
{
    VID_LockBuffer();
}


/*
===============
D_TurnZOn
===============
*/
void
D_TurnZOn(void)
{
// not needed for software version
}


/*
===============
D_DisableBackBufferAccess
===============
*/
void
D_DisableBackBufferAccess(void)
{
    VID_UnlockBuffer();
}


/*
===============
D_SetupFrame
===============
*/
void
D_SetupFrame(void)
{
    int i;

    d_viewbuffer = r_dowarp ? r_warpbuffer : vid.buffer;
    screenwidth = vid.rowbytes;

    d_roverwrapped = false;
    d_initial_rover = sc_rover;

    d_minmip = d_mipcap.value;
    if (d_minmip > 3)
	d_minmip = 3;
    else if (d_minmip < 0)
	d_minmip = 0;

    for (i = 0; i < (NUM_MIPS - 1); i++)
	d_scalemip[i] = basemip[i] * d_mipscale.value;

#ifdef USE_X86_ASM
    if (d_subdiv16.value)
	D_DrawSpans = D_DrawSpans16;
    else
	D_DrawSpans = D_DrawSpans8;
#else
    D_DrawSpans = D_DrawSpans8;
#endif
}


/*
===============
D_UpdateRects

the software driver draws these directly to the vid buffer
===============
*/
void
D_UpdateRects(vrect_t *prect) { }
