1/************************************************************************** 2 * 3 * Copyright 2003 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28#include "i915_context.h" 29#include "main/api_exec.h" 30#include "main/framebuffer.h" 31#include "main/extensions.h" 32#include "main/imports.h" 33#include "main/macros.h" 34#include "main/version.h" 35#include "main/vtxfmt.h" 36#include "intel_chipset.h" 37#include "intel_tris.h" 38#include "tnl/t_context.h" 39#include "tnl/t_pipeline.h" 40#include "tnl/t_vertex.h" 41 42#include "swrast/swrast.h" 43#include "swrast_setup/swrast_setup.h" 44#include "tnl/tnl.h" 45#include "util/ralloc.h" 46 47#include "i915_reg.h" 48#include "i915_program.h" 49 50/*************************************** 51 * Mesa's Driver Functions 52 ***************************************/ 53 54/* Override intel default. 55 */ 56static void 57i915InvalidateState(struct gl_context * ctx) 58{ 59 GLuint new_state = ctx->NewState; 60 61 _swrast_InvalidateState(ctx, new_state); 62 _swsetup_InvalidateState(ctx, new_state); 63 _tnl_InvalidateState(ctx, new_state); 64 _tnl_invalidate_vertex_state(ctx, new_state); 65 intel_context(ctx)->NewGLState |= new_state; 66 67 if (new_state & (_NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT)) 68 _mesa_update_draw_buffer_bounds(ctx, ctx->DrawBuffer); 69 70 /* Todo: gather state values under which tracked parameters become 71 * invalidated, add callbacks for things like 72 * ProgramLocalParameters, etc. 73 */ 74 { 75 struct i915_fragment_program *p = 76 (struct i915_fragment_program *) ctx->FragmentProgram._Current; 77 if (p && p->nr_params) 78 p->params_uptodate = 0; 79 } 80 81 if (new_state & (_NEW_STENCIL | _NEW_BUFFERS | _NEW_POLYGON)) 82 i915_update_stencil(ctx); 83 if (new_state & (_NEW_LIGHT)) 84 i915_update_provoking_vertex(ctx); 85 if (new_state & (_NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)) 86 i915_update_program(ctx); 87 if (new_state & (_NEW_PROGRAM | _NEW_POINT)) 88 i915_update_sprite_point_enable(ctx); 89} 90 91 92static void 93i915InitDriverFunctions(struct dd_function_table *functions) 94{ 95 intelInitDriverFunctions(functions); 96 i915InitStateFunctions(functions); 97 i915InitFragProgFuncs(functions); 98 functions->UpdateState = i915InvalidateState; 99} 100 101/* Note: this is shared with i830. */ 102void 103intel_init_texture_formats(struct gl_context *ctx) 104{ 105 struct intel_context *intel = intel_context(ctx); 106 struct intel_screen *intel_screen = intel->intelScreen; 107 108 ctx->TextureFormatSupported[MESA_FORMAT_B8G8R8A8_UNORM] = true; 109 if (intel_screen->deviceID != PCI_CHIP_I830_M && 110 intel_screen->deviceID != PCI_CHIP_845_G) 111 ctx->TextureFormatSupported[MESA_FORMAT_B8G8R8X8_UNORM] = true; 112 if (intel->gen == 3) 113 ctx->TextureFormatSupported[MESA_FORMAT_B8G8R8A8_SRGB] = true; 114 ctx->TextureFormatSupported[MESA_FORMAT_B4G4R4A4_UNORM] = true; 115 ctx->TextureFormatSupported[MESA_FORMAT_B5G5R5A1_UNORM] = true; 116 ctx->TextureFormatSupported[MESA_FORMAT_B5G6R5_UNORM] = true; 117 ctx->TextureFormatSupported[MESA_FORMAT_L_UNORM8] = true; 118 if (intel->gen == 3) 119 ctx->TextureFormatSupported[MESA_FORMAT_A_UNORM8] = true; 120 ctx->TextureFormatSupported[MESA_FORMAT_I_UNORM8] = true; 121 ctx->TextureFormatSupported[MESA_FORMAT_L8A8_UNORM] = true; 122 123 /* Depth and stencil */ 124 if (intel->gen == 3) { 125 ctx->TextureFormatSupported[MESA_FORMAT_Z24_UNORM_S8_UINT] = true; 126 ctx->TextureFormatSupported[MESA_FORMAT_Z24_UNORM_X8_UINT] = true; 127 128 /* 129 * This was disabled in initial FBO enabling to avoid combinations 130 * of depth+stencil that wouldn't work together. We since decided 131 * that it was OK, since it's up to the app to come up with the 132 * combo that actually works, so this can probably be re-enabled. 133 */ 134 /* 135 ctx->TextureFormatSupported[MESA_FORMAT_Z_UNORM16] = true; 136 ctx->TextureFormatSupported[MESA_FORMAT_Z24] = true; 137 */ 138 } 139 140 /* ctx->Extensions.MESA_ycbcr_texture */ 141 ctx->TextureFormatSupported[MESA_FORMAT_YCBCR] = true; 142 ctx->TextureFormatSupported[MESA_FORMAT_YCBCR_REV] = true; 143 144 /* GL_3DFX_texture_compression_FXT1 */ 145 ctx->TextureFormatSupported[MESA_FORMAT_RGB_FXT1] = true; 146 ctx->TextureFormatSupported[MESA_FORMAT_RGBA_FXT1] = true; 147 148 /* GL_EXT_texture_compression_s3tc */ 149 ctx->TextureFormatSupported[MESA_FORMAT_RGB_DXT1] = true; 150 ctx->TextureFormatSupported[MESA_FORMAT_RGBA_DXT1] = true; 151 ctx->TextureFormatSupported[MESA_FORMAT_RGBA_DXT3] = true; 152 ctx->TextureFormatSupported[MESA_FORMAT_RGBA_DXT5] = true; 153} 154 155extern const struct tnl_pipeline_stage *intel_pipeline[]; 156 157bool 158i915CreateContext(int api, 159 const struct gl_config * mesaVis, 160 __DRIcontext * driContextPriv, 161 unsigned major_version, 162 unsigned minor_version, 163 uint32_t flags, 164 unsigned *error, 165 void *sharedContextPrivate) 166{ 167 struct dd_function_table functions; 168 struct i915_context *i915 = rzalloc(NULL, struct i915_context); 169 struct intel_context *intel = &i915->intel; 170 struct gl_context *ctx = &intel->ctx; 171 172 if (!i915) { 173 *error = __DRI_CTX_ERROR_NO_MEMORY; 174 return false; 175 } 176 177 i915InitVtbl(i915); 178 179 i915InitDriverFunctions(&functions); 180 181 if (!intelInitContext(intel, api, major_version, minor_version, flags, 182 mesaVis, driContextPriv, 183 sharedContextPrivate, &functions, 184 error)) { 185 ralloc_free(i915); 186 return false; 187 } 188 189 intel_init_texture_formats(ctx); 190 191 _math_matrix_ctr(&intel->ViewportMatrix); 192 193 /* Initialize swrast, tnl driver tables: */ 194 intelInitTriFuncs(ctx); 195 196 /* Install the customized pipeline: */ 197 _tnl_destroy_pipeline(ctx); 198 _tnl_install_pipeline(ctx, intel_pipeline); 199 200 if (intel->no_rast) 201 FALLBACK(intel, INTEL_FALLBACK_USER, 1); 202 203 ctx->Const.MaxTextureUnits = I915_TEX_UNITS; 204 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = I915_TEX_UNITS; 205 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = I915_TEX_UNITS; 206 ctx->Const.MaxTextureCoordUnits = I915_TEX_UNITS; 207 ctx->Const.MaxVarying = I915_TEX_UNITS; 208 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 209 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = ctx->Const.MaxVarying * 4; 210 ctx->Const.MaxCombinedTextureImageUnits = 211 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits + 212 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; 213 214 /* Advertise the full hardware capabilities. The new memory 215 * manager should cope much better with overload situations: 216 */ 217 ctx->Const.MaxTextureLevels = 12; 218 ctx->Const.Max3DTextureLevels = 9; 219 ctx->Const.MaxCubeTextureLevels = 12; 220 ctx->Const.MaxTextureRectSize = (1 << 11); 221 ctx->Const.MaxTextureUnits = I915_TEX_UNITS; 222 223 ctx->Const.MaxTextureMaxAnisotropy = 4.0; 224 225 /* GL_ARB_fragment_program limits - don't think Mesa actually 226 * validates programs against these, and in any case one ARB 227 * instruction can translate to more than one HW instruction, so 228 * we'll still have to check and fallback each time. 229 */ 230 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeTemps = I915_MAX_TEMPORARY; 231 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeAttribs = 11; /* 8 tex, 2 color, fog */ 232 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeParameters = I915_MAX_CONSTANT; 233 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeAluInstructions = I915_MAX_ALU_INSN; 234 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeTexInstructions = I915_MAX_TEX_INSN; 235 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeInstructions = (I915_MAX_ALU_INSN + 236 I915_MAX_TEX_INSN); 237 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeTexIndirections = 238 I915_MAX_TEX_INDIRECT; 239 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeAddressRegs = 0; /* I don't think we have one */ 240 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxEnvParams = 241 MIN2(ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeParameters, 242 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxEnvParams); 243 244 /* i915 stores all values in single-precision floats. Values aren't set 245 * for other program targets because software is used for those targets. 246 */ 247 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumFloat.RangeMin = 127; 248 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumFloat.RangeMax = 127; 249 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumFloat.Precision = 23; 250 ctx->Const.Program[MESA_SHADER_FRAGMENT].LowFloat = ctx->Const.Program[MESA_SHADER_FRAGMENT].HighFloat = 251 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumFloat; 252 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumInt.RangeMin = 24; 253 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumInt.RangeMax = 24; 254 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumInt.Precision = 0; 255 ctx->Const.Program[MESA_SHADER_FRAGMENT].LowInt = ctx->Const.Program[MESA_SHADER_FRAGMENT].HighInt = 256 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumInt; 257 258 ctx->FragmentProgram._MaintainTexEnvProgram = true; 259 260 /* FINISHME: Are there other options that should be enabled for software 261 * FINISHME: vertex shaders? 262 */ 263 ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].EmitNoIndirectSampler = 264 true; 265 266 struct gl_shader_compiler_options *const fs_options = 267 & ctx->Const.ShaderCompilerOptions[MESA_SHADER_FRAGMENT]; 268 fs_options->MaxIfDepth = 0; 269 fs_options->EmitNoPow = true; 270 fs_options->EmitNoMainReturn = true; 271 fs_options->EmitNoIndirectInput = true; 272 fs_options->EmitNoIndirectOutput = true; 273 fs_options->EmitNoIndirectUniform = true; 274 fs_options->EmitNoIndirectTemp = true; 275 fs_options->EmitNoIndirectSampler = true; 276 277 ctx->Const.MaxDrawBuffers = 1; 278 ctx->Const.QueryCounterBits.SamplesPassed = 0; 279 280 _tnl_init_vertices(ctx, ctx->Const.MaxArrayLockSize + 12, 281 36 * sizeof(GLfloat)); 282 283 intel->verts = TNL_CONTEXT(ctx)->clipspace.vertex_buf; 284 285 i915InitState(i915); 286 287 /* Always enable pixel fog. Vertex fog using fog coord will conflict 288 * with fog code appended onto fragment program. 289 */ 290 _tnl_allow_vertex_fog(ctx, 0); 291 _tnl_allow_pixel_fog(ctx, 1); 292 293 _mesa_override_extensions(ctx); 294 _mesa_compute_version(ctx); 295 296 _mesa_initialize_dispatch_tables(ctx); 297 _mesa_initialize_vbo_vtxfmt(ctx); 298 299 return true; 300} 301