1848b8605Smrg/*
2848b8605Smrg * Mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the "Software"),
8848b8605Smrg * to deal in the Software without restriction, including without limitation
9848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
11848b8605Smrg * Software is furnished to do so, subject to the following conditions:
12848b8605Smrg *
13848b8605Smrg * The above copyright notice and this permission notice shall be included
14848b8605Smrg * in all copies or substantial portions of the Software.
15848b8605Smrg *
16848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE.
23848b8605Smrg */
24848b8605Smrg
25848b8605Smrg
26848b8605Smrg#include "main/glheader.h"
27848b8605Smrg#include "main/imports.h"
28848b8605Smrg#include "main/accum.h"
29848b8605Smrg#include "main/arrayobj.h"
30848b8605Smrg#include "main/context.h"
31b8e80941Smrg#include "main/draw.h"
32848b8605Smrg#include "main/formatquery.h"
33848b8605Smrg#include "main/framebuffer.h"
34848b8605Smrg#include "main/mipmap.h"
35848b8605Smrg#include "main/queryobj.h"
36848b8605Smrg#include "main/readpix.h"
37b8e80941Smrg#include "main/rastpos.h"
38848b8605Smrg#include "main/renderbuffer.h"
39848b8605Smrg#include "main/shaderobj.h"
40848b8605Smrg#include "main/texcompress.h"
41848b8605Smrg#include "main/texformat.h"
42848b8605Smrg#include "main/texgetimage.h"
43848b8605Smrg#include "main/teximage.h"
44848b8605Smrg#include "main/texobj.h"
45848b8605Smrg#include "main/texstorage.h"
46848b8605Smrg#include "main/texstore.h"
47848b8605Smrg#include "main/bufferobj.h"
48848b8605Smrg#include "main/fbobject.h"
49848b8605Smrg#include "main/samplerobj.h"
50848b8605Smrg#include "main/syncobj.h"
51b8e80941Smrg#include "main/barrier.h"
52848b8605Smrg#include "main/transformfeedback.h"
53b8e80941Smrg#include "main/externalobjects.h"
54848b8605Smrg
55848b8605Smrg#include "program/program.h"
56848b8605Smrg#include "tnl/tnl.h"
57848b8605Smrg#include "swrast/swrast.h"
58848b8605Smrg#include "swrast/s_renderbuffer.h"
59848b8605Smrg
60848b8605Smrg#include "driverfuncs.h"
61848b8605Smrg#include "meta.h"
62848b8605Smrg
63848b8605Smrg
64848b8605Smrg
65848b8605Smrg/**
66848b8605Smrg * Plug in default functions for all pointers in the dd_function_table
67848b8605Smrg * structure.
68848b8605Smrg * Device drivers should call this function and then plug in any
69848b8605Smrg * functions which it wants to override.
70848b8605Smrg * Some functions (pointers) MUST be implemented by all drivers (REQUIRED).
71848b8605Smrg *
72848b8605Smrg * \param table the dd_function_table to initialize
73848b8605Smrg */
74848b8605Smrgvoid
75848b8605Smrg_mesa_init_driver_functions(struct dd_function_table *driver)
76848b8605Smrg{
77848b8605Smrg   memset(driver, 0, sizeof(*driver));
78848b8605Smrg
79848b8605Smrg   driver->GetString = NULL;  /* REQUIRED! */
80848b8605Smrg   driver->UpdateState = NULL;  /* REQUIRED! */
81848b8605Smrg
82848b8605Smrg   driver->Finish = NULL;
83848b8605Smrg   driver->Flush = NULL;
84848b8605Smrg
85848b8605Smrg   /* framebuffer/image functions */
86848b8605Smrg   driver->Clear = _swrast_Clear;
87b8e80941Smrg   driver->RasterPos = _mesa_RasterPos;
88848b8605Smrg   driver->DrawPixels = _swrast_DrawPixels;
89848b8605Smrg   driver->ReadPixels = _mesa_readpixels;
90848b8605Smrg   driver->CopyPixels = _swrast_CopyPixels;
91848b8605Smrg   driver->Bitmap = _swrast_Bitmap;
92848b8605Smrg
93848b8605Smrg   /* Texture functions */
94848b8605Smrg   driver->ChooseTextureFormat = _mesa_choose_tex_format;
95b8e80941Smrg   driver->QueryInternalFormat = _mesa_query_internal_format_default;
96848b8605Smrg   driver->TexImage = _mesa_store_teximage;
97848b8605Smrg   driver->TexSubImage = _mesa_store_texsubimage;
98b8e80941Smrg   driver->GetTexSubImage = _mesa_meta_GetTexSubImage;
99848b8605Smrg   driver->ClearTexSubImage = _mesa_meta_ClearTexSubImage;
100848b8605Smrg   driver->CopyTexSubImage = _mesa_meta_CopyTexSubImage;
101848b8605Smrg   driver->GenerateMipmap = _mesa_meta_GenerateMipmap;
102848b8605Smrg   driver->TestProxyTexImage = _mesa_test_proxy_teximage;
103848b8605Smrg   driver->CompressedTexImage = _mesa_store_compressed_teximage;
104848b8605Smrg   driver->CompressedTexSubImage = _mesa_store_compressed_texsubimage;
105848b8605Smrg   driver->BindTexture = NULL;
106848b8605Smrg   driver->NewTextureObject = _mesa_new_texture_object;
107848b8605Smrg   driver->DeleteTexture = _mesa_delete_texture_object;
108848b8605Smrg   driver->NewTextureImage = _swrast_new_texture_image;
109848b8605Smrg   driver->DeleteTextureImage = _swrast_delete_texture_image;
110848b8605Smrg   driver->AllocTextureImageBuffer = _swrast_alloc_texture_image_buffer;
111848b8605Smrg   driver->FreeTextureImageBuffer = _swrast_free_texture_image_buffer;
112848b8605Smrg   driver->MapTextureImage = _swrast_map_teximage;
113848b8605Smrg   driver->UnmapTextureImage = _swrast_unmap_teximage;
114848b8605Smrg   driver->DrawTex = _mesa_meta_DrawTex;
115848b8605Smrg
116848b8605Smrg   /* Vertex/fragment programs */
117848b8605Smrg   driver->NewProgram = _mesa_new_program;
118848b8605Smrg   driver->DeleteProgram = _mesa_delete_program;
119848b8605Smrg
120b8e80941Smrg   /* ATI_fragment_shader */
121b8e80941Smrg   driver->NewATIfs = NULL;
122b8e80941Smrg
123b8e80941Smrg   /* Draw functions */
124b8e80941Smrg   driver->Draw = NULL;
125b8e80941Smrg   driver->DrawIndirect = _mesa_draw_indirect;
126b8e80941Smrg
127848b8605Smrg   /* simple state commands */
128848b8605Smrg   driver->AlphaFunc = NULL;
129848b8605Smrg   driver->BlendColor = NULL;
130848b8605Smrg   driver->BlendEquationSeparate = NULL;
131848b8605Smrg   driver->BlendFuncSeparate = NULL;
132848b8605Smrg   driver->ClipPlane = NULL;
133848b8605Smrg   driver->ColorMask = NULL;
134848b8605Smrg   driver->ColorMaterial = NULL;
135848b8605Smrg   driver->CullFace = NULL;
136848b8605Smrg   driver->DrawBuffer = NULL;
137848b8605Smrg   driver->FrontFace = NULL;
138848b8605Smrg   driver->DepthFunc = NULL;
139848b8605Smrg   driver->DepthMask = NULL;
140848b8605Smrg   driver->DepthRange = NULL;
141848b8605Smrg   driver->Enable = NULL;
142848b8605Smrg   driver->Fogfv = NULL;
143848b8605Smrg   driver->Lightfv = NULL;
144848b8605Smrg   driver->LightModelfv = NULL;
145848b8605Smrg   driver->LineStipple = NULL;
146848b8605Smrg   driver->LineWidth = NULL;
147848b8605Smrg   driver->LogicOpcode = NULL;
148848b8605Smrg   driver->PointParameterfv = NULL;
149848b8605Smrg   driver->PointSize = NULL;
150848b8605Smrg   driver->PolygonMode = NULL;
151848b8605Smrg   driver->PolygonOffset = NULL;
152848b8605Smrg   driver->PolygonStipple = NULL;
153848b8605Smrg   driver->ReadBuffer = NULL;
154848b8605Smrg   driver->RenderMode = NULL;
155848b8605Smrg   driver->Scissor = NULL;
156848b8605Smrg   driver->ShadeModel = NULL;
157848b8605Smrg   driver->StencilFuncSeparate = NULL;
158848b8605Smrg   driver->StencilOpSeparate = NULL;
159848b8605Smrg   driver->StencilMaskSeparate = NULL;
160848b8605Smrg   driver->TexGen = NULL;
161848b8605Smrg   driver->TexEnv = NULL;
162848b8605Smrg   driver->TexParameter = NULL;
163848b8605Smrg   driver->Viewport = NULL;
164848b8605Smrg
165848b8605Smrg   /* buffer objects */
166848b8605Smrg   _mesa_init_buffer_object_functions(driver);
167848b8605Smrg
168848b8605Smrg   /* query objects */
169848b8605Smrg   _mesa_init_query_object_functions(driver);
170848b8605Smrg
171848b8605Smrg   _mesa_init_sync_object_functions(driver);
172848b8605Smrg
173b8e80941Smrg   /* memory objects */
174b8e80941Smrg   _mesa_init_memory_object_functions(driver);
175b8e80941Smrg
176848b8605Smrg   driver->NewFramebuffer = _mesa_new_framebuffer;
177848b8605Smrg   driver->NewRenderbuffer = _swrast_new_soft_renderbuffer;
178848b8605Smrg   driver->MapRenderbuffer = _swrast_map_soft_renderbuffer;
179848b8605Smrg   driver->UnmapRenderbuffer = _swrast_unmap_soft_renderbuffer;
180848b8605Smrg   driver->RenderTexture = _swrast_render_texture;
181848b8605Smrg   driver->FinishRenderTexture = _swrast_finish_render_texture;
182b8e80941Smrg   driver->FramebufferRenderbuffer = _mesa_FramebufferRenderbuffer_sw;
183848b8605Smrg   driver->ValidateFramebuffer = _mesa_validate_framebuffer;
184848b8605Smrg
185848b8605Smrg   driver->BlitFramebuffer = _swrast_BlitFramebuffer;
186848b8605Smrg   driver->DiscardFramebuffer = NULL;
187848b8605Smrg
188b8e80941Smrg   _mesa_init_barrier_functions(driver);
189848b8605Smrg   _mesa_init_shader_object_functions(driver);
190848b8605Smrg   _mesa_init_transform_feedback_functions(driver);
191848b8605Smrg   _mesa_init_sampler_object_functions(driver);
192848b8605Smrg
193848b8605Smrg   /* T&L stuff */
194848b8605Smrg   driver->CurrentExecPrimitive = 0;
195848b8605Smrg   driver->CurrentSavePrimitive = 0;
196848b8605Smrg   driver->NeedFlush = 0;
197848b8605Smrg   driver->SaveNeedFlush = 0;
198848b8605Smrg
199848b8605Smrg   driver->ProgramStringNotify = _tnl_program_string;
200848b8605Smrg   driver->LightingSpaceChange = NULL;
201848b8605Smrg
202848b8605Smrg   /* GL_ARB_texture_storage */
203b8e80941Smrg   driver->AllocTextureStorage = _mesa_AllocTextureStorage_sw;
204848b8605Smrg
205848b8605Smrg   /* GL_ARB_texture_view */
206848b8605Smrg   driver->TextureView = NULL;
207848b8605Smrg
208848b8605Smrg   /* GL_ARB_texture_multisample */
209848b8605Smrg   driver->GetSamplePosition = NULL;
210b8e80941Smrg
211b8e80941Smrg   /* Multithreading */
212b8e80941Smrg   driver->SetBackgroundContext = NULL;
213848b8605Smrg}
214848b8605Smrg
215848b8605Smrg
216848b8605Smrg/**
217848b8605Smrg * Call the ctx->Driver.* state functions with current values to initialize
218848b8605Smrg * driver state.
219848b8605Smrg * Only the Intel drivers use this so far.
220848b8605Smrg */
221848b8605Smrgvoid
222848b8605Smrg_mesa_init_driver_state(struct gl_context *ctx)
223848b8605Smrg{
224848b8605Smrg   ctx->Driver.AlphaFunc(ctx, ctx->Color.AlphaFunc, ctx->Color.AlphaRef);
225848b8605Smrg
226848b8605Smrg   ctx->Driver.BlendColor(ctx, ctx->Color.BlendColor);
227848b8605Smrg
228848b8605Smrg   ctx->Driver.BlendEquationSeparate(ctx,
229848b8605Smrg                                     ctx->Color.Blend[0].EquationRGB,
230848b8605Smrg                                     ctx->Color.Blend[0].EquationA);
231848b8605Smrg
232848b8605Smrg   ctx->Driver.BlendFuncSeparate(ctx,
233848b8605Smrg                                 ctx->Color.Blend[0].SrcRGB,
234848b8605Smrg                                 ctx->Color.Blend[0].DstRGB,
235848b8605Smrg                                 ctx->Color.Blend[0].SrcA,
236848b8605Smrg                                 ctx->Color.Blend[0].DstA);
237848b8605Smrg
238b8e80941Smrg   ctx->Driver.ColorMask(ctx,
239b8e80941Smrg                         GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 0),
240b8e80941Smrg                         GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 1),
241b8e80941Smrg                         GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 2),
242b8e80941Smrg                         GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 3));
243848b8605Smrg
244848b8605Smrg   ctx->Driver.CullFace(ctx, ctx->Polygon.CullFaceMode);
245848b8605Smrg   ctx->Driver.DepthFunc(ctx, ctx->Depth.Func);
246848b8605Smrg   ctx->Driver.DepthMask(ctx, ctx->Depth.Mask);
247848b8605Smrg
248848b8605Smrg   ctx->Driver.Enable(ctx, GL_ALPHA_TEST, ctx->Color.AlphaEnabled);
249848b8605Smrg   ctx->Driver.Enable(ctx, GL_BLEND, ctx->Color.BlendEnabled);
250848b8605Smrg   ctx->Driver.Enable(ctx, GL_COLOR_LOGIC_OP, ctx->Color.ColorLogicOpEnabled);
251848b8605Smrg   ctx->Driver.Enable(ctx, GL_COLOR_SUM, ctx->Fog.ColorSumEnabled);
252848b8605Smrg   ctx->Driver.Enable(ctx, GL_CULL_FACE, ctx->Polygon.CullFlag);
253848b8605Smrg   ctx->Driver.Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);
254848b8605Smrg   ctx->Driver.Enable(ctx, GL_DITHER, ctx->Color.DitherFlag);
255848b8605Smrg   ctx->Driver.Enable(ctx, GL_FOG, ctx->Fog.Enabled);
256848b8605Smrg   ctx->Driver.Enable(ctx, GL_LIGHTING, ctx->Light.Enabled);
257848b8605Smrg   ctx->Driver.Enable(ctx, GL_LINE_SMOOTH, ctx->Line.SmoothFlag);
258848b8605Smrg   ctx->Driver.Enable(ctx, GL_POLYGON_STIPPLE, ctx->Polygon.StippleFlag);
259848b8605Smrg   ctx->Driver.Enable(ctx, GL_SCISSOR_TEST, ctx->Scissor.EnableFlags);
260b8e80941Smrg   ctx->Driver.Enable(ctx, GL_STENCIL_TEST, ctx->Stencil.Enabled);
261848b8605Smrg   ctx->Driver.Enable(ctx, GL_TEXTURE_1D, GL_FALSE);
262848b8605Smrg   ctx->Driver.Enable(ctx, GL_TEXTURE_2D, GL_FALSE);
263848b8605Smrg   ctx->Driver.Enable(ctx, GL_TEXTURE_RECTANGLE_NV, GL_FALSE);
264848b8605Smrg   ctx->Driver.Enable(ctx, GL_TEXTURE_3D, GL_FALSE);
265848b8605Smrg   ctx->Driver.Enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE);
266848b8605Smrg
267848b8605Smrg   ctx->Driver.Fogfv(ctx, GL_FOG_COLOR, ctx->Fog.Color);
268848b8605Smrg   {
269848b8605Smrg      GLfloat mode = (GLfloat) ctx->Fog.Mode;
270848b8605Smrg      ctx->Driver.Fogfv(ctx, GL_FOG_MODE, &mode);
271848b8605Smrg   }
272848b8605Smrg   ctx->Driver.Fogfv(ctx, GL_FOG_DENSITY, &ctx->Fog.Density);
273848b8605Smrg   ctx->Driver.Fogfv(ctx, GL_FOG_START, &ctx->Fog.Start);
274848b8605Smrg   ctx->Driver.Fogfv(ctx, GL_FOG_END, &ctx->Fog.End);
275848b8605Smrg
276848b8605Smrg   ctx->Driver.FrontFace(ctx, ctx->Polygon.FrontFace);
277848b8605Smrg
278848b8605Smrg   {
279848b8605Smrg      GLfloat f = (GLfloat) ctx->Light.Model.ColorControl;
280848b8605Smrg      ctx->Driver.LightModelfv(ctx, GL_LIGHT_MODEL_COLOR_CONTROL, &f);
281848b8605Smrg   }
282848b8605Smrg
283848b8605Smrg   ctx->Driver.LineWidth(ctx, ctx->Line.Width);
284b8e80941Smrg   ctx->Driver.LogicOpcode(ctx, ctx->Color._LogicOp);
285848b8605Smrg   ctx->Driver.PointSize(ctx, ctx->Point.Size);
286848b8605Smrg   ctx->Driver.PolygonStipple(ctx, (const GLubyte *) ctx->PolygonStipple);
287848b8605Smrg   ctx->Driver.Scissor(ctx);
288848b8605Smrg   ctx->Driver.ShadeModel(ctx, ctx->Light.ShadeModel);
289848b8605Smrg   ctx->Driver.StencilFuncSeparate(ctx, GL_FRONT,
290848b8605Smrg                                   ctx->Stencil.Function[0],
291848b8605Smrg                                   ctx->Stencil.Ref[0],
292848b8605Smrg                                   ctx->Stencil.ValueMask[0]);
293848b8605Smrg   ctx->Driver.StencilFuncSeparate(ctx, GL_BACK,
294848b8605Smrg                                   ctx->Stencil.Function[1],
295848b8605Smrg                                   ctx->Stencil.Ref[1],
296848b8605Smrg                                   ctx->Stencil.ValueMask[1]);
297848b8605Smrg   ctx->Driver.StencilMaskSeparate(ctx, GL_FRONT, ctx->Stencil.WriteMask[0]);
298848b8605Smrg   ctx->Driver.StencilMaskSeparate(ctx, GL_BACK, ctx->Stencil.WriteMask[1]);
299848b8605Smrg   ctx->Driver.StencilOpSeparate(ctx, GL_FRONT,
300848b8605Smrg                                 ctx->Stencil.FailFunc[0],
301848b8605Smrg                                 ctx->Stencil.ZFailFunc[0],
302848b8605Smrg                                 ctx->Stencil.ZPassFunc[0]);
303848b8605Smrg   ctx->Driver.StencilOpSeparate(ctx, GL_BACK,
304848b8605Smrg                                 ctx->Stencil.FailFunc[1],
305848b8605Smrg                                 ctx->Stencil.ZFailFunc[1],
306848b8605Smrg                                 ctx->Stencil.ZPassFunc[1]);
307848b8605Smrg
308848b8605Smrg
309b8e80941Smrg   ctx->Driver.DrawBuffer(ctx);
310848b8605Smrg}
311