1b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/* 2b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Copyright © 2011 Intel Corporation 3b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * 4b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Permission is hereby granted, free of charge, to any person obtaining a 5b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * copy of this software and associated documentation files (the "Software"), 6b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * to deal in the Software without restriction, including without limitation 7b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * and/or sell copies of the Software, and to permit persons to whom the 9b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Software is furnished to do so, subject to the following conditions: 10b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * 11b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * The above copyright notice and this permission notice (including the next 12b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * paragraph) shall be included in all copies or substantial portions of the 13b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Software. 14b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * 15b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * IN THE SOFTWARE. 22b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */ 23b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "main/mtypes.h" 24b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "main/samplerobj.h" 25b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "program/prog_parameter.h" 26b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 27b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_mipmap_tree.h" 28b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_batchbuffer.h" 29b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_tex.h" 30b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "intel_fbo.h" 31a07cf3397e332388d3599c83e50ac45511972890Eric Anholt#include "intel_buffer_objects.h" 32b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 33b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_context.h" 34b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_state.h" 35b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_defines.h" 36b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke#include "brw_wm.h" 37b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 3842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke/** 3942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke * Convert an swizzle enumeration (i.e. SWIZZLE_X) to one of the Gen7.5+ 4042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke * "Shader Channel Select" enumerations (i.e. HSW_SCS_RED) 4142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke */ 4242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunkestatic unsigned 4342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunkeswizzle_to_scs(GLenum swizzle) 4442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke{ 4542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke switch (swizzle) { 4642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke case SWIZZLE_X: 4742df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke return HSW_SCS_RED; 4842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke case SWIZZLE_Y: 4942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke return HSW_SCS_GREEN; 5042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke case SWIZZLE_Z: 5142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke return HSW_SCS_BLUE; 5242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke case SWIZZLE_W: 5342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke return HSW_SCS_ALPHA; 5442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke case SWIZZLE_ZERO: 5542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke return HSW_SCS_ZERO; 5642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke case SWIZZLE_ONE: 5742df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke return HSW_SCS_ONE; 5842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke } 5942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke 6042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke assert(!"Should not get here: invalid swizzle mode"); 6142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke return HSW_SCS_ZERO; 6242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke} 6342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke 6436e34134184e72532f2e6a2b9438f72284ac3057Paul Berryvoid 65b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_set_surface_tiling(struct gen7_surface_state *surf, uint32_t tiling) 66b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{ 67b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke switch (tiling) { 68b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke case I915_TILING_NONE: 69b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.tiled_surface = 0; 70b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.tile_walk = 0; 71b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke break; 72b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke case I915_TILING_X: 73b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.tiled_surface = 1; 74b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.tile_walk = BRW_TILEWALK_XMAJOR; 75b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke break; 76b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke case I915_TILING_Y: 77b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.tiled_surface = 1; 78b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.tile_walk = BRW_TILEWALK_YMAJOR; 79b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke break; 80b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke } 81b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke} 82b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 8319e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry 8419e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berryvoid 85989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berrygen7_set_surface_msaa(struct gen7_surface_state *surf, unsigned num_samples, 86989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry enum intel_msaa_layout layout) 8719e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry{ 8819e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry if (num_samples > 4) 8919e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry surf->ss4.num_multisamples = GEN7_SURFACE_MULTISAMPLECOUNT_8; 9097fc89c6cbaa3b5ef7f678d2dc2c7d5bbba05315Paul Berry else if (num_samples > 1) 9119e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry surf->ss4.num_multisamples = GEN7_SURFACE_MULTISAMPLECOUNT_4; 9219e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry else 9319e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry surf->ss4.num_multisamples = GEN7_SURFACE_MULTISAMPLECOUNT_1; 94989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry 95989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry surf->ss4.multisampled_surface_storage_format = 96989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry layout == INTEL_MSAA_LAYOUT_IMS ? 97989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry GEN7_SURFACE_MSFMT_DEPTH_STENCIL : 98989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry GEN7_SURFACE_MSFMT_MSS; 9919e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry} 10019e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry 10119e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry 10231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berryvoid 1037b3263af696e504ec68b91b0ce128d46a0691dcePaul Berrygen7_set_surface_mcs_info(struct brw_context *brw, 1047b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry struct gen7_surface_state *surf, 1057b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry uint32_t surf_offset, 1067b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry const struct intel_mipmap_tree *mcs_mt, 1077b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry bool is_render_target) 1087b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry{ 1097b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry /* From the Ivy Bridge PRM, Vol4 Part1 p76, "MCS Base Address": 1107b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry * 1117b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry * "The MCS surface must be stored as Tile Y." 1127b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry */ 1137b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry assert(mcs_mt->region->tiling == I915_TILING_Y); 1147b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry 1157b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry /* Compute the pitch in units of tiles. To do this we need to divide the 1167b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry * pitch in bytes by 128, since a single Y-tile is 128 bytes wide. 1177b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry */ 1187b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry unsigned pitch_bytes = mcs_mt->region->pitch * mcs_mt->cpp; 1197b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry unsigned pitch_tiles = pitch_bytes / 128; 1207b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry 1217b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry /* The upper 20 bits of surface state DWORD 6 are the upper 20 bits of the 1227b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry * GPU address of the MCS buffer; the lower 12 bits contain other control 1237b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry * information. Since buffer addresses are always on 4k boundaries (and 1247b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry * thus have their lower 12 bits zero), we can use an ordinary reloc to do 1257b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry * the necessary address translation. 1267b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry */ 1277b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry assert ((mcs_mt->region->bo->offset & 0xfff) == 0); 1287b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry surf->ss6.mcs_enabled.mcs_enable = 1; 1297b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry surf->ss6.mcs_enabled.mcs_surface_pitch = pitch_tiles - 1; 1307b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry surf->ss6.mcs_enabled.mcs_base_address = mcs_mt->region->bo->offset >> 12; 1317b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry drm_intel_bo_emit_reloc(brw->intel.batch.bo, 1327b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry surf_offset + 1337b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry offsetof(struct gen7_surface_state, ss6), 1347b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry mcs_mt->region->bo, 1357b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry surf->ss6.raw_data & 0xfff, 1367b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry is_render_target ? I915_GEM_DOMAIN_RENDER 1377b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry : I915_GEM_DOMAIN_SAMPLER, 1387b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry is_render_target ? I915_GEM_DOMAIN_RENDER : 0); 1397b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry} 1407b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry 1417b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry 1427b3263af696e504ec68b91b0ce128d46a0691dcePaul Berryvoid 14331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berrygen7_check_surface_setup(struct gen7_surface_state *surf, 14431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry bool is_render_target) 14531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry{ 14631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry bool is_multisampled = 14731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry surf->ss4.num_multisamples != GEN7_SURFACE_MULTISAMPLECOUNT_1; 14831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State > 14931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Surface Array 15031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * Spacing: 15131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 15231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * If Multisampled Surface Storage Format is MSFMT_MSS and Number of 15331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * Multisamples is not MULTISAMPLECOUNT_1, this field must be set to 15431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * ARYSPC_LOD0. 15531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry */ 15631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry if (surf->ss4.multisampled_surface_storage_format == GEN7_SURFACE_MSFMT_MSS 15731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry && is_multisampled) 15831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry assert(surf->ss0.surface_array_spacing == GEN7_SURFACE_ARYSPC_LOD0); 15931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 16031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State > 16131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Multisampled 16231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * Surface Storage Format: 16331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 16431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * All multisampled render target surfaces must have this field set to 16531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * MSFMT_MSS. 16631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 16731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * But also: 16831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 16931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * This field is ignored if Number of Multisamples is MULTISAMPLECOUNT_1. 17031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry */ 17131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry if (is_render_target && is_multisampled) { 17231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry assert(surf->ss4.multisampled_surface_storage_format == 17331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry GEN7_SURFACE_MSFMT_MSS); 17431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry } 17531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 17631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State > 17731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Multisampled 17831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * Surface Storage Format: 17931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 18031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * If the surface’s Number of Multisamples is MULTISAMPLECOUNT_8, Width 18131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * is >= 8192 (meaning the actual surface width is >= 8193 pixels), this 18231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * field must be set to MSFMT_MSS. 18331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry */ 18431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry if (surf->ss4.num_multisamples == GEN7_SURFACE_MULTISAMPLECOUNT_8 && 18531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry surf->ss2.width >= 8192) { 18631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry assert(surf->ss4.multisampled_surface_storage_format == 18731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry GEN7_SURFACE_MSFMT_MSS); 18831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry } 18931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 19031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry /* From the Graphics BSpec: vol5c Shared Functions [SNB+] > State > 19131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * SURFACE_STATE > SURFACE_STATE for most messages [DevIVB]: Multisampled 19231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * Surface Storage Format: 19331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 19431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * If the surface’s Number of Multisamples is MULTISAMPLECOUNT_8, 19531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * ((Depth+1) * (Height+1)) is > 4,194,304, OR if the surface’s Number of 19631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * Multisamples is MULTISAMPLECOUNT_4, ((Depth+1) * (Height+1)) is > 19731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 8,388,608, this field must be set to MSFMT_DEPTH_STENCIL.This field 19831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * must be set to MSFMT_DEPTH_STENCIL if Surface Format is one of the 19931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * following: I24X8_UNORM, L24X8_UNORM, A24X8_UNORM, or 20031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * R24_UNORM_X8_TYPELESS. 20131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 20231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * But also: 20331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * 20431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry * This field is ignored if Number of Multisamples is MULTISAMPLECOUNT_1. 20531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry */ 20631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry uint32_t depth = surf->ss3.depth + 1; 20731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry uint32_t height = surf->ss2.height + 1; 20831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry if (surf->ss4.num_multisamples == GEN7_SURFACE_MULTISAMPLECOUNT_8 && 20931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry depth * height > 4194304) { 21031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry assert(surf->ss4.multisampled_surface_storage_format == 21131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry GEN7_SURFACE_MSFMT_DEPTH_STENCIL); 21231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry } 21331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry if (surf->ss4.num_multisamples == GEN7_SURFACE_MULTISAMPLECOUNT_4 && 21431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry depth * height > 8388608) { 21531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry assert(surf->ss4.multisampled_surface_storage_format == 21631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry GEN7_SURFACE_MSFMT_DEPTH_STENCIL); 21731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry } 21831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry if (is_multisampled) { 21931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry switch (surf->ss0.surface_format) { 22031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry case BRW_SURFACEFORMAT_I24X8_UNORM: 22131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry case BRW_SURFACEFORMAT_L24X8_UNORM: 22231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry case BRW_SURFACEFORMAT_A24X8_UNORM: 22331f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry case BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS: 22431f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry assert(surf->ss4.multisampled_surface_storage_format == 22531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry GEN7_SURFACE_MSFMT_DEPTH_STENCIL); 22631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry } 22731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry } 22831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry} 22931f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 23031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 231b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void 23228fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunkegen7_update_buffer_texture_surface(struct gl_context *ctx, 23328fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke unsigned unit, 23428fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke uint32_t *binding_table, 23528fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke unsigned surf_index) 236a07cf3397e332388d3599c83e50ac45511972890Eric Anholt{ 237a07cf3397e332388d3599c83e50ac45511972890Eric Anholt struct brw_context *brw = brw_context(ctx); 238a07cf3397e332388d3599c83e50ac45511972890Eric Anholt struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current; 239a07cf3397e332388d3599c83e50ac45511972890Eric Anholt struct gen7_surface_state *surf; 240a07cf3397e332388d3599c83e50ac45511972890Eric Anholt struct intel_buffer_object *intel_obj = 241a07cf3397e332388d3599c83e50ac45511972890Eric Anholt intel_buffer_object(tObj->BufferObject); 242a07cf3397e332388d3599c83e50ac45511972890Eric Anholt drm_intel_bo *bo = intel_obj ? intel_obj->buffer : NULL; 243a07cf3397e332388d3599c83e50ac45511972890Eric Anholt gl_format format = tObj->_BufferObjectFormat; 244a07cf3397e332388d3599c83e50ac45511972890Eric Anholt int texel_size = _mesa_get_format_bytes(format); 245a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 246a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 24728fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke sizeof(*surf), 32, &binding_table[surf_index]); 248a07cf3397e332388d3599c83e50ac45511972890Eric Anholt memset(surf, 0, sizeof(*surf)); 249a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 250a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss0.surface_type = BRW_SURFACE_BUFFER; 251a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss0.surface_format = brw_format_for_mesa_format(format); 252a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 253a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss0.render_cache_read_write = 1; 254a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 255a07cf3397e332388d3599c83e50ac45511972890Eric Anholt if (surf->ss0.surface_format == 0 && format != MESA_FORMAT_RGBA_FLOAT32) { 256a07cf3397e332388d3599c83e50ac45511972890Eric Anholt _mesa_problem(NULL, "bad format %s for texture buffer\n", 257a07cf3397e332388d3599c83e50ac45511972890Eric Anholt _mesa_get_format_name(format)); 258a07cf3397e332388d3599c83e50ac45511972890Eric Anholt } 259a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 260a07cf3397e332388d3599c83e50ac45511972890Eric Anholt if (bo) { 261a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss1.base_addr = bo->offset; /* reloc */ 262a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 263a07cf3397e332388d3599c83e50ac45511972890Eric Anholt /* Emit relocation to surface contents. Section 5.1.1 of the gen4 264a07cf3397e332388d3599c83e50ac45511972890Eric Anholt * bspec ("Data Cache") says that the data cache does not exist as 265a07cf3397e332388d3599c83e50ac45511972890Eric Anholt * a separate cache and is just the sampler cache. 266a07cf3397e332388d3599c83e50ac45511972890Eric Anholt */ 267a07cf3397e332388d3599c83e50ac45511972890Eric Anholt drm_intel_bo_emit_reloc(brw->intel.batch.bo, 26828fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke (binding_table[surf_index] + 269a07cf3397e332388d3599c83e50ac45511972890Eric Anholt offsetof(struct gen7_surface_state, ss1)), 270a07cf3397e332388d3599c83e50ac45511972890Eric Anholt bo, 0, 271a07cf3397e332388d3599c83e50ac45511972890Eric Anholt I915_GEM_DOMAIN_SAMPLER, 0); 272a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 273a07cf3397e332388d3599c83e50ac45511972890Eric Anholt int w = intel_obj->Base.Size / texel_size; 274a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss2.width = w & 0x7f; /* bits 6:0 of size or width */ 275a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss2.height = (w >> 7) & 0x1fff; /* bits 19:7 of size or width */ 276a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss3.depth = (w >> 20) & 0x7f; /* bits 26:20 of size or width */ 277a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss3.pitch = texel_size - 1; 278a07cf3397e332388d3599c83e50ac45511972890Eric Anholt} else { 279a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss1.base_addr = 0; 280a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss2.width = 0; 281a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss2.height = 0; 282a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss3.depth = 0; 283a07cf3397e332388d3599c83e50ac45511972890Eric Anholt surf->ss3.pitch = 0; 284a07cf3397e332388d3599c83e50ac45511972890Eric Anholt } 285a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 286a07cf3397e332388d3599c83e50ac45511972890Eric Anholt gen7_set_surface_tiling(surf, I915_TILING_NONE); 28731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 28831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry gen7_check_surface_setup(surf, false /* is_render_target */); 289a07cf3397e332388d3599c83e50ac45511972890Eric Anholt} 290a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 291a07cf3397e332388d3599c83e50ac45511972890Eric Anholtstatic void 29228fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunkegen7_update_texture_surface(struct gl_context *ctx, 29328fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke unsigned unit, 29428fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke uint32_t *binding_table, 29528fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke unsigned surf_index) 296b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{ 297b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct brw_context *brw = brw_context(ctx); 298b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current; 299b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct intel_texture_object *intelObj = intel_texture_object(tObj); 3006781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke struct intel_mipmap_tree *mt = intelObj->mt; 301b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel]; 302b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit); 303b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gen7_surface_state *surf; 304fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt int width, height, depth; 305fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt 306a07cf3397e332388d3599c83e50ac45511972890Eric Anholt if (tObj->Target == GL_TEXTURE_BUFFER) { 30728fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke gen7_update_buffer_texture_surface(ctx, unit, binding_table, surf_index); 308a07cf3397e332388d3599c83e50ac45511972890Eric Anholt return; 309a07cf3397e332388d3599c83e50ac45511972890Eric Anholt } 310a07cf3397e332388d3599c83e50ac45511972890Eric Anholt 311455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry /* We don't support MSAA for textures. */ 312455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry assert(!mt->array_spacing_lod0); 31397fc89c6cbaa3b5ef7f678d2dc2c7d5bbba05315Paul Berry assert(mt->num_samples <= 1); 314455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry 315fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth); 316b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 317d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 31828fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke sizeof(*surf), 32, &binding_table[surf_index]); 319b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke memset(surf, 0, sizeof(*surf)); 320b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 3216781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke if (mt->align_h == 4) 3226781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke surf->ss0.vertical_alignment = 1; 323f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt if (mt->align_w == 8) 324f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt surf->ss0.horizontal_alignment = 1; 3256781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke 326b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.surface_type = translate_tex_target(tObj->Target); 327e71fc6a8200cd78037a9788230ec0cc9f451a4b1Eric Anholt surf->ss0.surface_format = translate_tex_format(mt->format, 328b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke firstImage->InternalFormat, 329c37efbfe4c415b6fd2d4f968220d7c9b62f11ecfPauli Nieminen tObj->DepthMode, 330b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke sampler->sRGBDecode); 331b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke if (tObj->Target == GL_TEXTURE_CUBE_MAP) { 332b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.cube_pos_x = 1; 333b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.cube_pos_y = 1; 334b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.cube_pos_z = 1; 335b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.cube_neg_x = 1; 336b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.cube_neg_y = 1; 337b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.cube_neg_z = 1; 338b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke } 339b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 3404273943a07bb577f91972b64232d394c1197c564Kenneth Graunke surf->ss0.is_array = depth > 1 && tObj->Target != GL_TEXTURE_3D; 3414273943a07bb577f91972b64232d394c1197c564Kenneth Graunke 342b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke gen7_set_surface_tiling(surf, intelObj->mt->region->tiling); 343b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 344b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke /* ss0 remaining fields: 345b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * - vert_line_stride (exists on gen6 but we ignore it) 346b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * - vert_line_stride_ofs (exists on gen6 but we ignore it) 347b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * - surface_array_spacing 348b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * - render_cache_read_write (exists on gen6 but ignored here) 349b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */ 350b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 35102ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg surf->ss1.base_addr = 35202ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg intelObj->mt->region->bo->offset + intelObj->mt->offset; /* reloc */ 353b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 354fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt surf->ss2.width = width - 1; 355fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt surf->ss2.height = height - 1; 356b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 357b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss3.pitch = (intelObj->mt->region->pitch * intelObj->mt->cpp) - 1; 358fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt surf->ss3.depth = depth - 1; 359b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 360b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke /* ss4: ignored? */ 361b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 362b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss5.mip_count = intelObj->_MaxLevel - tObj->BaseLevel; 363b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss5.min_lod = 0; 364b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 365b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke /* ss5 remaining fields: 366b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * - x_offset (N/A for textures?) 367b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * - y_offset (ditto) 368b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * - cache_control 369b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */ 370b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 3714848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke if (brw->intel.is_haswell) { 37242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke /* Handling GL_ALPHA as a surface format override breaks 1.30+ style 37342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke * texturing functions that return a float, as our code generation always 37442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke * selects the .x channel (which would always be 0). 37542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke */ 37642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke const bool alpha_depth = tObj->DepthMode == GL_ALPHA && 37742df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke (firstImage->_BaseFormat == GL_DEPTH_COMPONENT || 37842df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke firstImage->_BaseFormat == GL_DEPTH_STENCIL); 37942df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke 38042df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke const int swizzle = 38142df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke unlikely(alpha_depth) ? SWIZZLE_XYZW : brw_get_texture_swizzle(tObj); 38242df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke 38342df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke surf->ss7.shader_channel_select_r = swizzle_to_scs(GET_SWZ(swizzle, 0)); 38442df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke surf->ss7.shader_channel_select_g = swizzle_to_scs(GET_SWZ(swizzle, 1)); 38542df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke surf->ss7.shader_channel_select_b = swizzle_to_scs(GET_SWZ(swizzle, 2)); 38642df904f88a3515bf8bea5c1228380714c9146fbKenneth Graunke surf->ss7.shader_channel_select_a = swizzle_to_scs(GET_SWZ(swizzle, 3)); 3874848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke } 3884848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke 389b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke /* Emit relocation to surface contents */ 390b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke drm_intel_bo_emit_reloc(brw->intel.batch.bo, 39128fab4295e9631ca91c5ebdf26d1bee23011d57eKenneth Graunke binding_table[surf_index] + 392b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke offsetof(struct gen7_surface_state, ss1), 39302ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg intelObj->mt->region->bo, intelObj->mt->offset, 394b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke I915_GEM_DOMAIN_SAMPLER, 0); 39531f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 39631f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry gen7_check_surface_setup(surf, false /* is_render_target */); 397b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke} 398b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 399b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/** 400b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Create the constant buffer surface. Vertex/fragment shader constants will 401b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * be read from this buffer with Data Port Read instructions/messages. 402b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */ 4034ef8464068bc96ea9af71bbd18d121358db303b2Kenneth Graunkevoid 404b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_create_constant_surface(struct brw_context *brw, 405b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke drm_intel_bo *bo, 4065bffbd7ba2ba2ff21469b2a69a0ed67f0802fec7Eric Anholt uint32_t offset, 407b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke int width, 408b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke uint32_t *out_offset) 409b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{ 410b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke const GLint w = width - 1; 411b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gen7_surface_state *surf; 412b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 413d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 414d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt sizeof(*surf), 32, out_offset); 415b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke memset(surf, 0, sizeof(*surf)); 416b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 417b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.surface_type = BRW_SURFACE_BUFFER; 418b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.surface_format = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT; 419b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 420b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.render_cache_read_write = 1; 421b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 422b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke assert(bo); 4235bffbd7ba2ba2ff21469b2a69a0ed67f0802fec7Eric Anholt surf->ss1.base_addr = bo->offset + offset; /* reloc */ 424b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 425b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss2.width = w & 0x7f; /* bits 6:0 of size or width */ 426b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss2.height = (w >> 7) & 0x1fff; /* bits 19:7 of size or width */ 427b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss3.depth = (w >> 20) & 0x7f; /* bits 26:20 of size or width */ 428aa8ce1be4a30e7c8224af52f83f1e50d251b01d4Eric Anholt surf->ss3.pitch = (16 - 1); /* stride between samples */ 429b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke gen7_set_surface_tiling(surf, I915_TILING_NONE); /* tiling now allowed */ 430b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 4314848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke if (brw->intel.is_haswell) { 432cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_r = HSW_SCS_RED; 433cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_g = HSW_SCS_GREEN; 434cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_b = HSW_SCS_BLUE; 435cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_a = HSW_SCS_ALPHA; 4364848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke } 4374848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke 438b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke /* Emit relocation to surface contents. Section 5.1.1 of the gen4 439b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * bspec ("Data Cache") says that the data cache does not exist as 440b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * a separate cache and is just the sampler cache. 441b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */ 442b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke drm_intel_bo_emit_reloc(brw->intel.batch.bo, 443b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke (*out_offset + 444b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke offsetof(struct gen7_surface_state, ss1)), 4455bffbd7ba2ba2ff21469b2a69a0ed67f0802fec7Eric Anholt bo, offset, 446b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke I915_GEM_DOMAIN_SAMPLER, 0); 44731f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 44831f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry gen7_check_surface_setup(surf, false /* is_render_target */); 449b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke} 450b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 451b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void 452b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_null_renderbuffer_surface(struct brw_context *brw, unsigned unit) 453b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{ 4540aeb87023e64807734aee323e76f81796d525a36Paul Berry /* From the Ivy bridge PRM, Vol4 Part1 p62 (Surface Type: Programming 4550aeb87023e64807734aee323e76f81796d525a36Paul Berry * Notes): 4560aeb87023e64807734aee323e76f81796d525a36Paul Berry * 4570aeb87023e64807734aee323e76f81796d525a36Paul Berry * A null surface is used in instances where an actual surface is not 4580aeb87023e64807734aee323e76f81796d525a36Paul Berry * bound. When a write message is generated to a null surface, no 4590aeb87023e64807734aee323e76f81796d525a36Paul Berry * actual surface is written to. When a read message (including any 4600aeb87023e64807734aee323e76f81796d525a36Paul Berry * sampling engine message) is generated to a null surface, the result 4610aeb87023e64807734aee323e76f81796d525a36Paul Berry * is all zeros. Note that a null surface type is allowed to be used 4620aeb87023e64807734aee323e76f81796d525a36Paul Berry * with all messages, even if it is not specificially indicated as 4630aeb87023e64807734aee323e76f81796d525a36Paul Berry * supported. All of the remaining fields in surface state are ignored 4640aeb87023e64807734aee323e76f81796d525a36Paul Berry * for null surfaces, with the following exceptions: Width, Height, 4650aeb87023e64807734aee323e76f81796d525a36Paul Berry * Depth, LOD, and Render Target View Extent fields must match the 4660aeb87023e64807734aee323e76f81796d525a36Paul Berry * depth buffer’s corresponding state for all render target surfaces, 4670aeb87023e64807734aee323e76f81796d525a36Paul Berry * including null. 4680aeb87023e64807734aee323e76f81796d525a36Paul Berry */ 4690aeb87023e64807734aee323e76f81796d525a36Paul Berry struct intel_context *intel = &brw->intel; 4700aeb87023e64807734aee323e76f81796d525a36Paul Berry struct gl_context *ctx = &intel->ctx; 471b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gen7_surface_state *surf; 472b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 4730aeb87023e64807734aee323e76f81796d525a36Paul Berry /* _NEW_BUFFERS */ 4740aeb87023e64807734aee323e76f81796d525a36Paul Berry const struct gl_framebuffer *fb = ctx->DrawBuffer; 4750aeb87023e64807734aee323e76f81796d525a36Paul Berry 476d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 4775a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt sizeof(*surf), 32, &brw->wm.surf_offset[unit]); 478b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke memset(surf, 0, sizeof(*surf)); 479b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 480b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.surface_type = BRW_SURFACE_NULL; 481b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; 48231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 4830aeb87023e64807734aee323e76f81796d525a36Paul Berry surf->ss2.width = fb->Width - 1; 4840aeb87023e64807734aee323e76f81796d525a36Paul Berry surf->ss2.height = fb->Height - 1; 4850aeb87023e64807734aee323e76f81796d525a36Paul Berry 4860aeb87023e64807734aee323e76f81796d525a36Paul Berry /* From the Ivy bridge PRM, Vol4 Part1 p65 (Tiled Surface: Programming Notes): 4870aeb87023e64807734aee323e76f81796d525a36Paul Berry * 4880aeb87023e64807734aee323e76f81796d525a36Paul Berry * If Surface Type is SURFTYPE_NULL, this field must be TRUE. 4890aeb87023e64807734aee323e76f81796d525a36Paul Berry */ 4900aeb87023e64807734aee323e76f81796d525a36Paul Berry gen7_set_surface_tiling(surf, I915_TILING_Y); 4910aeb87023e64807734aee323e76f81796d525a36Paul Berry 49231f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry gen7_check_surface_setup(surf, true /* is_render_target */); 493b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke} 494b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 495b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke/** 496b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * Sets up a surface state structure to point at the given region. 497b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * While it is only used for the front/back buffer currently, it should be 498b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke * usable for further buffers when doing ARB_draw_buffer support. 499b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke */ 500b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkestatic void 501b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunkegen7_update_renderbuffer_surface(struct brw_context *brw, 502b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gl_renderbuffer *rb, 503b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke unsigned int unit) 504b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke{ 505b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct intel_context *intel = &brw->intel; 506b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gl_context *ctx = &intel->ctx; 507b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct intel_renderbuffer *irb = intel_renderbuffer(rb); 508da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace struct intel_region *region = irb->mt->region; 509b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke struct gen7_surface_state *surf; 5105e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke uint32_t tile_x, tile_y; 511924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul gl_format rb_format = intel_rb_format(irb); 512b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 513d375df220fae47f38944c4832bcbd5f5d568884cEric Anholt surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, 5145a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt sizeof(*surf), 32, &brw->wm.surf_offset[unit]); 515b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke memset(surf, 0, sizeof(*surf)); 516b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 5171bd4d456cdecf7bea55f4e3dac574af54efad994Paul Berry /* Render targets can't use IMS layout */ 5181bd4d456cdecf7bea55f4e3dac574af54efad994Paul Berry assert(irb->mt->msaa_layout != INTEL_MSAA_LAYOUT_IMS); 519455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry 5206781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke if (irb->mt->align_h == 4) 5216781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke surf->ss0.vertical_alignment = 1; 522f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt if (irb->mt->align_w == 8) 523f0d5c92a4c9d5057d727819e501d80c5dfcdf76eEric Anholt surf->ss0.horizontal_alignment = 1; 5246781fd05e9ea2ba45a615dacafca57291a220bb0Kenneth Graunke 525924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul switch (rb_format) { 526b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke case MESA_FORMAT_SARGB8: 527fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt /* _NEW_BUFFERS 528fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt * 529fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt * Without GL_EXT_framebuffer_sRGB we shouldn't bind sRGB surfaces to the 530fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt * blend/update as sRGB. 531fcd57280ae687d6b7c11cb8ac8fb8cc4f01a646dEric Anholt */ 532b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke if (ctx->Color.sRGBEnabled) 533924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul surf->ss0.surface_format = brw_format_for_mesa_format(rb_format); 534b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke else 535b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM; 536b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke break; 537b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke default: 538796f44d77906342e5912e7da6bdba1ba86bab9f0Eric Anholt assert(brw_render_target_supported(intel, rb)); 539924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul surf->ss0.surface_format = brw->render_target_format[rb_format]; 540924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul if (unlikely(!brw->format_supported_as_render_target[rb_format])) { 541ca10b2d4494798405a5fd654201291944645af5dEric Anholt _mesa_problem(ctx, "%s: renderbuffer format %s unsupported\n", 542924de7dc96f4607cb3d833637b5f69f4b9e2a6d0Brian Paul __FUNCTION__, _mesa_get_format_name(rb_format)); 543ca10b2d4494798405a5fd654201291944645af5dEric Anholt } 544ca10b2d4494798405a5fd654201291944645af5dEric Anholt break; 545b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke } 546b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 547b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss0.surface_type = BRW_SURFACE_2D; 548455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry surf->ss0.surface_array_spacing = irb->mt->array_spacing_lod0 ? 549455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry GEN7_SURFACE_ARYSPC_LOD0 : GEN7_SURFACE_ARYSPC_FULL; 550455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry 5515e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke /* reloc */ 552b17aab5753a6d14c9e757bedb186963b2dae8823Eric Anholt surf->ss1.base_addr = intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y); 5538004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt surf->ss1.base_addr += region->bo->offset; /* reloc */ 554b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 5555e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke assert(brw->has_surface_tile_offset); 5565e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke /* Note that the low bits of these fields are missing, so 5575e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke * there's the possibility of getting in trouble. 5585e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke */ 5595e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke assert(tile_x % 4 == 0); 5605e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke assert(tile_y % 2 == 0); 5615e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke surf->ss5.x_offset = tile_x / 4; 5625e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke surf->ss5.y_offset = tile_y / 2; 5635e48560926d43dfa8fbc148d0f1f6a3063fede48Kenneth Graunke 564b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss2.width = rb->Width - 1; 565b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss2.height = rb->Height - 1; 566b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke gen7_set_surface_tiling(surf, region->tiling); 567b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke surf->ss3.pitch = (region->pitch * region->cpp) - 1; 568b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 569989218b9801f0afd0cbadce19a5719b0aa0deb70Paul Berry gen7_set_surface_msaa(surf, irb->mt->num_samples, irb->mt->msaa_layout); 57019e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry 5717b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry if (irb->mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) { 5727b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry gen7_set_surface_mcs_info(brw, surf, brw->wm.surf_offset[unit], 5737b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry irb->mt->mcs_mt, true /* is_render_target */); 5747b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry } 5757b3263af696e504ec68b91b0ce128d46a0691dcePaul Berry 5764848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke if (intel->is_haswell) { 577cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_r = HSW_SCS_RED; 578cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_g = HSW_SCS_GREEN; 579cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_b = HSW_SCS_BLUE; 580cbcf750d5f2c4695c39766938b4cd9d8942d850bKenneth Graunke surf->ss7.shader_channel_select_a = HSW_SCS_ALPHA; 5814848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke } 5824848122a96a46d6725cbfe92041459d11aea70fcKenneth Graunke 583b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke drm_intel_bo_emit_reloc(brw->intel.batch.bo, 5845a7942c2f1e3af4daedd92c1ddf21fa6a0e4e752Eric Anholt brw->wm.surf_offset[unit] + 585b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke offsetof(struct gen7_surface_state, ss1), 5868004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt region->bo, 5878004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt surf->ss1.base_addr - region->bo->offset, 588b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke I915_GEM_DOMAIN_RENDER, 589b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke I915_GEM_DOMAIN_RENDER); 59031f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry 59131f3dfd59b6687214402c395ee03e7498fd6c79aPaul Berry gen7_check_surface_setup(surf, true /* is_render_target */); 592b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke} 593b2b6cc662271d611462532222ef2fcc30042bd0fKenneth Graunke 5945d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkevoid 5955d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunkegen7_init_vtable_surface_functions(struct brw_context *brw) 5965d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke{ 5975d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke struct intel_context *intel = &brw->intel; 5985d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke 5995d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke intel->vtbl.update_texture_surface = gen7_update_texture_surface; 6005d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke intel->vtbl.update_renderbuffer_surface = gen7_update_renderbuffer_surface; 6015d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke intel->vtbl.update_null_renderbuffer_surface = 6025d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke gen7_update_null_renderbuffer_surface; 6035d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke intel->vtbl.create_constant_surface = gen7_create_constant_surface; 6045d448b42b7143a1a38911b23d94b5c5d5bfa79f0Kenneth Graunke} 605