home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
System
/
Mesa-3.1
/
src
/
AOS
/
cybDisplay.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-09-26
|
12KB
|
419 lines
/*
* $Id: $
*/
/*
* Mesa 3-D graphics library
* Version: 3.1
* Copyright (C) 1995 Brian Paul (brianp@ssec.wisc.edu)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* $Log: $
*/
#undef NO_CONTEXT_AVAILABLE
#include <AOS/amigamesa.h>
#include "AOS/accessArray.h"
#define MyWritePixelArray WritePixelArray
#define MyReadPixelArray ReadPixelArray
#define MyWriteLUTPixelArray WriteLUTPixelArray
/**********************************************************************/
/***** Miscellaneous device driver funcs *****/
/**********************************************************************/
const char *cybRendererString(void)
{
return "CyberGraphX standard\n";
}
const char *cybRendererStringDB(void)
{
return "CyberGraphX fast\n";
}
void cybClearIndex(GLcontext * ctx, GLuint index)
{
amigaMesaContext amesa;
/*
* implement glClearIndex
* usually just save the value in the context struct
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybClearIndex(%d)\n", index);
amesa->clearpixel = GetRGBP(amesa, index);
}
void cybClearColor(GLcontext * ctx,
GLubyte r, GLubyte g, GLubyte b, GLubyte a)
{
amigaMesaContext amesa;
/*
* implement glClearColor
* color components are floats in [0,1]
* usually just save the value in the context struct
*
* @@@ TODO FREE COLOR IF NOT USED
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybClearColor(%d, %d, %d, %d)\n", r, g, b, a);
amesa->clearpixel = MakeRGBP(amesa, (GLubyte) r, (GLubyte) g, (GLubyte) b, 0, 0);
}
GLbitfield cybClear(GLcontext * ctx, GLbitfield mask, GLboolean all,
GLint x, GLint y, GLint width, GLint height)
{
amigaMesaContext amesa;
/*
* Clear the specified region of the color buffer using the clear color
* or index as specified by one of the two functions above.
* If all==GL_TRUE, clear whole buffer
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybClear(%d, %d, %d, %d, %d)\n", all, x, y, width, height);
if (all) {
struct gl_viewport_attrib *vport = &ctx->Viewport;
DEBUGOUT(2, " FillPixelArray(%d,%d,%d,%d);\n",
FIXx(vport->X),
FIXy(vport->Y) - vport->Height,
FIXx(vport->X) + vport->Width - 1,
FIXy(vport->Y) - 1);
FillPixelArray(amesa->rp,
FIXx(vport->X),
FIXy(vport->Y) - vport->Height,
vport->Width,
vport->Height,
amesa->clearpixel >> 8);
}
else {
DEBUGOUT(2, " FillPixelArray(%d,%d,%d,%d);\n",
FIXx(x),
FIXy(y) - height,
FIXx(x) + width - 1,
FIXy(y) - 1);
FillPixelArray(amesa->rp, FIXx(x),
FIXy(y) - height,
width,
height,
amesa->clearpixel >> 8);
}
return mask & (~GL_COLOR_BUFFER_BIT);
}
GLbitfield cybClearDB(GLcontext * ctx, GLbitfield mask, GLboolean all,
GLint x, GLint y, GLint width, GLint height)
{
amigaMesaContext amesa;
GLuint *db;
GLuint col;
/*
* Clear the specified region of the color buffer using the clear color
* or index as specified by one of the two functions above.
* If all==GL_TRUE, clear whole buffer
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybClearDB(%d, %d, %d, %d, %d)\n", all, x, y, width, height);
col = amesa->clearpixel;
if (all) {
GLint size = (amesa->FixedWidth * amesa->FixedHeight);
/*db = dbRGBA(dbRGBAGet(amesa), 0, 0);*/
db = (GLuint *)amesa->BackArray; /* really clear all (Fixed), not only Real */
while (--size >= 0)
*db++ = col;
}
else {
GLshort x1, y1, x2, y2;
y2 = y + width;
x2 = x + height;
db = dbRGBAGet(amesa);
for (y1 = y; y1 < y2; y1++) {
GLuint *img = dbRGBA(db, y1, x);
for (x1 = x; x1 < x2; x1++)
*img++ = col;
}
}
return mask & (~GL_COLOR_BUFFER_BIT);
}
void cybSetIndex(GLcontext * ctx, GLuint index)
{
amigaMesaContext amesa;
/*
* Set the amesa color index.
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybSetIndex(%d)\n", index);
amesa->pixel = GetRGBP(amesa, index);
}
void cybSetColor(GLcontext * ctx, GLubyte r, GLubyte g, GLubyte b, GLubyte a)
{
amigaMesaContext amesa;
/*
* Set the current RGBA color.
* r is in 0..255.RedScale
* g is in 0..255.GreenScale
* b is in 0..255.BlueScale
* a is in 0..255.AlphaScale
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybSetColor(%d, %d, %d, %d)\n", r, g, b, a);
amesa->pixel = MakeRGBP(amesa, (GLubyte) r, (GLubyte) g, (GLubyte) b, 0, 0);
}
GLboolean cybIndexMask(GLcontext * ctx, GLuint mask)
{
amigaMesaContext amesa;
/*
* implement glIndexMask if possible, else return GL_FALSE
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybIndexMask(0x%x)\n", mask);
amesa->rp->Mask = (GLubyte) mask;
return (GL_TRUE);
}
GLboolean cybColorMask(GLcontext * ctx, GLboolean rmask, GLboolean gmask, GLboolean bmask, GLboolean amask)
{
amigaMesaContext amesa;
/*
* implement glColorMask if possible, else return GL_FALSE
*/
amesa = (amigaMesaContext) ctx->DriverCtx;
DEBUGOUT(1, "cybColorMask()\n");
if (rmask || gmask || bmask)
return GL_TRUE;
return GL_FALSE;
}
/*
* OPTIONAL FUNCTION:
* Implements glLogicOp if possible. Return GL_TRUE if the device driver
* can perform the operation, otherwise return GL_FALSE. If GL_FALSE
* is returned, the logic op will be done in software by Mesa.
*/
GLboolean cybLogicOp(GLcontext * ctx, GLenum op)
{
/* TODO: minterms etc. */
switch (op) {
case GL_CLEAR:
case GL_SET:
case GL_COPY:
case GL_COPY_INVERTED:
case GL_NOOP:
case GL_INVERT:
case GL_AND:
case GL_NAND:
case GL_OR:
case GL_NOR:
case GL_XOR:
case GL_EQUIV:
case GL_AND_REVERSE:
case GL_AND_INVERTED:
case GL_OR_REVERSE:
case GL_OR_INVERTED:
default:
break;
}
return GL_FALSE;
}
#include "cybDisplay/cybFastLines.c"
#include "cybDisplay/cybFastPixels.c"
#include "cybDisplay/cybFastPoints.c"
#include "cybDisplay/cybFastTriangles.c"
#include "cybDisplay/cybSpans.c"
#include "cybDisplay/cybPixel.c"
/**********************************************************************/
/***** amiga/Mesa Private Functions *****/
/**********************************************************************/
/*
* Initialize all the pointers in the DD struct. Do this whenever
* a new context is made current or we change buffers via setBuffer!
*/
void cybStandardDDPointers(GLcontext * ctx)
{
palMode trueColor = ((amigaMesaContext) ctx->DriverCtx)->trueColor;
DEBUGOUT(1, "cybStandardDDPointers()\n");
ctx->Driver.RendererString = cybRendererString;
ctx->Driver.UpdateState = cybStandardDDPointers;
ctx->Driver.ClearIndex = cybClearIndex;
ctx->Driver.ClearColor = cybClearColor;
ctx->Driver.Clear = cybClear;
ctx->Driver.Index = cybSetIndex;
ctx->Driver.Color = cybSetColor;
ctx->Driver.IndexMask = cybIndexMask;
ctx->Driver.ColorMask = cybColorMask;
ctx->Driver.LogicOp = cybLogicOp;
ctx->Driver.SetBuffer = cmnSetBuffer;
ctx->Driver.GetBufferSize = cmnStandardResize;
ctx->Driver.RenderStart = cmnRenderStart;
ctx->Driver.RenderFinish = cmnRenderFinish;
ctx->Driver.Dither = NULL;
ctx->Driver.Flush = NULL; /* cmnFlush; */
ctx->Driver.PointsFunc = cybChoosePointsFunction(ctx);
ctx->Driver.LineFunc = cybChooseLineFunction(ctx);
ctx->Driver.TriangleFunc = cybChooseTriangleFunction(ctx);
ctx->Driver.QuadFunc = cybChooseQuadFunction(ctx);
ctx->Driver.RectFunc = cybChooseRectFunction(ctx);
ctx->Driver.DrawPixels = cybDirectDrawPixels;
/* Pixel/span writing functions: */
ctx->Driver.WriteRGBASpan = cybWriteRGBASpan;
ctx->Driver.WriteRGBSpan = cybWriteRGBSpan;
ctx->Driver.WriteCI32Span = cybWriteCI32Span;
ctx->Driver.WriteCI8Span = cybWriteCI8Span;
ctx->Driver.WriteMonoRGBASpan = cybWriteMonoCISpan;
ctx->Driver.WriteMonoCISpan = cybWriteMonoCISpan;
ctx->Driver.WriteRGBAPixels = cybWriteRGBAPixel;
ctx->Driver.WriteCI32Pixels = cybWriteCI32Pixel;
ctx->Driver.WriteMonoRGBAPixels = cybWriteMonoCIPixel;
ctx->Driver.WriteMonoCIPixels = cybWriteMonoCIPixel;
/* Pixel/span reading functions: */
ctx->Driver.ReadRGBASpan = cybReadRGBASpan;
ctx->Driver.ReadCI32Span = IS_SHIFT(trueColor) ? cyb8ReadCI32Span :
IS_MATCH(trueColor) ? cybGReadCI32Span :
cybDReadCI32Span;
ctx->Driver.ReadRGBAPixels = cybReadRGBAPixel;
ctx->Driver.ReadCI32Pixels = IS_SHIFT(trueColor) ? cyb8ReadCI32Pixel :
IS_MATCH(trueColor) ? cybGReadCI32Pixel :
cybDReadCI32Pixel;
}
void cybFasterDDPointers(GLcontext * ctx)
{
palMode trueColor = ((amigaMesaContext) ctx->DriverCtx)->trueColor;
DEBUGOUT(1, "cybFasterDDPointers()\n");
ctx->Driver.RendererString = cybRendererStringDB;
ctx->Driver.UpdateState = cybFasterDDPointers;
ctx->Driver.ClearIndex = cybClearIndex;
ctx->Driver.ClearColor = cybClearColor;
ctx->Driver.Clear = cybClearDB;
ctx->Driver.Index = cybSetIndex;
ctx->Driver.Color = cybSetColor;
ctx->Driver.IndexMask = cybIndexMask;
ctx->Driver.ColorMask = cybColorMask;
ctx->Driver.LogicOp = cybLogicOp;
ctx->Driver.SetBuffer = cmnSetBufferDB;
ctx->Driver.GetBufferSize = cmnStandardResizeDB;
ctx->Driver.RenderStart = cmnRenderStartDB;
ctx->Driver.RenderFinish = cmnRenderFinishDB;
ctx->Driver.Dither = NULL;
ctx->Driver.Flush = cmnFlushDB;
ctx->Driver.PointsFunc = cybChoosePointsFunctionDB(ctx);
ctx->Driver.LineFunc = cybChooseLineFunctionDB(ctx);
ctx->Driver.TriangleFunc = cybChooseTriangleFunctionDB(ctx);
ctx->Driver.QuadFunc = cybChooseQuadFunctionDB(ctx);
ctx->Driver.RectFunc = cybChooseRectFunctionDB(ctx);
ctx->Driver.DrawPixels = cybDirectDrawPixelsDB;
/* Pixel/span writing functions: */
ctx->Driver.WriteRGBASpan = cybWriteRGBASpanDB;
ctx->Driver.WriteRGBSpan = cybWriteRGBSpanDB;
ctx->Driver.WriteCI32Span = cybWriteCI32SpanDB;
ctx->Driver.WriteCI8Span = cybWriteCI8SpanDB;
ctx->Driver.WriteMonoRGBASpan = cybWriteMonoCISpanDB; /* same */
ctx->Driver.WriteMonoCISpan = cybWriteMonoCISpanDB;
ctx->Driver.WriteRGBAPixels = cybWriteRGBAPixelDB;
ctx->Driver.WriteCI32Pixels = cybWriteCI32PixelDB;
ctx->Driver.WriteMonoRGBAPixels = cybWriteMonoCIPixelDB; /* same */
ctx->Driver.WriteMonoCIPixels = cybWriteMonoCIPixelDB;
/* Pixel/span reading functions: */
ctx->Driver.ReadRGBASpan = cybReadRGBASpanDB;
ctx->Driver.ReadCI32Span = IS_SHIFT(trueColor) ? cyb8ReadCI32SpanDB :
IS_MATCH(trueColor) ? cybGReadCI32SpanDB :
cybDReadCI32SpanDB;
ctx->Driver.ReadRGBAPixels = cybReadRGBAPixelDB;
ctx->Driver.ReadCI32Pixels = IS_SHIFT(trueColor) ? cyb8ReadCI32PixelDB :
IS_MATCH(trueColor) ? cybGReadCI32PixelDB :
cybDReadCI32PixelDB;
}
#undef DEBUGPRINT