Fix several conformance problems. Hack solution to line stipple problem.
This commit is contained in:
@@ -1028,10 +1028,40 @@ static void fxDDUpdateDDPointers(GLcontext *ctx, GLuint new_state)
|
||||
|
||||
static void fxDDRenderPrimitive( GLcontext *ctx, GLenum mode )
|
||||
{
|
||||
(void) ctx; (void) mode;
|
||||
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
|
||||
|
||||
if (!fxMesa->is_in_hardware) {
|
||||
_swsetup_RenderPrimitive( ctx, mode );
|
||||
}
|
||||
else {
|
||||
fxMesa->render_prim = mode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void fxDDRenderStart( GLcontext *ctx )
|
||||
{
|
||||
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
|
||||
|
||||
if (!fxMesa->is_in_hardware) {
|
||||
_swsetup_RenderStart( ctx );
|
||||
}
|
||||
else if (fxMesa->new_state) {
|
||||
fxSetupFXUnits( ctx );
|
||||
}
|
||||
}
|
||||
|
||||
static void fxDDRenderFinish( GLcontext *ctx )
|
||||
{
|
||||
fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx;
|
||||
|
||||
if (!fxMesa->is_in_hardware) {
|
||||
_swsetup_RenderFinish( ctx );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void fxSetupDDPointers(GLcontext *ctx)
|
||||
{
|
||||
if (MESA_VERBOSE&VERBOSE_DRIVER) {
|
||||
@@ -1062,8 +1092,8 @@ void fxSetupDDPointers(GLcontext *ctx)
|
||||
ctx->Driver.Finish=fxDDFinish;
|
||||
ctx->Driver.Flush=NULL;
|
||||
|
||||
ctx->Driver.RenderStart=fxSetupFXUnits;
|
||||
ctx->Driver.RenderFinish=_swrast_flush;
|
||||
ctx->Driver.RenderStart=fxDDRenderStart;
|
||||
ctx->Driver.RenderFinish=fxDDRenderFinish;
|
||||
ctx->Driver.ResetLineStipple=_swrast_ResetLineStipple;
|
||||
ctx->Driver.RenderPrimitive=fxDDRenderPrimitive;
|
||||
|
||||
|
@@ -424,6 +424,7 @@ struct tfxMesaContext {
|
||||
GLuint render_index;
|
||||
GLuint passes, multipass;
|
||||
GLuint is_in_hardware;
|
||||
GLenum render_prim;
|
||||
|
||||
/* Current rasterization functions
|
||||
*/
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: xm_dd.c,v 1.9 2001/01/08 04:06:20 keithw Exp $ */
|
||||
/* $Id: xm_dd.c,v 1.10 2001/01/16 05:29:43 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -922,9 +922,16 @@ void xmesa_init_pointers( GLcontext *ctx )
|
||||
ctx->Driver.Flush = flush;
|
||||
ctx->Driver.Finish = finish;
|
||||
|
||||
ctx->Driver.RenderStart = 0;
|
||||
ctx->Driver.RenderPrimitive = _swsetup_RenderPrimNoop;
|
||||
ctx->Driver.RenderFinish = _swrast_flush;
|
||||
ctx->Driver.RenderStart = _swsetup_RenderStart;
|
||||
ctx->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices;
|
||||
ctx->Driver.RenderPrimitive = _swsetup_RenderPrimitive;
|
||||
ctx->Driver.PointsFunc = _swsetup_Points;
|
||||
ctx->Driver.LineFunc = _swsetup_Line;
|
||||
ctx->Driver.TriangleFunc = _swsetup_Triangle;
|
||||
ctx->Driver.QuadFunc = _swsetup_Quad;
|
||||
ctx->Driver.ResetLineStipple = _swrast_ResetLineStipple;
|
||||
ctx->Driver.RenderFinish = _swsetup_RenderFinish;
|
||||
|
||||
|
||||
ctx->Driver.SetDrawBuffer = set_draw_buffer;
|
||||
ctx->Driver.SetReadBuffer = set_read_buffer;
|
||||
@@ -936,11 +943,5 @@ void xmesa_init_pointers( GLcontext *ctx )
|
||||
ctx->Driver.ColorMask = color_mask;
|
||||
ctx->Driver.Enable = enable;
|
||||
|
||||
ctx->Driver.PointsFunc = _swsetup_Points;
|
||||
ctx->Driver.LineFunc = _swsetup_Line;
|
||||
ctx->Driver.TriangleFunc = _swsetup_Triangle;
|
||||
ctx->Driver.QuadFunc = _swsetup_Quad;
|
||||
ctx->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices;
|
||||
ctx->Driver.ResetLineStipple = _swrast_ResetLineStipple;
|
||||
(void) DitherValues; /* silenced unused var warning */
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: ss_context.c,v 1.7 2001/01/08 04:09:41 keithw Exp $ */
|
||||
/* $Id: ss_context.c,v 1.8 2001/01/16 05:29:43 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -27,64 +27,17 @@
|
||||
* Keith Whitwell <keithw@valinux.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "glheader.h"
|
||||
#include "mem.h"
|
||||
|
||||
|
||||
#include "ss_context.h"
|
||||
#include "ss_triangle.h"
|
||||
#include "ss_vb.h"
|
||||
|
||||
#include "swrast_setup.h"
|
||||
|
||||
#include "tnl/t_context.h"
|
||||
|
||||
/* Stub for swsetup->Triangle to select a true triangle function
|
||||
* after a state change.
|
||||
*/
|
||||
static void
|
||||
_swsetup_validate_quad( GLcontext *ctx, GLuint v0, GLuint v1,
|
||||
GLuint v2, GLuint v3 )
|
||||
{
|
||||
_swsetup_choose_trifuncs( ctx );
|
||||
SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3 );
|
||||
}
|
||||
|
||||
static void
|
||||
_swsetup_validate_triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2 )
|
||||
{
|
||||
_swsetup_choose_trifuncs( ctx );
|
||||
SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 );
|
||||
}
|
||||
|
||||
static void
|
||||
_swsetup_validate_line( GLcontext *ctx, GLuint v0, GLuint v1 )
|
||||
{
|
||||
_swsetup_choose_trifuncs( ctx );
|
||||
SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1 );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
_swsetup_validate_points( GLcontext *ctx, GLuint first, GLuint last )
|
||||
{
|
||||
_swsetup_choose_trifuncs( ctx );
|
||||
SWSETUP_CONTEXT(ctx)->Points( ctx, first, last );
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
_swsetup_validate_buildprojverts( GLcontext *ctx,
|
||||
GLuint start, GLuint end, GLuint new_inputs )
|
||||
{
|
||||
_swsetup_choose_rastersetup_func( ctx );
|
||||
SWSETUP_CONTEXT(ctx)->BuildProjVerts( ctx, start, end, new_inputs );
|
||||
}
|
||||
|
||||
|
||||
#define _SWSETUP_NEW_VERTS (_NEW_RENDERMODE| \
|
||||
_NEW_LIGHT| \
|
||||
_NEW_TEXTURE| \
|
||||
_NEW_COLOR| \
|
||||
_NEW_FOG| \
|
||||
@@ -93,38 +46,13 @@ _swsetup_validate_buildprojverts( GLcontext *ctx,
|
||||
#define _SWSETUP_NEW_RENDERINDEX (_NEW_POLYGON|_NEW_LIGHT)
|
||||
|
||||
|
||||
#if 0
|
||||
/* TODO: sleep/wakeup mechanism
|
||||
*/
|
||||
static void
|
||||
_swsetup_sleep( GLcontext *ctx, GLuint new_state )
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
_swsetup_invalidate_state( GLcontext *ctx, GLuint new_state )
|
||||
{
|
||||
SScontext *swsetup = SWSETUP_CONTEXT(ctx);
|
||||
|
||||
swsetup->NewState |= new_state;
|
||||
|
||||
if (new_state & _SWSETUP_NEW_RENDERINDEX) {
|
||||
swsetup->Triangle = _swsetup_validate_triangle;
|
||||
swsetup->Line = _swsetup_validate_line;
|
||||
swsetup->Points = _swsetup_validate_points;
|
||||
swsetup->Quad = _swsetup_validate_quad;
|
||||
}
|
||||
|
||||
if (new_state & _SWSETUP_NEW_VERTS) {
|
||||
swsetup->BuildProjVerts = _swsetup_validate_buildprojverts;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Dispatch from these fixed entrypoints to the state-dependent
|
||||
* functions:
|
||||
* functions.
|
||||
*
|
||||
* The design of swsetup suggests that we could really program
|
||||
* ctx->Driver.TriangleFunc directly from _swsetup_RenderStart, and
|
||||
* avoid this second level of indirection. However, this is more
|
||||
* convient for fallback cases in hardware rasterization drivers.
|
||||
*/
|
||||
void
|
||||
_swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1,
|
||||
@@ -146,7 +74,6 @@ _swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1 )
|
||||
SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1 );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_swsetup_Points( GLcontext *ctx, GLuint first, GLuint last )
|
||||
{
|
||||
@@ -160,12 +87,6 @@ _swsetup_BuildProjectedVertices( GLcontext *ctx, GLuint start, GLuint end,
|
||||
SWSETUP_CONTEXT(ctx)->BuildProjVerts( ctx, start, end, new_inputs );
|
||||
}
|
||||
|
||||
void
|
||||
_swsetup_InvalidateState( GLcontext *ctx, GLuint new_state )
|
||||
{
|
||||
SWSETUP_CONTEXT(ctx)->InvalidateState( ctx, new_state );
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_swsetup_CreateContext( GLcontext *ctx )
|
||||
@@ -185,13 +106,6 @@ _swsetup_CreateContext( GLcontext *ctx )
|
||||
ctx->swsetup_context = swsetup;
|
||||
|
||||
swsetup->NewState = ~0;
|
||||
swsetup->InvalidateState = _swsetup_invalidate_state;
|
||||
swsetup->Quad = _swsetup_validate_quad;
|
||||
swsetup->Triangle = _swsetup_validate_triangle;
|
||||
swsetup->Line = _swsetup_validate_line;
|
||||
swsetup->Points = _swsetup_validate_points;
|
||||
swsetup->BuildProjVerts = _swsetup_validate_buildprojverts;
|
||||
|
||||
_swsetup_vb_init( ctx );
|
||||
_swsetup_trifuncs_init( ctx );
|
||||
|
||||
@@ -210,10 +124,38 @@ _swsetup_DestroyContext( GLcontext *ctx )
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_swsetup_RenderPrimitive( GLcontext *ctx, GLenum mode )
|
||||
{
|
||||
SWSETUP_CONTEXT(ctx)->render_prim = mode;
|
||||
}
|
||||
|
||||
void
|
||||
_swsetup_RenderPrimNoop( GLcontext *ctx, GLenum mode )
|
||||
_swsetup_RenderStart( GLcontext *ctx )
|
||||
{
|
||||
(void) ctx;
|
||||
(void) mode;
|
||||
SScontext *swsetup = SWSETUP_CONTEXT(ctx);
|
||||
GLuint new_state = swsetup->NewState;
|
||||
|
||||
if (new_state & _SWSETUP_NEW_RENDERINDEX) {
|
||||
_swsetup_choose_trifuncs( ctx );
|
||||
}
|
||||
|
||||
if (new_state & _SWSETUP_NEW_VERTS) {
|
||||
_swsetup_choose_rastersetup_func( ctx );
|
||||
}
|
||||
|
||||
swsetup->NewState = 0;
|
||||
}
|
||||
|
||||
void
|
||||
_swsetup_RenderFinish( GLcontext *ctx )
|
||||
{
|
||||
_swrast_flush( ctx );
|
||||
}
|
||||
|
||||
void
|
||||
_swsetup_InvalidateState( GLcontext *ctx, GLuint new_state )
|
||||
{
|
||||
SWSETUP_CONTEXT(ctx)->NewState |= new_state;
|
||||
}
|
||||
|
||||
|
@@ -54,6 +54,7 @@ typedef struct {
|
||||
void (*Points)( GLcontext *ctx, GLuint first, GLuint last );
|
||||
|
||||
SWvertex *verts;
|
||||
GLenum render_prim;
|
||||
|
||||
} SScontext;
|
||||
|
||||
|
@@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
#include "colormac.h"
|
||||
#include "macros.h"
|
||||
#include "mtypes.h"
|
||||
|
||||
@@ -44,6 +45,100 @@ static triangle_func tri_tab[SS_MAX_TRIFUNC];
|
||||
static quad_func quad_tab[SS_MAX_TRIFUNC];
|
||||
|
||||
|
||||
static void _swsetup_render_line_tri( GLcontext *ctx,
|
||||
GLuint e0, GLuint e1, GLuint e2 )
|
||||
{
|
||||
SScontext *swsetup = SWSETUP_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
|
||||
GLubyte *ef = VB->EdgeFlag;
|
||||
SWvertex *verts = swsetup->verts;
|
||||
SWvertex *v0 = &verts[e0];
|
||||
SWvertex *v1 = &verts[e1];
|
||||
SWvertex *v2 = &verts[e2];
|
||||
GLchan c[2][4];
|
||||
GLchan s[2][4];
|
||||
GLuint i[2];
|
||||
|
||||
if (ctx->_TriangleCaps & DD_FLATSHADE) {
|
||||
COPY_CHAN4(c[0], v0->color);
|
||||
COPY_CHAN4(c[1], v1->color);
|
||||
COPY_CHAN4(s[0], v0->specular);
|
||||
COPY_CHAN4(s[1], v1->specular);
|
||||
i[0] = v0->index;
|
||||
i[1] = v1->index;
|
||||
|
||||
COPY_CHAN4(v0->color, v2->color);
|
||||
COPY_CHAN4(v1->color, v2->color);
|
||||
COPY_CHAN4(v0->specular, v2->specular);
|
||||
COPY_CHAN4(v1->specular, v2->specular);
|
||||
v0->index = v2->index;
|
||||
v1->index = v2->index;
|
||||
}
|
||||
|
||||
if (swsetup->render_prim == GL_POLYGON) {
|
||||
if (ef[e2]) _swrast_Line( ctx, v2, v0 );
|
||||
if (ef[e0]) _swrast_Line( ctx, v0, v1 );
|
||||
if (ef[e1]) _swrast_Line( ctx, v1, v2 );
|
||||
} else {
|
||||
if (ef[e0]) _swrast_Line( ctx, v0, v1 );
|
||||
if (ef[e1]) _swrast_Line( ctx, v1, v2 );
|
||||
if (ef[e2]) _swrast_Line( ctx, v2, v0 );
|
||||
}
|
||||
|
||||
if (ctx->_TriangleCaps & DD_FLATSHADE) {
|
||||
COPY_CHAN4(v0->color, c[0]);
|
||||
COPY_CHAN4(v1->color, c[1]);
|
||||
COPY_CHAN4(v0->specular, s[0]);
|
||||
COPY_CHAN4(v1->specular, s[1]);
|
||||
v0->index = i[0];
|
||||
v1->index = i[1];
|
||||
}
|
||||
}
|
||||
|
||||
static void _swsetup_render_point_tri( GLcontext *ctx,
|
||||
GLuint e0, GLuint e1, GLuint e2 )
|
||||
{
|
||||
SScontext *swsetup = SWSETUP_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
|
||||
GLubyte *ef = VB->EdgeFlag;
|
||||
SWvertex *verts = swsetup->verts;
|
||||
SWvertex *v0 = &verts[e0];
|
||||
SWvertex *v1 = &verts[e1];
|
||||
SWvertex *v2 = &verts[e2];
|
||||
GLchan c[2][4];
|
||||
GLchan s[2][4];
|
||||
GLuint i[2];
|
||||
|
||||
if (ctx->_TriangleCaps & DD_FLATSHADE) {
|
||||
COPY_CHAN4(c[0], v0->color);
|
||||
COPY_CHAN4(c[1], v1->color);
|
||||
COPY_CHAN4(s[0], v0->specular);
|
||||
COPY_CHAN4(s[1], v1->specular);
|
||||
i[0] = v0->index;
|
||||
i[1] = v1->index;
|
||||
|
||||
COPY_CHAN4(v0->color, v2->color);
|
||||
COPY_CHAN4(v1->color, v2->color);
|
||||
COPY_CHAN4(v0->specular, v2->specular);
|
||||
COPY_CHAN4(v1->specular, v2->specular);
|
||||
v0->index = v2->index;
|
||||
v1->index = v2->index;
|
||||
}
|
||||
|
||||
if (ef[e0]) _swrast_Point( ctx, v0 );
|
||||
if (ef[e1]) _swrast_Point( ctx, v1 );
|
||||
if (ef[e2]) _swrast_Point( ctx, v2 );
|
||||
|
||||
if (ctx->_TriangleCaps & DD_FLATSHADE) {
|
||||
COPY_CHAN4(v0->color, c[0]);
|
||||
COPY_CHAN4(v1->color, c[1]);
|
||||
COPY_CHAN4(v0->specular, s[0]);
|
||||
COPY_CHAN4(v1->specular, s[1]);
|
||||
v0->index = i[0];
|
||||
v1->index = i[1];
|
||||
}
|
||||
}
|
||||
|
||||
#define SS_COLOR(a,b) COPY_4UBV(a,b)
|
||||
#define SS_SPEC(a,b) COPY_4UBV(a,b)
|
||||
#define SS_IND(a,b) (a = b)
|
||||
|
@@ -99,25 +99,19 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
|
||||
}
|
||||
|
||||
if (mode == GL_POINT) {
|
||||
GLubyte *ef = VB->EdgeFlag;
|
||||
if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetPoint) {
|
||||
v[0]->win[2] += offset;
|
||||
v[1]->win[2] += offset;
|
||||
v[2]->win[2] += offset;
|
||||
}
|
||||
if (ef[e0]) _swrast_Point( ctx, v[0] );
|
||||
if (ef[e1]) _swrast_Point( ctx, v[1] );
|
||||
if (ef[e2]) _swrast_Point( ctx, v[2] );
|
||||
_swsetup_render_point_tri( ctx, e0, e1, e2 );
|
||||
} else if (mode == GL_LINE) {
|
||||
GLubyte *ef = VB->EdgeFlag;
|
||||
if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetLine) {
|
||||
v[0]->win[2] += offset;
|
||||
v[1]->win[2] += offset;
|
||||
v[2]->win[2] += offset;
|
||||
}
|
||||
if (ef[e0]) _swrast_Line( ctx, v[0], v[1] );
|
||||
if (ef[e1]) _swrast_Line( ctx, v[1], v[2] );
|
||||
if (ef[e2]) _swrast_Line( ctx, v[2], v[0] );
|
||||
_swsetup_render_line_tri( ctx, e0, e1, e2 );
|
||||
} else {
|
||||
if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetFill) {
|
||||
v[0]->win[2] += offset;
|
||||
|
@@ -25,7 +25,9 @@
|
||||
* Keith Whitwell <keithw@valinux.com>
|
||||
*/
|
||||
|
||||
/* Public interface to the swrast_setup module.
|
||||
/* Public interface to the swrast_setup module. This module provides
|
||||
* an implementation of the driver interface to t_vb_render.c, and uses
|
||||
* the software rasterizer (swrast) to perform actual rasterization.
|
||||
*/
|
||||
|
||||
#ifndef SWRAST_SETUP_H
|
||||
@@ -59,6 +61,12 @@ extern void
|
||||
_swsetup_Points( GLcontext *ctx, GLuint first, GLuint last );
|
||||
|
||||
extern void
|
||||
_swsetup_RenderPrimNoop( GLcontext *ctx, GLenum mode );
|
||||
_swsetup_RenderPrimitive( GLcontext *ctx, GLenum mode );
|
||||
|
||||
extern void
|
||||
_swsetup_RenderStart( GLcontext *ctx );
|
||||
|
||||
extern void
|
||||
_swsetup_RenderFinish( GLcontext *ctx );
|
||||
|
||||
#endif
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: t_vb_render.c,v 1.9 2001/01/08 21:56:00 keithw Exp $ */
|
||||
/* $Id: t_vb_render.c,v 1.10 2001/01/16 05:29:43 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -577,7 +577,6 @@ static GLboolean run_render( GLcontext *ctx,
|
||||
* that window coordinates are guarenteed not to change before
|
||||
* rendering.
|
||||
*/
|
||||
if (ctx->Driver.RenderStart)
|
||||
ctx->Driver.RenderStart( ctx );
|
||||
|
||||
if (VB->ClipOrMask) {
|
||||
@@ -611,9 +610,8 @@ static GLboolean run_render( GLcontext *ctx,
|
||||
} while (ctx->Driver.MultipassFunc &&
|
||||
ctx->Driver.MultipassFunc( ctx, ++pass ));
|
||||
|
||||
if (ctx->Driver.RenderFinish)
|
||||
ctx->Driver.RenderFinish( ctx );
|
||||
|
||||
ctx->Driver.RenderFinish( ctx );
|
||||
return GL_FALSE; /* finished the pipe */
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: t_vb_rendertmp.h,v 1.6 2001/01/14 06:14:21 keithw Exp $ */
|
||||
/* $Id: t_vb_rendertmp.h,v 1.7 2001/01/16 05:29:43 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
Reference in New Issue
Block a user