i915_screen.c revision e3c9bf1a670dd6924537d2e04d522ef899ee5b57
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
29d4d48c0579f7eb8d889ad325e8f1c9b4a95f6ed7Vinson Lee#include "draw/draw_context.h"
3028486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
31d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz#include "util/u_memory.h"
325b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include "util/u_string.h"
33aa59a937ccf41609081d3f9a4973df5478979785Brian
34aa59a937ccf41609081d3f9a4973df5478979785Brian#include "i915_reg.h"
35abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz#include "i915_debug.h"
36f81b7a6285455e838adb061dcca90036c9f99522José Fonseca#include "i915_context.h"
37aa59a937ccf41609081d3f9a4973df5478979785Brian#include "i915_screen.h"
38287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_resource.h"
39bc88c95990f871a206a8fe93e7541f1f41841f7eJakob Bornecrantz#include "i915_winsys.h"
40c7015877beedd9831402755dbc58afddcbbd5339Jakob Bornecrantz#include "i915_public.h"
41d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
42d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
43d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz/*
44d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz * Probe functions
45d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz */
46aa59a937ccf41609081d3f9a4973df5478979785Brian
47aa59a937ccf41609081d3f9a4973df5478979785Brian
48aa59a937ccf41609081d3f9a4973df5478979785Brianstatic const char *
491bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_get_vendor(struct pipe_screen *screen)
50aa59a937ccf41609081d3f9a4973df5478979785Brian{
5121a949365d1de2f1fea6cb87c6f389e30156566fJosé Fonseca   return "VMware, Inc.";
52aa59a937ccf41609081d3f9a4973df5478979785Brian}
53aa59a937ccf41609081d3f9a4973df5478979785Brian
54aa59a937ccf41609081d3f9a4973df5478979785Brianstatic const char *
551bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_get_name(struct pipe_screen *screen)
56aa59a937ccf41609081d3f9a4973df5478979785Brian{
57aa59a937ccf41609081d3f9a4973df5478979785Brian   static char buffer[128];
58aa59a937ccf41609081d3f9a4973df5478979785Brian   const char *chipset;
59aa59a937ccf41609081d3f9a4973df5478979785Brian
60835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantz   switch (i915_screen(screen)->iws->pci_id) {
61aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_G:
62aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "915G";
63aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
64aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_GM:
65aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "915GM";
66aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
67aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_G:
68aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "945G";
69aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
70aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GM:
71aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "945GM";
72aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
73aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GME:
74aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "945GME";
75aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
76aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_G33_G:
77aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "G33";
78aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
79aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q35_G:
80aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "Q35";
81aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
82aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q33_G:
83aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "Q33";
84aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
858624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter   case PCI_CHIP_PINEVIEW_G:
868624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter      chipset = "Pineview G";
878624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter      break;
888624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter   case PCI_CHIP_PINEVIEW_M:
898624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter      chipset = "Pineview M";
908624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter      break;
91aa59a937ccf41609081d3f9a4973df5478979785Brian   default:
92aa59a937ccf41609081d3f9a4973df5478979785Brian      chipset = "unknown";
93aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
94aa59a937ccf41609081d3f9a4973df5478979785Brian   }
95aa59a937ccf41609081d3f9a4973df5478979785Brian
965b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca   util_snprintf(buffer, sizeof(buffer), "i915 (chipset: %s)", chipset);
97aa59a937ccf41609081d3f9a4973df5478979785Brian   return buffer;
98aa59a937ccf41609081d3f9a4973df5478979785Brian}
99aa59a937ccf41609081d3f9a4973df5478979785Brian
10017188e4d5a3707c134fc97976863f0d8e2f1f5abBrianstatic int
101e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantzi915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
10217188e4d5a3707c134fc97976863f0d8e2f1f5abBrian{
103e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   switch (cap) {
104e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   /* Supported features (boolean caps). */
10517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_NPOT_TEXTURES:
106e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_PRIMITIVE_RESTART: /* draw module */
107e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_TEXTURE_SHADOW_MAP:
10817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_TWO_SIDED_STENCIL:
10917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 1;
110e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz
111e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   /* Unsupported features (boolean caps). */
11217188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_ANISOTROPIC_FILTER:
113e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_ARRAY_TEXTURES:
114e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_BLEND_EQUATION_SEPARATE:
115e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_DEPTH_CLAMP:
116e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE: /* disable for now */
117e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_GLSL:
118e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_INDEP_BLEND_ENABLE:
119e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_INDEP_BLEND_FUNC:
120e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_INSTANCED_DRAWING: /* draw module? */
12117188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_OCCLUSION_QUERY:
122e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_POINT_SPRITE:
123e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_SHADER_STENCIL_EXPORT:
124e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
125e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
126e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_TEXTURE_SWIZZLE:
127cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich   case PIPE_CAP_TIMER_QUERY:
128cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich      return 0;
129e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz
130e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   /* Texturing. */
131e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
132e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_MAX_COMBINED_SAMPLERS:
133e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz      return 8;
134e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
135e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz      return 0;
13617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
137e0d4f3202e213ae790a272eba7e96a40f68a6822Brian Paul      return I915_MAX_TEXTURE_2D_LEVELS;
13817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
139e0d4f3202e213ae790a272eba7e96a40f68a6822Brian Paul      return I915_MAX_TEXTURE_3D_LEVELS;
14017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
141e0d4f3202e213ae790a272eba7e96a40f68a6822Brian Paul      return I915_MAX_TEXTURE_2D_LEVELS;
142e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz
143e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   /* Render targets. */
144e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   case PIPE_CAP_MAX_RENDER_TARGETS:
145e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz      return 1;
146e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz
147e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   /* Fragment coordinate conventions. */
1486c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
1496c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
1506c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri      return 1;
1516c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
1526c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
1536c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri      return 0;
154e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz
15517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   default:
156e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz      debug_printf("%s: Unkown cap %u.\n", __FUNCTION__, cap);
15717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
15817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   }
15917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian}
16017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
161a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieristatic int
162e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantzi915_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap cap)
163a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri{
164a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   switch(shader) {
165a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   case PIPE_SHADER_VERTEX:
166e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz      return draw_get_shader_param(shader, cap);
167a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   case PIPE_SHADER_FRAGMENT:
168a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      break;
169a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   default:
170a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      return 0;
171a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   }
172a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
173a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   /* XXX: these are just shader model 2.0 values, fix this! */
174e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   switch(cap) {
175a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
176a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 96;
177a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
178a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 64;
179a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
180a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 32;
181a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
182a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 8;
183a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
184a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 0;
185a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_INPUTS:
186a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 10;
187a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_CONSTS:
188a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 32;
189a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
190a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 1;
191a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_TEMPS:
192a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 12; /* XXX: 12 -> 32 ? */
193a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_ADDRS:
194a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 0;
195a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_MAX_PREDS:
196a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 0;
197a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
198a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri         return 0;
1995bf7d668acf638ae4100cc25288fc181a221bab7Marek Olšák      case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
2005bf7d668acf638ae4100cc25288fc181a221bab7Marek Olšák      case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
2015bf7d668acf638ae4100cc25288fc181a221bab7Marek Olšák      case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
2025bf7d668acf638ae4100cc25288fc181a221bab7Marek Olšák      case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
2035bf7d668acf638ae4100cc25288fc181a221bab7Marek Olšák         return 1;
2049aa089eac05ebefafb6610b4a7e209b2fd1e93f6Marek Olšák      case PIPE_SHADER_CAP_SUBROUTINES:
2059aa089eac05ebefafb6610b4a7e209b2fd1e93f6Marek Olšák         return 0;
206a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri      default:
207e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz         debug_printf("%s: Unkown cap %u.\n", __FUNCTION__, cap);
208706380cf7da3d376b22bc32cb5decfb66665053dVinson Lee         return 0;
209a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   }
210a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri}
211a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
21217188e4d5a3707c134fc97976863f0d8e2f1f5abBrianstatic float
213e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantzi915_get_paramf(struct pipe_screen *screen, enum pipe_cap cap)
21417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian{
215e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz   switch(cap) {
21617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_LINE_WIDTH:
21717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      /* fall-through */
21817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_LINE_WIDTH_AA:
21917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 7.5;
22017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
22117188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_POINT_WIDTH:
22217188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      /* fall-through */
22317188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_POINT_WIDTH_AA:
22417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 255.0;
22517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
22617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
22717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 4.0;
22817188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
22917188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
23017188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 16.0;
23117188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
23217188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   default:
233e3c9bf1a670dd6924537d2e04d522ef899ee5b57Jakob Bornecrantz      debug_printf("%s: Unkown cap %u.\n", __FUNCTION__, cap);
23417188e4d5a3707c134fc97976863f0d8e2f1f5abBrian      return 0;
23517188e4d5a3707c134fc97976863f0d8e2f1f5abBrian   }
23617188e4d5a3707c134fc97976863f0d8e2f1f5abBrian}
23717188e4d5a3707c134fc97976863f0d8e2f1f5abBrian
238364f8cad0f8f02fd39d9c51ea0774d349121b58dBrianstatic boolean
2391bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_is_format_supported(struct pipe_screen *screen,
240bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger                         enum pipe_format format,
2411bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz                         enum pipe_texture_target target,
242bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger                         unsigned sample_count,
243bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger                         unsigned tex_usage,
2441bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz                         unsigned geom_flags)
245364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian{
246364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   static const enum pipe_format tex_supported[] = {
247b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B8G8R8A8_UNORM,
248b4b4ac668116d974522df2ce56e30b74ecdfef77Jakob Bornecrantz      PIPE_FORMAT_B8G8R8X8_UNORM,
249b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B5G6R5_UNORM,
25054f94a790e4488445347abcff9a636a9c440d7f9Brian Paul      PIPE_FORMAT_L8_UNORM,
25154f94a790e4488445347abcff9a636a9c440d7f9Brian Paul      PIPE_FORMAT_A8_UNORM,
25254f94a790e4488445347abcff9a636a9c440d7f9Brian Paul      PIPE_FORMAT_I8_UNORM,
253b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_L8A8_UNORM,
254b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_UYVY,
255b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_YUYV,
2564bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      /* XXX why not?
2574bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z16_UNORM, */
2584bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z24X8_UNORM,
2596fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger      PIPE_FORMAT_Z24_UNORM_S8_USCALED,
260364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      PIPE_FORMAT_NONE  /* list terminator */
261364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   };
262bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   static const enum pipe_format render_supported[] = {
263b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B8G8R8A8_UNORM,
264b2b1e899f64ed8a96ea2df6ed45accd430d44363José Fonseca      PIPE_FORMAT_B5G6R5_UNORM,
265bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      PIPE_FORMAT_NONE  /* list terminator */
266bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   };
267bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   static const enum pipe_format depth_supported[] = {
2684bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      /* XXX why not?
2694bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z16_UNORM, */
2704bc7b14224bfb9c5efe37e1505345fb90ba69d9eRoland Scheidegger      PIPE_FORMAT_Z24X8_UNORM,
2716fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger      PIPE_FORMAT_Z24_UNORM_S8_USCALED,
272364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      PIPE_FORMAT_NONE  /* list terminator */
273364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   };
274364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   const enum pipe_format *list;
275364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   uint i;
276364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
277bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   if (sample_count > 1)
278bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      return FALSE;
279bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger
280bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   if(tex_usage & PIPE_BIND_DEPTH_STENCIL)
281bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      list = depth_supported;
282bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger   else if (tex_usage & PIPE_BIND_RENDER_TARGET)
283bccf31bf5f2d6c9516a4c073d735b5056ff1d608Roland Scheidegger      list = render_supported;
2848aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   else
2858aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca      list = tex_supported;
286364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
287364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   for (i = 0; list[i] != PIPE_FORMAT_NONE; i++) {
288364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      if (list[i] == format)
289364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian         return TRUE;
290364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   }
291364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
292364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   return FALSE;
293364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian}
294364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
295d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
296d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz/*
297d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz * Fence functions
298d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz */
299d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
300d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
301d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzstatic void
302d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzi915_fence_reference(struct pipe_screen *screen,
303d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     struct pipe_fence_handle **ptr,
304d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     struct pipe_fence_handle *fence)
305d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz{
306d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
307d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
308d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->iws->fence_reference(is->iws, ptr, fence);
309d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz}
310d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
311d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzstatic int
312d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzi915_fence_signalled(struct pipe_screen *screen,
313d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     struct pipe_fence_handle *fence,
314d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                     unsigned flags)
315d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz{
316d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
317d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
318d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   return is->iws->fence_signalled(is->iws, fence);
319d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz}
320d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
321d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzstatic int
322d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantzi915_fence_finish(struct pipe_screen *screen,
323d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                  struct pipe_fence_handle *fence,
324d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz                  unsigned flags)
325d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz{
326d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
327d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
328d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   return is->iws->fence_finish(is->iws, fence);
329d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz}
330d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
331d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
332d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz/*
333d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz * Generic functions
334d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz */
335d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
336d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
337aa59a937ccf41609081d3f9a4973df5478979785Brianstatic void
338ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantzi915_flush_frontbuffer(struct pipe_screen *screen,
339ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz                       struct pipe_resource *resource,
340ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz                       unsigned level, unsigned layer,
341ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz                       void *winsys_drawable_handle)
342ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz{
343ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz   /* XXX: Dummy right now. */
344ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz   (void)screen;
345ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz   (void)resource;
346ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz   (void)level;
347ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz   (void)layer;
348ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz   (void)winsys_drawable_handle;
349ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz}
350ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz
351ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantzstatic void
3521bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantzi915_destroy_screen(struct pipe_screen *screen)
353aa59a937ccf41609081d3f9a4973df5478979785Brian{
354d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   struct i915_screen *is = i915_screen(screen);
3559dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
356d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   if (is->iws)
357d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz      is->iws->destroy(is->iws);
3589dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
359d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   FREE(is);
360aa59a937ccf41609081d3f9a4973df5478979785Brian}
361aa59a937ccf41609081d3f9a4973df5478979785Brian
362aa59a937ccf41609081d3f9a4973df5478979785Brian/**
363aa59a937ccf41609081d3f9a4973df5478979785Brian * Create a new i915_screen object
364aa59a937ccf41609081d3f9a4973df5478979785Brian */
365aa59a937ccf41609081d3f9a4973df5478979785Brianstruct pipe_screen *
366835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantzi915_screen_create(struct i915_winsys *iws)
367aa59a937ccf41609081d3f9a4973df5478979785Brian{
3681bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   struct i915_screen *is = CALLOC_STRUCT(i915_screen);
369aa59a937ccf41609081d3f9a4973df5478979785Brian
3701bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   if (!is)
371aa59a937ccf41609081d3f9a4973df5478979785Brian      return NULL;
372aa59a937ccf41609081d3f9a4973df5478979785Brian
373835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantz   switch (iws->pci_id) {
374aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_G:
375aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I915_GM:
3761bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz      is->is_i945 = FALSE;
377aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
378aa59a937ccf41609081d3f9a4973df5478979785Brian
379aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_G:
380aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GM:
381aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_I945_GME:
382aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_G33_G:
383aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q33_G:
384aa59a937ccf41609081d3f9a4973df5478979785Brian   case PCI_CHIP_Q35_G:
3858624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter   case PCI_CHIP_PINEVIEW_G:
3868624fe7a49f2bd42d17f79d504078ed58065f579Daniel Vetter   case PCI_CHIP_PINEVIEW_M:
3871bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz      is->is_i945 = TRUE;
388aa59a937ccf41609081d3f9a4973df5478979785Brian      break;
389aa59a937ccf41609081d3f9a4973df5478979785Brian
390aa59a937ccf41609081d3f9a4973df5478979785Brian   default:
391baab98a637d526871fb77ec6f313012f49c0e998José Fonseca      debug_printf("%s: unknown pci id 0x%x, cannot create screen\n",
392835f5a65a11ae9ca9f4b36ceb6656c77041ec901Jakob Bornecrantz                   __FUNCTION__, iws->pci_id);
393520b6abdecdaba856e5ca04938e18eb83b33dfaaVinson Lee      FREE(is);
394aa59a937ccf41609081d3f9a4973df5478979785Brian      return NULL;
395aa59a937ccf41609081d3f9a4973df5478979785Brian   }
396aa59a937ccf41609081d3f9a4973df5478979785Brian
397d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->iws = iws;
398aa59a937ccf41609081d3f9a4973df5478979785Brian
399d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.winsys = NULL;
400aa59a937ccf41609081d3f9a4973df5478979785Brian
4011bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.destroy = i915_destroy_screen;
402ec3c5ac5924d0daab424215a45ea3a089b9df54fJakob Bornecrantz   is->base.flush_frontbuffer = i915_flush_frontbuffer;
403aa59a937ccf41609081d3f9a4973df5478979785Brian
4041bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_name = i915_get_name;
4051bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_vendor = i915_get_vendor;
4061bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_param = i915_get_param;
407a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   is->base.get_shader_param = i915_get_shader_param;
4081bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.get_paramf = i915_get_paramf;
4091bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   is->base.is_format_supported = i915_is_format_supported;
410aa59a937ccf41609081d3f9a4973df5478979785Brian
4117f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell   is->base.context_create = i915_create_context;
4127f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell
413d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.fence_reference = i915_fence_reference;
414d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.fence_signalled = i915_fence_signalled;
415d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz   is->base.fence_finish = i915_fence_finish;
416d2110064c2075a8537d4b7f87ba894ebaa6ccb33Jakob Bornecrantz
417287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   i915_init_screen_resource_functions(is);
418aa59a937ccf41609081d3f9a4973df5478979785Brian
419abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz   i915_debug_init(is);
420abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz
4211bb3a2c648e0d6feea12bfff7f739159339f034aJakob Bornecrantz   return &is->base;
422aa59a937ccf41609081d3f9a4973df5478979785Brian}
423