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