1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/gl.h>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/internal/dri_interface.h>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_batchbuffer.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_context.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_mipmap_tree.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_regions.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_resolve_map.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_span.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_tex_layout.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_tex.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_blit.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef I915
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_blorp.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/formats.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glformats.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texcompress_etc.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/teximage.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FILE_DEBUG_FLAG DEBUG_MIPTREE
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtarget_to_target(GLenum target)
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB:
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB:
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB:
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TEXTURE_CUBE_MAP_ARB;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return target;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @param for_region Indicates that the caller is
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *        intel_miptree_create_for_region(). If true, then do not create
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *        \c stencil_mt.
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct intel_mipmap_tree *
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_create_internal(struct intel_context *intel,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLenum target,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      gl_format format,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint first_level,
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint last_level,
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint width0,
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint height0,
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint depth0,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      bool for_region,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLuint num_samples,
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              enum intel_msaa_layout msaa_layout)
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt = calloc(sizeof(*mt), 1);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int compress_byte = 0;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s target %s format %s level %d..%d <-- %p\n", __FUNCTION__,
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_lookup_enum_by_nr(target),
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_get_format_name(format),
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       first_level, last_level, mt);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_format_compressed(format))
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compress_byte = intel_compressed_num_bytes(format);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->target = target_to_target(target);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->format = format;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->first_level = first_level;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->last_level = last_level;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->width0 = width0;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->height0 = height0;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->cpp = compress_byte ? compress_byte : _mesa_get_format_bytes(mt->format);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->num_samples = num_samples;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->compressed = compress_byte ? 1 : 0;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->msaa_layout = msaa_layout;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->refcount = 1;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* array_spacing_lod0 is only used for non-IMS MSAA surfaces.  TODO: can we
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * use it elsewhere?
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (msaa_layout) {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case INTEL_MSAA_LAYOUT_NONE:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case INTEL_MSAA_LAYOUT_IMS:
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->array_spacing_lod0 = false;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case INTEL_MSAA_LAYOUT_UMS:
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case INTEL_MSAA_LAYOUT_CMS:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->array_spacing_lod0 = true;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target == GL_TEXTURE_CUBE_MAP) {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(depth0 == 1);
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->depth0 = 6;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->depth0 = depth0;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!for_region &&
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       _mesa_is_depthstencil_format(_mesa_get_format_base_format(format)) &&
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (intel->must_use_separate_stencil ||
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(intel->has_separate_stencil &&
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel->vtbl.is_hiz_depth_format(intel, format)))) {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* MSAA stencil surfaces always use IMS layout. */
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enum intel_msaa_layout msaa_layout =
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         num_samples > 1 ? INTEL_MSAA_LAYOUT_IMS : INTEL_MSAA_LAYOUT_NONE;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->stencil_mt = intel_miptree_create(intel,
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            mt->target,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            MESA_FORMAT_S8,
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            mt->first_level,
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            mt->last_level,
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            mt->width0,
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            mt->height0,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            mt->depth0,
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            true,
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            num_samples,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            msaa_layout);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!mt->stencil_mt) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_release(&mt);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return NULL;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Fix up the Z miptree format for how we're splitting out separate
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * stencil.  Gen7 expects there to be no stencil bits in its depth buffer.
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mt->format == MESA_FORMAT_S8_Z24) {
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 mt->format = MESA_FORMAT_X8_Z24;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (mt->format == MESA_FORMAT_Z32_FLOAT_X24S8) {
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 mt->format = MESA_FORMAT_Z32_FLOAT;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 mt->cpp = 4;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_problem(NULL, "Unknown format %s in separate stencil mt\n",
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       _mesa_get_format_name(mt->format));
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_get_texture_alignment_unit(intel, mt->format,
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    &mt->align_w, &mt->align_h);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef I915
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) intel;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->is_945)
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i945_miptree_layout(mt);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i915_miptree_layout(mt);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_miptree_layout(intel, mt);
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return mt;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct intel_mipmap_tree *
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_create(struct intel_context *intel,
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLenum target,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     gl_format format,
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLuint first_level,
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLuint last_level,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLuint width0,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLuint height0,
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     GLuint depth0,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     bool expect_accelerated_upload,
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLuint num_samples,
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     enum intel_msaa_layout msaa_layout)
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t tiling = I915_TILING_NONE;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum base_format;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool wraps_etc1 = false;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint total_width, total_height;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == MESA_FORMAT_ETC1_RGB8) {
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = MESA_FORMAT_RGBX8888_REV;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wraps_etc1 = true;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base_format = _mesa_get_format_base_format(format);
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->use_texture_tiling && !_mesa_is_format_compressed(format)) {
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (intel->gen >= 4 &&
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  (base_format == GL_DEPTH_COMPONENT ||
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   base_format == GL_DEPTH_STENCIL_EXT))
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tiling = I915_TILING_Y;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (msaa_layout != INTEL_MSAA_LAYOUT_NONE) {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* From p82 of the Sandy Bridge PRM, dw3[1] of SURFACE_STATE ("Tiled
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * Surface"):
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *   [DevSNB+]: For multi-sample render targets, this field must be
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *   1. MSRTs can only be tiled.
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * Our usual reason for preferring X tiling (fast blits using the
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * blitting engine) doesn't apply to MSAA, since we'll generally be
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * downsampling or upsampling when blitting between the MSAA buffer
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * and another buffer, and the blitting engine doesn't support that.
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * So use Y tiling, since it makes better use of the cache.
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tiling = I915_TILING_Y;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (width0 >= 64)
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tiling = I915_TILING_X;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt = intel_miptree_create_internal(intel, target, format,
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      first_level, last_level, width0,
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      height0, depth0,
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      false, num_samples, msaa_layout);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * pitch == 0 || height == 0  indicates the null texture
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt || !mt->total_width || !mt->total_height) {
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release(&mt);
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   total_width = mt->total_width;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   total_height = mt->total_height;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == MESA_FORMAT_S8) {
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The stencil buffer is W tiled. However, we request from the kernel a
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * non-tiled buffer because the GTT is incapable of W fencing.  So round
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * up the width and height to match the size of W tiles (64x64).
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tiling = I915_TILING_NONE;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      total_width = ALIGN(total_width, 64);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      total_height = ALIGN(total_height, 64);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->wraps_etc1 = wraps_etc1;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->region = intel_region_alloc(intel->intelScreen,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   tiling,
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   mt->cpp,
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   total_width,
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   total_height,
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   expect_accelerated_upload);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->offset = 0;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt->region) {
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       intel_miptree_release(&mt);
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return NULL;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return mt;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct intel_mipmap_tree *
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_create_for_region(struct intel_context *intel,
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLenum target,
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				gl_format format,
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct intel_region *region)
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt = intel_miptree_create_internal(intel, target, format,
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      0, 0,
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      region->width, region->height, 1,
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      true, 0 /* num_samples */,
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      INTEL_MSAA_LAYOUT_NONE);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt)
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return mt;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_region_reference(&mt->region, region);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return mt;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine which MSAA layout should be used by the MSAA surface being
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * created, based on the chip generation and the surface type.
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum intel_msaa_layout
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_msaa_layout(struct intel_context *intel, gl_format format)
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Prior to Gen7, all MSAA surfaces used IMS layout. */
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->gen < 7)
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return INTEL_MSAA_LAYOUT_IMS;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* In Gen7, IMS layout is only used for depth and stencil buffers. */
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (_mesa_get_format_base_format(format)) {
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_COMPONENT:
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_INDEX:
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_STENCIL:
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return INTEL_MSAA_LAYOUT_IMS;
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* From the Ivy Bridge PRM, Vol4 Part1 p77 ("MCS Enable"):
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *   This field must be set to 0 for all SINT MSRTs when all RT channels
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *   are not written
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * In practice this means that we have to disable MCS for all signed
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * integer MSAA buffers.  The alternative, to disable MCS only when one
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * of the render target channels is disabled, is impractical because it
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * would require converting between CMS and UMS MSAA layouts on the fly,
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * which is expensive.
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (_mesa_get_format_datatype(format) == GL_INT) {
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* TODO: is this workaround needed for future chipsets? */
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(intel->gen == 7);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return INTEL_MSAA_LAYOUT_UMS;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return INTEL_MSAA_LAYOUT_CMS;
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For a singlesample DRI2 buffer, this simply wraps the given region with a miptree.
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For a multisample DRI2 buffer, this wraps the given region with
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a singlesample miptree, then creates a multisample miptree into which the
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * singlesample miptree is embedded as a child.
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct intel_mipmap_tree*
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_create_for_dri2_buffer(struct intel_context *intel,
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     unsigned dri_attachment,
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     gl_format format,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     uint32_t num_samples,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     struct intel_region *region)
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *singlesample_mt = NULL;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *multisample_mt = NULL;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum base_format = _mesa_get_format_base_format(format);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Only the front and back buffers, which are color buffers, are shared
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * through DRI2.
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dri_attachment == __DRI_BUFFER_BACK_LEFT ||
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dri_attachment == __DRI_BUFFER_FRONT_LEFT ||
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          dri_attachment == __DRI_BUFFER_FAKE_FRONT_LEFT);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(base_format == GL_RGB || base_format == GL_RGBA);
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   singlesample_mt = intel_miptree_create_for_region(intel, GL_TEXTURE_2D,
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     format, region);
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!singlesample_mt)
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_samples == 0)
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return singlesample_mt;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   multisample_mt = intel_miptree_create_for_renderbuffer(intel,
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          format,
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          region->width,
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          region->height,
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                          num_samples);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!multisample_mt) {
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release(&singlesample_mt);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   multisample_mt->singlesample_mt = singlesample_mt;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   multisample_mt->need_downsample = false;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->is_front_buffer_rendering &&
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (dri_attachment == __DRI_BUFFER_FRONT_LEFT ||
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        dri_attachment == __DRI_BUFFER_FAKE_FRONT_LEFT)) {
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_upsample(intel, multisample_mt);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return multisample_mt;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct intel_mipmap_tree*
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_create_for_renderbuffer(struct intel_context *intel,
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      gl_format format,
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      uint32_t width,
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      uint32_t height,
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      uint32_t num_samples)
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *mt;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t depth = 1;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum intel_msaa_layout msaa_layout = INTEL_MSAA_LAYOUT_NONE;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const uint32_t singlesample_width = width;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const uint32_t singlesample_height = height;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool ok;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_samples > 1) {
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Adjust width/height/depth for MSAA */
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      msaa_layout = compute_msaa_layout(intel, format);
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (msaa_layout == INTEL_MSAA_LAYOUT_IMS) {
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* In the Sandy Bridge PRM, volume 4, part 1, page 31, it says:
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *     "Any of the other messages (sample*, LOD, load4) used with a
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (4x) multisampled surface will in-effect sample a surface with
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      double the height and width as that indicated in the surface
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      state. Each pixel position on the original-sized surface is
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      replaced with a 2x2 of samples with the following arrangement:
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *         sample 0 sample 2
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *         sample 1 sample 3"
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * Thus, when sampling from a multisampled texture, it behaves as
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * though the layout in memory for (x,y,sample) is:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,0,0) (0,0,2)   (1,0,0) (1,0,2)
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,0,1) (0,0,3)   (1,0,1) (1,0,3)
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,1,0) (0,1,2)   (1,1,0) (1,1,2)
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,1,1) (0,1,3)   (1,1,1) (1,1,3)
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * However, the actual layout of multisampled data in memory is:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,0,0) (1,0,0)   (0,0,1) (1,0,1)
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,1,0) (1,1,0)   (0,1,1) (1,1,1)
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,0,2) (1,0,2)   (0,0,3) (1,0,3)
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *      (0,1,2) (1,1,2)   (0,1,3) (1,1,3)
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * This pattern repeats for each 2x2 pixel block.
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * As a result, when calculating the size of our 4-sample buffer for
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * an odd width or height, we have to align before scaling up because
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * sample 3 is in that bottom right 2x2 block.
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (num_samples) {
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 4:
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            width = ALIGN(width, 2) * 2;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            height = ALIGN(height, 2) * 2;
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 8:
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            width = ALIGN(width, 2) * 4;
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            height = ALIGN(height, 2) * 2;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* num_samples should already have been quantized to 0, 1, 4, or
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * 8.
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            assert(false);
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Non-interleaved */
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         depth = num_samples;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt = intel_miptree_create(intel, GL_TEXTURE_2D, format, 0, 0,
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     width, height, depth, true, num_samples,
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             msaa_layout);
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt)
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (intel->vtbl.is_hiz_depth_format(intel, format)) {
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ok = intel_miptree_alloc_hiz(intel, mt, num_samples);
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ok)
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto fail;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) {
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ok = intel_miptree_alloc_mcs(intel, mt, num_samples);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ok)
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto fail;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->singlesample_width0 = singlesample_width;
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->singlesample_height0 = singlesample_height;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return mt;
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail:
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_release(&mt);
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_reference(struct intel_mipmap_tree **dst,
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        struct intel_mipmap_tree *src)
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*dst == src)
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_release(dst);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src) {
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->refcount++;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s %p refcount now %d\n", __FUNCTION__, src, src->refcount);
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *dst = src;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_release(struct intel_mipmap_tree **mt)
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!*mt)
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s %p refcount will be %d\n", __FUNCTION__, *mt, (*mt)->refcount - 1);
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (--(*mt)->refcount <= 0) {
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s deleting %p\n", __FUNCTION__, *mt);
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_release(&((*mt)->region));
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release(&(*mt)->stencil_mt);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release(&(*mt)->hiz_mt);
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release(&(*mt)->mcs_mt);
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release(&(*mt)->singlesample_mt);
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_resolve_map_clear(&(*mt)->hiz_map);
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 free((*mt)->level[i].slice);
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(*mt);
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *mt = NULL;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_get_dimensions_for_image(struct gl_texture_image *image,
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       int *width, int *height, int *depth)
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (image->TexObject->Target) {
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D_ARRAY:
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *width = image->Width;
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *height = 1;
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *depth = image->Height;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *width = image->Width;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *height = image->Height;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *depth = image->Depth;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Can the image be pulled into a unified mipmap tree?  This mirrors
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the completeness test in a lot of ways.
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Not sure whether I want to pass gl_texture_image here.
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_match_image(struct intel_mipmap_tree *mt,
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct gl_texture_image *image)
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_texture_image *intelImage = intel_texture_image(image);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint level = intelImage->base.Base.Level;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int width, height, depth;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target_to_target(image->TexObject->Target) != mt->target)
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (image->TexFormat != mt->format &&
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !(image->TexFormat == MESA_FORMAT_S8_Z24 &&
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 mt->format == MESA_FORMAT_X8_Z24 &&
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 mt->stencil_mt)) {
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_get_dimensions_for_image(image, &width, &height, &depth);
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mt->target == GL_TEXTURE_CUBE_MAP)
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth = 6;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Test image dimensions against the base level image adjusted for
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * minification.  This will also catch images not present in the
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * tree, changed targets, etc.
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width != mt->level[level].width ||
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       height != mt->level[level].height ||
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       depth != mt->level[level].depth)
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_set_level_info(struct intel_mipmap_tree *mt,
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     GLuint level,
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     GLuint x, GLuint y,
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     GLuint w, GLuint h, GLuint d)
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].width = w;
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].height = h;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].depth = d;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].level_x = x;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].level_y = y;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s level %d size: %d,%d,%d offset %d,%d\n", __FUNCTION__,
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       level, w, h, d, x, y);
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->level[level].slice == NULL);
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].slice = calloc(d, sizeof(*mt->level[0].slice));
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].slice[0].x_offset = mt->level[level].level_x;
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].slice[0].y_offset = mt->level[level].level_y;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_set_image_offset(struct intel_mipmap_tree *mt,
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint level, GLuint img,
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint x, GLuint y)
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (img == 0 && level == 0)
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(x == 0 && y == 0);
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(img < mt->level[level].depth);
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].slice[img].x_offset = mt->level[level].level_x + x;
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].slice[img].y_offset = mt->level[level].level_y + y;
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s level %d img %d pos %d,%d\n",
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       __FUNCTION__, level, img,
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt->level[level].slice[img].x_offset,
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt->level[level].slice[img].y_offset);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For cube map textures, either the \c face parameter can be used, of course,
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or the cube face can be interpreted as a depth layer and the \c layer
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * parameter used.
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_get_image_offset(struct intel_mipmap_tree *mt,
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint level, GLuint face, GLuint layer,
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint *x, GLuint *y)
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int slice;
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face > 0) {
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(mt->target == GL_TEXTURE_CUBE_MAP);
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(face < 6);
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(layer == 0);
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      slice = face;
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This branch may be taken even if the texture target is a cube map. In
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * that case, the caller chose to interpret each cube face as a layer.
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(face == 0);
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      slice = layer;
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *x = mt->level[level].slice[slice].x_offset;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *y = mt->level[level].slice[slice].y_offset;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_copy_slice(struct intel_context *intel,
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 struct intel_mipmap_tree *dst_mt,
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 struct intel_mipmap_tree *src_mt,
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 int level,
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 int face,
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 int depth)
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format format = src_mt->format;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t width = src_mt->level[level].width;
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t height = src_mt->level[level].height;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(depth < src_mt->level[level].depth);
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dst_mt->compressed) {
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      height = ALIGN(height, dst_mt->align_h) / dst_mt->align_h;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      width = ALIGN(width, dst_mt->align_w);
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t dst_x, dst_y, src_x, src_y;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_get_image_offset(dst_mt, level, face, depth,
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  &dst_x, &dst_y);
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_get_image_offset(src_mt, level, face, depth,
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  &src_x, &src_y);
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("validate blit mt %p %d,%d/%d -> mt %p %d,%d/%d (%dx%d)\n",
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       src_mt, src_x, src_y, src_mt->region->pitch * src_mt->region->cpp,
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dst_mt, dst_x, dst_y, dst_mt->region->pitch * dst_mt->region->cpp,
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       width, height);
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!intelEmitCopyBlit(intel,
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  dst_mt->region->cpp,
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  src_mt->region->pitch, src_mt->region->bo,
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  0, src_mt->region->tiling,
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  dst_mt->region->pitch, dst_mt->region->bo,
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  0, dst_mt->region->tiling,
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  src_x, src_y,
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  dst_x, dst_y,
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  width, height,
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GL_COPY)) {
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fallback_debug("miptree validate blit for %s failed\n",
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     _mesa_get_format_name(format));
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *dst = intel_region_map(intel, dst_mt->region, GL_MAP_WRITE_BIT);
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *src = intel_region_map(intel, src_mt->region, GL_MAP_READ_BIT);
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_copy_rect(dst,
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      dst_mt->cpp,
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      dst_mt->region->pitch,
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      dst_x, dst_y,
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      width, height,
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      src, src_mt->region->pitch,
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      src_x, src_y);
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, dst_mt->region);
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, src_mt->region);
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src_mt->stencil_mt) {
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_copy_slice(intel,
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               dst_mt->stencil_mt, src_mt->stencil_mt,
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               level, face, depth);
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copies the image's current data to the given miptree, and associates that
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * miptree with the image.
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_copy_teximage(struct intel_context *intel,
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    struct intel_texture_image *intelImage,
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    struct intel_mipmap_tree *dst_mt)
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *src_mt = intelImage->mt;
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int level = intelImage->base.Base.Level;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int face = intelImage->base.Base.Face;
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint depth = intelImage->base.Base.Depth;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int slice = 0; slice < depth; slice++) {
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_copy_slice(intel, dst_mt, src_mt, level, face, slice);
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_reference(&intelImage->mt, dst_mt);
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_alloc_mcs(struct intel_context *intel,
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        struct intel_mipmap_tree *mt,
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLuint num_samples)
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->mcs_mt == NULL);
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(intel->gen >= 7); /* MCS only used on Gen7+ */
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Choose the correct format for the MCS buffer.  All that really matters
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * is that we allocate the right buffer size, since we'll always be
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * accessing this miptree using MCS-specific hardware mechanisms, which
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * infer the correct format based on num_samples.
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_format format;
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (num_samples) {
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 4:
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* 8 bits/pixel are required for MCS data when using 4x MSAA (2 bits for
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * each sample).
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = MESA_FORMAT_R8;
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 8:
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* 32 bits/pixel are required for MCS data when using 8x MSAA (3 bits
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * for each sample, plus 8 padding bits).
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = MESA_FORMAT_R_UINT32;
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"Unrecognized sample count in intel_miptree_alloc_mcs");
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   };
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the Ivy Bridge PRM, Vol4 Part1 p76, "MCS Base Address":
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     "The MCS surface must be stored as Tile Y."
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * We set msaa_format to INTEL_MSAA_LAYOUT_CMS to force
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * intel_miptree_create() to use Y tiling.  msaa_format is otherwise
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * ignored for the MCS miptree.
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->mcs_mt = intel_miptree_create(intel,
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->target,
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     format,
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->first_level,
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->last_level,
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->width0,
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->height0,
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->depth0,
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     true,
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     0 /* num_samples */,
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     INTEL_MSAA_LAYOUT_CMS);
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the Ivy Bridge PRM, Vol 2 Part 1 p326:
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     When MCS buffer is enabled and bound to MSRT, it is required that it
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     is cleared prior to any rendering.
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Since we don't use the MCS buffer for any purpose other than rendering,
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * it makes sense to just clear it immediately upon allocation.
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: the clear value for MCS buffers is all 1's, so we memset to 0xff.
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *data = intel_region_map(intel, mt->mcs_mt->region, 0);
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(data, 0xff, mt->mcs_mt->region->bo->size);
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_region_unmap(intel, mt->mcs_mt->region);
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return mt->mcs_mt;
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_alloc_hiz(struct intel_context *intel,
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct intel_mipmap_tree *mt,
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLuint num_samples)
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->hiz_mt == NULL);
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* MSAA HiZ surfaces always use IMS layout. */
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->hiz_mt = intel_miptree_create(intel,
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->target,
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     MESA_FORMAT_X8_Z24,
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->first_level,
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->last_level,
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->width0,
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->height0,
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mt->depth0,
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     true,
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     num_samples,
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     INTEL_MSAA_LAYOUT_IMS);
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt->hiz_mt)
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Mark that all slices need a HiZ resolve. */
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_resolve_map *head = &mt->hiz_map;
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int level = mt->first_level; level <= mt->last_level; ++level) {
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (int layer = 0; layer < mt->level[level].depth; ++layer) {
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 head->next = malloc(sizeof(*head->next));
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 head->next->prev = head;
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 head->next->next = NULL;
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 head = head->next;
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 head->level = level;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 head->layer = layer;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 head->need = GEN6_HIZ_OP_HIZ_RESOLVE;
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_slice_set_needs_hiz_resolve(struct intel_mipmap_tree *mt,
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  uint32_t level,
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  uint32_t layer)
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_check_level_layer(mt, level, layer);
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt->hiz_mt)
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_resolve_map_set(&mt->hiz_map,
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 level, layer, GEN6_HIZ_OP_HIZ_RESOLVE);
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_slice_set_needs_depth_resolve(struct intel_mipmap_tree *mt,
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            uint32_t level,
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            uint32_t layer)
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_check_level_layer(mt, level, layer);
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt->hiz_mt)
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_resolve_map_set(&mt->hiz_map,
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 level, layer, GEN6_HIZ_OP_DEPTH_RESOLVE);
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_slice_resolve(struct intel_context *intel,
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    struct intel_mipmap_tree *mt,
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t level,
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    uint32_t layer,
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    enum gen6_hiz_op need)
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_check_level_layer(mt, level, layer);
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_resolve_map *item =
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_resolve_map_get(&mt->hiz_map, level, layer);
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!item || item->need != need)
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_hiz_exec(intel, mt, level, layer, need);
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_resolve_map_remove(item);
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_slice_resolve_hiz(struct intel_context *intel,
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct intel_mipmap_tree *mt,
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				uint32_t level,
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				uint32_t layer)
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return intel_miptree_slice_resolve(intel, mt, level, layer,
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GEN6_HIZ_OP_HIZ_RESOLVE);
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_slice_resolve_depth(struct intel_context *intel,
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  struct intel_mipmap_tree *mt,
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  uint32_t level,
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  uint32_t layer)
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return intel_miptree_slice_resolve(intel, mt, level, layer,
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GEN6_HIZ_OP_DEPTH_RESOLVE);
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_all_slices_resolve(struct intel_context *intel,
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct intel_mipmap_tree *mt,
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 enum gen6_hiz_op need)
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool did_resolve = false;
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_resolve_map *i, *next;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = mt->hiz_map.next; i; i = next) {
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      next = i->next;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->need != need)
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 continue;
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_hiz_exec(intel, mt, i->level, i->layer, need);
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_resolve_map_remove(i);
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      did_resolve = true;
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return did_resolve;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_all_slices_resolve_hiz(struct intel_context *intel,
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     struct intel_mipmap_tree *mt)
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return intel_miptree_all_slices_resolve(intel, mt,
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GEN6_HIZ_OP_HIZ_RESOLVE);
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_all_slices_resolve_depth(struct intel_context *intel,
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       struct intel_mipmap_tree *mt)
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return intel_miptree_all_slices_resolve(intel, mt,
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GEN6_HIZ_OP_DEPTH_RESOLVE);
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_updownsample(struct intel_context *intel,
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct intel_mipmap_tree *src,
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct intel_mipmap_tree *dst,
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned width,
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           unsigned height)
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef I915
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int src_x0 = 0;
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int src_y0 = 0;
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dst_x0 = 0;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dst_y0 = 0;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_slice_resolve_depth(intel, src, 0, 0);
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_slice_resolve_depth(intel, dst, 0, 0);
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brw_blorp_blit_miptrees(intel,
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           src, 0 /* level */, 0 /* layer */,
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           dst, 0 /* level */, 0 /* layer */,
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           src_x0, src_y0,
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           dst_x0, dst_y0,
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           width, height,
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           false, false /*mirror x, y*/);
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src->stencil_mt) {
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_blorp_blit_miptrees(intel,
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              src->stencil_mt, 0 /* level */, 0 /* layer */,
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              dst->stencil_mt, 0 /* level */, 0 /* layer */,
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              src_x0, src_y0,
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              dst_x0, dst_y0,
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              width, height,
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              false, false /*mirror x, y*/);
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* I915 */
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgassert_is_flat(struct intel_mipmap_tree *mt)
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->target == GL_TEXTURE_2D);
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->first_level == 0);
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->last_level == 0);
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \brief Downsample from mt to mt->singlesample_mt.
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the miptree needs no downsample, then skip.
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_downsample(struct intel_context *intel,
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct intel_mipmap_tree *mt)
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Only flat, renderbuffer-like miptrees are supported. */
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert_is_flat(mt);
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt->need_downsample)
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_updownsample(intel,
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              mt, mt->singlesample_mt,
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              mt->singlesample_mt->width0,
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              mt->singlesample_mt->height0);
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->need_downsample = false;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Strictly speaking, after a downsample on a depth miptree, a hiz
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * resolve is needed on the singlesample miptree. However, since the
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * singlesample miptree is never rendered to, the hiz resolve will never
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * occur. Therefore we do not mark the needed hiz resolve after
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * downsampling.
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \brief Upsample from mt->singlesample_mt to mt.
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The upsample is done unconditionally.
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_upsample(struct intel_context *intel,
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct intel_mipmap_tree *mt)
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Only flat, renderbuffer-like miptrees are supported. */
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert_is_flat(mt);
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!mt->need_downsample);
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_updownsample(intel,
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              mt->singlesample_mt, mt,
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              mt->singlesample_mt->width0,
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              mt->singlesample_mt->height0);
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_slice_set_needs_hiz_resolve(mt, 0, 0);
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map_gtt(struct intel_context *intel,
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      struct intel_mipmap_tree *mt,
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      struct intel_miptree_map *map,
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      unsigned int level, unsigned int slice)
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int bw, bh;
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *base;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int image_x, image_y;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int x = map->x;
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int y = map->y;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* For compressed formats, the stride is the number of bytes per
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * row of blocks.  intel_miptree_get_image_offset() already does
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * the divide.
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_get_format_block_size(mt->format, &bw, &bh);
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(y % bh == 0);
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   y /= bh;
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base = intel_region_map(intel, mt->region, map->mode);
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (base == NULL)
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map->ptr = NULL;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Note that in the case of cube maps, the caller must have passed the
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * slice number referencing the face.
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      */
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_get_image_offset(mt, level, 0, slice, &image_x, &image_y);
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      x += image_x;
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      y += image_y;
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map->stride = mt->region->pitch * mt->cpp;
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map->ptr = base + y * map->stride + x * mt->cpp;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s: %d,%d %dx%d from mt %p (%s) %d,%d = %p/%d\n", __FUNCTION__,
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       map->x, map->y, map->w, map->h,
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt, _mesa_get_format_name(mt->format),
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       x, y, map->ptr, map->stride);
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap_gtt(struct intel_context *intel,
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct intel_mipmap_tree *mt,
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct intel_miptree_map *map,
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned int level,
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned int slice)
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_region_unmap(intel, mt->region);
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map_blit(struct intel_context *intel,
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       struct intel_mipmap_tree *mt,
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       struct intel_miptree_map *map,
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned int level, unsigned int slice)
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int image_x, image_y;
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int x = map->x;
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int y = map->y;
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ret;
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The blitter requires the pitch to be aligned to 4. */
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->stride = ALIGN(map->w * mt->region->cpp, 4);
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->bo = drm_intel_bo_alloc(intel->bufmgr, "intel_miptree_map_blit() temp",
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				map->stride * map->h, 4096);
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map->bo) {
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "Failed to allocate blit temporary\n");
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_get_image_offset(mt, level, 0, slice, &image_x, &image_y);
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x += image_x;
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   y += image_y;
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!intelEmitCopyBlit(intel,
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  mt->region->cpp,
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  mt->region->pitch, mt->region->bo,
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  0, mt->region->tiling,
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  map->stride / mt->region->cpp, map->bo,
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  0, I915_TILING_NONE,
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  x, y,
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  0, 0,
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  map->w, map->h,
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GL_COPY)) {
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "Failed to blit\n");
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_batchbuffer_flush(intel);
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = drm_intel_bo_map(map->bo, (map->mode & GL_MAP_WRITE_BIT) != 0);
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret) {
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "Failed to map blit temporary\n");
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->ptr = map->bo->virtual;
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s: %d,%d %dx%d from mt %p (%s) %d,%d = %p/%d\n", __FUNCTION__,
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       map->x, map->y, map->w, map->h,
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt, _mesa_get_format_name(mt->format),
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       x, y, map->ptr, map->stride);
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return;
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail:
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_unreference(map->bo);
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->ptr = NULL;
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->stride = 0;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap_blit(struct intel_context *intel,
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 struct intel_mipmap_tree *mt,
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 struct intel_miptree_map *map,
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 unsigned int level,
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 unsigned int slice)
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!(map->mode & GL_MAP_WRITE_BIT));
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_unmap(map->bo);
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   drm_intel_bo_unreference(map->bo);
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map_s8(struct intel_context *intel,
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct intel_mipmap_tree *mt,
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct intel_miptree_map *map,
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     unsigned int level, unsigned int slice)
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->stride = map->w;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->buffer = map->ptr = malloc(map->stride * map->h);
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map->buffer)
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* One of either READ_BIT or WRITE_BIT or both is set.  READ_BIT implies no
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * INVALIDATE_RANGE_BIT.  WRITE_BIT needs the original values read in unless
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * invalidate is set, since we'll be writing the whole rectangle from our
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * temporary buffer back out.
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!(map->mode & GL_MAP_INVALIDATE_RANGE_BIT)) {
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *untiled_s8_map = map->ptr;
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *tiled_s8_map = intel_region_map(intel, mt->region,
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       GL_MAP_READ_BIT);
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int image_x, image_y;
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_get_image_offset(mt, level, 0, slice, &image_x, &image_y);
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (uint32_t y = 0; y < map->h; y++) {
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (uint32_t x = 0; x < map->w; x++) {
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ptrdiff_t offset = intel_offset_S8(mt->region->pitch,
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	                                       x + image_x + map->x,
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	                                       y + image_y + map->y,
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       intel->has_swizzling);
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    untiled_s8_map[y * map->w + x] = tiled_s8_map[offset];
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, mt->region);
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s: %d,%d %dx%d from mt %p %d,%d = %p/%d\n", __FUNCTION__,
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->x, map->y, map->w, map->h,
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  mt, map->x + image_x, map->y + image_y, map->ptr, map->stride);
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s: %d,%d %dx%d from mt %p = %p/%d\n", __FUNCTION__,
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->x, map->y, map->w, map->h,
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  mt, map->ptr, map->stride);
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap_s8(struct intel_context *intel,
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       struct intel_mipmap_tree *mt,
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       struct intel_miptree_map *map,
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned int level,
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       unsigned int slice)
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (map->mode & GL_MAP_WRITE_BIT) {
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int image_x, image_y;
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *untiled_s8_map = map->ptr;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *tiled_s8_map = intel_region_map(intel, mt->region, map->mode);
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_get_image_offset(mt, level, 0, slice, &image_x, &image_y);
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (uint32_t y = 0; y < map->h; y++) {
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (uint32_t x = 0; x < map->w; x++) {
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ptrdiff_t offset = intel_offset_S8(mt->region->pitch,
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	                                       x + map->x,
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	                                       y + map->y,
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       intel->has_swizzling);
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tiled_s8_map[offset] = untiled_s8_map[y * map->w + x];
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, mt->region);
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(map->buffer);
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map_etc1(struct intel_context *intel,
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct intel_mipmap_tree *mt,
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct intel_miptree_map *map,
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned int level,
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned int slice)
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* For justification of these invariants,
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * see intel_mipmap_tree:wraps_etc1.
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->wraps_etc1);
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->format == MESA_FORMAT_RGBX8888_REV);
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* From the GL_OES_compressed_ETC1_RGB8_texture spec:
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *   INVALID_OPERATION is generated by CompressedTexSubImage2D,
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *   TexSubImage2D, or CopyTexSubImage2D if the texture image <level>
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *   bound to <target> has internal format ETC1_RGB8_OES.
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This implies that intel_miptree_map_etc1() can only be called from
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glCompressedTexImage2D, and hence the assertions below hold.
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(map->mode & GL_MAP_WRITE_BIT);
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(map->mode & GL_MAP_INVALIDATE_RANGE_BIT);
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(map->x == 0);
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(map->y == 0);
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Each ETC1 block contains 4x4 pixels in 8 bytes. */
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->stride = 2 * map->w;
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->buffer = map->ptr = malloc(map->stride * map->h);
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap_etc1(struct intel_context *intel,
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct intel_mipmap_tree *mt,
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct intel_miptree_map *map,
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int level,
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int slice)
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t image_x;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t image_y;
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_get_image_offset(mt, level, 0, slice, &image_x, &image_y);
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t *xbgr = intel_region_map(intel, mt->region, map->mode)
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 + image_y * mt->region->pitch * mt->region->cpp
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 + image_x * mt->region->cpp;
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_etc1_unpack_rgba8888(xbgr, mt->region->pitch * mt->region->cpp,
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              map->ptr, map->stride,
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              map->w, map->h);
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_region_unmap(intel, mt->region);
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(map->buffer);
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mapping function for packed depth/stencil miptrees backed by real separate
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * miptrees for depth and stencil.
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * On gen7, and to support HiZ pre-gen7, we have to have the stencil buffer
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * separate from the depth buffer.  Yet at the GL API level, we have to expose
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * packed depth/stencil textures and FBO attachments, and Mesa core expects to
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be able to map that memory for texture storage and glReadPixels-type
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * operations.  We give Mesa core that access by mallocing a temporary and
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copying the data between the actual backing store and the temporary.
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map_depthstencil(struct intel_context *intel,
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       struct intel_mipmap_tree *mt,
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       struct intel_miptree_map *map,
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       unsigned int level, unsigned int slice)
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *z_mt = mt;
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *s_mt = mt->stencil_mt;
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool map_z32f_x24s8 = mt->format == MESA_FORMAT_Z32_FLOAT;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int packed_bpp = map_z32f_x24s8 ? 8 : 4;
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->stride = map->w * packed_bpp;
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->buffer = map->ptr = malloc(map->stride * map->h);
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map->buffer)
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* One of either READ_BIT or WRITE_BIT or both is set.  READ_BIT implies no
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * INVALIDATE_RANGE_BIT.  WRITE_BIT needs the original values read in unless
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * invalidate is set, since we'll be writing the whole rectangle from our
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * temporary buffer back out.
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!(map->mode & GL_MAP_INVALIDATE_RANGE_BIT)) {
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t *packed_map = map->ptr;
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *s_map = intel_region_map(intel, s_mt->region, GL_MAP_READ_BIT);
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t *z_map = intel_region_map(intel, z_mt->region, GL_MAP_READ_BIT);
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int s_image_x, s_image_y;
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int z_image_x, z_image_y;
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_get_image_offset(s_mt, level, 0, slice,
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     &s_image_x, &s_image_y);
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_get_image_offset(z_mt, level, 0, slice,
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     &z_image_x, &z_image_y);
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (uint32_t y = 0; y < map->h; y++) {
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (uint32_t x = 0; x < map->w; x++) {
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    int map_x = map->x + x, map_y = map->y + y;
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ptrdiff_t s_offset = intel_offset_S8(s_mt->region->pitch,
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 map_x + s_image_x,
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 map_y + s_image_y,
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 intel->has_swizzling);
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ptrdiff_t z_offset = ((map_y + z_image_y) * z_mt->region->pitch +
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  (map_x + z_image_x));
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    uint8_t s = s_map[s_offset];
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    uint32_t z = z_map[z_offset];
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (map_z32f_x24s8) {
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       packed_map[(y * map->w + x) * 2 + 0] = z;
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       packed_map[(y * map->w + x) * 2 + 1] = s;
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    } else {
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       packed_map[y * map->w + x] = (s << 24) | (z & 0x00ffffff);
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, s_mt->region);
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, z_mt->region);
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s: %d,%d %dx%d from z mt %p %d,%d, s mt %p %d,%d = %p/%d\n",
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  __FUNCTION__,
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->x, map->y, map->w, map->h,
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  z_mt, map->x + z_image_x, map->y + z_image_y,
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  s_mt, map->x + s_image_x, map->y + s_image_y,
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->ptr, map->stride);
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s: %d,%d %dx%d from mt %p = %p/%d\n", __FUNCTION__,
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->x, map->y, map->w, map->h,
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  mt, map->ptr, map->stride);
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap_depthstencil(struct intel_context *intel,
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct intel_mipmap_tree *mt,
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct intel_miptree_map *map,
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 unsigned int level,
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 unsigned int slice)
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *z_mt = mt;
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_mipmap_tree *s_mt = mt->stencil_mt;
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool map_z32f_x24s8 = mt->format == MESA_FORMAT_Z32_FLOAT;
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (map->mode & GL_MAP_WRITE_BIT) {
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t *packed_map = map->ptr;
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *s_map = intel_region_map(intel, s_mt->region, map->mode);
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t *z_map = intel_region_map(intel, z_mt->region, map->mode);
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int s_image_x, s_image_y;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int z_image_x, z_image_y;
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_get_image_offset(s_mt, level, 0, slice,
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     &s_image_x, &s_image_y);
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_get_image_offset(z_mt, level, 0, slice,
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     &z_image_x, &z_image_y);
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (uint32_t y = 0; y < map->h; y++) {
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (uint32_t x = 0; x < map->w; x++) {
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ptrdiff_t s_offset = intel_offset_S8(s_mt->region->pitch,
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 x + s_image_x + map->x,
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 y + s_image_y + map->y,
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						 intel->has_swizzling);
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ptrdiff_t z_offset = ((y + z_image_y) * z_mt->region->pitch +
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  (x + z_image_x));
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (map_z32f_x24s8) {
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       z_map[z_offset] = packed_map[(y * map->w + x) * 2 + 0];
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       s_map[s_offset] = packed_map[(y * map->w + x) * 2 + 1];
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    } else {
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       uint32_t packed = packed_map[y * map->w + x];
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       s_map[s_offset] = packed >> 24;
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       z_map[z_offset] = packed;
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, s_mt->region);
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_region_unmap(intel, z_mt->region);
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DBG("%s: %d,%d %dx%d from z mt %p (%s) %d,%d, s mt %p %d,%d = %p/%d\n",
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  __FUNCTION__,
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->x, map->y, map->w, map->h,
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  z_mt, _mesa_get_format_name(z_mt->format),
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->x + z_image_x, map->y + z_image_y,
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  s_mt, map->x + s_image_x, map->y + s_image_y,
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  map->ptr, map->stride);
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(map->buffer);
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create and attach a map to the miptree at (level, slice). Return the
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attached map.
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct intel_miptree_map*
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_attach_map(struct intel_mipmap_tree *mt,
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int level,
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int slice,
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int x,
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int y,
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int w,
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int h,
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLbitfield mode)
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_miptree_map *map = calloc(1, sizeof(*map));
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map)
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->level[level].slice[slice].map == NULL);
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->level[level].slice[slice].map = map;
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->mode = mode;
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->x = x;
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->y = y;
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->w = w;
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map->h = h;
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return map;
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Release the map at (level, slice).
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_release_map(struct intel_mipmap_tree *mt,
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int level,
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned int slice)
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_miptree_map **map;
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map = &mt->level[level].slice[slice].map;
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(*map);
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *map = NULL;
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map_singlesample(struct intel_context *intel,
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               struct intel_mipmap_tree *mt,
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               unsigned int level,
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               unsigned int slice,
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               unsigned int x,
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               unsigned int y,
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               unsigned int w,
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               unsigned int h,
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLbitfield mode,
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               void **out_ptr,
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               int *out_stride)
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_miptree_map *map;
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->num_samples <= 1);
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map = intel_miptree_attach_map(mt, level, slice, x, y, w, h, mode);
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map){
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *out_ptr = NULL;
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *out_stride = 0;
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_slice_resolve_depth(intel, mt, level, slice);
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (map->mode & GL_MAP_WRITE_BIT) {
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_slice_set_needs_hiz_resolve(mt, level, slice);
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mt->format == MESA_FORMAT_S8) {
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_map_s8(intel, mt, map, level, slice);
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (mt->wraps_etc1) {
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_map_etc1(intel, mt, map, level, slice);
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (mt->stencil_mt) {
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_map_depthstencil(intel, mt, map, level, slice);
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (intel->has_llc &&
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      !(mode & GL_MAP_WRITE_BIT) &&
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      !mt->compressed &&
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      mt->region->tiling == I915_TILING_X) {
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_map_blit(intel, mt, map, level, slice);
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_map_gtt(intel, mt, map, level, slice);
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *out_ptr = map->ptr;
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *out_stride = map->stride;
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (map->ptr == NULL)
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release_map(mt, level, slice);
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap_singlesample(struct intel_context *intel,
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct intel_mipmap_tree *mt,
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 unsigned int level,
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 unsigned int slice)
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_miptree_map *map = mt->level[level].slice[slice].map;
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->num_samples <= 1);
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map)
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s: mt %p (%s) level %d slice %d\n", __FUNCTION__,
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt, _mesa_get_format_name(mt->format), level, slice);
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mt->format == MESA_FORMAT_S8) {
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_unmap_s8(intel, mt, map, level, slice);
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (mt->wraps_etc1) {
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_unmap_etc1(intel, mt, map, level, slice);
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (mt->stencil_mt) {
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_unmap_depthstencil(intel, mt, map, level, slice);
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (map->bo) {
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_unmap_blit(intel, mt, map, level, slice);
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_unmap_gtt(intel, mt, map, level, slice);
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_release_map(mt, level, slice);
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map_multisample(struct intel_context *intel,
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct intel_mipmap_tree *mt,
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned int level,
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned int slice,
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned int x,
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned int y,
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned int w,
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              unsigned int h,
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLbitfield mode,
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              void **out_ptr,
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              int *out_stride)
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_miptree_map *map;
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->num_samples > 1);
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Only flat, renderbuffer-like miptrees are supported. */
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mt->target != GL_TEXTURE_2D ||
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt->first_level != 0 ||
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt->last_level != 0) {
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(&intel->ctx, "attempt to map a multisample miptree for "
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    "which (target, first_level, last_level != "
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    "(GL_TEXTURE_2D, 0, 0)");
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map = intel_miptree_attach_map(mt, level, slice, x, y, w, h, mode);
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map)
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto fail;
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mt->singlesample_mt) {
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->singlesample_mt =
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         intel_miptree_create_for_renderbuffer(intel,
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               mt->format,
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               mt->singlesample_width0,
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               mt->singlesample_height0,
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               0 /*num_samples*/);
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!mt->singlesample_mt)
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto fail;
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map->singlesample_mt_is_tmp = true;
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->need_downsample = true;
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_downsample(intel, mt);
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_map_singlesample(intel, mt->singlesample_mt,
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  level, slice,
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  x, y, w, h,
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  mode,
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  out_ptr, out_stride);
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return;
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail:
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_release_map(mt, level, slice);
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *out_ptr = NULL;
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *out_stride = 0;
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap_multisample(struct intel_context *intel,
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct intel_mipmap_tree *mt,
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                unsigned int level,
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                unsigned int slice)
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct intel_miptree_map *map = mt->level[level].slice[slice].map;
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(mt->num_samples > 1);
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map)
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_unmap_singlesample(intel, mt->singlesample_mt, level, slice);
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->need_downsample = false;
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (map->mode & GL_MAP_WRITE_BIT)
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_upsample(intel, mt);
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (map->singlesample_mt_is_tmp)
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_release(&mt->singlesample_mt);
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   intel_miptree_release_map(mt, level, slice);
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_map(struct intel_context *intel,
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  struct intel_mipmap_tree *mt,
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned int level,
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned int slice,
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned int x,
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned int y,
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned int w,
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned int h,
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  GLbitfield mode,
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  void **out_ptr,
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  int *out_stride)
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mt->num_samples <= 1)
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_map_singlesample(intel, mt,
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     level, slice,
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     x, y, w, h,
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     mode,
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     out_ptr, out_stride);
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_map_multisample(intel, mt,
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    level, slice,
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    x, y, w, h,
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    mode,
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    out_ptr, out_stride);
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgintel_miptree_unmap(struct intel_context *intel,
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    struct intel_mipmap_tree *mt,
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    unsigned int level,
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    unsigned int slice)
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mt->num_samples <= 1)
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_unmap_singlesample(intel, mt, level, slice);
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_unmap_multisample(intel, mt, level, slice);
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1712