summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/glide/fxdd.c13
-rw-r--r--src/mesa/drivers/glide/fxdrv.h1
-rw-r--r--src/mesa/drivers/glide/fxglidew.c9
-rw-r--r--src/mesa/drivers/glide/fxglidew.h14
-rw-r--r--src/mesa/drivers/glide/fxsetup.c53
-rw-r--r--src/mesa/drivers/glide/fxtexman.c2
6 files changed, 63 insertions, 29 deletions
diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c
index d7e7293b21..ca5ff94484 100644
--- a/src/mesa/drivers/glide/fxdd.c
+++ b/src/mesa/drivers/glide/fxdd.c
@@ -56,7 +56,7 @@
#include "fxdrv.h"
#include "enums.h"
#include "extensions.h"
-
+#include "pb.h"
/* These lookup table are used to extract RGB values in [0,255] from
* 16-bit pixel values.
@@ -847,6 +847,16 @@ static void fxDDUpdateDDPointers(GLcontext *ctx)
}
}
+static void fxDDReducedPrimitiveChange(GLcontext *ctx, GLenum prim)
+{
+ if (ctx->Polygon.CullFlag) {
+ if (ctx->PB->primitive != GL_POLYGON) { /* Lines or Points */
+ FX_grCullMode(GR_CULL_DISABLE);
+ FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE;
+ }
+ }
+}
+
void fxSetupDDPointers(GLcontext *ctx)
{
if (MESA_VERBOSE&VERBOSE_DRIVER) {
@@ -910,6 +920,7 @@ void fxSetupDDPointers(GLcontext *ctx)
ctx->Driver.CullFace=fxDDCullFace;
ctx->Driver.ShadeModel=fxDDShadeModel;
ctx->Driver.Enable=fxDDEnable;
+ ctx->Driver.ReducedPrimitiveChange=fxDDReducedPrimitiveChange;
ctx->Driver.RegisterVB=fxDDRegisterVB;
ctx->Driver.UnregisterVB=fxDDUnregisterVB;
diff --git a/src/mesa/drivers/glide/fxdrv.h b/src/mesa/drivers/glide/fxdrv.h
index 4a9110393c..208801e87b 100644
--- a/src/mesa/drivers/glide/fxdrv.h
+++ b/src/mesa/drivers/glide/fxdrv.h
@@ -443,6 +443,7 @@ struct tfxMesaContext {
GrColor_t clearC;
GrAlpha_t clearA;
GLuint constColor;
+ GrCullMode_t cullMode;
tfxUnitsState unitsState;
tfxUnitsState restoreUnitsState; /* saved during multipass */
diff --git a/src/mesa/drivers/glide/fxglidew.c b/src/mesa/drivers/glide/fxglidew.c
index d27c155842..9084cc5fea 100644
--- a/src/mesa/drivers/glide/fxglidew.c
+++ b/src/mesa/drivers/glide/fxglidew.c
@@ -55,7 +55,7 @@
#include <stdlib.h>
#include <string.h>
-static FxI32 FX_grGetInteger_NoLock(FxU32 pname)
+FxI32 FX_grGetInteger_NoLock(FxU32 pname)
{
#if !defined(FX_GLIDE3)
switch (pname)
@@ -244,6 +244,13 @@ void FX_grAADrawPoint(GrVertex *a)
END_CLIP_LOOP();
}
+void FX_grDrawPolygonVertexList(int n, GrVertex *verts)
+{
+ BEGIN_CLIP_LOOP();
+ grDrawVertexArrayContiguous(GR_POLYGON, n, verts, sizeof(GrVertex));
+ END_CLIP_LOOP();
+}
+
#if FX_USE_PARGB
void FX_setupGrVertexLayout(void)
{
diff --git a/src/mesa/drivers/glide/fxglidew.h b/src/mesa/drivers/glide/fxglidew.h
index 749540ce0e..614949f71f 100644
--- a/src/mesa/drivers/glide/fxglidew.h
+++ b/src/mesa/drivers/glide/fxglidew.h
@@ -77,6 +77,7 @@
* Genral warper functions for Glide2/Glide3:
*/
extern FxI32 FX_grGetInteger(FxU32 pname);
+extern FxI32 FX_grGetInteger_NoLock(FxU32 pname);
/*
* Glide2 emulation on Glide3:
@@ -532,6 +533,17 @@ extern FX_GrContext_t FX_grSstWinOpen( FxU32 hWnd,
END_CLIP_LOOP(); \
} while (0)
+#if defined(FX_GLIDE3)
+extern void FX_grDrawPolygonVertexList(int n, GrVertex *v);
+#else
+#define FX_grDrawPolygonVertexList(n, v) \
+ do { \
+ BEGIN_CLIP_LOOP(); \
+ grDrawPolygonVertexList(n, v); \
+ END_CLIP_LOOP(); \
+ } while (0)
+#endif
+
#define FX_grDitherMode(m) \
do { \
BEGIN_BOARD_LOCK(); \
@@ -758,6 +770,7 @@ extern FxU32 FX_grTexTextureMemRequired(FxU32 evenOdd, GrTexInfo *info);
grGlideGetState(s); \
END_BOARD_LOCK(); \
} while (0)
+#define FX_grGlideGetState_NoLock(s) grGlideGetState(s);
#define FX_grDRIBufferSwap(i) \
do { \
@@ -781,6 +794,7 @@ extern FxU32 FX_grTexTextureMemRequired(FxU32 evenOdd, GrTexInfo *info);
grGlideSetState(s); \
END_BOARD_LOCK(); \
} while (0)
+#define FX_grGlideSetState_NoLock(s) grGlideSetState(s);
#define FX_grDepthBufferMode(m) \
do { \
diff --git a/src/mesa/drivers/glide/fxsetup.c b/src/mesa/drivers/glide/fxsetup.c
index a8ca52d62c..6ebd037fd5 100644
--- a/src/mesa/drivers/glide/fxsetup.c
+++ b/src/mesa/drivers/glide/fxsetup.c
@@ -407,10 +407,11 @@ static void fxSelectSingleTMUSrc_NoLock(fxMesaContext fxMesa, GLint tmu,
GR_COMBINE_FACTOR_ONE_MINUS_LOD_FRACTION,
FXFALSE,FXFALSE);
- FX_grTexCombine_NoLock(GR_TMU1,
- GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
- GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
- FXFALSE,FXFALSE);
+ if (fxMesa->haveTwoTMUs)
+ FX_grTexCombine_NoLock(GR_TMU1,
+ GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
+ GR_COMBINE_FUNCTION_LOCAL,GR_COMBINE_FACTOR_NONE,
+ FXFALSE,FXFALSE);
fxMesa->tmuSrc=FX_TMU_SPLIT;
}
else {
@@ -1561,28 +1562,28 @@ void fxDDFrontFace(GLcontext *ctx, GLenum mode)
static void fxSetupCull(GLcontext *ctx)
{
- if(ctx->Polygon.CullFlag) {
- switch(ctx->Polygon.CullFaceMode) {
- case GL_BACK:
- if(ctx->Polygon.FrontFace==GL_CCW)
- FX_grCullMode(GR_CULL_NEGATIVE);
- else
- FX_grCullMode(GR_CULL_POSITIVE);
- break;
- case GL_FRONT:
- if(ctx->Polygon.FrontFace==GL_CCW)
- FX_grCullMode(GR_CULL_POSITIVE);
- else
- FX_grCullMode(GR_CULL_NEGATIVE);
- break;
- case GL_FRONT_AND_BACK:
- FX_grCullMode(GR_CULL_DISABLE);
- break;
- default:
- break;
- }
- } else
- FX_grCullMode(GR_CULL_DISABLE);
+ if (ctx->Polygon.CullFlag) {
+ switch (ctx->Polygon.CullFaceMode) {
+ case GL_BACK:
+ if (ctx->Polygon.FrontFace==GL_CCW)
+ FX_CONTEXT(ctx)->cullMode=GR_CULL_NEGATIVE;
+ else
+ FX_CONTEXT(ctx)->cullMode=GR_CULL_POSITIVE;
+ break;
+ case GL_FRONT:
+ if(ctx->Polygon.FrontFace==GL_CCW)
+ FX_CONTEXT(ctx)->cullMode=GR_CULL_POSITIVE;
+ else
+ FX_CONTEXT(ctx)->cullMode=GR_CULL_NEGATIVE;
+ break;
+ case GL_FRONT_AND_BACK:
+ FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE;
+ break;
+ default:
+ break;
+ }
+ } else FX_CONTEXT(ctx)->cullMode=GR_CULL_DISABLE;
+ FX_grCullMode(FX_CONTEXT(ctx)->cullMode);
}
diff --git a/src/mesa/drivers/glide/fxtexman.c b/src/mesa/drivers/glide/fxtexman.c
index 280a2c574c..87f309adc3 100644
--- a/src/mesa/drivers/glide/fxtexman.c
+++ b/src/mesa/drivers/glide/fxtexman.c
@@ -722,7 +722,7 @@ fxTMRestoreTextures_NoLock(fxMesaContext ctx) {
if (ctx->glCtx->Texture.Unit[i].Current==tObj) {
/* Force the texture onto the board, as it could be in use */
where=ti->whichTMU;
- ti->whichTMU=FX_TMU_NONE;
+ fxTMMoveOutTM_NoLock(ctx, tObj);
fxTMMoveInTM_NoLock(ctx, tObj, where);
break;
}