177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**************************************************************************
277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * All Rights Reserved.
577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * copy of this software and associated documentation files (the
877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * "Software"), to deal in the Software without restriction, including
977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * without limitation the rights to use, copy, modify, merge, publish,
1077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to
1177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * permit persons to whom the Software is furnished to do so, subject to
1277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * the following conditions:
1377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
1477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * The above copyright notice and this permission notice (including the
1577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * next paragraph) shall be included in all copies or substantial portions
1677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * of the Software.
1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt **************************************************************************/
2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt#include <errno.h>
293913cd19b82802449dad2008ff4cfc1d546c05a6Quentin Glidic#include <time.h>
30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
32ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h"
33ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h"
342d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg#include "main/hash.h"
35d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg#include "main/fbobject.h"
3645a56e4730a74a012ad712fd9b6013d900b04742Vinson Lee#include "main/mfeatures.h"
3714aff23e1b4d52d5e10a3aeb65c3f4c783498a35Brian Paul#include "main/version.h"
38d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h"
396c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
4077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h"
4177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h"
4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] =
44a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_BEGIN
45a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_PERFORMANCE
46e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
47fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
48fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
49fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
50f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
51fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
52fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
53fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
54fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
55fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
561ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
578e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_BEGIN(texture_tiling, bool, true)
588e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt	 DRI_CONF_DESC(en, "Enable texture tiling")
598e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_END
601ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
61d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt      DRI_CONF_OPT_BEGIN(hiz, bool, true)
62d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt	 DRI_CONF_DESC(en, "Enable Hierarchical Z on gen6+")
63d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt      DRI_CONF_OPT_END
64d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt
65b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
66b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
67b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
68b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
69a58514cc9c5cc5867f9140700462c5ac5749550dEric Anholt      DRI_CONF_OPT_BEGIN(fragment_shader, bool, true)
70862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt	 DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
71862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_END
72862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt
73a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
74a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_QUALITY
75a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FORCE_S3TC_ENABLE(false)
76acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer      DRI_CONF_ALLOW_LARGE_TEXTURES(2)
77a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
78a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_DEBUG
79a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt     DRI_CONF_NO_RAST(false)
8040bc2748c2781600c748e546160bcc2aab637825Eric Anholt     DRI_CONF_ALWAYS_FLUSH_BATCH(false)
81f3687284c12f34268172b9c60e2effd697162129Eric Anholt     DRI_CONF_ALWAYS_FLUSH_CACHE(false)
82642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt     DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN(false)
83040894391a2cf85035c6ad85f3f85c6efb23324bKenneth Graunke     DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED(false)
8481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt
8581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false)
8681aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
8781aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_END
88c6abde211fa875f90e59e3709720cfe394669069Eric Anholt
899ef710575b914ddfc8e9a162d98ad554c1c217f7Kenneth Graunke      DRI_CONF_OPT_BEGIN(shader_precompile, bool, true)
90c6abde211fa875f90e59e3709720cfe394669069Eric Anholt	 DRI_CONF_DESC(en, "Perform code generation at shader link time.")
91c6abde211fa875f90e59e3709720cfe394669069Eric Anholt      DRI_CONF_OPT_END
92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
93a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
94a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
95040894391a2cf85035c6ad85f3f85c6efb23324bKenneth Graunkeconst GLuint __driNConfigOptions = 15;
9677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
97df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_batchbuffer.h"
98df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_buffers.h"
99df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_bufmgr.h"
100df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_chipset.h"
101df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_fbo.h"
102da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace#include "intel_mipmap_tree.h"
103df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_screen.h"
104df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_tex.h"
105df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_regions.h"
106df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt
107df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "i915_drm.h"
108df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt
10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE
11085063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
11177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */
11277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
113006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt/**
114006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt * For debugging purposes, this returns a time in seconds.
115006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt */
116006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholtdouble
117006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholtget_time(void)
118006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt{
119006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt   struct timespec tp;
120006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt
121006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt   clock_gettime(CLOCK_MONOTONIC, &tp);
122006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt
123006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt   return tp.tv_sec + tp.tv_nsec / 1000000000.0;
124006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt}
125006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt
126252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkevoid
127252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkeaub_dump_bmp(struct gl_context *ctx)
128252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke{
129252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke   struct gl_framebuffer *fb = ctx->DrawBuffer;
130252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
131252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke   for (int i = 0; i < fb->_NumColorDrawBuffers; i++) {
132252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      struct intel_renderbuffer *irb =
133252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 intel_renderbuffer(fb->_ColorDrawBuffers[i]);
134252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
135252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      if (irb && irb->mt) {
136252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 enum aub_dump_bmp_format format;
137252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
138252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 switch (irb->Base.Base.Format) {
139252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 case MESA_FORMAT_ARGB8888:
140252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 case MESA_FORMAT_XRGB8888:
141252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	    format = AUB_DUMP_BMP_FORMAT_ARGB_8888;
142252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	    break;
143252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 default:
144252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	    continue;
145252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 }
146252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
147252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 drm_intel_gem_bo_aub_dump_bmp(irb->mt->region->bo,
148252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->draw_x,
149252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->draw_y,
150252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->Base.Base.Width,
151252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->Base.Base.Height,
152252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       format,
153252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->mt->region->pitch *
154252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->mt->region->cpp,
155252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       0);
156252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      }
157252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke   }
158252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke}
159252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
1606d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
1616d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
1626d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
16366175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
1646d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
1656d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
1667c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
1677c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable)
1687c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
169dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt   GET_CURRENT_CONTEXT(ctx);
170dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt   struct intel_context *intel = intel_context(ctx);
171ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   if (intel == NULL)
172ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat      return;
1737c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
174ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   if (intel->gen < 4)
175ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat      INTEL_FIREVERTICES(intel);
1767c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
17761fd6847827048ce9b01b1d164111472ad8bf593Chad Versace   intel_downsample_for_dri2_flush(intel, drawable);
178ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   intel->need_throttle = true;
179e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg
180ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   if (intel->batch.used)
181ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat      intel_batchbuffer_flush(intel);
1820247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt
1830247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt   if (INTEL_DEBUG & DEBUG_AUB) {
184252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      aub_dump_bmp(ctx);
1850247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt   }
1867c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1877c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1887c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
1897c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
1907c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
191e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg    dri2InvalidateDrawable,
1927c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
1937c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
19400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzstruct intel_image_format intel_image_formats[] = {
19500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_ARGB8888, __DRI_IMAGE_COMPONENTS_RGBA, 1,
19600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } },
19700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
19800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_XRGB8888, __DRI_IMAGE_COMPONENTS_RGB, 1,
19900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_XRGB8888, 4 }, } },
20000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
20100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_YUV410, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
20200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
20300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 1, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 },
20400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 2, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 } } },
20500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
20600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_YUV411, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
20700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
20800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 1, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 },
20900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 2, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
21000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
21100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_YUV420, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
21200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
21300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 1, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 },
21400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 2, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 } } },
21500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
21600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_YUV422, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
21700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
21800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 1, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 },
21900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 2, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
22000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
22100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_YUV444, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
22200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
22300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 1, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
22400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 2, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
22500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
22600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_NV12, __DRI_IMAGE_COMPONENTS_Y_UV, 2,
22700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
22800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88, 2 } } },
22900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
23000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_NV16, __DRI_IMAGE_COMPONENTS_Y_UV, 2,
23100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
23200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 1, 1, 0, __DRI_IMAGE_FORMAT_GR88, 2 } } },
23300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
23400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   /* For YUYV buffers, we set up two overlapping DRI images and treat
23500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    * them as planar buffers in the compositors.  Plane 0 is GR88 and
23600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    * samples YU or YV pairs and places Y into the R component, while
23700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    * plane 1 is ARGB and samples YUYV clusters and places pairs and
23800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    * places U into the G component and V into A.  This lets the
23900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    * texture sampler interpolate the Y components correctly when
24000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    * sampling from plane 0, and interpolate U and V correctly when
24100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    * sampling from plane 1. */
24200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   { __DRI_IMAGE_FOURCC_YUYV, __DRI_IMAGE_COMPONENTS_Y_XUXV, 2,
24300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz     { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR88, 2 },
24400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       { 0, 1, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } }
24500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz};
24600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
247c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
2481bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergintel_allocate_image(int dri_format, void *loaderPrivate)
249c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
250c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    __DRIimage *image;
251c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
252c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image = CALLOC(sizeof *image);
253c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image == NULL)
254c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	return NULL;
255c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
2561bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg    image->dri_format = dri_format;
25795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->offset = 0;
258249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira
2591bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg    switch (dri_format) {
260c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_RGB565:
261c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_RGB565;
262c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
263c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_XRGB8888:
264c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_XRGB8888;
265c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
266c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_ARGB8888:
267c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_ARGB8888;
268c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
2699fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu    case __DRI_IMAGE_FORMAT_ABGR8888:
2709fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->format = MESA_FORMAT_RGBA8888_REV;
2719fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       break;
272fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley    case __DRI_IMAGE_FORMAT_XBGR8888:
273fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley       image->format = MESA_FORMAT_RGBX8888_REV;
274fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley       break;
27544a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg    case __DRI_IMAGE_FORMAT_R8:
27644a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg       image->format = MESA_FORMAT_R8;
27744a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg       break;
27844a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg    case __DRI_IMAGE_FORMAT_GR88:
27944a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg       image->format = MESA_FORMAT_GR88;
28044a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg       break;
28144a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg    case __DRI_IMAGE_FORMAT_NONE:
28244a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg       image->format = MESA_FORMAT_NONE;
28344a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg       break;
284c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    default:
285c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       free(image);
286c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
287c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
288c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
289454fc07ddefe2b750d78c94e8d52a11a8741c42fKristian Høgsberg    image->internal_format = _mesa_get_format_base_format(image->format);
290c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->data = loaderPrivate;
291c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
2921bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg    return image;
2931bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg}
2941bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg
2951bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergstatic __DRIimage *
2961bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergintel_create_image_from_name(__DRIscreen *screen,
2971bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg			     int width, int height, int format,
2981bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg			     int name, int pitch, void *loaderPrivate)
2991bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg{
3001bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg    struct intel_screen *intelScreen = screen->driverPrivate;
3011bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg    __DRIimage *image;
3021bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg    int cpp;
3031bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg
3041bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg    image = intel_allocate_image(format, loaderPrivate);
305636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg    if (image->format == MESA_FORMAT_NONE)
30600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz       cpp = 1;
307636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg    else
308636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg       cpp = _mesa_get_format_bytes(image->format);
3099ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg    image->region = intel_region_alloc_for_handle(intelScreen,
3109087ba128089ed0dc00e6eb38f37126fb7557d3bKristian Høgsberg						  cpp, width, height,
311c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg						  pitch, name, "image");
312c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image->region == NULL) {
313c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       FREE(image);
314c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
315c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
316c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
317c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    return image;
318c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
319c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
320c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
321c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context,
322c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg				     int renderbuffer, void *loaderPrivate)
323c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
324c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   __DRIimage *image;
325c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_context *intel = context->driverPrivate;
326c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct gl_renderbuffer *rb;
327c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_renderbuffer *irb;
328c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
329d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg   rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer);
330c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (!rb) {
331c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      _mesa_error(&intel->ctx,
332c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg		  GL_INVALID_OPERATION, "glRenderbufferExternalMESA");
333c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
334c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   }
335c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
336c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   irb = intel_renderbuffer(rb);
337c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image = CALLOC(sizeof *image);
338c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (image == NULL)
339c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
340c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
341c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->internal_format = rb->InternalFormat;
342c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->format = rb->Format;
34395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg   image->offset = 0;
344c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data = loaderPrivate;
345da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace   intel_region_reference(&image->region, irb->mt->region);
346c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
347249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   switch (image->format) {
348249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_RGB565:
349249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_RGB565;
350249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
351249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_XRGB8888:
352249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
353249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
354249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_ARGB8888:
355249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
356249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
357249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_RGBA8888_REV:
358249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_ABGR8888;
359249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
36044a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg   case MESA_FORMAT_R8:
36144a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg      image->dri_format = __DRI_IMAGE_FORMAT_R8;
36244a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg      break;
36344a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg   case MESA_FORMAT_RG88:
36444a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg      image->dri_format = __DRI_IMAGE_FORMAT_GR88;
36544a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg      break;
366249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   }
367249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira
368c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   return image;
369c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
370c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
371c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void
372c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image)
373c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
374c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_region_release(&image->region);
375c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    FREE(image);
376c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
377c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
378f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic __DRIimage *
379f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_create_image(__DRIscreen *screen,
380f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   int width, int height, int format,
381f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   unsigned int use,
382f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   void *loaderPrivate)
383f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{
384f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   __DRIimage *image;
385875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = screen->driverPrivate;
386e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   uint32_t tiling;
387f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   int cpp;
388f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
389e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   tiling = I915_TILING_X;
390e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   if (use & __DRI_IMAGE_USE_CURSOR) {
391e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      if (width != 64 || height != 64)
392e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg	 return NULL;
393e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      tiling = I915_TILING_NONE;
394e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   }
395e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg
3961bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg   image = intel_allocate_image(format, loaderPrivate);
397f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   cpp = _mesa_get_format_bytes(image->format);
398f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   image->region =
3991bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg      intel_region_alloc(intelScreen, tiling, cpp, width, height, true);
400f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   if (image->region == NULL) {
401f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      FREE(image);
402f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return NULL;
403f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
404f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
405f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   return image;
406f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg}
407f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
408f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic GLboolean
409f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_query_image(__DRIimage *image, int attrib, int *value)
410f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{
411f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   switch (attrib) {
412f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_STRIDE:
413f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      *value = image->region->pitch * image->region->cpp;
4142e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
415f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_HANDLE:
4168004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt      *value = image->region->bo->handle;
4172e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
418f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_NAME:
419f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return intel_region_flink(image->region, (uint32_t *) value);
4208de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes   case __DRI_IMAGE_ATTRIB_FORMAT:
421fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira      *value = image->dri_format;
422fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira      return true;
42344f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg   case __DRI_IMAGE_ATTRIB_WIDTH:
42444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg      *value = image->region->width;
42544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg      return true;
42644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg   case __DRI_IMAGE_ATTRIB_HEIGHT:
42744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg      *value = image->region->height;
42844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg      return true;
42900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   case __DRI_IMAGE_ATTRIB_COMPONENTS:
43000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz      if (image->planar_format == NULL)
43100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz         return false;
43200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz      *value = image->planar_format->components;
43300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz      return true;
43444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg  default:
4352e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
436f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
437f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg}
438f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
4393af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkestatic __DRIimage *
4403af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkeintel_dup_image(__DRIimage *orig_image, void *loaderPrivate)
4413af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke{
4423af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   __DRIimage *image;
4433af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
4443af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image = CALLOC(sizeof *image);
4453af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   if (image == NULL)
4463af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      return NULL;
4473af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
4483af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   intel_region_reference(&image->region, orig_image->region);
4493af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   if (image->region == NULL) {
4503af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      FREE(image);
4513af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      return NULL;
4523af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   }
4533af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
4543af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->internal_format = orig_image->internal_format;
45500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   image->planar_format   = orig_image->planar_format;
456249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   image->dri_format      = orig_image->dri_format;
4573af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->format          = orig_image->format;
45895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg   image->offset          = orig_image->offset;
4593af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->data            = loaderPrivate;
46000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
46100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   memcpy(image->strides, orig_image->strides, sizeof(image->strides));
46200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz   memcpy(image->offsets, orig_image->offsets, sizeof(image->offsets));
46300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
4643af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   return image;
4653af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke}
4663af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
467221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergstatic GLboolean
468221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergintel_validate_usage(__DRIimage *image, unsigned int use)
469221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg{
470221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg   if (use & __DRI_IMAGE_USE_CURSOR) {
471221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg      if (image->region->width != 64 || image->region->height != 64)
472221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg	 return GL_FALSE;
473221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg   }
474221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg
475221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg   return GL_TRUE;
476221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg}
477221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg
47895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsbergstatic __DRIimage *
47900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzintel_create_image_from_names(__DRIscreen *screen,
48000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz                              int width, int height, int fourcc,
48100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz                              int *names, int num_names,
48200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz                              int *strides, int *offsets,
48300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz                              void *loaderPrivate)
48495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg{
48500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    struct intel_image_format *f = NULL;
48695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    __DRIimage *image;
48700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    int i, index;
48800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
48900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    if (screen == NULL || names == NULL || num_names != 1)
49000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        return NULL;
49100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
49200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    for (i = 0; i < ARRAY_SIZE(intel_image_formats); i++) {
49300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        if (intel_image_formats[i].fourcc == fourcc) {
49400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz           f = &intel_image_formats[i];
49500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        }
49600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    }
49700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
49800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    if (f == NULL)
49900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        return NULL;
50000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
50100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    image = intel_create_image_from_name(screen, width, height,
50200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz                                         __DRI_IMAGE_FORMAT_NONE,
50300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz                                         names[0], strides[0],
50400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz                                         loaderPrivate);
50500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
50600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    if (image == NULL)
50700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        return NULL;
50800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
50900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    image->planar_format = f;
51000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    for (i = 0; i < f->nplanes; i++) {
51100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        index = f->planes[i].buffer_index;
51200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        image->offsets[index] = offsets[index];
51300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        image->strides[index] = strides[index];
51400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    }
51500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
51600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    return image;
51700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz}
51800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
51900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzstatic __DRIimage *
52000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzintel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
52100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz{
52200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    int width, height, offset, stride, dri_format, cpp, index, pitch;
52300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    struct intel_image_format *f;
52495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    uint32_t mask_x, mask_y;
52500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    __DRIimage *image;
52600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
52700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    if (parent == NULL || parent->planar_format == NULL)
52800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        return NULL;
52900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
53000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    f = parent->planar_format;
53100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
53200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    if (plane >= f->nplanes)
53300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz        return NULL;
53400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz
53500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    width = parent->region->width >> f->planes[plane].width_shift;
53600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    height = parent->region->height >> f->planes[plane].height_shift;
53700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    dri_format = f->planes[plane].dri_format;
53800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    index = f->planes[plane].buffer_index;
53900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    offset = parent->offsets[index];
54000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    stride = parent->strides[index];
54195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg
54295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image = intel_allocate_image(dri_format, loaderPrivate);
54300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    cpp = _mesa_get_format_bytes(image->format); /* safe since no none format */
54400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    pitch = stride / cpp;
54595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    if (offset + height * cpp * pitch > parent->region->bo->size) {
54695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg       _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds");
54795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg       FREE(image);
54895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg       return NULL;
54995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    }
55095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg
55195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region = calloc(sizeof(*image->region), 1);
55295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    if (image->region == NULL) {
55395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg       FREE(image);
55495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg       return NULL;
55595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    }
55695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg
55795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->cpp = _mesa_get_format_bytes(image->format);
55895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->width = width;
55995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->height = height;
56095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->pitch = pitch;
56195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->refcount = 1;
56295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->bo = parent->region->bo;
56395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    drm_intel_bo_reference(image->region->bo);
56495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->tiling = parent->region->tiling;
56595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->region->screen = parent->region->screen;
56695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    image->offset = offset;
56795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg
56896fd94ba9421c7c3072988f999ee869534f2bc2aPaul Berry    intel_region_get_tile_masks(image->region, &mask_x, &mask_y, false);
56995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    if (offset & mask_x)
57095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg       _mesa_warning(NULL,
57195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg                     "intel_create_sub_image: offset not on tile boundary");
57295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg
57395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    return image;
57495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg}
57595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg
576c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = {
57795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg    { __DRI_IMAGE, 5 },
578c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_name,
579c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_renderbuffer,
580c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_destroy_image,
581f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg    intel_create_image,
5823af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke    intel_query_image,
583221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg    intel_dup_image,
5844fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg    intel_validate_usage,
58500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    intel_create_image_from_names,
58600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz    intel_from_planar
587c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg};
588c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
589e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
5906d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
5917c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
592c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    &intelImageExtension.base,
593234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    &dri2ConfigQueryExtension.base,
59477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
59577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
59677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5972e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
598d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value)
59924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
60024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
6011c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
60224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
603f33d100fa71cecfb163dd91cd56b9a2788a43c22Eric Anholt   memset(&gp, 0, sizeof(gp));
60424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
60524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
60624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
6071c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
60824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
609f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt      if (ret != -EINVAL)
610f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt	 _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
6112e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
61224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
61324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
6142e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
61524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
61677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6172e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
618900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilsonintel_get_boolean(__DRIscreen *psp, int param)
619900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson{
620900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   int value = 0;
621900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   return intel_get_param(psp, param, &value) && value;
622900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson}
623900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson
62477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
6252d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData)
6262d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{
6272d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg}
6282d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
6292d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void
630d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv)
63177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
632875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = sPriv->driverPrivate;
63377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
634904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
6356d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
63677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6372d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   /* Some regions may still have references to them at this point, so
6382d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * flush the hash table to prevent _mesa_DeleteHashTable() from
6392d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * complaining about the hash not being empty; */
6402d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL);
6412d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_DeleteHashTable(intelScreen->named_regions);
6422d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
64377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
644875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   sPriv->driverPrivate = NULL;
64577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
64677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
64777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
64877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
64977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
65077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
65177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
652d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv,
653d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                  __DRIdrawable * driDrawPriv,
654d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg                  const struct gl_config * mesaVis, GLboolean isPixmap)
65577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
656d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct intel_renderbuffer *rb;
657875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *screen = (struct intel_screen*) driScrnPriv->driverPrivate;
6582b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   gl_format rgbFormat;
659e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace   unsigned num_samples = intel_quantize_num_samples(screen, mesaVis->samples);
6602b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   struct gl_framebuffer *fb;
661d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
6622b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   if (isPixmap)
6632b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      return false;
66477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6652b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   fb = CALLOC_STRUCT(gl_framebuffer);
6662b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   if (!fb)
6672b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      return false;
66877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6692b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   _mesa_initialize_window_framebuffer(fb, mesaVis);
67077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6712b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   if (mesaVis->redBits == 5)
6722b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      rgbFormat = MESA_FORMAT_RGB565;
6732b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   else if (mesaVis->alphaBits == 0)
6742b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      rgbFormat = MESA_FORMAT_XRGB8888;
6752b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   else
6762b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      rgbFormat = MESA_FORMAT_ARGB8888;
67777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6782b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   /* setup the hardware-based renderbuffers */
679e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace   rb = intel_create_renderbuffer(rgbFormat, num_samples);
6802b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base);
681119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
6822b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   if (mesaVis->doubleBufferMode) {
683e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace      rb = intel_create_renderbuffer(rgbFormat, num_samples);
6842b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base);
6852b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   }
68677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6872b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   /*
6882b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace    * Assert here that the gl_config has an expected depth/stencil bit
6892b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace    * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(),
6902b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace    * which constructs the advertised configs.)
6912b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace    */
6922b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   if (mesaVis->depthBits == 24) {
6932b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      assert(mesaVis->stencilBits == 8);
6942b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace
6952b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      if (screen->hw_has_separate_stencil) {
696e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace         rb = intel_create_private_renderbuffer(MESA_FORMAT_X8_Z24,
697e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace                                                num_samples);
6982b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
699e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace         rb = intel_create_private_renderbuffer(MESA_FORMAT_S8,
700e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace                                                num_samples);
7012b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base);
7022b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      } else {
7032b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace         /*
7042b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace          * Use combined depth/stencil. Note that the renderbuffer is
7052b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace          * attached to two attachment points.
7062b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace          */
707e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace         rb = intel_create_private_renderbuffer(MESA_FORMAT_S8_Z24,
708e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace                                                num_samples);
7092b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
7102b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base);
711f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace      }
7122b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   }
7132b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   else if (mesaVis->depthBits == 16) {
7142b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      assert(mesaVis->stencilBits == 0);
715e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace      rb = intel_create_private_renderbuffer(MESA_FORMAT_Z16,
716e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace                                             num_samples);
7178c94f6bbd80908fd2cae8e27fe78c429e54a78b8Chad Versace      _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
7182b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   }
7192b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   else {
7202b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      assert(mesaVis->depthBits == 0);
7212b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace      assert(mesaVis->stencilBits == 0);
7222b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   }
72377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
7242b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   /* now add any/all software-based renderbuffers we may need */
7252b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   _swrast_add_soft_renderbuffers(fb,
7262b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace                                  false, /* never sw color */
7272b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace                                  false, /* never sw depth */
7282b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace                                  false, /* never sw stencil */
7292b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace                                  mesaVis->accumRedBits > 0,
7302b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace                                  false, /* never sw alpha */
7312b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace                                  false  /* never sw aux */ );
7322b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   driDrawPriv->driverPrivate = fb;
73377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
7342b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace   return true;
73577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
73677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
73777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
738d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv)
73977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
740d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
741d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
742d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    _mesa_reference_framebuffer(&fb, NULL);
74377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
74477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
74577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
74677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
74777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
74877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
7492e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
7502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei830CreateContext(const struct gl_config *mesaVis,
7512e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  __DRIcontext *driContextPriv,
7522e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  void *sharedContextPrivate);
7532e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke
7542e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
7552e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915CreateContext(int api,
7562e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  const struct gl_config *mesaVis,
7572e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  __DRIcontext *driContextPriv,
758db273724c9484d513f5caa34729475d2873d9f7bIan Romanick                  unsigned major_version,
759db273724c9484d513f5caa34729475d2873d9f7bIan Romanick                  unsigned minor_version,
760db273724c9484d513f5caa34729475d2873d9f7bIan Romanick                  unsigned *error,
7612e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  void *sharedContextPrivate);
7622e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
7632e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api,
7642e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         const struct gl_config *mesaVis,
7652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         __DRIcontext *driContextPriv,
766d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick                 unsigned major_version,
767d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick                 unsigned minor_version,
768bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick                 uint32_t flags,
769d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick                 unsigned *error,
7702e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		 void *sharedContextPrivate);
77177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
77277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
773a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian HøgsbergintelCreateContext(gl_api api,
774d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg		   const struct gl_config * mesaVis,
775d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                   __DRIcontext * driContextPriv,
776e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned major_version,
777e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned minor_version,
778e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   uint32_t flags,
779e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned *error,
78077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
78177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
782d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
783875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = sPriv->driverPrivate;
78435cdd7b6dbc763fe57bf466def0a4257ca09beb8Eric Anholt   bool success = false;
78577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
786bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
78719420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
7882b636243265f0f09b7fd8d42046119222a63cad4Ian Romanick      success = i915CreateContext(api, mesaVis, driContextPriv,
789db273724c9484d513f5caa34729475d2873d9f7bIan Romanick                                  major_version, minor_version, error,
7902b636243265f0f09b7fd8d42046119222a63cad4Ian Romanick                                  sharedContextPrivate);
791bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
792a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick      switch (api) {
793a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick      case API_OPENGL:
794a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick         if (major_version > 1 || minor_version > 3) {
795a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick            *error = __DRI_CTX_ERROR_BAD_VERSION;
79691473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick            success = false;
797a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick         }
798a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick         break;
799a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick      case API_OPENGLES:
800a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick         break;
801a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick      default:
802a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick         *error = __DRI_CTX_ERROR_BAD_API;
80391473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick         success = false;
804a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick      }
805a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick
80691473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick      if (success) {
80791473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick         intelScreen->no_vbo = true;
80891473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick         success = i830CreateContext(mesaVis, driContextPriv,
80991473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick                                     sharedContextPrivate);
81091473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick         if (!success)
81191473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick            *error = __DRI_CTX_ERROR_NO_MEMORY;
812a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick      }
81377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
814bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
8152b636243265f0f09b7fd8d42046119222a63cad4Ian Romanick   success = brwCreateContext(api, mesaVis,
816d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick                              driContextPriv,
817bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick                              major_version, minor_version, flags,
818bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick                              error, sharedContextPrivate);
819bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
820e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
82191473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick   if (success)
82291473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick      return true;
823e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
824a87b0110b93597c6df5d84e720f685816d01ed40Ian Romanick   if (driContextPriv->driverPrivate != NULL)
825a87b0110b93597c6df5d84e720f685816d01ed40Ian Romanick      intelDestroyContext(driContextPriv);
826a87b0110b93597c6df5d84e720f685816d01ed40Ian Romanick
8272e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return false;
82877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
82977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
8302e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
8315777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen)
8327e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
833d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *spriv = intelScreen->driScrnPriv;
834cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
8357e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
8362222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
8377e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
838827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
8397e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
840827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
841827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
8422e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
8437e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
8447e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
845bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) ||
846bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt       num_fences == 0) {
847bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt      fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__);
8482e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
849bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   }
850e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
85106d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt   drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr);
85206d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt
8532d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   intelScreen->named_regions = _mesa_NewHashTable();
8542d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
855900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   intelScreen->relaxed_relocations = 0;
856900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   intelScreen->relaxed_relocations |=
857900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson      intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0;
858900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson
8592e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
8607e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
8617e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
862c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
8636b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_separate_stencil with environment variable
8646b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * INTEL_SEPARATE_STENCIL.
8656b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace *
8666b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_SEPARATE_STENCIL are "0" and "1". If an invalid
8676b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * valid value is encountered, a warning is emitted and INTEL_SEPARATE_STENCIL
8686b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * is ignored.
8696b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */
8706b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void
8716b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_separate_stencil(struct intel_screen *screen)
8726b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{
8736b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   const char *s = getenv("INTEL_SEPARATE_STENCIL");
8746b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   if (!s) {
8756b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      return;
8766b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("0", s, 2)) {
8776b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      screen->hw_has_separate_stencil = false;
8786b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("1", s, 2)) {
8796b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      screen->hw_has_separate_stencil = true;
8806b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else {
8816b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      fprintf(stderr,
8826b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "warning: env variable INTEL_SEPARATE_STENCIL=\"%s\" has "
8836b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "invalid value and is ignored", s);
8846b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   }
8856b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace}
8866b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
887f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterstatic bool
888f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterintel_detect_swizzling(struct intel_screen *screen)
889f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter{
890f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   drm_intel_bo *buffer;
891f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   unsigned long flags = 0;
892f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   unsigned long aligned_pitch;
893f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   uint32_t tiling = I915_TILING_X;
894f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   uint32_t swizzle_mode = 0;
895f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
896f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "swizzle test",
897f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter				     64, 64, 4,
898f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter				     &tiling, &aligned_pitch, flags);
899f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   if (buffer == NULL)
900f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter      return false;
901f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
902f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   drm_intel_bo_get_tiling(buffer, &tiling, &swizzle_mode);
903f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   drm_intel_bo_unreference(buffer);
904f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
905f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   if (swizzle_mode == I915_BIT_6_SWIZZLE_NONE)
906f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter      return false;
907f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   else
908f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter      return true;
909f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter}
910f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
911b2d428cb8d20e003b65769c7757a137406c671e6Chad Versacestatic __DRIconfig**
912b2d428cb8d20e003b65769c7757a137406c671e6Chad Versaceintel_screen_make_configs(__DRIscreen *dri_screen)
913b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace{
914b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   static const GLenum back_buffer_modes[] = {
915b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
916b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   };
917b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
9188b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace   static const uint8_t singlesample_samples[1] = {0};
919e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace   static const uint8_t multisample_samples[2]  = {4, 8};
9208b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace
921e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace   struct intel_screen *screen = dri_screen->driverPrivate;
922b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   GLenum fb_format[3];
923b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   GLenum fb_type[3];
9248b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace   uint8_t depth_bits[4], stencil_bits[4];
925b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   __DRIconfig **configs = NULL;
926b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
927b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   fb_format[0] = GL_RGB;
928b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
929b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
930b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   fb_format[1] = GL_BGR;
931b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
932b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
933b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   fb_format[2] = GL_BGRA;
934b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
935b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
936e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace   /* Generate singlesample configs without accumulation buffer. */
9378b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace   for (int i = 0; i < ARRAY_SIZE(fb_format); i++) {
938b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      __DRIconfig **new_configs;
9398b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace      const int num_depth_stencil_bits = 2;
940b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
941b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
942b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace       * buffer that has a different number of bits per pixel than the color
943b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace       * buffer.  This isn't yet supported here.
944b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace       */
9458b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace      depth_bits[0] = 0;
9468b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace      stencil_bits[0] = 0;
9478b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace
9488b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace      if (fb_type[i] == GL_UNSIGNED_SHORT_5_6_5) {
949b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         depth_bits[1] = 16;
950b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         stencil_bits[1] = 0;
951b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      } else {
952b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         depth_bits[1] = 24;
953b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         stencil_bits[1] = 8;
954b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      }
955b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
9568b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace      new_configs = driCreateConfigs(fb_format[i], fb_type[i],
957b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     depth_bits,
958b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     stencil_bits,
9598b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace                                     num_depth_stencil_bits,
960b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     back_buffer_modes,
961b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     ARRAY_SIZE(back_buffer_modes),
9628b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace                                     singlesample_samples, 1,
963b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     false);
964a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace      configs = driConcatConfigs(configs, new_configs);
965b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   }
966b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
967b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   /* Generate the minimum possible set of configs that include an
968b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace    * accumulation buffer.
969b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace    */
9708b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace   for (int i = 0; i < ARRAY_SIZE(fb_format); i++) {
971b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      __DRIconfig **new_configs;
972b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
9738b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace      if (fb_type[i] == GL_UNSIGNED_SHORT_5_6_5) {
974b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         depth_bits[0] = 16;
975b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         stencil_bits[0] = 0;
976b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      } else {
977b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         depth_bits[0] = 24;
978b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace         stencil_bits[0] = 8;
979b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      }
980b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
9818b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace      new_configs = driCreateConfigs(fb_format[i], fb_type[i],
982b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     depth_bits, stencil_bits, 1,
983b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     back_buffer_modes + 1, 1,
9848b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace                                     singlesample_samples, 1,
985b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace                                     true);
986a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace      configs = driConcatConfigs(configs, new_configs);
987b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   }
988b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
989e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace   /* Generate multisample configs.
990e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    *
991e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * This loop breaks early, and hence is a no-op, on gen < 6.
992e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    *
993e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * Multisample configs must follow the singlesample configs in order to
994e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * work around an X server bug present in 1.12. The X server chooses to
995e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * associate the first listed RGBA888-Z24S8 config, regardless of its
996e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * sample count, with the 32-bit depth visual used for compositing.
997e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    *
998e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * Only doublebuffer configs with GLX_SWAP_UNDEFINED_OML behavior are
999e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * supported.  Singlebuffer configs are not supported because no one wants
1000e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    * them. GLX_SWAP_COPY_OML is not supported due to page flipping.
1001e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace    */
1002e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace   for (int i = 0; i < ARRAY_SIZE(fb_format); i++) {
1003e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      if (screen->gen < 6)
1004e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace         break;
1005e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace
1006e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      __DRIconfig **new_configs;
1007e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      const int num_depth_stencil_bits = 2;
10083aaeb3e5e76b7b468e2eb2a26f30d68d19d3c854Eric Anholt      int num_msaa_modes = 0;
1009e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace
1010e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      depth_bits[0] = 0;
1011e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      stencil_bits[0] = 0;
1012e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace
1013e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      if (fb_type[i] == GL_UNSIGNED_SHORT_5_6_5) {
1014e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace         depth_bits[1] = 16;
1015e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace         stencil_bits[1] = 0;
1016e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      } else {
1017e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace         depth_bits[1] = 24;
1018e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace         stencil_bits[1] = 8;
1019e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      }
1020e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace
1021e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      if (screen->gen >= 7)
1022e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace         num_msaa_modes = 2;
1023e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      else if (screen->gen == 6)
1024e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace         num_msaa_modes = 1;
1025e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace
1026e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      new_configs = driCreateConfigs(fb_format[i], fb_type[i],
1027e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace                                     depth_bits,
1028e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace                                     stencil_bits,
1029e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace                                     num_depth_stencil_bits,
1030e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace                                     back_buffer_modes + 1, 1,
1031e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace                                     multisample_samples,
1032e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace                                     num_msaa_modes,
1033e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace                                     false);
1034e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace      configs = driConcatConfigs(configs, new_configs);
1035e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace   }
1036e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace
1037b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   if (configs == NULL) {
1038b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
1039b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace              __LINE__);
1040b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace      return NULL;
1041b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   }
1042b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
1043b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   return configs;
1044b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace}
1045b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace
10466b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/**
1047c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
10488d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
10498d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
1050d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver
1051c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
1052e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
1053d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp)
1054c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
10555777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen;
10565efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   unsigned int api_mask;
10577c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
10581b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt   if (psp->dri2.loader->base.version <= 2 ||
10591b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt       psp->dri2.loader->getBuffersWithFormat == NULL) {
10601b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt      fprintf(stderr,
10611b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt	      "\nERROR!  DRI2 loader with getBuffersWithFormat() "
10621b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt	      "support required\n");
10631b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt      return false;
10641b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt   }
10651b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt
1066c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
10675777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   intelScreen = CALLOC(sizeof *intelScreen);
1068c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
1069c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
10702e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
1071c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
1072c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
1073c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
1074c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
1075c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
1076c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
1077875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   psp->driverPrivate = (void *) intelScreen;
1078c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
10792222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt   if (!intel_init_bufmgr(intelScreen))
10802222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt       return false;
1081c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
10822222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt   intelScreen->deviceID = drm_intel_bufmgr_gem_get_devid(intelScreen->bufmgr);
10834ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt
1084cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt   intelScreen->kernel_has_gen7_sol_reset =
1085cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt      intel_get_boolean(intelScreen->driScrnPriv,
1086cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt			I915_PARAM_HAS_GEN7_SOL_RESET);
1087cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt
108889a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke   if (IS_GEN7(intelScreen->deviceID)) {
108989a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke      intelScreen->gen = 7;
109089a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke   } else if (IS_GEN6(intelScreen->deviceID)) {
10917363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 6;
10927363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_GEN5(intelScreen->deviceID)) {
10937363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 5;
10947363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_965(intelScreen->deviceID)) {
10957363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 4;
10967363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_9XX(intelScreen->deviceID)) {
10977363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 3;
10987363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else {
10997363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 2;
11007363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   }
11017363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg
1102e5411d8fdc6a7dda18d82746b84197ef83ee0a13Chad Versace   intelScreen->hw_has_separate_stencil = intelScreen->gen >= 6;
11036b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7;
11046b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
1105249fc7056104113633215106ac085b505d8dc161Eric Anholt   int has_llc = 0;
1106249fc7056104113633215106ac085b505d8dc161Eric Anholt   bool success = intel_get_param(intelScreen->driScrnPriv, I915_PARAM_HAS_LLC,
1107249fc7056104113633215106ac085b505d8dc161Eric Anholt				  &has_llc);
1108249fc7056104113633215106ac085b505d8dc161Eric Anholt   if (success && has_llc)
1109249fc7056104113633215106ac085b505d8dc161Eric Anholt      intelScreen->hw_has_llc = true;
1110249fc7056104113633215106ac085b505d8dc161Eric Anholt   else if (!success && intelScreen->gen >= 6)
1111249fc7056104113633215106ac085b505d8dc161Eric Anholt      intelScreen->hw_has_llc = true;
11127def293204977c41ea35198af147f743a31b1889Eugeni Dodonov
11136b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intel_override_separate_stencil(intelScreen);
11146b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
11155efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask = (1 << __DRI_API_OPENGL);
11165efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES1
11175efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask |= (1 << __DRI_API_GLES);
11185efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif
11195efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES2
11205efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask |= (1 << __DRI_API_GLES2);
11215efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif
11225efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg
11235efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID))
11245efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg      psp->api_mask = api_mask;
11255efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg
1126f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen);
1127f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
1128e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
1129c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
1130b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace   return (const __DRIconfig**) intel_screen_make_configs(psp);
1131c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
1132e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
11332adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestruct intel_buffer {
11342adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   __DRIbuffer base;
11352adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_region *region;
11362adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke};
11372adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11382adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic __DRIbuffer *
11392adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelAllocateBuffer(__DRIscreen *screen,
11402adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke		    unsigned attachment, unsigned format,
11412adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke		    int width, int height)
11422adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{
11432adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_buffer *intelBuffer;
1144875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = screen->driverPrivate;
114579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace
114683fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace   assert(attachment == __DRI_BUFFER_FRONT_LEFT ||
114783fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace          attachment == __DRI_BUFFER_BACK_LEFT);
11482adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11492adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer = CALLOC(sizeof *intelBuffer);
11502adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   if (intelBuffer == NULL)
11512adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke      return NULL;
11522adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
115383fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace   /* The front and back buffers are color buffers, which are X tiled. */
115479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   intelBuffer->region = intel_region_alloc(intelScreen,
115583fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace                                            I915_TILING_X,
115683fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace                                            format / 8,
115783fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace                                            width,
115883fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace                                            height,
115979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                                            true);
11602adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11612adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   if (intelBuffer->region == NULL) {
11622adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke	   FREE(intelBuffer);
11632adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke	   return NULL;
11642adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   }
11652adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11662adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intel_region_flink(intelBuffer->region, &intelBuffer->base.name);
11672adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11682adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.attachment = attachment;
11692adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.cpp = intelBuffer->region->cpp;
11702adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.pitch =
11712adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke         intelBuffer->region->pitch * intelBuffer->region->cpp;
11722adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11732adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   return &intelBuffer->base;
11742adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}
11752adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11762adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic void
11772adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer)
11782adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{
11792adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer;
11802adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11812adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intel_region_release(&intelBuffer->region);
11822adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   free(intelBuffer);
11832adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}
11842adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
11852adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
1186e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
11877192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis   .InitScreen		 = intelInitScreen2,
1188e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
1189e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
1190e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
1191e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
1192e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
1193e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
1194e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
11952adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   .AllocateBuffer       = intelAllocateBuffer,
11962adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   .ReleaseBuffer        = intelReleaseBuffer
1197e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
119839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg
119939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */
120039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = {
120139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driCoreExtension.base,
120239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driDRI2Extension.base,
120339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    NULL
120439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg};
1205