i915_screen.c revision abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4f
1aa59a937ccf41609081d3f9a4973df5478979785Brian/**************************************************************************
2aa59a937ccf41609081d3f9a4973df5478979785Brian *
3aa59a937ccf41609081d3f9a4973df5478979785Brian * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4aa59a937ccf41609081d3f9a4973df5478979785Brian * All Rights Reserved.
5aa59a937ccf41609081d3f9a4973df5478979785Brian *
6aa59a937ccf41609081d3f9a4973df5478979785Brian * Permission is hereby granted, free of charge, to any person obtaining a
7aa59a937ccf41609081d3f9a4973df5478979785Brian * copy of this software and associated documentation files (the
8aa59a937ccf41609081d3f9a4973df5478979785Brian * "Software"), to deal in the Software without restriction, including
9aa59a937ccf41609081d3f9a4973df5478979785Brian * without limitation the rights to use, copy, modify, merge, publish,
10aa59a937ccf41609081d3f9a4973df5478979785Brian * distribute, sub license, and/or sell copies of the Software, and to
11aa59a937ccf41609081d3f9a4973df5478979785Brian * permit persons to whom the Software is furnished to do so, subject to
12aa59a937ccf41609081d3f9a4973df5478979785Brian * the following conditions:
13aa59a937ccf41609081d3f9a4973df5478979785Brian *
14aa59a937ccf41609081d3f9a4973df5478979785Brian * The above copyright notice and this permission notice (including the
15aa59a937ccf41609081d3f9a4973df5478979785Brian * next paragraph) shall be included in all copies or substantial portions
16aa59a937ccf41609081d3f9a4973df5478979785Brian * of the Software.
17aa59a937ccf41609081d3f9a4973df5478979785Brian *
18aa59a937ccf41609081d3f9a4973df5478979785Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19aa59a937ccf41609081d3f9a4973df5478979785Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20aa59a937ccf41609081d3f9a4973df5478979785Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21aa59a937ccf41609081d3f9a4973df5478979785Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22aa59a937ccf41609081d3f9a4973df5478979785Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23aa59a937ccf41609081d3f9a4973df5478979785Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24aa59a937ccf41609081d3f9a4973df5478979785Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25aa59a937ccf41609081d3f9a4973df5478979785Brian *
26aa59a937ccf41609081d3f9a4973df5478979785Brian **************************************************************************/
27aa59a937ccf41609081d3f9a4973df5478979785Brian
28aa59a937ccf41609081d3f9a4973df5478979785Brian
2928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
30d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz#include "util/u_memory.h"
315b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include "util/u_string.h"
32aa59a937ccf41609081d3f9a4973df5478979785Brian
33aa59a937ccf41609081d3f9a4973df5478979785Brian#include "i915_reg.h"
34abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz#include "i915_debug.h"
35f81b7a6285455e838adb061dcca90036c9f99522José Fonseca#include "i915_context.h"
36aa59a937ccf41609081d3f9a4973df5478979785Brian#include "i915_screen.h"
37287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_surface.h"
38287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_resource.h"
39bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz#include "i915_winsys.h"
40d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
41d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
42d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz/*
43d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz * Probe functions
44d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz */
45aa59a937ccf41609081d3f9a4973df5478979785Brian
46aa59a937ccf41609081d3f9a4973df5478979785Brian
47aa59a937ccf41609081d3f9a4973df5478979785Brianstatic const char *
481bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_get_vendor(struct pipe_screen *screen)
49aa59a937ccf41609081d3f9a4973df5478979785Brian{
5021a949365d1de2f1fea6cb87c6f389e30156566fJosé Fonseca   return "VMware, Inc.";
51aa59a937ccf41609081d3f9a4973df5478979785Brian}
52aa59a937ccf41609081d3f9a4973df5478979785Brian
53aa59a937ccf41609081d3f9a4973df5478979785Brianstatic const char *
541bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_get_name(struct pipe_screen *screen)
55aa59a937ccf41609081d3f9a4973df5478979785Brian{
56aa59a937ccf41609081d3f9a4973df5478979785Brian   static char buffer[128];
57aa59a937ccf41609081d3f9a4973df5478979785Brian   const char *chipset;
58aa59a937ccf41609081d3f9a4973df5478979785Brian
59835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantz   switch (i915_screen(screen)->iws->pci_id) {
60aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_G:
61aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "915G";
62aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
63aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_GM:
64aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "915GM";
65aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
66aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_G:
67aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "945G";
68aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
69aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GM:
70aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "945GM";
71aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
72aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GME:
73aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "945GME";
74aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
75aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_G33_G:
76aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "G33";
77aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
78aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q35_G:
79aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "Q35";
80aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
81aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q33_G:
82aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "Q33";
83aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
84aa59a937ccf41609081d3f9a4973df5478979785Brian   default:
85aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "unknown";
86aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
87aa59a937ccf41609081d3f9a4973df5478979785Brian   }
88aa59a937ccf41609081d3f9a4973df5478979785Brian
895b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca   util_snprintf(buffer, sizeof(buffer), "i915 (chipset: %s)", chipset);
90aa59a937ccf41609081d3f9a4973df5478979785Brian   return buffer;
91aa59a937ccf41609081d3f9a4973df5478979785Brian}
92aa59a937ccf41609081d3f9a4973df5478979785Brian
9317188e4d5a3707c134fc97976863f0d8e2f1f5abBrianstatic int
94e1238b5cad3845c029f60d92c08e810274517d33José Fonsecai915_get_param(struct pipe_screen *screen, enum pipe_cap param)
9517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian{
9617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   switch (param) {
9717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
9817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 8;
9998e2f6c38bede8373fbf51981ccf6b513ac3695cBrian Paul   case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
10098e2f6c38bede8373fbf51981ccf6b513ac3695cBrian Paul      return 0;
10198e2f6c38bede8373fbf51981ccf6b513ac3695cBrian Paul   case PIPE_CAP_MAX_COMBINED_SAMPLERS:
10298e2f6c38bede8373fbf51981ccf6b513ac3695cBrian Paul      return 8;
10317188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_NPOT_TEXTURES:
10417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 1;
10517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_TWO_SIDED_STENCIL:
10617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 1;
10717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_GLSL:
10817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
10917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_ANISOTROPIC_FILTER:
11017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
11117188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_POINT_SPRITE:
11217188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
11317188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_RENDER_TARGETS:
11417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 1;
11517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_OCCLUSION_QUERY:
11617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
117cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich   case PIPE_CAP_TIMER_QUERY:
118cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich      return 0;
11917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_TEXTURE_SHADOW_MAP:
12017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 1;
12117188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
122e0d4f3202e213ae790a272eba7e96a40f68a6822Brian Paul      return I915_MAX_TEXTURE_2D_LEVELS;
12317188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
124e0d4f3202e213ae790a272eba7e96a40f68a6822Brian Paul      return I915_MAX_TEXTURE_3D_LEVELS;
12517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
126e0d4f3202e213ae790a272eba7e96a40f68a6822Brian Paul      return I915_MAX_TEXTURE_2D_LEVELS;
1276c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
1286c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
1296c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri      return 1;
1306c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
1316c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
1326c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri      return 0;
1334bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger   case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
1344bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      /* disable for now */
1354bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      return 0;
13617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   default:
13717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
13817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   }
13917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian}
14017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
14117188e4d5a3707c134fc97976863f0d8e2f1f5abBrianstatic float
142e1238b5cad3845c029f60d92c08e810274517d33José Fonsecai915_get_paramf(struct pipe_screen *screen, enum pipe_cap param)
14317188e4d5a3707c134fc97976863f0d8e2f1f5abBrian{
14417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   switch (param) {
14517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_LINE_WIDTH:
14617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      /* fall-through */
14717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_LINE_WIDTH_AA:
14817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 7.5;
14917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
15017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_POINT_WIDTH:
15117188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      /* fall-through */
15217188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_POINT_WIDTH_AA:
15317188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 255.0;
15417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
15517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
15617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 4.0;
15717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
15817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
15917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 16.0;
16017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
16117188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   default:
16217188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
16317188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   }
16417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian}
16517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
166364f8cad0f8f02fd39d9c51ea0774d349121b58dBrianstatic boolean
1671bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_is_format_supported(struct pipe_screen *screen,
168bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger                         enum pipe_format format,
1691bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz                         enum pipe_texture_target target,
170bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger                         unsigned sample_count,
171bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger                         unsigned tex_usage,
1721bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz                         unsigned geom_flags)
173364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian{
174364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   static const enum pipe_format tex_supported[] = {
175b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B8G8R8A8_UNORM,
176b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      PIPE_FORMAT_B8G8R8X8_UNORM,
177b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      PIPE_FORMAT_R8G8B8A8_UNORM,
178b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz#if 0
179b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      PIPE_FORMAT_R8G8B8X8_UNORM,
180b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz#endif
181b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B5G6R5_UNORM,
18254f94a790e4488445347abcff9a636a9c440d7f9Brian Paul      PIPE_FORMAT_L8_UNORM,
18354f94a790e4488445347abcff9a636a9c440d7f9Brian Paul      PIPE_FORMAT_A8_UNORM,
18454f94a790e4488445347abcff9a636a9c440d7f9Brian Paul      PIPE_FORMAT_I8_UNORM,
185b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_L8A8_UNORM,
186b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_UYVY,
187b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_YUYV,
1884bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      /* XXX why not?
1894bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z16_UNORM, */
1904bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z24X8_UNORM,
1916fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger      PIPE_FORMAT_Z24_UNORM_S8_USCALED,
192364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      PIPE_FORMAT_NONE  /* list terminator */
193364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   };
194bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   static const enum pipe_format render_supported[] = {
195b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B8G8R8A8_UNORM,
196b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B5G6R5_UNORM,
197bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      PIPE_FORMAT_NONE  /* list terminator */
198bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   };
199bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   static const enum pipe_format depth_supported[] = {
2004bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      /* XXX why not?
2014bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z16_UNORM, */
2024bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z24X8_UNORM,
2036fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger      PIPE_FORMAT_Z24_UNORM_S8_USCALED,
204364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      PIPE_FORMAT_NONE  /* list terminator */
205364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   };
206364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   const enum pipe_format *list;
207364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   uint i;
208364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
209bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   if (sample_count > 1)
210bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      return FALSE;
211bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger
212bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   if(tex_usage & PIPE_BIND_DEPTH_STENCIL)
213bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      list = depth_supported;
214bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   else if (tex_usage & PIPE_BIND_RENDER_TARGET)
215bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      list = render_supported;
2168aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   else
2178aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca      list = tex_supported;
218364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
219364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   for (i = 0; list[i] != PIPE_FORMAT_NONE; i++) {
220364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      if (list[i] == format)
221364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian         return TRUE;
222364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   }
223364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
224364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   return FALSE;
225364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian}
226364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
227d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
228d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz/*
229d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz * Fence functions
230d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz */
231d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
232d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
233d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzstatic void
234d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzi915_fence_reference(struct pipe_screen *screen,
235d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     struct pipe_fence_handle **ptr,
236d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     struct pipe_fence_handle *fence)
237d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz{
238d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
239d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
240d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->iws->fence_reference(is->iws, ptr, fence);
241d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz}
242d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
243d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzstatic int
244d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzi915_fence_signalled(struct pipe_screen *screen,
245d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     struct pipe_fence_handle *fence,
246d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     unsigned flags)
247d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz{
248d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
249d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
250d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   return is->iws->fence_signalled(is->iws, fence);
251d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz}
252d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
253d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzstatic int
254d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzi915_fence_finish(struct pipe_screen *screen,
255d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                  struct pipe_fence_handle *fence,
256d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                  unsigned flags)
257d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz{
258d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
259d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
260d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   return is->iws->fence_finish(is->iws, fence);
261d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz}
262d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
263d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
264d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz/*
265d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz * Generic functions
266d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz */
267d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
268d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
269aa59a937ccf41609081d3f9a4973df5478979785Brianstatic void
2701bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_destroy_screen(struct pipe_screen *screen)
271aa59a937ccf41609081d3f9a4973df5478979785Brian{
272d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
2739dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
274d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   if (is->iws)
275d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz      is->iws->destroy(is->iws);
2769dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
277d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   FREE(is);
278aa59a937ccf41609081d3f9a4973df5478979785Brian}
279aa59a937ccf41609081d3f9a4973df5478979785Brian
280aa59a937ccf41609081d3f9a4973df5478979785Brian/**
281aa59a937ccf41609081d3f9a4973df5478979785Brian * Create a new i915_screen object
282aa59a937ccf41609081d3f9a4973df5478979785Brian */
283aa59a937ccf41609081d3f9a4973df5478979785Brianstruct pipe_screen *
284835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantzi915_screen_create(struct i915_winsys *iws)
285aa59a937ccf41609081d3f9a4973df5478979785Brian{
2861bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   struct i915_screen *is = CALLOC_STRUCT(i915_screen);
287aa59a937ccf41609081d3f9a4973df5478979785Brian
2881bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   if (!is)
289aa59a937ccf41609081d3f9a4973df5478979785Brian      return NULL;
290aa59a937ccf41609081d3f9a4973df5478979785Brian
291835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantz   switch (iws->pci_id) {
292aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_G:
293aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_GM:
2941bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz      is->is_i945 = FALSE;
295aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
296aa59a937ccf41609081d3f9a4973df5478979785Brian
297aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_G:
298aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GM:
299aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GME:
300aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_G33_G:
301aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q33_G:
302aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q35_G:
3031bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz      is->is_i945 = TRUE;
304aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
305aa59a937ccf41609081d3f9a4973df5478979785Brian
306aa59a937ccf41609081d3f9a4973df5478979785Brian   default:
307baab98a637d526871fb77ec6f313012f49c0e998José Fonseca      debug_printf("%s: unknown pci id 0x%x, cannot create screen\n",
308835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantz                   __FUNCTION__, iws->pci_id);
309520b6abdecdaba856e5ca04938e18eb83b33dfaaVinson Lee      FREE(is);
310aa59a937ccf41609081d3f9a4973df5478979785Brian      return NULL;
311aa59a937ccf41609081d3f9a4973df5478979785Brian   }
312aa59a937ccf41609081d3f9a4973df5478979785Brian
313d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->iws = iws;
314aa59a937ccf41609081d3f9a4973df5478979785Brian
315d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.winsys = NULL;
316aa59a937ccf41609081d3f9a4973df5478979785Brian
3171bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.destroy = i915_destroy_screen;
318aa59a937ccf41609081d3f9a4973df5478979785Brian
3191bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_name = i915_get_name;
3201bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_vendor = i915_get_vendor;
3211bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_param = i915_get_param;
3221bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_paramf = i915_get_paramf;
3231bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.is_format_supported = i915_is_format_supported;
324aa59a937ccf41609081d3f9a4973df5478979785Brian
3257f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell   is->base.context_create = i915_create_context;
3267f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell
327d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.fence_reference = i915_fence_reference;
328d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.fence_signalled = i915_fence_signalled;
329d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.fence_finish = i915_fence_finish;
330d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
331287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   i915_init_screen_resource_functions(is);
332287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   i915_init_screen_surface_functions(is);
333aa59a937ccf41609081d3f9a4973df5478979785Brian
334abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz   i915_debug_init(is);
335abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz
3361bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   return &is->base;
337aa59a937ccf41609081d3f9a4973df5478979785Brian}
338