Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1901 | serge | 1 | /* |
2 | * Mesa 3-D graphics library |
||
3 | * Version: 7.1 |
||
4 | * |
||
5 | * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. |
||
6 | * |
||
7 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
8 | * copy of this software and associated documentation files (the "Software"), |
||
9 | * to deal in the Software without restriction, including without limitation |
||
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
11 | * and/or sell copies of the Software, and to permit persons to whom the |
||
12 | * Software is furnished to do so, subject to the following conditions: |
||
13 | * |
||
14 | * The above copyright notice and this permission notice shall be included |
||
15 | * in all copies or substantial portions of the Software. |
||
16 | * |
||
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
18 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
20 | * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||
21 | * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
22 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
23 | */ |
||
24 | |||
25 | |||
26 | #include "main/glheader.h" |
||
27 | #include "main/imports.h" |
||
28 | #include "main/arrayobj.h" |
||
29 | #include "main/context.h" |
||
30 | #include "main/framebuffer.h" |
||
31 | #include "main/mipmap.h" |
||
32 | #include "main/queryobj.h" |
||
33 | #include "main/renderbuffer.h" |
||
34 | #include "main/shaderobj.h" |
||
35 | #include "main/texcompress.h" |
||
36 | #include "main/texformat.h" |
||
37 | #include "main/texgetimage.h" |
||
38 | #include "main/teximage.h" |
||
39 | #include "main/texobj.h" |
||
40 | #include "main/texstore.h" |
||
41 | #include "main/bufferobj.h" |
||
42 | #include "main/fbobject.h" |
||
43 | #include "main/texrender.h" |
||
44 | #include "main/syncobj.h" |
||
45 | #include "main/transformfeedback.h" |
||
46 | |||
47 | #include "program/program.h" |
||
48 | #include "tnl/tnl.h" |
||
49 | #include "swrast/swrast.h" |
||
50 | |||
51 | #include "driverfuncs.h" |
||
52 | #include "meta.h" |
||
53 | |||
54 | |||
55 | |||
56 | /** |
||
57 | * Plug in default functions for all pointers in the dd_function_table |
||
58 | * structure. |
||
59 | * Device drivers should call this function and then plug in any |
||
60 | * functions which it wants to override. |
||
61 | * Some functions (pointers) MUST be implemented by all drivers (REQUIRED). |
||
62 | * |
||
63 | * \param table the dd_function_table to initialize |
||
64 | */ |
||
65 | void |
||
66 | _mesa_init_driver_functions(struct dd_function_table *driver) |
||
67 | { |
||
68 | memset(driver, 0, sizeof(*driver)); |
||
69 | |||
70 | driver->GetString = NULL; /* REQUIRED! */ |
||
71 | driver->UpdateState = NULL; /* REQUIRED! */ |
||
72 | driver->GetBufferSize = NULL; /* REQUIRED! */ |
||
73 | driver->ResizeBuffers = _mesa_resize_framebuffer; |
||
74 | driver->Error = NULL; |
||
75 | |||
76 | driver->Finish = NULL; |
||
77 | driver->Flush = NULL; |
||
78 | |||
79 | /* framebuffer/image functions */ |
||
80 | driver->Clear = _swrast_Clear; |
||
81 | driver->Accum = _swrast_Accum; |
||
82 | driver->RasterPos = _tnl_RasterPos; |
||
83 | driver->DrawPixels = _swrast_DrawPixels; |
||
84 | driver->ReadPixels = _swrast_ReadPixels; |
||
85 | driver->CopyPixels = _swrast_CopyPixels; |
||
86 | driver->Bitmap = _swrast_Bitmap; |
||
87 | |||
88 | /* Texture functions */ |
||
89 | driver->ChooseTextureFormat = _mesa_choose_tex_format; |
||
90 | driver->TexImage1D = _mesa_store_teximage1d; |
||
91 | driver->TexImage2D = _mesa_store_teximage2d; |
||
92 | driver->TexImage3D = _mesa_store_teximage3d; |
||
93 | driver->TexSubImage1D = _mesa_store_texsubimage1d; |
||
94 | driver->TexSubImage2D = _mesa_store_texsubimage2d; |
||
95 | driver->TexSubImage3D = _mesa_store_texsubimage3d; |
||
96 | driver->GetTexImage = _mesa_get_teximage; |
||
97 | driver->CopyTexImage1D = _mesa_meta_CopyTexImage1D; |
||
98 | driver->CopyTexImage2D = _mesa_meta_CopyTexImage2D; |
||
99 | driver->CopyTexSubImage1D = _mesa_meta_CopyTexSubImage1D; |
||
100 | driver->CopyTexSubImage2D = _mesa_meta_CopyTexSubImage2D; |
||
101 | driver->CopyTexSubImage3D = _mesa_meta_CopyTexSubImage3D; |
||
102 | driver->GenerateMipmap = _mesa_meta_GenerateMipmap; |
||
103 | driver->TestProxyTexImage = _mesa_test_proxy_teximage; |
||
104 | driver->CompressedTexImage1D = _mesa_store_compressed_teximage1d; |
||
105 | driver->CompressedTexImage2D = _mesa_store_compressed_teximage2d; |
||
106 | driver->CompressedTexImage3D = _mesa_store_compressed_teximage3d; |
||
107 | driver->CompressedTexSubImage1D = _mesa_store_compressed_texsubimage1d; |
||
108 | driver->CompressedTexSubImage2D = _mesa_store_compressed_texsubimage2d; |
||
109 | driver->CompressedTexSubImage3D = _mesa_store_compressed_texsubimage3d; |
||
110 | driver->GetCompressedTexImage = _mesa_get_compressed_teximage; |
||
111 | driver->BindTexture = NULL; |
||
112 | driver->NewTextureObject = _mesa_new_texture_object; |
||
113 | driver->DeleteTexture = _mesa_delete_texture_object; |
||
114 | driver->NewTextureImage = _mesa_new_texture_image; |
||
115 | driver->FreeTexImageData = _mesa_free_texture_image_data; |
||
116 | driver->MapTexture = NULL; |
||
117 | driver->UnmapTexture = NULL; |
||
118 | driver->TextureMemCpy = memcpy; |
||
119 | driver->IsTextureResident = NULL; |
||
120 | driver->UpdateTexturePalette = NULL; |
||
121 | |||
122 | /* imaging */ |
||
123 | driver->CopyColorTable = _mesa_meta_CopyColorTable; |
||
124 | driver->CopyColorSubTable = _mesa_meta_CopyColorSubTable; |
||
125 | |||
126 | /* Vertex/fragment programs */ |
||
127 | driver->BindProgram = NULL; |
||
128 | driver->NewProgram = _mesa_new_program; |
||
129 | driver->DeleteProgram = _mesa_delete_program; |
||
130 | |||
131 | /* simple state commands */ |
||
132 | driver->AlphaFunc = NULL; |
||
133 | driver->BlendColor = NULL; |
||
134 | driver->BlendEquationSeparate = NULL; |
||
135 | driver->BlendFuncSeparate = NULL; |
||
136 | driver->ClearColor = NULL; |
||
137 | driver->ClearDepth = NULL; |
||
138 | driver->ClearStencil = NULL; |
||
139 | driver->ClipPlane = NULL; |
||
140 | driver->ColorMask = NULL; |
||
141 | driver->ColorMaterial = NULL; |
||
142 | driver->CullFace = NULL; |
||
143 | driver->DrawBuffer = NULL; |
||
144 | driver->DrawBuffers = NULL; |
||
145 | driver->FrontFace = NULL; |
||
146 | driver->DepthFunc = NULL; |
||
147 | driver->DepthMask = NULL; |
||
148 | driver->DepthRange = NULL; |
||
149 | driver->Enable = NULL; |
||
150 | driver->Fogfv = NULL; |
||
151 | driver->Hint = NULL; |
||
152 | driver->Lightfv = NULL; |
||
153 | driver->LightModelfv = NULL; |
||
154 | driver->LineStipple = NULL; |
||
155 | driver->LineWidth = NULL; |
||
156 | driver->LogicOpcode = NULL; |
||
157 | driver->PointParameterfv = NULL; |
||
158 | driver->PointSize = NULL; |
||
159 | driver->PolygonMode = NULL; |
||
160 | driver->PolygonOffset = NULL; |
||
161 | driver->PolygonStipple = NULL; |
||
162 | driver->ReadBuffer = NULL; |
||
163 | driver->RenderMode = NULL; |
||
164 | driver->Scissor = NULL; |
||
165 | driver->ShadeModel = NULL; |
||
166 | driver->StencilFuncSeparate = NULL; |
||
167 | driver->StencilOpSeparate = NULL; |
||
168 | driver->StencilMaskSeparate = NULL; |
||
169 | driver->TexGen = NULL; |
||
170 | driver->TexEnv = NULL; |
||
171 | driver->TexParameter = NULL; |
||
172 | driver->Viewport = NULL; |
||
173 | |||
174 | /* buffer objects */ |
||
175 | _mesa_init_buffer_object_functions(driver); |
||
176 | |||
177 | /* query objects */ |
||
178 | _mesa_init_query_object_functions(driver); |
||
179 | |||
180 | _mesa_init_sync_object_functions(driver); |
||
181 | |||
182 | driver->NewFramebuffer = _mesa_new_framebuffer; |
||
183 | driver->NewRenderbuffer = _mesa_new_soft_renderbuffer; |
||
184 | driver->RenderTexture = _mesa_render_texture; |
||
185 | driver->FinishRenderTexture = _mesa_finish_render_texture; |
||
186 | driver->FramebufferRenderbuffer = _mesa_framebuffer_renderbuffer; |
||
187 | |||
188 | driver->BlitFramebuffer = _swrast_BlitFramebuffer; |
||
189 | |||
190 | /* APPLE_vertex_array_object */ |
||
191 | driver->NewArrayObject = _mesa_new_array_object; |
||
192 | driver->DeleteArrayObject = _mesa_delete_array_object; |
||
193 | driver->BindArrayObject = NULL; |
||
194 | |||
195 | _mesa_init_shader_object_functions(driver); |
||
196 | |||
197 | _mesa_init_transform_feedback_functions(driver); |
||
198 | |||
199 | /* T&L stuff */ |
||
200 | driver->NeedValidate = GL_FALSE; |
||
201 | driver->ValidateTnlModule = NULL; |
||
202 | driver->CurrentExecPrimitive = 0; |
||
203 | driver->CurrentSavePrimitive = 0; |
||
204 | driver->NeedFlush = 0; |
||
205 | driver->SaveNeedFlush = 0; |
||
206 | |||
207 | driver->ProgramStringNotify = _tnl_program_string; |
||
208 | driver->FlushVertices = NULL; |
||
209 | driver->SaveFlushVertices = NULL; |
||
210 | driver->NotifySaveBegin = NULL; |
||
211 | driver->LightingSpaceChange = NULL; |
||
212 | |||
213 | /* display list */ |
||
214 | driver->NewList = NULL; |
||
215 | driver->EndList = NULL; |
||
216 | driver->BeginCallList = NULL; |
||
217 | driver->EndCallList = NULL; |
||
218 | } |
||
219 | |||
220 | |||
221 | /** |
||
222 | * Call the ctx->Driver.* state functions with current values to initialize |
||
223 | * driver state. |
||
224 | * Only the Intel drivers use this so far. |
||
225 | */ |
||
226 | void |
||
227 | _mesa_init_driver_state(struct gl_context *ctx) |
||
228 | { |
||
229 | ctx->Driver.AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef); |
||
230 | |||
231 | ctx->Driver.BlendColor(ctx, ctx->Color.BlendColor); |
||
232 | |||
233 | ctx->Driver.BlendEquationSeparate(ctx, |
||
234 | ctx->Color.BlendEquationRGB, |
||
235 | ctx->Color.BlendEquationA); |
||
236 | |||
237 | ctx->Driver.BlendFuncSeparate(ctx, |
||
238 | ctx->Color.BlendSrcRGB, |
||
239 | ctx->Color.BlendDstRGB, |
||
240 | ctx->Color.BlendSrcA, ctx->Color.BlendDstA); |
||
241 | |||
242 | if (ctx->Driver.ColorMaskIndexed) { |
||
243 | GLuint i; |
||
244 | for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) { |
||
245 | ctx->Driver.ColorMaskIndexed(ctx, i, |
||
246 | ctx->Color.ColorMask[0][RCOMP], |
||
247 | ctx->Color.ColorMask[0][GCOMP], |
||
248 | ctx->Color.ColorMask[0][BCOMP], |
||
249 | ctx->Color.ColorMask[0][ACOMP]); |
||
250 | } |
||
251 | } |
||
252 | else { |
||
253 | ctx->Driver.ColorMask(ctx, |
||
254 | ctx->Color.ColorMask[0][RCOMP], |
||
255 | ctx->Color.ColorMask[0][GCOMP], |
||
256 | ctx->Color.ColorMask[0][BCOMP], |
||
257 | ctx->Color.ColorMask[0][ACOMP]); |
||
258 | } |
||
259 | |||
260 | ctx->Driver.CullFace(ctx, ctx->Polygon.CullFaceMode); |
||
261 | ctx->Driver.DepthFunc(ctx, ctx->Depth.Func); |
||
262 | ctx->Driver.DepthMask(ctx, ctx->Depth.Mask); |
||
263 | |||
264 | ctx->Driver.Enable(ctx, GL_ALPHA_TEST, ctx->Color.AlphaEnabled); |
||
265 | ctx->Driver.Enable(ctx, GL_BLEND, ctx->Color.BlendEnabled); |
||
266 | ctx->Driver.Enable(ctx, GL_COLOR_LOGIC_OP, ctx->Color.ColorLogicOpEnabled); |
||
267 | ctx->Driver.Enable(ctx, GL_COLOR_SUM, ctx->Fog.ColorSumEnabled); |
||
268 | ctx->Driver.Enable(ctx, GL_CULL_FACE, ctx->Polygon.CullFlag); |
||
269 | ctx->Driver.Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test); |
||
270 | ctx->Driver.Enable(ctx, GL_DITHER, ctx->Color.DitherFlag); |
||
271 | ctx->Driver.Enable(ctx, GL_FOG, ctx->Fog.Enabled); |
||
272 | ctx->Driver.Enable(ctx, GL_LIGHTING, ctx->Light.Enabled); |
||
273 | ctx->Driver.Enable(ctx, GL_LINE_SMOOTH, ctx->Line.SmoothFlag); |
||
274 | ctx->Driver.Enable(ctx, GL_POLYGON_STIPPLE, ctx->Polygon.StippleFlag); |
||
275 | ctx->Driver.Enable(ctx, GL_SCISSOR_TEST, ctx->Scissor.Enabled); |
||
276 | ctx->Driver.Enable(ctx, GL_STENCIL_TEST, ctx->Stencil._Enabled); |
||
277 | ctx->Driver.Enable(ctx, GL_TEXTURE_1D, GL_FALSE); |
||
278 | ctx->Driver.Enable(ctx, GL_TEXTURE_2D, GL_FALSE); |
||
279 | ctx->Driver.Enable(ctx, GL_TEXTURE_RECTANGLE_NV, GL_FALSE); |
||
280 | ctx->Driver.Enable(ctx, GL_TEXTURE_3D, GL_FALSE); |
||
281 | ctx->Driver.Enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE); |
||
282 | |||
283 | ctx->Driver.Fogfv(ctx, GL_FOG_COLOR, ctx->Fog.Color); |
||
284 | ctx->Driver.Fogfv(ctx, GL_FOG_MODE, 0); |
||
285 | ctx->Driver.Fogfv(ctx, GL_FOG_DENSITY, &ctx->Fog.Density); |
||
286 | ctx->Driver.Fogfv(ctx, GL_FOG_START, &ctx->Fog.Start); |
||
287 | ctx->Driver.Fogfv(ctx, GL_FOG_END, &ctx->Fog.End); |
||
288 | |||
289 | ctx->Driver.FrontFace(ctx, ctx->Polygon.FrontFace); |
||
290 | |||
291 | { |
||
292 | GLfloat f = (GLfloat) ctx->Light.Model.ColorControl; |
||
293 | ctx->Driver.LightModelfv(ctx, GL_LIGHT_MODEL_COLOR_CONTROL, &f); |
||
294 | } |
||
295 | |||
296 | ctx->Driver.LineWidth(ctx, ctx->Line.Width); |
||
297 | ctx->Driver.LogicOpcode(ctx, ctx->Color.LogicOp); |
||
298 | ctx->Driver.PointSize(ctx, ctx->Point.Size); |
||
299 | ctx->Driver.PolygonStipple(ctx, (const GLubyte *) ctx->PolygonStipple); |
||
300 | ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y, |
||
301 | ctx->Scissor.Width, ctx->Scissor.Height); |
||
302 | ctx->Driver.ShadeModel(ctx, ctx->Light.ShadeModel); |
||
303 | ctx->Driver.StencilFuncSeparate(ctx, GL_FRONT, |
||
304 | ctx->Stencil.Function[0], |
||
305 | ctx->Stencil.Ref[0], |
||
306 | ctx->Stencil.ValueMask[0]); |
||
307 | ctx->Driver.StencilFuncSeparate(ctx, GL_BACK, |
||
308 | ctx->Stencil.Function[1], |
||
309 | ctx->Stencil.Ref[1], |
||
310 | ctx->Stencil.ValueMask[1]); |
||
311 | ctx->Driver.StencilMaskSeparate(ctx, GL_FRONT, ctx->Stencil.WriteMask[0]); |
||
312 | ctx->Driver.StencilMaskSeparate(ctx, GL_BACK, ctx->Stencil.WriteMask[1]); |
||
313 | ctx->Driver.StencilOpSeparate(ctx, GL_FRONT, |
||
314 | ctx->Stencil.FailFunc[0], |
||
315 | ctx->Stencil.ZFailFunc[0], |
||
316 | ctx->Stencil.ZPassFunc[0]); |
||
317 | ctx->Driver.StencilOpSeparate(ctx, GL_BACK, |
||
318 | ctx->Stencil.FailFunc[1], |
||
319 | ctx->Stencil.ZFailFunc[1], |
||
320 | ctx->Stencil.ZPassFunc[1]); |
||
321 | |||
322 | |||
323 | ctx->Driver.DrawBuffer(ctx, ctx->Color.DrawBuffer[0]); |
||
324 | }> |