1e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák/* 2e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * Copyright © 2011 Red Hat All Rights Reserved. 3e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * Copyright © 2014 Advanced Micro Devices, Inc. 4e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * All Rights Reserved. 5e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * 6e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining 7e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * a copy of this software and associated documentation files (the 8e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * "Software"), to deal in the Software without restriction, including 9e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * without limitation the rights to use, copy, modify, merge, publish, 10e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * distribute, sub license, and/or sell copies of the Software, and to 11e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * permit persons to whom the Software is furnished to do so, subject to 12e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * the following conditions: 13e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * 14e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 16e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS 18e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * USE OR OTHER DEALINGS IN THE SOFTWARE. 22e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * 23e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * The above copyright notice and this permission notice (including the 24e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * next paragraph) shall be included in all copies or substantial portions 25e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * of the Software. 26e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák */ 27e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 28e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák/* Contact: 29e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * Marek Olšák <maraeo@gmail.com> 30e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák */ 31e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 32e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák#include "amdgpu_winsys.h" 33e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák#include "util/u_format.h" 34e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 35e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák#ifndef CIASICIDGFXENGINE_SOUTHERNISLAND 36e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák#define CIASICIDGFXENGINE_SOUTHERNISLAND 0x0000000A 37e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák#endif 38e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 39e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 40e9590d9092fbcd551f5597149c64016b6f861233Marek Olšákstatic int amdgpu_surface_sanity(const struct pipe_resource *tex) 41e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák{ 42e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* all dimension must be at least 1 ! */ 43e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (!tex->width0 || !tex->height0 || !tex->depth0 || 44e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák !tex->array_size) 45e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 46e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 47e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák switch (tex->nr_samples) { 48e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case 0: 49e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case 1: 50e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case 2: 51e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case 4: 52e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case 8: 53e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 54e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák default: 55e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 56e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 57e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 58e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák switch (tex->target) { 59e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_1D: 60e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->height0 > 1) 61e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 62e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* fall through */ 63e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_2D: 64e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_RECT: 65e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->depth0 > 1 || tex->array_size > 1) 66e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 67e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 68e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_3D: 69e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->array_size > 1) 70e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 71e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 72e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_1D_ARRAY: 73e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->height0 > 1) 74e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 75e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* fall through */ 76e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_CUBE: 77e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_2D_ARRAY: 78e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák case PIPE_TEXTURE_CUBE_ARRAY: 79e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->depth0 > 1) 80e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 81e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 82e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák default: 83e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return -EINVAL; 84e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 85e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return 0; 86e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák} 87e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 88e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšákstatic void *ADDR_API allocSysMem(const ADDR_ALLOCSYSMEM_INPUT * pInput) 89e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák{ 90e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return malloc(pInput->sizeInBytes); 91e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák} 92e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 93e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšákstatic ADDR_E_RETURNCODE ADDR_API freeSysMem(const ADDR_FREESYSMEM_INPUT * pInput) 94e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák{ 95e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák free(pInput->pVirtAddr); 96e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return ADDR_OK; 97e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák} 98e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 99e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek OlšákADDR_HANDLE amdgpu_addr_create(struct amdgpu_winsys *ws) 100e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák{ 101e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_CREATE_INPUT addrCreateInput = {0}; 102e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_CREATE_OUTPUT addrCreateOutput = {0}; 103e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_REGISTER_VALUE regValue = {0}; 104e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_CREATE_FLAGS createFlags = {{0}}; 105e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_E_RETURNCODE addrRet; 106e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 107e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.size = sizeof(ADDR_CREATE_INPUT); 108e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateOutput.size = sizeof(ADDR_CREATE_OUTPUT); 109e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 110e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák regValue.noOfBanks = ws->amdinfo.mc_arb_ramcfg & 0x3; 111e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák regValue.gbAddrConfig = ws->amdinfo.gb_addr_cfg; 112e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák regValue.noOfRanks = (ws->amdinfo.mc_arb_ramcfg & 0x4) >> 2; 113e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 114e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák regValue.backendDisables = ws->amdinfo.backend_disable[0]; 115e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák regValue.pTileConfig = ws->amdinfo.gb_tile_mode; 1163edae10601daed11be227e5634f7bdf09bafcbacEdward O'Callaghan regValue.noOfEntries = ARRAY_SIZE(ws->amdinfo.gb_tile_mode); 11797b55243fbea9b5d0e76217e986e85b96fd09f93Ronie Salgado if (ws->info.chip_class == SI) { 11897b55243fbea9b5d0e76217e986e85b96fd09f93Ronie Salgado regValue.pMacroTileConfig = NULL; 11997b55243fbea9b5d0e76217e986e85b96fd09f93Ronie Salgado regValue.noOfMacroEntries = 0; 12097b55243fbea9b5d0e76217e986e85b96fd09f93Ronie Salgado } else { 12197b55243fbea9b5d0e76217e986e85b96fd09f93Ronie Salgado regValue.pMacroTileConfig = ws->amdinfo.gb_macro_tile_mode; 12297b55243fbea9b5d0e76217e986e85b96fd09f93Ronie Salgado regValue.noOfMacroEntries = ARRAY_SIZE(ws->amdinfo.gb_macro_tile_mode); 12397b55243fbea9b5d0e76217e986e85b96fd09f93Ronie Salgado } 124e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 125e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák createFlags.value = 0; 126e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák createFlags.useTileIndex = 1; 127e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák createFlags.degradeBaseLevel = 1; 128d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák createFlags.useHtileSliceAlign = 1; 129e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 130e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.chipEngine = CIASICIDGFXENGINE_SOUTHERNISLAND; 131e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.chipFamily = ws->family; 132e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.chipRevision = ws->rev_id; 133e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.createFlags = createFlags; 134e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.callbacks.allocSysMem = allocSysMem; 135e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.callbacks.freeSysMem = freeSysMem; 136e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.callbacks.debugPrint = 0; 137e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrCreateInput.regValue = regValue; 138e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 139e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák addrRet = AddrCreate(&addrCreateInput, &addrCreateOutput); 140e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (addrRet != ADDR_OK) 141e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return NULL; 142e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 143e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return addrCreateOutput.hLib; 144e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák} 145e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 146e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšákstatic int compute_level(struct amdgpu_winsys *ws, 147e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák const struct pipe_resource *tex, 148e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák struct radeon_surf *surf, bool is_stencil, 149e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák unsigned level, bool compressed, 150e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_COMPUTE_SURFACE_INFO_INPUT *AddrSurfInfoIn, 151afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen ADDR_COMPUTE_SURFACE_INFO_OUTPUT *AddrSurfInfoOut, 152afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen ADDR_COMPUTE_DCCINFO_INPUT *AddrDccIn, 153d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák ADDR_COMPUTE_DCCINFO_OUTPUT *AddrDccOut, 154d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák ADDR_COMPUTE_HTILE_INFO_INPUT *AddrHtileIn, 155d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák ADDR_COMPUTE_HTILE_INFO_OUTPUT *AddrHtileOut) 156e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák{ 157e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák struct radeon_surf_level *surf_level; 158e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_E_RETURNCODE ret; 159e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 160e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn->mipLevel = level; 161e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn->width = u_minify(tex->width0, level); 162e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn->height = u_minify(tex->height0, level); 163e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 164e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->target == PIPE_TEXTURE_3D) 165e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn->numSlices = u_minify(tex->depth0, level); 166e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák else if (tex->target == PIPE_TEXTURE_CUBE) 167e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn->numSlices = 6; 168e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák else 169e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn->numSlices = tex->array_size; 170e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 171e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (level > 0) { 172e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* Set the base level pitch. This is needed for calculation 173e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * of non-zero levels. */ 174e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (is_stencil) 175e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn->basePitch = surf->stencil_level[0].nblk_x; 176e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák else 177e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn->basePitch = surf->level[0].nblk_x; 178e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 179e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* Convert blocks to pixels for compressed formats. */ 180e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (compressed) 181e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn->basePitch *= surf->blk_w; 182e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 183e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 184e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ret = AddrComputeSurfaceInfo(ws->addrlib, 185e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn, 186e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoOut); 187e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (ret != ADDR_OK) { 188e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return ret; 189e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 190e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 191e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf_level = is_stencil ? &surf->stencil_level[level] : &surf->level[level]; 1922a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák surf_level->offset = align64(surf->surf_size, AddrSurfInfoOut->baseAlign); 193e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf_level->slice_size = AddrSurfInfoOut->sliceSize; 194e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf_level->nblk_x = AddrSurfInfoOut->pitch; 195e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf_level->nblk_y = AddrSurfInfoOut->height; 196e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 197e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák switch (AddrSurfInfoOut->tileMode) { 198e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case ADDR_TM_LINEAR_ALIGNED: 199e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf_level->mode = RADEON_SURF_MODE_LINEAR_ALIGNED; 200e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 201e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case ADDR_TM_1D_TILED_THIN1: 202e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf_level->mode = RADEON_SURF_MODE_1D; 203e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 204e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case ADDR_TM_2D_TILED_THIN1: 205e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf_level->mode = RADEON_SURF_MODE_2D; 206e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 207e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák default: 208e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák assert(0); 209e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 210e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 211e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (is_stencil) 212e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->stencil_tiling_index[level] = AddrSurfInfoOut->tileIndex; 213e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák else 214e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->tiling_index[level] = AddrSurfInfoOut->tileIndex; 215e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 2162a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák surf->surf_size = surf_level->offset + AddrSurfInfoOut->surfSize; 217afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen 218aa7fe7044328039903993dde6edb32b7953ae9b0Marek Olšák /* Clear DCC fields at the beginning. */ 219aa7fe7044328039903993dde6edb32b7953ae9b0Marek Olšák surf_level->dcc_offset = 0; 220aa7fe7044328039903993dde6edb32b7953ae9b0Marek Olšák 22100389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák /* The previous level's flag tells us if we can use DCC for this level. */ 22200389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák if (AddrSurfInfoIn->flags.dccCompatible && 22300389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák (level == 0 || AddrDccOut->subLvlCompressible)) { 224afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccIn->colorSurfSize = AddrSurfInfoOut->surfSize; 225afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccIn->tileMode = AddrSurfInfoOut->tileMode; 226afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccIn->tileInfo = *AddrSurfInfoOut->pTileInfo; 227afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccIn->tileIndex = AddrSurfInfoOut->tileIndex; 228afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccIn->macroModeIndex = AddrSurfInfoOut->macroModeIndex; 229afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen 230afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen ret = AddrComputeDccInfo(ws->addrlib, 231afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccIn, 232afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccOut); 233afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen 234afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen if (ret == ADDR_OK) { 235afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen surf_level->dcc_offset = surf->dcc_size; 23600389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák surf_level->dcc_fast_clear_size = AddrDccOut->dccFastClearSize; 237692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák surf->num_dcc_levels = level + 1; 238afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen surf->dcc_size = surf_level->dcc_offset + AddrDccOut->dccRamSize; 239afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen surf->dcc_alignment = MAX2(surf->dcc_alignment, AddrDccOut->dccRamBaseAlign); 240afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen } 241afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen } 242afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen 243d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák /* TC-compatible HTILE. */ 244d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák if (!is_stencil && 245d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrSurfInfoIn->flags.depth && 246d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrSurfInfoIn->flags.tcCompatible && 247d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák surf_level->mode == RADEON_SURF_MODE_2D && 248d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák level == 0) { 249d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->flags.tcCompatible = 1; 250d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->pitch = AddrSurfInfoOut->pitch; 251d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->height = AddrSurfInfoOut->height; 252d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->numSlices = AddrSurfInfoOut->depth; 253d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->blockWidth = ADDR_HTILE_BLOCKSIZE_8; 254d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->blockHeight = ADDR_HTILE_BLOCKSIZE_8; 255d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->pTileInfo = AddrSurfInfoOut->pTileInfo; 256d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->tileIndex = AddrSurfInfoOut->tileIndex; 257d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn->macroModeIndex = AddrSurfInfoOut->macroModeIndex; 258d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 259d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák ret = AddrComputeHtileInfo(ws->addrlib, 260d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn, 261d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileOut); 262d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 263d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák if (ret == ADDR_OK) { 264d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák surf->htile_size = AddrHtileOut->htileBytes; 265d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák surf->htile_alignment = AddrHtileOut->baseAlign; 266d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák } 267d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák } 268d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 269e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return 0; 270e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák} 271e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 272789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák#define G_009910_MICRO_TILE_MODE(x) (((x) >> 0) & 0x03) 273789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák#define G_009910_MICRO_TILE_MODE_NEW(x) (((x) >> 22) & 0x07) 274789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák 275789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšákstatic void set_micro_tile_mode(struct radeon_surf *surf, 276789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák struct radeon_info *info) 277789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák{ 278789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák uint32_t tile_mode = info->si_tile_mode_array[surf->tiling_index[0]]; 279789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák 280789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák if (info->chip_class >= CIK) 281789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák surf->micro_tile_mode = G_009910_MICRO_TILE_MODE_NEW(tile_mode); 282789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák else 283789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák surf->micro_tile_mode = G_009910_MICRO_TILE_MODE(tile_mode); 284789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák} 285789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák 2866ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšákstatic unsigned cik_get_macro_tile_index(struct radeon_surf *surf) 2876ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák{ 2886ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák unsigned index, tileb; 2896ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák 2906ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák tileb = 8 * 8 * surf->bpe; 2916ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák tileb = MIN2(surf->tile_split, tileb); 2926ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák 2936ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák for (index = 0; tileb > 64; index++) 2946ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák tileb >>= 1; 2956ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák 2966ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák assert(index < 16); 2976ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák return index; 2986ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák} 2996ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák 300e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšákstatic int amdgpu_surface_init(struct radeon_winsys *rws, 301e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák const struct pipe_resource *tex, 302e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák unsigned flags, unsigned bpe, 303e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák enum radeon_surf_mode mode, 304e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák struct radeon_surf *surf) 305e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák{ 306e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák struct amdgpu_winsys *ws = (struct amdgpu_winsys*)rws; 307e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák unsigned level; 308e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák bool compressed; 309e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_COMPUTE_SURFACE_INFO_INPUT AddrSurfInfoIn = {0}; 310e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_COMPUTE_SURFACE_INFO_OUTPUT AddrSurfInfoOut = {0}; 311afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen ADDR_COMPUTE_DCCINFO_INPUT AddrDccIn = {0}; 312afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen ADDR_COMPUTE_DCCINFO_OUTPUT AddrDccOut = {0}; 313d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák ADDR_COMPUTE_HTILE_INFO_INPUT AddrHtileIn = {0}; 314d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák ADDR_COMPUTE_HTILE_INFO_OUTPUT AddrHtileOut = {0}; 315e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_TILEINFO AddrTileInfoIn = {0}; 316e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ADDR_TILEINFO AddrTileInfoOut = {0}; 317e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák int r; 318e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 319e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák r = amdgpu_surface_sanity(tex); 320e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (r) 321e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return r; 322e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 323e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.size = sizeof(ADDR_COMPUTE_SURFACE_INFO_INPUT); 324e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoOut.size = sizeof(ADDR_COMPUTE_SURFACE_INFO_OUTPUT); 325afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccIn.size = sizeof(ADDR_COMPUTE_DCCINFO_INPUT); 326afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen AddrDccOut.size = sizeof(ADDR_COMPUTE_DCCINFO_OUTPUT); 327d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileIn.size = sizeof(ADDR_COMPUTE_HTILE_INFO_INPUT); 328d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrHtileOut.size = sizeof(ADDR_COMPUTE_HTILE_INFO_OUTPUT); 329e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoOut.pTileInfo = &AddrTileInfoOut; 330e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 331e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák surf->blk_w = util_format_get_blockwidth(tex->format); 332e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák surf->blk_h = util_format_get_blockheight(tex->format); 333e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák surf->bpe = bpe; 334e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák surf->flags = flags; 335e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák 336e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák compressed = surf->blk_w == 4 && surf->blk_h == 4; 337e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 338e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* MSAA and FMASK require 2D tiling. */ 339e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->nr_samples > 1 || 340e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák (flags & RADEON_SURF_FMASK)) 341e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák mode = RADEON_SURF_MODE_2D; 342e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 343e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* DB doesn't support linear layouts. */ 344e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (flags & (RADEON_SURF_Z_OR_SBUFFER) && 345e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák mode < RADEON_SURF_MODE_1D) 346e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák mode = RADEON_SURF_MODE_1D; 347e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 348e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* Set the requested tiling mode. */ 349e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák switch (mode) { 350e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case RADEON_SURF_MODE_LINEAR_ALIGNED: 351e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.tileMode = ADDR_TM_LINEAR_ALIGNED; 352e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 353e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case RADEON_SURF_MODE_1D: 354e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.tileMode = ADDR_TM_1D_TILED_THIN1; 355e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 356e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case RADEON_SURF_MODE_2D: 357e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.tileMode = ADDR_TM_2D_TILED_THIN1; 358e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 359e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák default: 360e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák assert(0); 361e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 362e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 363e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* The format must be set correctly for the allocation of compressed 364e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * textures to work. In other cases, setting the bpp is sufficient. */ 365e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (compressed) { 366e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák switch (bpe) { 367e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case 8: 368e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.format = ADDR_FMT_BC1; 369e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 370e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák case 16: 371e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.format = ADDR_FMT_BC3; 372e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák break; 373e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák default: 374e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák assert(0); 375e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 376e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 377e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák else { 378e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrDccIn.bpp = AddrSurfInfoIn.bpp = bpe * 8; 379e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 380e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 381e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrDccIn.numSamples = AddrSurfInfoIn.numSamples = 382e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák tex->nr_samples ? tex->nr_samples : 1; 383e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.tileIndex = -1; 384e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 385e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* Set the micro tile type. */ 386e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (flags & RADEON_SURF_SCANOUT) 387e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.tileType = ADDR_DISPLAYABLE; 388ecf045b4f7c83e2ea070e490d9475c2132308ee4Marek Olšák else if (flags & (RADEON_SURF_Z_OR_SBUFFER | RADEON_SURF_FMASK)) 389e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.tileType = ADDR_DEPTH_SAMPLE_ORDER; 390e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák else 391e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.tileType = ADDR_NON_DISPLAYABLE; 392e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 393e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn.flags.color = !(flags & RADEON_SURF_Z_OR_SBUFFER); 394e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn.flags.depth = (flags & RADEON_SURF_ZBUFFER) != 0; 395e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn.flags.cube = tex->target == PIPE_TEXTURE_CUBE; 396ecf045b4f7c83e2ea070e490d9475c2132308ee4Marek Olšák AddrSurfInfoIn.flags.fmask = (flags & RADEON_SURF_FMASK) != 0; 397e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn.flags.display = (flags & RADEON_SURF_SCANOUT) != 0; 398e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn.flags.pow2Pad = tex->last_level > 0; 399e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn.flags.tcCompatible = (flags & RADEON_SURF_TC_COMPATIBLE_HTILE) != 0; 400d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 401d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák /* Only degrade the tile mode for space if TC-compatible HTILE hasn't been 402d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák * requested, because TC-compatible HTILE requires 2D tiling. 403d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák */ 404ecf045b4f7c83e2ea070e490d9475c2132308ee4Marek Olšák AddrSurfInfoIn.flags.degrade4Space = !AddrSurfInfoIn.flags.tcCompatible && 40549fa4a4e600cbb35c43a85fab2ed4aac3e6acccfMarek Olšák !AddrSurfInfoIn.flags.fmask && 40649fa4a4e600cbb35c43a85fab2ed4aac3e6acccfMarek Olšák tex->nr_samples <= 1 && 40749fa4a4e600cbb35c43a85fab2ed4aac3e6acccfMarek Olšák (flags & RADEON_SURF_OPTIMIZE_FOR_SPACE); 40879a8e674aef8d50e79f5d4ab25e0f951d1c69398Marek Olšák AddrSurfInfoIn.flags.opt4Space = AddrSurfInfoIn.flags.degrade4Space; 40900389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák 41000389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák /* DCC notes: 41100389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák * - If we add MSAA support, keep in mind that CB can't decompress 8bpp 41200389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák * with samples >= 4. 41300389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák * - Mipmapped array textures have low performance (discovered by a closed 41400389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák * driver team). 41500389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák */ 416a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.flags.dccCompatible = ws->info.chip_class >= VI && 417e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák !(flags & RADEON_SURF_Z_OR_SBUFFER) && 418e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák !(flags & RADEON_SURF_DISABLE_DCC) && 419aa7fe7044328039903993dde6edb32b7953ae9b0Marek Olšák !compressed && AddrDccIn.numSamples <= 1 && 420e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák ((tex->array_size == 1 && tex->depth0 == 1) || 421e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák tex->last_level == 0); 422e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 423e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák AddrSurfInfoIn.flags.noStencil = (flags & RADEON_SURF_SBUFFER) == 0; 424ea68215c545ba9600d20718a372707be8e0f3905Marek Olšák AddrSurfInfoIn.flags.compressZ = AddrSurfInfoIn.flags.depth; 425ea68215c545ba9600d20718a372707be8e0f3905Marek Olšák 426660cd3de4acf5ae8ccef2bc5d367de98d9ac0e27Nicolai Hähnle /* noStencil = 0 can result in a depth part that is incompatible with 427660cd3de4acf5ae8ccef2bc5d367de98d9ac0e27Nicolai Hähnle * mipmapped texturing. So set noStencil = 1 when mipmaps are requested (in 428660cd3de4acf5ae8ccef2bc5d367de98d9ac0e27Nicolai Hähnle * this case, we may end up setting stencil_adjusted). 429660cd3de4acf5ae8ccef2bc5d367de98d9ac0e27Nicolai Hähnle * 430660cd3de4acf5ae8ccef2bc5d367de98d9ac0e27Nicolai Hähnle * TODO: update addrlib to a newer version, remove this, and 431660cd3de4acf5ae8ccef2bc5d367de98d9ac0e27Nicolai Hähnle * use flags.matchStencilTileCfg = 1 as an alternative fix. 432ea68215c545ba9600d20718a372707be8e0f3905Marek Olšák */ 433e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (tex->last_level > 0) 434660cd3de4acf5ae8ccef2bc5d367de98d9ac0e27Nicolai Hähnle AddrSurfInfoIn.flags.noStencil = 1; 435e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 436e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* Set preferred macrotile parameters. This is usually required 437e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * for shared resources. This is for 2D tiling only. */ 438e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (AddrSurfInfoIn.tileMode >= ADDR_TM_2D_TILED_THIN1 && 439e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->bankw && surf->bankh && surf->mtilea && surf->tile_split) { 440d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák assert(!(flags & RADEON_SURF_FMASK)); 441d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák 442e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* If any of these parameters are incorrect, the calculation 443e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * will fail. */ 444dc970c4f4e03e17e32132734c1707d845ab610c9Marek Olšák AddrTileInfoIn.banks = surf->num_banks; 445e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrTileInfoIn.bankWidth = surf->bankw; 446e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrTileInfoIn.bankHeight = surf->bankh; 447e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrTileInfoIn.macroAspectRatio = surf->mtilea; 448e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrTileInfoIn.tileSplitBytes = surf->tile_split; 449c8aac4fc0dce61a8061bccb8d63a94f1eacd5348Marek Olšák AddrTileInfoIn.pipeConfig = surf->pipe_config + 1; /* +1 compared to GB_TILE_MODE */ 450e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.flags.degrade4Space = 0; 451e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.pTileInfo = &AddrTileInfoIn; 452e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 453e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* If AddrSurfInfoIn.pTileInfo is set, Addrlib doesn't set 454e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * the tile index, because we are expected to know it if 455e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * we know the other parameters. 456e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * 457e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * This is something that can easily be fixed in Addrlib. 458e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * For now, just figure it out here. 459e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák * Note that only 2D_TILE_THIN1 is handled here. 460e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák */ 461e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák assert(!(flags & RADEON_SURF_Z_OR_SBUFFER)); 462e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák assert(AddrSurfInfoIn.tileMode == ADDR_TM_2D_TILED_THIN1); 463e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 464a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák if (ws->info.chip_class == SI) { 465a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák if (AddrSurfInfoIn.tileType == ADDR_DISPLAYABLE) { 466e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (bpe == 2) 467a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 11; /* 16bpp */ 468a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák else 469a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 12; /* 32bpp */ 470a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák } else { 471e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (bpe == 1) 472a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 14; /* 8bpp */ 473e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák else if (bpe == 2) 474a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 15; /* 16bpp */ 475e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák else if (bpe == 4) 476a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 16; /* 32bpp */ 477a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák else 478a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 17; /* 64bpp (and 128bpp) */ 479a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák } 480a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák } else { 481a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák /* CIK - VI */ 482a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák if (AddrSurfInfoIn.tileType == ADDR_DISPLAYABLE) 483a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 10; /* 2D displayable */ 484a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák else 485a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák AddrSurfInfoIn.tileIndex = 14; /* 2D non-displayable */ 4866ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák 4876ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák /* Addrlib doesn't set this if tileIndex is forced like above. */ 4886ec3b2a4b1d41b83a4721d06b42c49f55e695cbfMarek Olšák AddrSurfInfoOut.macroModeIndex = cik_get_macro_tile_index(surf); 489a6869e7c06e362749219c83bc9b106cda89b9bc0Marek Olšák } 490e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 491e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 492692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák surf->num_dcc_levels = 0; 4932a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák surf->surf_size = 0; 494afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen surf->dcc_size = 0; 495afa357c3b01322df31034f84613a4d8401a9486eBas Nieuwenhuizen surf->dcc_alignment = 1; 496d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák surf->htile_size = 0; 497d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák surf->htile_alignment = 1; 498e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 499e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* Calculate texture layout information. */ 500e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák for (level = 0; level <= tex->last_level; level++) { 501e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák r = compute_level(ws, tex, surf, false, level, compressed, 502d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák &AddrSurfInfoIn, &AddrSurfInfoOut, 503d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák &AddrDccIn, &AddrDccOut, &AddrHtileIn, &AddrHtileOut); 504e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (r) 505e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return r; 506e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 507e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (level == 0) { 5082a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák surf->surf_alignment = AddrSurfInfoOut.baseAlign; 509e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->pipe_config = AddrSurfInfoOut.pTileInfo->pipeConfig - 1; 510789618e3b4619225f1e86d52f7b692bf6eb866ebMarek Olšák set_micro_tile_mode(surf, &ws->info); 511e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 512e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* For 2D modes only. */ 513e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (AddrSurfInfoOut.tileMode >= ADDR_TM_2D_TILED_THIN1) { 514e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->bankw = AddrSurfInfoOut.pTileInfo->bankWidth; 515e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->bankh = AddrSurfInfoOut.pTileInfo->bankHeight; 516e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->mtilea = AddrSurfInfoOut.pTileInfo->macroAspectRatio; 517e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->tile_split = AddrSurfInfoOut.pTileInfo->tileSplitBytes; 518e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->num_banks = AddrSurfInfoOut.pTileInfo->banks; 519ef45825708e653daa232a9542187b534470e738aMarek Olšák surf->macro_tile_index = AddrSurfInfoOut.macroModeIndex; 520ef45825708e653daa232a9542187b534470e738aMarek Olšák } else { 521ef45825708e653daa232a9542187b534470e738aMarek Olšák surf->macro_tile_index = 0; 522e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 523e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 524e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 525e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 526e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* Calculate texture layout information for stencil. */ 527e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (flags & RADEON_SURF_SBUFFER) { 528e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoIn.bpp = 8; 529ea68215c545ba9600d20718a372707be8e0f3905Marek Olšák AddrSurfInfoIn.flags.depth = 0; 530ea68215c545ba9600d20718a372707be8e0f3905Marek Olšák AddrSurfInfoIn.flags.stencil = 1; 531d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák AddrSurfInfoIn.flags.tcCompatible = 0; 532e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* This will be ignored if AddrSurfInfoIn.pTileInfo is NULL. */ 533e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrTileInfoIn.tileSplitBytes = surf->stencil_tile_split; 534e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 535e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák for (level = 0; level <= tex->last_level; level++) { 536e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák r = compute_level(ws, tex, surf, true, level, compressed, 537d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák &AddrSurfInfoIn, &AddrSurfInfoOut, &AddrDccIn, &AddrDccOut, 538d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák NULL, NULL); 539e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (r) 540e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return r; 541e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 5427000dfd5c36dcfcc493e149e5aa5b4124d814d8aNicolai Hähnle /* DB uses the depth pitch for both stencil and depth. */ 5437000dfd5c36dcfcc493e149e5aa5b4124d814d8aNicolai Hähnle if (surf->stencil_level[level].nblk_x != surf->level[level].nblk_x) 5447000dfd5c36dcfcc493e149e5aa5b4124d814d8aNicolai Hähnle surf->stencil_adjusted = true; 5457000dfd5c36dcfcc493e149e5aa5b4124d814d8aNicolai Hähnle 546e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (level == 0) { 547e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák /* For 2D modes only. */ 548e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák if (AddrSurfInfoOut.tileMode >= ADDR_TM_2D_TILED_THIN1) { 549e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák surf->stencil_tile_split = 550e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák AddrSurfInfoOut.pTileInfo->tileSplitBytes; 551e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 552e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 553e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 554e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák } 555e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 55600389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák /* Recalculate the whole DCC miptree size including disabled levels. 55700389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák * This is what addrlib does, but calling addrlib would be a lot more 55800389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák * complicated. 55900389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák */ 560e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (surf->dcc_size && tex->last_level > 0) { 5612a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák surf->dcc_size = align64(surf->surf_size >> 8, 56200389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák ws->info.pipe_interleave_bytes * 56300389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák ws->info.num_tile_pipes); 56400389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák } 56500389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák 566d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák /* Make sure HTILE covers the whole miptree, because the shader reads 567d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák * TC-compatible HTILE even for levels where it's disabled by DB. 568d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák */ 569e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (surf->htile_size && tex->last_level) 570d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák surf->htile_size *= 2; 571d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 572bf4d102ea3419ade6759bf9c3ad9d40c7f9b3c27Marek Olšák surf->is_linear = surf->level[0].mode == RADEON_SURF_MODE_LINEAR_ALIGNED; 573e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák return 0; 574e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák} 575e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák 576e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšákvoid amdgpu_surface_init_functions(struct amdgpu_winsys *ws) 577e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák{ 578e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák ws->base.surface_init = amdgpu_surface_init; 579e7fc664b91a5d886c2709d05a498f6a1dfbaf136Marek Olšák} 580