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