ss_context.c revision 5c1e7fa6ee72f4403d9ec9d12830dd689b966e71
1/* $Id: ss_context.c,v 1.9 2001/01/29 20:47:39 keithw Exp $ */
2
3/*
4 * Mesa 3-D graphics library
5 * Version:  3.5
6 *
7 * Copyright (C) 1999  Brian Paul   All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * Authors:
27 *    Keith Whitwell <keithw@valinux.com>
28 */
29
30#include "glheader.h"
31#include "mem.h"
32#include "ss_context.h"
33#include "ss_triangle.h"
34#include "ss_vb.h"
35#include "ss_interp.h"
36#include "swrast_setup.h"
37#include "tnl/t_context.h"
38
39
40#define _SWSETUP_NEW_VERTS (_NEW_RENDERMODE|	\
41                            _NEW_LIGHT|         \
42			    _NEW_TEXTURE|	\
43			    _NEW_COLOR|		\
44			    _NEW_FOG|		\
45			    _NEW_POINT)
46
47#define _SWSETUP_NEW_RENDERINDEX (_NEW_POLYGON|_NEW_LIGHT)
48
49
50/* Dispatch from these fixed entrypoints to the state-dependent
51 * functions.
52 *
53 * The design of swsetup suggests that we could really program
54 * ctx->Driver.TriangleFunc directly from _swsetup_RenderStart, and
55 * avoid this second level of indirection.  However, this is more
56 * convient for fallback cases in hardware rasterization drivers.
57 */
58void
59_swsetup_Quad( GLcontext *ctx, GLuint v0, GLuint v1,
60	       GLuint v2, GLuint v3 )
61{
62   SWSETUP_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3 );
63}
64
65void
66_swsetup_Triangle( GLcontext *ctx, GLuint v0, GLuint v1,
67		   GLuint v2 )
68{
69   SWSETUP_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 );
70}
71
72void
73_swsetup_Line( GLcontext *ctx, GLuint v0, GLuint v1 )
74{
75   SWSETUP_CONTEXT(ctx)->Line( ctx, v0, v1 );
76}
77
78void
79_swsetup_Points( GLcontext *ctx, GLuint first, GLuint last )
80{
81   SWSETUP_CONTEXT(ctx)->Points( ctx, first, last );
82}
83
84void
85_swsetup_BuildProjectedVertices( GLcontext *ctx, GLuint start, GLuint end,
86				 GLuint new_inputs )
87{
88   SWSETUP_CONTEXT(ctx)->BuildProjVerts( ctx, start, end, new_inputs );
89}
90
91
92GLboolean
93_swsetup_CreateContext( GLcontext *ctx )
94{
95   TNLcontext *tnl = TNL_CONTEXT(ctx);
96   SScontext *swsetup = (SScontext *)CALLOC(sizeof(SScontext));
97
98   if (!swsetup)
99      return GL_FALSE;
100
101   swsetup->verts = ALIGN_MALLOC( sizeof(SWvertex) * tnl->vb.Size, 32);
102   if (!swsetup->verts) {
103      FREE(swsetup);
104      return GL_FALSE;
105   }
106
107   ctx->swsetup_context = swsetup;
108
109   swsetup->NewState = ~0;
110   _swsetup_vb_init( ctx );
111   _swsetup_interp_init( ctx );
112   _swsetup_trifuncs_init( ctx );
113
114   return GL_TRUE;
115}
116
117void
118_swsetup_DestroyContext( GLcontext *ctx )
119{
120   if (SWSETUP_CONTEXT(ctx)) {
121      if (SWSETUP_CONTEXT(ctx)->verts)
122	 ALIGN_FREE(SWSETUP_CONTEXT(ctx)->verts);
123
124      FREE(SWSETUP_CONTEXT(ctx));
125      ctx->swsetup_context = 0;
126   }
127}
128
129void
130_swsetup_RenderPrimitive( GLcontext *ctx, GLenum mode )
131{
132   SWSETUP_CONTEXT(ctx)->render_prim = mode;
133}
134
135void
136_swsetup_RenderStart( GLcontext *ctx )
137{
138   SScontext *swsetup = SWSETUP_CONTEXT(ctx);
139   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
140   GLuint new_state = swsetup->NewState;
141
142   if (new_state & _SWSETUP_NEW_RENDERINDEX) {
143      _swsetup_choose_trifuncs( ctx );
144   }
145
146   if (new_state & _SWSETUP_NEW_VERTS) {
147      _swsetup_choose_rastersetup_func( ctx );
148   }
149
150   swsetup->NewState = 0;
151
152   if (VB->ClipMask && VB->importable_data)
153      VB->import_data( ctx,
154		       VB->importable_data,
155		       VEC_NOT_WRITEABLE|VEC_BAD_STRIDE);
156}
157
158void
159_swsetup_RenderFinish( GLcontext *ctx )
160{
161   _swrast_flush( ctx );
162}
163
164void
165_swsetup_InvalidateState( GLcontext *ctx, GLuint new_state )
166{
167   SScontext *swsetup = SWSETUP_CONTEXT(ctx);
168   swsetup->NewState |= new_state;
169
170   if (new_state & _SWSETUP_NEW_INTERP) {
171      swsetup->RenderInterp = _swsetup_validate_interp;
172      swsetup->RenderCopyPV = _swsetup_validate_copypv;
173   }
174}
175
176void
177_swsetup_RenderInterp( GLcontext *ctx, GLfloat t,
178		       GLuint dst, GLuint out, GLuint in,
179		       GLboolean force_boundary )
180{
181   SWSETUP_CONTEXT(ctx)->RenderInterp( ctx, t, dst, out, in, force_boundary );
182}
183
184void
185_swsetup_RenderCopyPV( GLcontext *ctx, GLuint dst, GLuint src )
186{
187   SWSETUP_CONTEXT(ctx)->RenderCopyPV( ctx, dst, src );
188}
189
190