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