172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/* 272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"), 672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation 772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next 1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software. 1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * 2372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Authors: 2472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Jerome Glisse 2572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Corbin Simpson 2672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */ 27e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák#include "r600_pipe_common.h" 28e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák#include "r600_cs.h" 2949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák#include "r600_query.h" 30e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák#include "util/u_format.h" 318fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_memory.h" 3228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák#include "util/u_pack_color.h" 33739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák#include "util/u_surface.h" 3449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák#include "os/os_time.h" 35e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák#include <errno.h> 364c110994533c67f2e501cd32ee0c2f91060630e0Emil Velikov#include <inttypes.h> 3749f1104c449fb51ec4cc18aa5bd814afeb632415Marek Olšák 38f475c9fb0708c312a4194558da36204becfafd35Marek Olšákstatic void r600_texture_discard_cmask(struct r600_common_screen *rscreen, 39f475c9fb0708c312a4194558da36204becfafd35Marek Olšák struct r600_texture *rtex); 40ba174b8dfff0777075f62a9188124d0bb22a5f17Marek Olšákstatic enum radeon_surf_mode 41ba174b8dfff0777075f62a9188124d0bb22a5f17Marek Olšákr600_choose_tiling(struct r600_common_screen *rscreen, 42ba174b8dfff0777075f62a9188124d0bb22a5f17Marek Olšák const struct pipe_resource *templ); 43f475c9fb0708c312a4194558da36204becfafd35Marek Olšák 44f475c9fb0708c312a4194558da36204becfafd35Marek Olšák 452f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšákbool r600_prepare_for_dma_blit(struct r600_common_context *rctx, 462f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák struct r600_texture *rdst, 472f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák unsigned dst_level, unsigned dstx, 482f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák unsigned dsty, unsigned dstz, 492f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák struct r600_texture *rsrc, 502f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák unsigned src_level, 512f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák const struct pipe_box *src_box) 522f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák{ 532f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák if (!rctx->dma.cs) 542f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák return false; 552f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 56c66a550385b4937b2aaba8484aeaa41cf77399b7Marek Olšák if (rdst->surface.bpe != rsrc->surface.bpe) 572f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák return false; 582f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 592f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák /* MSAA: Blits don't exist in the real world. */ 602f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák if (rsrc->resource.b.b.nr_samples > 1 || 612f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák rdst->resource.b.b.nr_samples > 1) 622f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák return false; 632f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 642f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák /* Depth-stencil surfaces: 652f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák * When dst is linear, the DB->CB copy preserves HTILE. 662f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák * When dst is tiled, the 3D path must be used to update HTILE. 672f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák */ 682f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák if (rsrc->is_depth || rdst->is_depth) 692f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák return false; 702f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 712f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák /* DCC as: 722f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák * src: Use the 3D path. DCC decompression is expensive. 73c65361763cca709a28534aa354b6dffe1cbadf99Marek Olšák * dst: Use the 3D path to compress the pixels with DCC. 742f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák */ 75692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák if ((rsrc->dcc_offset && src_level < rsrc->surface.num_dcc_levels) || 76692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák (rdst->dcc_offset && dst_level < rdst->surface.num_dcc_levels)) 772f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák return false; 782f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 792f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák /* CMASK as: 802f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák * src: Both texture and SDMA paths need decompression. Use SDMA. 81f475c9fb0708c312a4194558da36204becfafd35Marek Olšák * dst: If overwriting the whole texture, discard CMASK and use 822f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák * SDMA. Otherwise, use the 3D path. 832f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák */ 84f475c9fb0708c312a4194558da36204becfafd35Marek Olšák if (rdst->cmask.size && rdst->dirty_level_mask & (1 << dst_level)) { 85ef765d07894bdb6234c2f9cb47c7c3ab0f20fccfMarek Olšák /* The CMASK clear is only enabled for the first level. */ 86ef765d07894bdb6234c2f9cb47c7c3ab0f20fccfMarek Olšák assert(dst_level == 0); 879d881cc0ac8f08f839dd86f6aeaf6c7bca97ccb1Marek Olšák if (!util_texrange_covers_whole_level(&rdst->resource.b.b, dst_level, 889d881cc0ac8f08f839dd86f6aeaf6c7bca97ccb1Marek Olšák dstx, dsty, dstz, src_box->width, 899d881cc0ac8f08f839dd86f6aeaf6c7bca97ccb1Marek Olšák src_box->height, src_box->depth)) 90f475c9fb0708c312a4194558da36204becfafd35Marek Olšák return false; 91f475c9fb0708c312a4194558da36204becfafd35Marek Olšák 92f475c9fb0708c312a4194558da36204becfafd35Marek Olšák r600_texture_discard_cmask(rctx->screen, rdst); 93f475c9fb0708c312a4194558da36204becfafd35Marek Olšák } 942f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 952f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák /* All requirements are met. Prepare textures for SDMA. */ 962f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák if (rsrc->cmask.size && rsrc->dirty_level_mask & (1 << src_level)) 972f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák rctx->b.flush_resource(&rctx->b, &rsrc->resource.b.b); 982f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 992f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák assert(!(rsrc->dirty_level_mask & (1 << src_level))); 1002f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák assert(!(rdst->dirty_level_mask & (1 << dst_level))); 1012f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 1022f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák return true; 1032f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák} 1042f173b8e13308bea0690684f841fad28ccc2e40eMarek Olšák 1054d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák/* Same as resource_copy_region, except that both upsampling and downsampling are allowed. */ 1064d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšákstatic void r600_copy_region_with_blit(struct pipe_context *pipe, 1074d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák struct pipe_resource *dst, 1084d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák unsigned dst_level, 1094d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák unsigned dstx, unsigned dsty, unsigned dstz, 1104d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák struct pipe_resource *src, 1114d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák unsigned src_level, 1124d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák const struct pipe_box *src_box) 1134d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák{ 1144d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák struct pipe_blit_info blit; 1154d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 1164d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák memset(&blit, 0, sizeof(blit)); 1174d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.src.resource = src; 1184d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.src.format = src->format; 1194d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.src.level = src_level; 1204d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.src.box = *src_box; 1214d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.resource = dst; 1224d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.format = dst->format; 1234d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.level = dst_level; 1244d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.box.x = dstx; 1254d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.box.y = dsty; 1264d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.box.z = dstz; 1274d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.box.width = src_box->width; 1284d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.box.height = src_box->height; 1294d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.dst.box.depth = src_box->depth; 1304d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.mask = util_format_get_mask(src->format) & 1314d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák util_format_get_mask(dst->format); 1324d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák blit.filter = PIPE_TEX_FILTER_NEAREST; 1334d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 1344d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák if (blit.mask) { 1354d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák pipe->blit(pipe, &blit); 1364d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák } 1374d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák} 1384d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 139d4fab99c1c20334131b446b0032303a8b3c5c1a1Keith Whitwell/* Copy from a full GPU texture to a transfer's staging one. */ 140d4fab99c1c20334131b446b0032303a8b3c5c1a1Keith Whitwellstatic void r600_copy_to_staging_texture(struct pipe_context *ctx, struct r600_transfer *rtransfer) 14136efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse{ 142e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*)ctx; 14336efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse struct pipe_transfer *transfer = (struct pipe_transfer*)rtransfer; 14449f1104c449fb51ec4cc18aa5bd814afeb632415Marek Olšák struct pipe_resource *dst = &rtransfer->staging->b.b; 14549f1104c449fb51ec4cc18aa5bd814afeb632415Marek Olšák struct pipe_resource *src = transfer->resource; 14636efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse 1474d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák if (src->nr_samples > 1) { 1484d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák r600_copy_region_with_blit(ctx, dst, 0, 0, 0, 0, 1494d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák src, transfer->level, &transfer->box); 1504d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák return; 1514d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák } 1524d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 1534ca3486b195653f875003d335921fd4e7d7c2c4aMarek Olšák rctx->dma_copy(ctx, dst, 0, 0, 0, 0, src, transfer->level, 1544ca3486b195653f875003d335921fd4e7d7c2c4aMarek Olšák &transfer->box); 15536efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse} 15636efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse 157d4fab99c1c20334131b446b0032303a8b3c5c1a1Keith Whitwell/* Copy from a transfer's staging texture to a full GPU one. */ 158d4fab99c1c20334131b446b0032303a8b3c5c1a1Keith Whitwellstatic void r600_copy_from_staging_texture(struct pipe_context *ctx, struct r600_transfer *rtransfer) 1599979d60c0e2e4152bce19c2c4128ff2941b9191bDave Airlie{ 160e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*)ctx; 1619979d60c0e2e4152bce19c2c4128ff2941b9191bDave Airlie struct pipe_transfer *transfer = (struct pipe_transfer*)rtransfer; 1624d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák struct pipe_resource *dst = transfer->resource; 1634d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák struct pipe_resource *src = &rtransfer->staging->b.b; 1644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_box sbox; 1654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 1661aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák u_box_3d(0, 0, 0, transfer->box.width, transfer->box.height, transfer->box.depth, &sbox); 167b278aba42310e8fa30f2408b9dcd58dbb4901724Marek Olšák 1684d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák if (dst->nr_samples > 1) { 1694d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák r600_copy_region_with_blit(ctx, dst, transfer->level, 1704d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák transfer->box.x, transfer->box.y, transfer->box.z, 1714d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák src, 0, &sbox); 1724d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák return; 1734d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák } 1744d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 1754ca3486b195653f875003d335921fd4e7d7c2c4aMarek Olšák rctx->dma_copy(ctx, dst, transfer->level, 1764ca3486b195653f875003d335921fd4e7d7c2c4aMarek Olšák transfer->box.x, transfer->box.y, transfer->box.z, 1774ca3486b195653f875003d335921fd4e7d7c2c4aMarek Olšák src, 0, &sbox); 1789979d60c0e2e4152bce19c2c4128ff2941b9191bDave Airlie} 1799979d60c0e2e4152bce19c2c4128ff2941b9191bDave Airlie 180ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšákstatic unsigned r600_texture_get_offset(struct r600_texture *rtex, unsigned level, 181ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák const struct pipe_box *box) 18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 183773ff5705f3b2d88fb7094b8d2e051bb684c2323Marek Olšák return rtex->surface.level[level].offset + 184ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák box->z * rtex->surface.level[level].slice_size + 185e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák (box->y / rtex->surface.blk_h * 186e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák rtex->surface.level[level].nblk_x + 187e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák box->x / rtex->surface.blk_w) * rtex->surface.bpe; 188a23f25eba1fb8919a29efb88ef9e351abcc65b2eAlex Deucher} 189a23f25eba1fb8919a29efb88ef9e351abcc65b2eAlex Deucher 190e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšákstatic int r600_init_surface(struct r600_common_screen *rscreen, 191a582b22c6382f24d921e9fe8a24917100c1396f1Marek Olšák struct radeon_surf *surface, 192c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse const struct pipe_resource *ptex, 193ba174b8dfff0777075f62a9188124d0bb22a5f17Marek Olšák enum radeon_surf_mode array_mode, 19428d237d63d8161124e62b5dab6f864de494cd652Marek Olšák unsigned pitch_in_bytes_override, 19528d237d63d8161124e62b5dab6f864de494cd652Marek Olšák unsigned offset, 19628d237d63d8161124e62b5dab6f864de494cd652Marek Olšák bool is_imported, 19728d237d63d8161124e62b5dab6f864de494cd652Marek Olšák bool is_scanout, 198d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák bool is_flushed_depth, 199d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák bool tc_compatible_htile) 200c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse{ 201018e3f75d69490598d61059ece56d379867f3995Marek Olšák const struct util_format_description *desc = 202018e3f75d69490598d61059ece56d379867f3995Marek Olšák util_format_description(ptex->format); 203018e3f75d69490598d61059ece56d379867f3995Marek Olšák bool is_depth, is_stencil; 204e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák int r; 205e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák unsigned i, bpe, flags = 0; 206018e3f75d69490598d61059ece56d379867f3995Marek Olšák 207018e3f75d69490598d61059ece56d379867f3995Marek Olšák is_depth = util_format_has_depth(desc); 208018e3f75d69490598d61059ece56d379867f3995Marek Olšák is_stencil = util_format_has_stencil(desc); 209018e3f75d69490598d61059ece56d379867f3995Marek Olšák 210e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (rscreen->chip_class >= EVERGREEN && !is_flushed_depth && 211ea72351a919c594e7f40e901dca42aebb866f8a6Marek Olšák ptex->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) { 212e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák bpe = 4; /* stencil is allocated separately on evergreen */ 213ea72351a919c594e7f40e901dca42aebb866f8a6Marek Olšák } else { 214e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák bpe = util_format_get_blocksize(ptex->format); 215ea72351a919c594e7f40e901dca42aebb866f8a6Marek Olšák /* align byte per element on dword */ 216e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (bpe == 3) { 217e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák bpe = 4; 218ea72351a919c594e7f40e901dca42aebb866f8a6Marek Olšák } 219c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 220ea72351a919c594e7f40e901dca42aebb866f8a6Marek Olšák 221f5ac60152b10b04d38e77db6b904dd50d1a54d6cMarek Olšák if (!is_flushed_depth && is_depth) { 222e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák flags |= RADEON_SURF_ZBUFFER; 223c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 224d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák if (tc_compatible_htile && 225d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák array_mode == RADEON_SURF_MODE_2D) { 226d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák /* TC-compatible HTILE only supports Z32_FLOAT. 227d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák * Promote Z16 to Z32. DB->CB copies will convert 228d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák * the format for transfers. 229d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák */ 230e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák bpe = 4; 231e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák flags |= RADEON_SURF_TC_COMPATIBLE_HTILE; 232d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák } 233d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 23467a44c97afb72812639039eb4594592c91c9ead5Marek Olšák if (is_stencil) 23567a44c97afb72812639039eb4594592c91c9ead5Marek Olšák flags |= RADEON_SURF_SBUFFER; 236e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } 237d4d733e39de2fc75aaa17d95998abdf19219cb38Marek Olšák 238d4d733e39de2fc75aaa17d95998abdf19219cb38Marek Olšák if (rscreen->chip_class >= VI && 2394be46c7d9dbeaff9dede941ee6518f68ad0c5f75Marek Olšák (ptex->flags & R600_RESOURCE_FLAG_DISABLE_DCC || 2404be46c7d9dbeaff9dede941ee6518f68ad0c5f75Marek Olšák ptex->format == PIPE_FORMAT_R9G9B9E5_FLOAT)) 241e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák flags |= RADEON_SURF_DISABLE_DCC; 242d4d733e39de2fc75aaa17d95998abdf19219cb38Marek Olšák 24328d237d63d8161124e62b5dab6f864de494cd652Marek Olšák if (ptex->bind & PIPE_BIND_SCANOUT || is_scanout) { 244a01536a29fdebfcdf7781e28a66b3b2abba943c8Marek Olšák /* This should catch bugs in gallium users setting incorrect flags. */ 245b5118fe0543400295be5b1a65a5001882498831eMarek Olšák assert(ptex->nr_samples <= 1 && 246b5118fe0543400295be5b1a65a5001882498831eMarek Olšák ptex->array_size == 1 && 247b5118fe0543400295be5b1a65a5001882498831eMarek Olšák ptex->depth0 == 1 && 248b5118fe0543400295be5b1a65a5001882498831eMarek Olšák ptex->last_level == 0 && 249e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák !(flags & RADEON_SURF_Z_OR_SBUFFER)); 250a01536a29fdebfcdf7781e28a66b3b2abba943c8Marek Olšák 251e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák flags |= RADEON_SURF_SCANOUT; 252a01536a29fdebfcdf7781e28a66b3b2abba943c8Marek Olšák } 253c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 25428d237d63d8161124e62b5dab6f864de494cd652Marek Olšák if (is_imported) 255e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák flags |= RADEON_SURF_IMPORTED; 25649fa4a4e600cbb35c43a85fab2ed4aac3e6acccfMarek Olšák if (!(ptex->flags & R600_RESOURCE_FLAG_FORCE_TILING)) 25749fa4a4e600cbb35c43a85fab2ed4aac3e6acccfMarek Olšák flags |= RADEON_SURF_OPTIMIZE_FOR_SPACE; 258c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 259e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák r = rscreen->ws->surface_init(rscreen->ws, ptex, flags, bpe, 260e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák array_mode, surface); 261c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (r) { 262c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse return r; 263c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 264e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 265e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák if (pitch_in_bytes_override && 266e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák pitch_in_bytes_override != surface->level[0].nblk_x * bpe) { 267c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse /* old ddx on evergreen over estimate alignment for 1d, only 1 level 268c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse * for those 269c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse */ 270e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák surface->level[0].nblk_x = pitch_in_bytes_override / bpe; 27128d237d63d8161124e62b5dab6f864de494cd652Marek Olšák surface->level[0].slice_size = pitch_in_bytes_override * surface->level[0].nblk_y; 272c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 27304bc082f6a8bfc3b3774bb102d3200317609432eChristian König 27404bc082f6a8bfc3b3774bb102d3200317609432eChristian König if (offset) { 27528d237d63d8161124e62b5dab6f864de494cd652Marek Olšák for (i = 0; i < ARRAY_SIZE(surface->level); ++i) 27628d237d63d8161124e62b5dab6f864de494cd652Marek Olšák surface->level[i].offset += offset; 27704bc082f6a8bfc3b3774bb102d3200317609432eChristian König } 278c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse return 0; 279c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse} 280c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 281e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšákstatic void r600_texture_init_metadata(struct r600_texture *rtex, 282e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák struct radeon_bo_metadata *metadata) 283e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák{ 284e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák struct radeon_surf *surface = &rtex->surface; 285e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák 286e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák memset(metadata, 0, sizeof(*metadata)); 287e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->microtile = surface->level[0].mode >= RADEON_SURF_MODE_1D ? 288e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák RADEON_LAYOUT_TILED : RADEON_LAYOUT_LINEAR; 289e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->macrotile = surface->level[0].mode >= RADEON_SURF_MODE_2D ? 290e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák RADEON_LAYOUT_TILED : RADEON_LAYOUT_LINEAR; 291e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->pipe_config = surface->pipe_config; 292e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->bankw = surface->bankw; 293e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->bankh = surface->bankh; 294e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->tile_split = surface->tile_split; 295e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->mtilea = surface->mtilea; 296e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->num_banks = surface->num_banks; 297e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák metadata->stride = surface->level[0].nblk_x * surface->bpe; 298e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák metadata->scanout = (surface->flags & RADEON_SURF_SCANOUT) != 0; 299e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák} 300e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák 30160c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšákstatic void r600_dirty_all_framebuffer_states(struct r600_common_screen *rscreen) 30260c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák{ 30360c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák p_atomic_inc(&rscreen->dirty_fb_counter); 30460c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák} 30560c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 30601dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšákstatic void r600_eliminate_fast_color_clear(struct r600_common_context *rctx, 30701dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák struct r600_texture *rtex) 308970b979da1639d57e89169f96cc0064db9dae43aMarek Olšák{ 30901dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák struct r600_common_screen *rscreen = rctx->screen; 31001dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák struct pipe_context *ctx = &rctx->b; 31101dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák 31201dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák if (ctx == rscreen->aux_context) 31301dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák pipe_mutex_lock(rscreen->aux_context_lock); 314970b979da1639d57e89169f96cc0064db9dae43aMarek Olšák 315970b979da1639d57e89169f96cc0064db9dae43aMarek Olšák ctx->flush_resource(ctx, &rtex->resource.b.b); 316970b979da1639d57e89169f96cc0064db9dae43aMarek Olšák ctx->flush(ctx, NULL, 0); 31701dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák 31801dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák if (ctx == rscreen->aux_context) 31901dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák pipe_mutex_unlock(rscreen->aux_context_lock); 320970b979da1639d57e89169f96cc0064db9dae43aMarek Olšák} 321970b979da1639d57e89169f96cc0064db9dae43aMarek Olšák 322c85d0c17d98b012191c8b52dc7bc9fb77cce7656Marek Olšákstatic void r600_texture_discard_cmask(struct r600_common_screen *rscreen, 32360c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák struct r600_texture *rtex) 32460c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák{ 32560c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák if (!rtex->cmask.size) 32660c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák return; 32760c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 32860c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák assert(rtex->resource.b.b.nr_samples <= 1); 32960c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 33060c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák /* Disable CMASK. */ 33160c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák memset(&rtex->cmask, 0, sizeof(rtex->cmask)); 33260c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák rtex->cmask.base_address_reg = rtex->resource.gpu_address >> 8; 333ed24d79ed712f22ca12a1986a024c522d202dc37Marek Olšák rtex->dirty_level_mask = 0; 33460c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 33560c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák if (rscreen->chip_class >= SI) 33660c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák rtex->cb_color_info &= ~SI_S_028C70_FAST_CLEAR(1); 33760c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák else 33860c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák rtex->cb_color_info &= ~EG_S_028C70_FAST_CLEAR(1); 33960c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 34060c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák if (rtex->cmask_buffer != &rtex->resource) 341d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&rtex->cmask_buffer, NULL); 34260c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 34360c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák /* Notify all contexts about the change. */ 34460c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák r600_dirty_all_framebuffer_states(rscreen); 345784269aa404e9484e195032841025cee24af8058Nicolai Hähnle p_atomic_inc(&rscreen->compressed_colortex_counter); 34660c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák} 34760c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 3489e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšákstatic bool r600_can_disable_dcc(struct r600_texture *rtex) 3499e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák{ 3509e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák /* We can't disable DCC if it can be written by another process. */ 3519e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák return rtex->dcc_offset && 3529e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák (!rtex->resource.is_shared || 3539e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák !(rtex->resource.external_usage & PIPE_HANDLE_USAGE_WRITE)); 3549e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák} 3559e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák 3569e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšákstatic bool r600_texture_discard_dcc(struct r600_common_screen *rscreen, 3572af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák struct r600_texture *rtex) 3582af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák{ 3599e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák if (!r600_can_disable_dcc(rtex)) 3609e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák return false; 3619e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák 3629124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák assert(rtex->dcc_separate_buffer == NULL); 3639124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák 3642af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák /* Disable DCC. */ 3652af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák rtex->dcc_offset = 0; 3662af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák 3672af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák /* Notify all contexts about the change. */ 3682af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák r600_dirty_all_framebuffer_states(rscreen); 3699e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák return true; 3702af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák} 3712af4b637d8a2da72a42ca8288dcab90fb1e2346cMarek Olšák 372a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák/** 373a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * Disable DCC for the texture. (first decompress, then discard metadata). 374a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * 375a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * There is unresolved multi-context synchronization issue between 376a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * screen::aux_context and the current context. If applications do this with 377a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * multiple contexts, it's already undefined behavior for them and we don't 378a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * have to worry about that. The scenario is: 379a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * 380a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * If context 1 disables DCC and context 2 has queued commands that write 381a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * to the texture via CB with DCC enabled, and the order of operations is 382a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * as follows: 383a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * context 2 queues draw calls rendering to the texture, but doesn't flush 384a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * context 1 disables DCC and flushes 385a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * context 1 & 2 reset descriptors and FB state 386a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * context 2 flushes (new compressed tiles written by the draw calls) 387a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * context 1 & 2 read garbage, because DCC is disabled, yet there are 388a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * compressed tiled 389a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * 390a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * \param rctx the current context if you have one, or rscreen->aux_context 391a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák * if you don't. 392a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák */ 393a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšákbool r600_texture_disable_dcc(struct r600_common_context *rctx, 394b1b7268f014c78ac46b2f360959e681bad3091d5Nicolai Hähnle struct r600_texture *rtex) 395f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák{ 396a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák struct r600_common_screen *rscreen = rctx->screen; 397f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák 3989e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák if (!r600_can_disable_dcc(rtex)) 3999e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák return false; 400f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák 401a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák if (&rctx->b == rscreen->aux_context) 402a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák pipe_mutex_lock(rscreen->aux_context_lock); 403a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák 404f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák /* Decompress DCC. */ 405f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák rctx->decompress_dcc(&rctx->b, rtex); 406f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák rctx->b.flush(&rctx->b, NULL, 0); 407a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák 408a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák if (&rctx->b == rscreen->aux_context) 409a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26Marek Olšák pipe_mutex_unlock(rscreen->aux_context_lock); 410f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák 4119e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák return r600_texture_discard_dcc(rscreen, rtex); 412f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák} 413f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák 414fc1479a95432f291623fa5bafe524701e77af3caMarek Olšákstatic void r600_degrade_tile_mode_to_linear(struct r600_common_context *rctx, 415fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák struct r600_texture *rtex, 416fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák bool invalidate_storage) 417fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák{ 418fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák struct pipe_screen *screen = rctx->b.screen; 419fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák struct r600_texture *new_tex; 420fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák struct pipe_resource templ = rtex->resource.b.b; 421fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák unsigned i; 422fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 423fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák templ.bind |= PIPE_BIND_LINEAR; 424fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 425fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák /* r600g doesn't react to dirty_tex_descriptor_counter */ 426fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák if (rctx->chip_class < SI) 427fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák return; 428fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 429fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák if (rtex->resource.is_shared || 430bf4d102ea3419ade6759bf9c3ad9d40c7f9b3c27Marek Olšák rtex->surface.is_linear) 431fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák return; 432fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 433fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák /* This fails with MSAA, depth, and compressed textures. */ 434fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák if (r600_choose_tiling(rctx->screen, &templ) != 435fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák RADEON_SURF_MODE_LINEAR_ALIGNED) 436fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák return; 437fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 438fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák new_tex = (struct r600_texture*)screen->resource_create(screen, &templ); 439fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák if (!new_tex) 440fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák return; 441fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 442fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák /* Copy the pixels to the new texture. */ 443fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák if (!invalidate_storage) { 444fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák for (i = 0; i <= templ.last_level; i++) { 445fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák struct pipe_box box; 446fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 447fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák u_box_3d(0, 0, 0, 448fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák u_minify(templ.width0, i), u_minify(templ.height0, i), 449fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák util_max_layer(&templ, i) + 1, &box); 450fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 451fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rctx->dma_copy(&rctx->b, &new_tex->resource.b.b, i, 0, 0, 0, 452fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák &rtex->resource.b.b, i, &box); 453fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák } 454fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák } 455fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 456fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák r600_texture_discard_cmask(rctx->screen, rtex); 457fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák r600_texture_discard_dcc(rctx->screen, rtex); 458fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 459fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák /* Replace the structure fields of rtex. */ 460fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->resource.b.b.bind = templ.bind; 461fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák pb_reference(&rtex->resource.buf, new_tex->resource.buf); 462fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->resource.gpu_address = new_tex->resource.gpu_address; 463b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák rtex->resource.vram_usage = new_tex->resource.vram_usage; 464b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák rtex->resource.gart_usage = new_tex->resource.gart_usage; 465b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák rtex->resource.bo_size = new_tex->resource.bo_size; 466b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák rtex->resource.bo_alignment = new_tex->resource.bo_alignment; 467fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->resource.domains = new_tex->resource.domains; 468b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák rtex->resource.flags = new_tex->resource.flags; 469fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->size = new_tex->size; 470fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->surface = new_tex->surface; 471fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->non_disp_tiling = new_tex->non_disp_tiling; 472fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->cb_color_info = new_tex->cb_color_info; 473fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->cmask = new_tex->cmask; /* needed even without CMASK */ 474fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 475fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák assert(!rtex->htile_buffer); 476fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák assert(!rtex->cmask.size); 477fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák assert(!rtex->fmask.size); 478fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák assert(!rtex->dcc_offset); 479fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák assert(!rtex->is_depth); 480fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 48136cf5a57c2b53b50778482f7341b7afcdc434dafMarek Olšák r600_texture_reference(&new_tex, NULL); 482fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 483fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák r600_dirty_all_framebuffer_states(rctx->screen); 484fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák p_atomic_inc(&rctx->screen->dirty_tex_descriptor_counter); 485fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák} 486fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 487126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeetstatic boolean r600_texture_get_handle(struct pipe_screen* screen, 4889daaa6f5a66ab6cc99c6f0af37fc1007ab3d09afMarek Olšák struct pipe_context *ctx, 48969d8b7511420e3c9053dc57da9d7f478c2baca48Marek Olšák struct pipe_resource *resource, 49082db518f1519cec9e3842f23455a105e2006afbdMarek Olšák struct winsys_handle *whandle, 49182db518f1519cec9e3842f23455a105e2006afbdMarek Olšák unsigned usage) 492126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet{ 493e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_common_screen *rscreen = (struct r600_common_screen*)screen; 494d22feeaa9d65126e9775fcbaec8007e349f7fac5Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*) 495d22feeaa9d65126e9775fcbaec8007e349f7fac5Marek Olšák (ctx ? ctx : rscreen->aux_context); 49669d8b7511420e3c9053dc57da9d7f478c2baca48Marek Olšák struct r600_resource *res = (struct r600_resource*)resource; 49769d8b7511420e3c9053dc57da9d7f478c2baca48Marek Olšák struct r600_texture *rtex = (struct r600_texture*)resource; 498e3cee38e13dc79c3810560ba936c70f407c69aaeMarek Olšák struct radeon_bo_metadata metadata; 499a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák bool update_metadata = false; 500260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák 501d4e847ea33039f1d31843e69ab238f2225982393Marek Olšák /* This is not supported now, but it might be required for OpenCL 502d4e847ea33039f1d31843e69ab238f2225982393Marek Olšák * interop in the future. 503d4e847ea33039f1d31843e69ab238f2225982393Marek Olšák */ 504d4e847ea33039f1d31843e69ab238f2225982393Marek Olšák if (resource->target != PIPE_BUFFER && 505d4e847ea33039f1d31843e69ab238f2225982393Marek Olšák (resource->nr_samples > 1 || rtex->is_depth)) 506ca22d2f1fdb09e9b77394bc88418251034d344b5Edward O'Callaghan return false; 507d4e847ea33039f1d31843e69ab238f2225982393Marek Olšák 508a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák if (resource->target != PIPE_BUFFER) { 509a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák /* Since shader image stores don't support DCC on VI, 510a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák * disable it for external clients that want write 511a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák * access. 512a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák */ 513a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák if (usage & PIPE_HANDLE_USAGE_WRITE && rtex->dcc_offset) { 514d22feeaa9d65126e9775fcbaec8007e349f7fac5Marek Olšák if (r600_texture_disable_dcc(rctx, rtex)) 5159e5b5fbde0b445df1a3265b33e2ac890d6505409Marek Olšák update_metadata = true; 516a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák } 517f18fc70d6f62719e4fae2f93f2d563894bc1437fMarek Olšák 518a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH) && 519f660d1cb218d2610b81194d7a7ab83ff5e220005Marek Olšák (rtex->cmask.size || rtex->dcc_offset)) { 520a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák /* Eliminate fast clear (both CMASK and DCC) */ 52101dd73f2f42f0d017c2c6ccf1138a9c222953d52Marek Olšák r600_eliminate_fast_color_clear(rctx, rtex); 52260c08aa90bce4c8766a747c8517f7ff6987937f0Marek Olšák 523a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák /* Disable CMASK if flush_resource isn't going 524a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák * to be called. 525a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák */ 526f660d1cb218d2610b81194d7a7ab83ff5e220005Marek Olšák if (rtex->cmask.size) 527f660d1cb218d2610b81194d7a7ab83ff5e220005Marek Olšák r600_texture_discard_cmask(rscreen, rtex); 528a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák } 529970b979da1639d57e89169f96cc0064db9dae43aMarek Olšák 530a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák /* Set metadata. */ 531a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák if (!res->is_shared || update_metadata) { 532be73d358298b04624cdeca7113eedd10e3e37e6cMarek Olšák r600_texture_init_metadata(rtex, &metadata); 533ec74deeb2466689a0eca52f290d5f9e44af6a97bMarek Olšák if (rscreen->query_opaque_metadata) 534ec74deeb2466689a0eca52f290d5f9e44af6a97bMarek Olšák rscreen->query_opaque_metadata(rscreen, rtex, 535ec74deeb2466689a0eca52f290d5f9e44af6a97bMarek Olšák &metadata); 536ec74deeb2466689a0eca52f290d5f9e44af6a97bMarek Olšák 537be73d358298b04624cdeca7113eedd10e3e37e6cMarek Olšák rscreen->ws->buffer_set_metadata(res->buf, &metadata); 538be73d358298b04624cdeca7113eedd10e3e37e6cMarek Olšák } 539a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák } 540a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák 541a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák if (res->is_shared) { 542a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák /* USAGE_EXPLICIT_FLUSH must be cleared if at least one user 543a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák * doesn't set it. 544a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák */ 545a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák res->external_usage |= usage & ~PIPE_HANDLE_USAGE_EXPLICIT_FLUSH; 546a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)) 547a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák res->external_usage &= ~PIPE_HANDLE_USAGE_EXPLICIT_FLUSH; 548c034d3dde06b1ff882938bfea2b7cad10468b0dbMarek Olšák } else { 549a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák res->is_shared = true; 550a64dbdf612805daff0bbc70bba26053bd226ae70Marek Olšák res->external_usage = usage; 551f914779c75b01f344ff8d63f572abc71179f44d7Marek Olšák } 55211f056a3f0b87e86267efa8b5ac9d36a343c9dc1Michel Dänzer 55369d8b7511420e3c9053dc57da9d7f478c2baca48Marek Olšák return rscreen->ws->buffer_get_handle(res->buf, 554e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák rtex->surface.level[0].nblk_x * 555e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák rtex->surface.bpe, 55604bc082f6a8bfc3b3774bb102d3200317609432eChristian König rtex->surface.level[0].offset, 5575aea0d691988af945e09e1d7cca28ca0759cc309Christian König rtex->surface.level[0].slice_size, 55869d8b7511420e3c9053dc57da9d7f478c2baca48Marek Olšák whandle); 559126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet} 560126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet 561126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeetstatic void r600_texture_destroy(struct pipe_screen *screen, 562126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet struct pipe_resource *ptex) 563126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet{ 564951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)ptex; 565126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet struct r600_resource *resource = &rtex->resource; 566126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet 5673a1da559c5a4aaf77106ecefbaf03cb0aaf35495Nicolai Hähnle r600_texture_reference(&rtex->flushed_depth_texture, NULL); 568126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet 569d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&rtex->htile_buffer, NULL); 57039801d4ba7e19e9ce1dbde3ba3441cae38e7dbaaMarek Olšák if (rtex->cmask_buffer != &rtex->resource) { 571d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&rtex->cmask_buffer, NULL); 57256d9a397aa2dbee6b12e1bbe56be39f426e1e34dGrigori Goronzy } 5736101b6d442b06a347c001fe85848d636ab7df260Marek Olšák pb_reference(&resource->buf, NULL); 5749124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák r600_resource_reference(&rtex->dcc_separate_buffer, NULL); 57549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák r600_resource_reference(&rtex->last_dcc_separate_buffer, NULL); 576126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet FREE(rtex); 577126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet} 578126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet 579369e46888904c6d379b8b477d9242cff1608e30eMarek Olšákstatic const struct u_resource_vtbl r600_texture_vtbl; 580126e98966d5396ed251a34e3c39f11b36351a579Henri Verbeet 58178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák/* The number of samples can be specified independently of the texture. */ 582e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšákvoid r600_texture_get_fmask_info(struct r600_common_screen *rscreen, 58378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_texture *rtex, 58478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák unsigned nr_samples, 58578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_fmask_info *out) 586a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák{ 58761c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák /* FMASK is allocated like an ordinary texture. */ 588e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák struct pipe_resource templ = rtex->resource.b.b; 589e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák struct radeon_surf fmask = {}; 590e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák unsigned flags, bpe; 591a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 59261c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák memset(out, 0, sizeof(*out)); 59361c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák 594e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák templ.nr_samples = 1; 595e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák flags = rtex->surface.flags | RADEON_SURF_FMASK; 59661c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák 597d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák if (rscreen->chip_class <= CAYMAN) { 598d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák /* Use the same parameters and tile mode. */ 599d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák fmask.bankw = rtex->surface.bankw; 600d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák fmask.bankh = rtex->surface.bankh; 601d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák fmask.mtilea = rtex->surface.mtilea; 602d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák fmask.tile_split = rtex->surface.tile_split; 603d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák 604d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák if (nr_samples <= 4) 605d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák fmask.bankh = 4; 606d18bf0b9441934c5119351b19e628f9e8df0dd3aMarek Olšák } 60720a9b784da3c286bdba5fbfb4e6592e16560895cMarek Olšák 608a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák switch (nr_samples) { 609a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák case 2: 610a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák case 4: 611e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák bpe = 1; 612a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák break; 613a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák case 8: 614e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák bpe = 4; 615a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák break; 616a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák default: 617a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák R600_ERR("Invalid sample count for FMASK allocation.\n"); 618a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák return; 619a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 620a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 62161c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák /* Overallocate FMASK on R600-R700 to fix colorbuffer corruption. 62261c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák * This can be fixed by writing a separate FMASK allocator specifically 62361c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák * for R600-R700 asics. */ 624e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (rscreen->chip_class <= R700) { 625e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák bpe *= 2; 6268698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 6278698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 628e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák if (rscreen->ws->surface_init(rscreen->ws, &templ, flags, bpe, 629e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák RADEON_SURF_MODE_2D, &fmask)) { 630a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák R600_ERR("Got error in surface_init while allocating FMASK.\n"); 631a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák return; 632a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 63361c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák 634a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák assert(fmask.level[0].mode == RADEON_SURF_MODE_2D); 635a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 63661c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák out->slice_tile_max = (fmask.level[0].nblk_x * fmask.level[0].nblk_y) / 64; 63761c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák if (out->slice_tile_max) 63861c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák out->slice_tile_max -= 1; 63961c995bc47b838317a4a62fba2ff2031bcb0c23eMarek Olšák 640e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák out->tile_mode_index = fmask.tiling_index[0]; 64184fbb0aff98d6e90e4759bbe701c9484e569c869Marek Olšák out->pitch_in_pixels = fmask.level[0].nblk_x; 64278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák out->bank_height = fmask.bankh; 6432a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák out->alignment = MAX2(256, fmask.surf_alignment); 6442a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák out->size = fmask.surf_size; 64578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák} 64678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 647e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšákstatic void r600_texture_allocate_fmask(struct r600_common_screen *rscreen, 64878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_texture *rtex) 64978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák{ 65078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_texture_get_fmask_info(rscreen, rtex, 651e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák rtex->resource.b.b.nr_samples, &rtex->fmask); 65278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 6531dd8832e046ddef6d9ee69210127bebc9ddb35ebMarek Olšák rtex->fmask.offset = align64(rtex->size, rtex->fmask.alignment); 65439801d4ba7e19e9ce1dbde3ba3441cae38e7dbaaMarek Olšák rtex->size = rtex->fmask.offset + rtex->fmask.size; 655a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák} 656a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 657e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšákvoid r600_texture_get_cmask_info(struct r600_common_screen *rscreen, 65878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_texture *rtex, 65978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_cmask_info *out) 660a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák{ 661a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned cmask_tile_width = 8; 662a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned cmask_tile_height = 8; 663a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned cmask_tile_elements = cmask_tile_width * cmask_tile_height; 664a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned element_bits = 4; 665a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned cmask_cache_bits = 1024; 666294ec530c9829aead97487b1feb06361ef97cc2dMarek Olšák unsigned num_pipes = rscreen->info.num_tile_pipes; 6674f96846d9d96fcb84fb0fb1823b3f59c3c426253Marek Olšák unsigned pipe_interleave_bytes = rscreen->info.pipe_interleave_bytes; 668a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 669a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned elements_per_macro_tile = (cmask_cache_bits / element_bits) * num_pipes; 670a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned pixels_per_macro_tile = elements_per_macro_tile * cmask_tile_elements; 671a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned sqrt_pixels_per_macro_tile = sqrt(pixels_per_macro_tile); 672a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned macro_tile_width = util_next_power_of_two(sqrt_pixels_per_macro_tile); 673a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned macro_tile_height = pixels_per_macro_tile / macro_tile_width; 674a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 675b5118fe0543400295be5b1a65a5001882498831eMarek Olšák unsigned pitch_elements = align(rtex->resource.b.b.width0, macro_tile_width); 676b5118fe0543400295be5b1a65a5001882498831eMarek Olšák unsigned height = align(rtex->resource.b.b.height0, macro_tile_height); 677a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 678a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned base_align = num_pipes * pipe_interleave_bytes; 679a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned slice_bytes = 680a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák ((pitch_elements * height * element_bits + 7) / 8) / cmask_tile_elements; 681a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 682a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák assert(macro_tile_width % 128 == 0); 683a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák assert(macro_tile_height % 128 == 0); 684a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 68578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák out->slice_tile_max = ((pitch_elements * height) / (128*128)) - 1; 68678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák out->alignment = MAX2(256, base_align); 687a9528cef6b6ff4875c9d125a60b7309a2ad24766Marek Olšák out->size = (util_max_layer(&rtex->resource.b.b, 0) + 1) * 688a9528cef6b6ff4875c9d125a60b7309a2ad24766Marek Olšák align(slice_bytes, base_align); 68978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák} 69078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 691e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšákstatic void si_texture_get_cmask_info(struct r600_common_screen *rscreen, 692e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_texture *rtex, 693e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_cmask_info *out) 69478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák{ 6954f96846d9d96fcb84fb0fb1823b3f59c3c426253Marek Olšák unsigned pipe_interleave_bytes = rscreen->info.pipe_interleave_bytes; 696294ec530c9829aead97487b1feb06361ef97cc2dMarek Olšák unsigned num_pipes = rscreen->info.num_tile_pipes; 697e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák unsigned cl_width, cl_height; 69878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 699e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák switch (num_pipes) { 700e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák case 2: 701e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák cl_width = 32; 702e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák cl_height = 16; 703e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák break; 704e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák case 4: 705e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák cl_width = 32; 706e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák cl_height = 32; 707e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák break; 708e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák case 8: 709e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák cl_width = 64; 710e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák cl_height = 32; 711e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák break; 712751e8697f2099a0ceaba09e0d8775e4636f209b1Marek Olšák case 16: /* Hawaii */ 713751e8697f2099a0ceaba09e0d8775e4636f209b1Marek Olšák cl_width = 64; 714751e8697f2099a0ceaba09e0d8775e4636f209b1Marek Olšák cl_height = 64; 715751e8697f2099a0ceaba09e0d8775e4636f209b1Marek Olšák break; 716e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák default: 717e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák assert(0); 718e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return; 719e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } 720e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 721e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák unsigned base_align = num_pipes * pipe_interleave_bytes; 722e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 723b5118fe0543400295be5b1a65a5001882498831eMarek Olšák unsigned width = align(rtex->resource.b.b.width0, cl_width*8); 724b5118fe0543400295be5b1a65a5001882498831eMarek Olšák unsigned height = align(rtex->resource.b.b.height0, cl_height*8); 725e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák unsigned slice_elements = (width * height) / (8*8); 72678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 727e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* Each element of CMASK is a nibble. */ 728e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák unsigned slice_bytes = slice_elements / 2; 729e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 730e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák out->slice_tile_max = (width * height) / (128*128); 731e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (out->slice_tile_max) 732e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák out->slice_tile_max -= 1; 733e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 734e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák out->alignment = MAX2(256, base_align); 735a9528cef6b6ff4875c9d125a60b7309a2ad24766Marek Olšák out->size = (util_max_layer(&rtex->resource.b.b, 0) + 1) * 736a9528cef6b6ff4875c9d125a60b7309a2ad24766Marek Olšák align(slice_bytes, base_align); 737e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák} 738e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 739e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšákstatic void r600_texture_allocate_cmask(struct r600_common_screen *rscreen, 740e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_texture *rtex) 741e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák{ 742e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (rscreen->chip_class >= SI) { 743e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák si_texture_get_cmask_info(rscreen, rtex, &rtex->cmask); 744e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } else { 745e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák r600_texture_get_cmask_info(rscreen, rtex, &rtex->cmask); 746e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } 747e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 7481dd8832e046ddef6d9ee69210127bebc9ddb35ebMarek Olšák rtex->cmask.offset = align64(rtex->size, rtex->cmask.alignment); 74939801d4ba7e19e9ce1dbde3ba3441cae38e7dbaaMarek Olšák rtex->size = rtex->cmask.offset + rtex->cmask.size; 750d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák 751d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák if (rscreen->chip_class >= SI) 752d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák rtex->cb_color_info |= SI_S_028C70_FAST_CLEAR(1); 753d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák else 754d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák rtex->cb_color_info |= EG_S_028C70_FAST_CLEAR(1); 755a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák} 756a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 75728eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšákstatic void r600_texture_alloc_cmask_separate(struct r600_common_screen *rscreen, 75828eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák struct r600_texture *rtex) 759e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák{ 760d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák if (rtex->cmask_buffer) 761d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák return; 762d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák 763e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák assert(rtex->cmask.size == 0); 76456d9a397aa2dbee6b12e1bbe56be39f426e1e34dGrigori Goronzy 765a38e1fd78ba406abe6c6dfd665804ec0d8f98172Marek Olšák if (rscreen->chip_class >= SI) { 766a38e1fd78ba406abe6c6dfd665804ec0d8f98172Marek Olšák si_texture_get_cmask_info(rscreen, rtex, &rtex->cmask); 767a38e1fd78ba406abe6c6dfd665804ec0d8f98172Marek Olšák } else { 768a38e1fd78ba406abe6c6dfd665804ec0d8f98172Marek Olšák r600_texture_get_cmask_info(rscreen, rtex, &rtex->cmask); 769a38e1fd78ba406abe6c6dfd665804ec0d8f98172Marek Olšák } 77056d9a397aa2dbee6b12e1bbe56be39f426e1e34dGrigori Goronzy 771e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák rtex->cmask_buffer = (struct r600_resource *) 772dce05b342355eac9296ee7110385b16d6edb059dMarek Olšák r600_aligned_buffer_create(&rscreen->b, 0, PIPE_USAGE_DEFAULT, 773dce05b342355eac9296ee7110385b16d6edb059dMarek Olšák rtex->cmask.size, 774dce05b342355eac9296ee7110385b16d6edb059dMarek Olšák rtex->cmask.alignment); 775e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (rtex->cmask_buffer == NULL) { 776e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák rtex->cmask.size = 0; 777d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák return; 778e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } 779d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák 780d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák /* update colorbuffer state bits */ 7818c235465cd742c65c8f5550f8bda89b7cd4e3b33Marek Olšák rtex->cmask.base_address_reg = rtex->cmask_buffer->gpu_address >> 8; 782d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák 783d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák if (rscreen->chip_class >= SI) 784d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák rtex->cb_color_info |= SI_S_028C70_FAST_CLEAR(1); 785d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák else 786d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák rtex->cb_color_info |= EG_S_028C70_FAST_CLEAR(1); 787784269aa404e9484e195032841025cee24af8058Nicolai Hähnle 788784269aa404e9484e195032841025cee24af8058Nicolai Hähnle p_atomic_inc(&rscreen->compressed_colortex_counter); 789e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák} 79039801d4ba7e19e9ce1dbde3ba3441cae38e7dbaaMarek Olšák 7917a706ad25cefc666b54ddf778d047691a575b689Marek Olšákstatic void r600_texture_get_htile_size(struct r600_common_screen *rscreen, 7927a706ad25cefc666b54ddf778d047691a575b689Marek Olšák struct r600_texture *rtex) 793a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz{ 794a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz unsigned cl_width, cl_height, width, height; 795a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz unsigned slice_elements, slice_bytes, pipe_interleave_bytes, base_align; 796294ec530c9829aead97487b1feb06361ef97cc2dMarek Olšák unsigned num_pipes = rscreen->info.num_tile_pipes; 797a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 7987a706ad25cefc666b54ddf778d047691a575b689Marek Olšák rtex->surface.htile_size = 0; 7997a706ad25cefc666b54ddf778d047691a575b689Marek Olšák 8006d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák if (rscreen->chip_class <= EVERGREEN && 8018ba70e0a7405005c079eb72f94999245c992aa91Marek Olšák rscreen->info.drm_major == 2 && rscreen->info.drm_minor < 26) 8027a706ad25cefc666b54ddf778d047691a575b689Marek Olšák return; 8036d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák 8046d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák /* HW bug on R6xx. */ 8056d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák if (rscreen->chip_class == R600 && 8067e73ff87c0255a8e0498a47991b640cdece35928Marek Olšák (rtex->resource.b.b.width0 > 7680 || 8077e73ff87c0255a8e0498a47991b640cdece35928Marek Olšák rtex->resource.b.b.height0 > 7680)) 8087a706ad25cefc666b54ddf778d047691a575b689Marek Olšák return; 8096d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák 8104d641803e8f8763dcf4a262c6bcf2d1ba0431ca2Marek Olšák /* HTILE is broken with 1D tiling on old kernels and CIK. */ 8116d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák if (rscreen->chip_class >= CIK && 8126d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák rtex->surface.level[0].mode == RADEON_SURF_MODE_1D && 8138ba70e0a7405005c079eb72f94999245c992aa91Marek Olšák rscreen->info.drm_major == 2 && rscreen->info.drm_minor < 38) 8147a706ad25cefc666b54ddf778d047691a575b689Marek Olšák return; 8152748b7da7e2a65bc46d12187b27585902a88f0aaMarek Olšák 8164ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák /* Overalign HTILE on P2 configs to work around GPU hangs in 8174ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák * piglit/depthstencil-render-miplevels 585. 8184ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák * 8194ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák * This has been confirmed to help Kabini & Stoney, where the hangs 8204ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák * are always reproducible. I think I have seen the test hang 8214ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák * on Carrizo too, though it was very rare there. 8224ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák */ 8234ab2ac334921ae9bbd1791adaf8977fccf744580Marek Olšák if (rscreen->chip_class >= CIK && num_pipes < 4) 8248ec24678ac0f459af4acb4b40a70d7802906e41aMarek Olšák num_pipes = 4; 8258ec24678ac0f459af4acb4b40a70d7802906e41aMarek Olšák 826a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz switch (num_pipes) { 8276d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák case 1: 8286d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák cl_width = 32; 8296d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák cl_height = 16; 8306d751065cca931798f2ad9e68f936d3d41886e4fMarek Olšák break; 831a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz case 2: 832a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_width = 32; 833a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_height = 32; 834a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz break; 835a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz case 4: 836a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_width = 64; 837a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_height = 32; 838a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz break; 839a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz case 8: 840a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_width = 64; 841a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_height = 64; 842a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz break; 843a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz case 16: 844a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_width = 128; 845a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz cl_height = 64; 846a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz break; 847a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz default: 848a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz assert(0); 8497a706ad25cefc666b54ddf778d047691a575b689Marek Olšák return; 850a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz } 851a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 852b5118fe0543400295be5b1a65a5001882498831eMarek Olšák width = align(rtex->resource.b.b.width0, cl_width * 8); 853b5118fe0543400295be5b1a65a5001882498831eMarek Olšák height = align(rtex->resource.b.b.height0, cl_height * 8); 854a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 855a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz slice_elements = (width * height) / (8 * 8); 856a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz slice_bytes = slice_elements * 4; 857a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 8584f96846d9d96fcb84fb0fb1823b3f59c3c426253Marek Olšák pipe_interleave_bytes = rscreen->info.pipe_interleave_bytes; 859a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz base_align = num_pipes * pipe_interleave_bytes; 860a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 8617a706ad25cefc666b54ddf778d047691a575b689Marek Olšák rtex->surface.htile_alignment = base_align; 8627a706ad25cefc666b54ddf778d047691a575b689Marek Olšák rtex->surface.htile_size = 8637a706ad25cefc666b54ddf778d047691a575b689Marek Olšák (util_max_layer(&rtex->resource.b.b, 0) + 1) * 864a9528cef6b6ff4875c9d125a60b7309a2ad24766Marek Olšák align(slice_bytes, base_align); 865a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz} 866a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 867a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetzstatic void r600_texture_allocate_htile(struct r600_common_screen *rscreen, 868a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz struct r600_texture *rtex) 869a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz{ 870d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák uint32_t clear_value; 871d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 872d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák if (rtex->tc_compatible_htile) { 873d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák clear_value = 0x0000030F; 874d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák } else { 8757a706ad25cefc666b54ddf778d047691a575b689Marek Olšák r600_texture_get_htile_size(rscreen, rtex); 876d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák clear_value = 0; 877d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák } 878a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 8797a706ad25cefc666b54ddf778d047691a575b689Marek Olšák if (!rtex->surface.htile_size) 880a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz return; 881e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 882a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz rtex->htile_buffer = (struct r600_resource*) 88329144d0f34d9325a3549e4ed0feecc0577c70358Marek Olšák r600_aligned_buffer_create(&rscreen->b, 0, PIPE_USAGE_DEFAULT, 8847a706ad25cefc666b54ddf778d047691a575b689Marek Olšák rtex->surface.htile_size, 8857a706ad25cefc666b54ddf778d047691a575b689Marek Olšák rtex->surface.htile_alignment); 886ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz if (rtex->htile_buffer == NULL) { 887e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* this is not a fatal error as we can still keep rendering 888a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz * without htile buffer */ 889a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz R600_ERR("Failed to create buffer object for htile buffer.\n"); 890e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } else { 891d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák r600_screen_clear_buffer(rscreen, &rtex->htile_buffer->b.b, 8927a706ad25cefc666b54ddf778d047691a575b689Marek Olšák 0, rtex->surface.htile_size, 8939a3296bf1cf8d45349b14b31eeb0d81f8b8774fcMarek Olšák clear_value); 894e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } 89556d9a397aa2dbee6b12e1bbe56be39f426e1e34dGrigori Goronzy} 89656d9a397aa2dbee6b12e1bbe56be39f426e1e34dGrigori Goronzy 8973a6de8c86ee8a0a6d2f2fbc8cf2c461af0b9a007Marek Olšákvoid r600_print_texture_info(struct r600_texture *rtex, FILE *f) 8982d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák{ 8992d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák int i; 9002d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák 9012d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák fprintf(f, " Info: npix_x=%u, npix_y=%u, npix_z=%u, blk_w=%u, " 902e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák "blk_h=%u, array_size=%u, last_level=%u, " 9032d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák "bpe=%u, nsamples=%u, flags=0x%x, %s\n", 904e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák rtex->resource.b.b.width0, rtex->resource.b.b.height0, 905e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák rtex->resource.b.b.depth0, rtex->surface.blk_w, 906e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák rtex->surface.blk_h, 907e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák rtex->resource.b.b.array_size, rtex->resource.b.b.last_level, 908e9590d9092fbcd551f5597149c64016b6f861233Marek Olšák rtex->surface.bpe, rtex->resource.b.b.nr_samples, 9092d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák rtex->surface.flags, util_format_short_name(rtex->resource.b.b.format)); 91019eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák 911d5c7ea3b83168d8fd77ed4bd834901209e1d47daMarek Olšák fprintf(f, " Layout: size=%"PRIu64", alignment=%u, bankw=%u, " 91219eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák "bankh=%u, nbanks=%u, mtilea=%u, tilesplit=%u, pipeconfig=%u, scanout=%u\n", 9132a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák rtex->surface.surf_size, rtex->surface.surf_alignment, rtex->surface.bankw, 91419eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák rtex->surface.bankh, rtex->surface.num_banks, rtex->surface.mtilea, 91519eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák rtex->surface.tile_split, rtex->surface.pipe_config, 91619eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák (rtex->surface.flags & RADEON_SURF_SCANOUT) != 0); 91719eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák 91819eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák if (rtex->fmask.size) 9191dd8832e046ddef6d9ee69210127bebc9ddb35ebMarek Olšák fprintf(f, " FMask: offset=%"PRIu64", size=%"PRIu64", alignment=%u, pitch_in_pixels=%u, " 92019eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák "bankh=%u, slice_tile_max=%u, tile_mode_index=%u\n", 92119eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák rtex->fmask.offset, rtex->fmask.size, rtex->fmask.alignment, 92284fbb0aff98d6e90e4759bbe701c9484e569c869Marek Olšák rtex->fmask.pitch_in_pixels, rtex->fmask.bank_height, 92319eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák rtex->fmask.slice_tile_max, rtex->fmask.tile_mode_index); 92419eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák 92519eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák if (rtex->cmask.size) 9263dc78c33a95fc50191cfe0713865197338ef65b0Marek Olšák fprintf(f, " CMask: offset=%"PRIu64", size=%"PRIu64", alignment=%u, " 9273dc78c33a95fc50191cfe0713865197338ef65b0Marek Olšák "slice_tile_max=%u\n", 92819eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák rtex->cmask.offset, rtex->cmask.size, rtex->cmask.alignment, 9293dc78c33a95fc50191cfe0713865197338ef65b0Marek Olšák rtex->cmask.slice_tile_max); 93019eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák 93119eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák if (rtex->htile_buffer) 9327a706ad25cefc666b54ddf778d047691a575b689Marek Olšák fprintf(f, " HTile: size=%u, alignment=%u, TC_compatible = %u\n", 93319eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák rtex->htile_buffer->b.b.width0, 9347a706ad25cefc666b54ddf778d047691a575b689Marek Olšák rtex->htile_buffer->buf->alignment, 935d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák rtex->tc_compatible_htile); 93619eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák 937b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák if (rtex->dcc_offset) { 938d5c7ea3b83168d8fd77ed4bd834901209e1d47daMarek Olšák fprintf(f, " DCC: offset=%"PRIu64", size=%"PRIu64", alignment=%u\n", 939b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák rtex->dcc_offset, rtex->surface.dcc_size, 940b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák rtex->surface.dcc_alignment); 941b5118fe0543400295be5b1a65a5001882498831eMarek Olšák for (i = 0; i <= rtex->resource.b.b.last_level; i++) 94200389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák fprintf(f, " DCCLevel[%i]: enabled=%u, offset=%"PRIu64", " 94300389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák "fast_clear_size=%"PRIu64"\n", 944692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák i, i < rtex->surface.num_dcc_levels, 94500389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák rtex->surface.level[i].dcc_offset, 94600389100b63d03adf70892b721d1b2e8b8d5e48aMarek Olšák rtex->surface.level[i].dcc_fast_clear_size); 94719eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák } 94819eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák 949b5118fe0543400295be5b1a65a5001882498831eMarek Olšák for (i = 0; i <= rtex->resource.b.b.last_level; i++) 95019eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák fprintf(f, " Level[%i]: offset=%"PRIu64", slice_size=%"PRIu64", " 95119eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák "npix_x=%u, npix_y=%u, npix_z=%u, nblk_x=%u, nblk_y=%u, " 952e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák "mode=%u, tiling_index = %u\n", 9532d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák i, rtex->surface.level[i].offset, 9542d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák rtex->surface.level[i].slice_size, 9552d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák u_minify(rtex->resource.b.b.width0, i), 9562d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák u_minify(rtex->resource.b.b.height0, i), 9572d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák u_minify(rtex->resource.b.b.depth0, i), 9582d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák rtex->surface.level[i].nblk_x, 9592d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák rtex->surface.level[i].nblk_y, 96024faeb94bea35d750132fb27be4bad94caf064f3Marek Olšák rtex->surface.level[i].mode, 96124faeb94bea35d750132fb27be4bad94caf064f3Marek Olšák rtex->surface.tiling_index[i]); 96219eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák 9632d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák if (rtex->surface.flags & RADEON_SURF_SBUFFER) { 9645b87eef031e8ebfee4f868cdc856a76faff87930Nicolai Hähnle fprintf(f, " StencilLayout: tilesplit=%u\n", 9655b87eef031e8ebfee4f868cdc856a76faff87930Nicolai Hähnle rtex->surface.stencil_tile_split); 966b5118fe0543400295be5b1a65a5001882498831eMarek Olšák for (i = 0; i <= rtex->resource.b.b.last_level; i++) { 96719eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák fprintf(f, " StencilLevel[%i]: offset=%"PRIu64", " 96819eaceb6edc6cd3a9ae878c89f9deb79afae4dd6Marek Olšák "slice_size=%"PRIu64", npix_x=%u, " 9692d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák "npix_y=%u, npix_z=%u, nblk_x=%u, nblk_y=%u, " 970e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák "mode=%u, tiling_index = %u\n", 9712d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák i, rtex->surface.stencil_level[i].offset, 9722d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák rtex->surface.stencil_level[i].slice_size, 9732d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák u_minify(rtex->resource.b.b.width0, i), 9742d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák u_minify(rtex->resource.b.b.height0, i), 9752d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák u_minify(rtex->resource.b.b.depth0, i), 9762d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák rtex->surface.stencil_level[i].nblk_x, 9772d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák rtex->surface.stencil_level[i].nblk_y, 97824faeb94bea35d750132fb27be4bad94caf064f3Marek Olšák rtex->surface.stencil_level[i].mode, 97924faeb94bea35d750132fb27be4bad94caf064f3Marek Olšák rtex->surface.stencil_tiling_index[i]); 9802d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák } 9812d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák } 9822d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák} 9832d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák 984ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz/* Common processing for r600_texture_create and r600_texture_from_handle */ 985951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšákstatic struct r600_texture * 9866a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlier600_texture_create_object(struct pipe_screen *screen, 9876a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie const struct pipe_resource *base, 9886101b6d442b06a347c001fe85848d636ab7df260Marek Olšák struct pb_buffer *buf, 989a582b22c6382f24d921e9fe8a24917100c1396f1Marek Olšák struct radeon_surf *surface) 99072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 991951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex; 992742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse struct r600_resource *resource; 993e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_common_screen *rscreen = (struct r600_common_screen*)screen; 994c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 995951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák rtex = CALLOC_STRUCT(r600_texture); 99613eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan if (!rtex) 99772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return NULL; 9986a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie 999742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse resource = &rtex->resource; 1000a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák resource->b.b = *base; 10018d8c440ebf1a41dd235a67f3f1538cf47adec013Michel Dänzer resource->b.b.next = NULL; 1002a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák resource->b.vtbl = &r600_texture_vtbl; 1003a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák pipe_reference_init(&resource->b.b.reference, 1); 1004a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák resource->b.b.screen = screen; 100568c54abb2cfd12a031829e78d721b2480d0c8cc4Marek Olšák 10067c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák /* don't include stencil-only formats which we don't support for rendering */ 10077c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák rtex->is_depth = util_format_has_depth(util_format_description(rtex->resource.b.b.format)); 100838b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet 1009581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák rtex->surface = *surface; 10102a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák rtex->size = rtex->surface.surf_size; 101168c54abb2cfd12a031829e78d721b2480d0c8cc4Marek Olšák 1012ce3f453f0165d0ef29fa482e4ec1f89aa9706b1dMarek Olšák rtex->tc_compatible_htile = rtex->surface.htile_size != 0 && 1013ce3f453f0165d0ef29fa482e4ec1f89aa9706b1dMarek Olšák (rtex->surface.flags & 1014ce3f453f0165d0ef29fa482e4ec1f89aa9706b1dMarek Olšák RADEON_SURF_TC_COMPATIBLE_HTILE); 1015d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 1016d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák /* TC-compatible HTILE only supports Z32_FLOAT. */ 1017d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák if (rtex->tc_compatible_htile) 1018d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák rtex->db_render_format = PIPE_FORMAT_Z32_FLOAT; 1019d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák else 1020d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák rtex->db_render_format = base->format; 1021d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 1022c7d91a6f13d9dafe47cfa948619083258bc47cb0Marek Olšák /* Tiled depth textures utilize the non-displayable tile order. 1023c7d91a6f13d9dafe47cfa948619083258bc47cb0Marek Olšák * This must be done after r600_setup_surface. 1024c7d91a6f13d9dafe47cfa948619083258bc47cb0Marek Olšák * Applies to R600-Cayman. */ 1025c7d91a6f13d9dafe47cfa948619083258bc47cb0Marek Olšák rtex->non_disp_tiling = rtex->is_depth && rtex->surface.level[0].mode >= RADEON_SURF_MODE_1D; 10264eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák /* Applies to GCN. */ 10274eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->last_msaa_resolve_target_micro_mode = rtex->surface.micro_tile_mode; 1028c7d91a6f13d9dafe47cfa948619083258bc47cb0Marek Olšák 10299ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák /* Disable separate DCC at the beginning. DRI2 doesn't reuse buffers 10309ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák * between frames, so the only thing that can enable separate DCC 10319ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák * with DRI2 is multiple slow clears within a frame. 103249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 10339ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák rtex->ps_draw_ratio = 0; 103449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 1035ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz if (rtex->is_depth) { 1036dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle if (base->flags & (R600_RESOURCE_FLAG_TRANSFER | 1037dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle R600_RESOURCE_FLAG_FLUSHED_DEPTH) || 1038dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle rscreen->chip_class >= EVERGREEN) { 10397000dfd5c36dcfcc493e149e5aa5b4124d814d8aNicolai Hähnle rtex->can_sample_z = !rtex->surface.depth_adjusted; 10407000dfd5c36dcfcc493e149e5aa5b4124d814d8aNicolai Hähnle rtex->can_sample_s = !rtex->surface.stencil_adjusted; 1041dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle } else { 1042dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle if (rtex->resource.b.b.nr_samples <= 1 && 1043dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle (rtex->resource.b.b.format == PIPE_FORMAT_Z16_UNORM || 1044dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle rtex->resource.b.b.format == PIPE_FORMAT_Z32_FLOAT)) 1045dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle rtex->can_sample_z = true; 1046dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle } 1047a32aa2617db218a9f03c49970a3417ae7d8c3babAndreas Hartmetz 1048dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle if (!(base->flags & (R600_RESOURCE_FLAG_TRANSFER | 1049dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle R600_RESOURCE_FLAG_FLUSHED_DEPTH))) { 1050f2eb34f82f074284b691d568d26426a1f633d5f0Nicolai Hähnle rtex->db_compatible = true; 1051f2eb34f82f074284b691d568d26426a1f633d5f0Nicolai Hähnle 1052dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle if (!(rscreen->debug_flags & DBG_NO_HYPERZ)) 1053dd651261530e2d885d150755c9521e8f6e97c851Nicolai Hähnle r600_texture_allocate_htile(rscreen, rtex); 1054ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz } 1055ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz } else { 1056ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz if (base->nr_samples > 1) { 1057ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz if (!buf) { 1058ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz r600_texture_allocate_fmask(rscreen, rtex); 1059ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz r600_texture_allocate_cmask(rscreen, rtex); 1060ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz rtex->cmask_buffer = &rtex->resource; 1061ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz } 1062ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz if (!rtex->fmask.size || !rtex->cmask.size) { 1063ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz FREE(rtex); 1064ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz return NULL; 1065ca5812b45c09aabe2f2c400c323b4f2cc23ca93cAndreas Hartmetz } 10666532eb17baff6e61b427f29e076883f8941ae664Jerome Glisse } 1067b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák 1068095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák /* Shared textures must always set up DCC here. 1069095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák * If it's not present, it will be disabled by 1070095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák * apply_opaque_metadata later. 1071095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák */ 1072095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák if (rtex->surface.dcc_size && 1073fa7c927625ec1904a659edfdd677b5752165590aMarek Olšák (buf || !(rscreen->debug_flags & DBG_NO_DCC)) && 1074fa7c927625ec1904a659edfdd677b5752165590aMarek Olšák !(rtex->surface.flags & RADEON_SURF_SCANOUT)) { 1075b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák /* Reserve space for the DCC buffer. */ 10761dd8832e046ddef6d9ee69210127bebc9ddb35ebMarek Olšák rtex->dcc_offset = align64(rtex->size, rtex->surface.dcc_alignment); 1077b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák rtex->size = rtex->dcc_offset + rtex->surface.dcc_size; 1078b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák } 10796532eb17baff6e61b427f29e076883f8941ae664Jerome Glisse } 10806532eb17baff6e61b427f29e076883f8941ae664Jerome Glisse 10817f29824fd5df27eca516ad65e4a4f8ff94fe7bedMarek Olšák /* Now create the backing buffer. */ 10829ef26fc667ab00072a23ca4d7bb1e8181d8fb1b1Marek Olšák if (!buf) { 10830d2e43fcb1198a6e67c85feadb1ca8c360ddc284Marek Olšák r600_init_resource_fields(rscreen, resource, rtex->size, 10842a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák rtex->surface.surf_alignment); 10850d2e43fcb1198a6e67c85feadb1ca8c360ddc284Marek Olšák 10866d89a4067627fdf568c6c4e3d9a201fd45d5352bNicolai Hähnle resource->flags |= RADEON_FLAG_HANDLE; 10876d89a4067627fdf568c6c4e3d9a201fd45d5352bNicolai Hähnle 10880d2e43fcb1198a6e67c85feadb1ca8c360ddc284Marek Olšák if (!r600_alloc_resource(rscreen, resource)) { 10896a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie FREE(rtex); 10906a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie return NULL; 10916a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie } 10929ef26fc667ab00072a23ca4d7bb1e8181d8fb1b1Marek Olšák } else { 10936101b6d442b06a347c001fe85848d636ab7df260Marek Olšák resource->buf = buf; 1094cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák resource->gpu_address = rscreen->ws->buffer_get_virtual_address(resource->buf); 1095b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák resource->bo_size = buf->size; 1096b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák resource->bo_alignment = buf->alignment; 1097cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák resource->domains = rscreen->ws->buffer_get_initial_domain(resource->buf); 1098b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák if (resource->domains & RADEON_DOMAIN_VRAM) 1099b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák resource->vram_usage = buf->size; 1100b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák else if (resource->domains & RADEON_DOMAIN_GTT) 1101b89854b0c7927817293aaec196c41b991cbcf377Marek Olšák resource->gart_usage = buf->size; 110272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse } 1103a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 110439801d4ba7e19e9ce1dbde3ba3441cae38e7dbaaMarek Olšák if (rtex->cmask.size) { 1105a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* Initialize the cmask to 0xCC (= compressed state). */ 1106e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák r600_screen_clear_buffer(rscreen, &rtex->cmask_buffer->b.b, 1107edf18da85dd3b1865c4faaba650a8fa371b7103cMarek Olšák rtex->cmask.offset, rtex->cmask.size, 11089a3296bf1cf8d45349b14b31eeb0d81f8b8774fcMarek Olšák 0xCCCCCCCC); 1109a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 1110095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák 1111095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák /* Initialize DCC only if the texture is not being imported. */ 1112095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák if (!buf && rtex->dcc_offset) { 1113b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák r600_screen_clear_buffer(rscreen, &rtex->resource.b.b, 1114b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák rtex->dcc_offset, 1115b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák rtex->surface.dcc_size, 11169a3296bf1cf8d45349b14b31eeb0d81f8b8774fcMarek Olšák 0xFFFFFFFF); 1117b744ac9f44099e1b50d335dc9bdc0950ab7ec374Marek Olšák } 1118428e37c2da420f7dc14a2ea265f2387270f9bee1Marek Olšák 1119d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák /* Initialize the CMASK base register value. */ 11208c235465cd742c65c8f5550f8bda89b7cd4e3b33Marek Olšák rtex->cmask.base_address_reg = 11218c235465cd742c65c8f5550f8bda89b7cd4e3b33Marek Olšák (rtex->resource.gpu_address + rtex->cmask.offset) >> 8; 1122d3c1be530a9e13378b66fb1ff8760ba0faa1a260Marek Olšák 1123e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (rscreen->debug_flags & DBG_VM) { 1124042b061fefc6531d247322a766950afb4dd39e54Christian König fprintf(stderr, "VM start=0x%"PRIX64" end=0x%"PRIX64" | Texture %ix%ix%i, %i levels, %i samples, %s\n", 11258c235465cd742c65c8f5550f8bda89b7cd4e3b33Marek Olšák rtex->resource.gpu_address, 11268c235465cd742c65c8f5550f8bda89b7cd4e3b33Marek Olšák rtex->resource.gpu_address + rtex->resource.buf->size, 1127413ca78af3b29036c051c827a0bfc4d20454e6bfMarek Olšák base->width0, base->height0, util_max_layer(base, 0)+1, base->last_level+1, 1128413ca78af3b29036c051c827a0bfc4d20454e6bfMarek Olšák base->nr_samples ? base->nr_samples : 1, util_format_short_name(base->format)); 1129413ca78af3b29036c051c827a0bfc4d20454e6bfMarek Olšák } 1130413ca78af3b29036c051c827a0bfc4d20454e6bfMarek Olšák 113175d64698f0b0c906d611e69d9f8b118c35026efaMarek Olšák if (rscreen->debug_flags & DBG_TEX) { 11322d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák puts("Texture:"); 11332d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák r600_print_texture_info(rtex, stdout); 1134bae066c3f0a9c47c43ebf497935145ed056e412fNicolai Hähnle fflush(stdout); 1135428e37c2da420f7dc14a2ea265f2387270f9bee1Marek Olšák } 11362d712d35c57900fc0aa0f1455381de48cdda0073Marek Olšák 11376a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie return rtex; 11386a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie} 11396a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie 1140ba174b8dfff0777075f62a9188124d0bb22a5f17Marek Olšákstatic enum radeon_surf_mode 1141ba174b8dfff0777075f62a9188124d0bb22a5f17Marek Olšákr600_choose_tiling(struct r600_common_screen *rscreen, 1142ba174b8dfff0777075f62a9188124d0bb22a5f17Marek Olšák const struct pipe_resource *templ) 11436a0066a69f6873a53d45684205926e8f5b73ddb2Dave Airlie{ 1144ac4f61b232024c7c83b81a9119a4637ed592c4a1Marek Olšák const struct util_format_description *desc = util_format_description(templ->format); 114544e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian bool force_tiling = templ->flags & R600_RESOURCE_FLAG_FORCE_TILING; 1146ee07e0e39ad1c4d13d540b23220fecc564d07b16Keith Whitwell 1147e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* MSAA resources must be 2D tiled. */ 1148e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (templ->nr_samples > 1) 1149e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_2D; 1150e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1151e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* Transfer resources should be linear. */ 1152e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (templ->flags & R600_RESOURCE_FLAG_TRANSFER) 1153e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_LINEAR_ALIGNED; 1154e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 115544e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian /* r600g: force tiling on TEXTURE_2D and TEXTURE_3D compute resources. */ 115644e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian if (rscreen->chip_class >= R600 && rscreen->chip_class <= CAYMAN && 115744e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian (templ->bind & PIPE_BIND_COMPUTE_RESOURCE) && 115844e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian (templ->target == PIPE_TEXTURE_2D || 115944e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian templ->target == PIPE_TEXTURE_3D)) 116044e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian force_tiling = true; 116144e90f2a556a9b8ede12ae18a7cfa3a71e32d40cZoltan Gilian 1162e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* Handle common candidates for the linear mode. 11632d7be5d37e70d19df88be53222bf02def40e93e6Marek Olšák * Compressed textures and DB surfaces must always be tiled. 11642d7be5d37e70d19df88be53222bf02def40e93e6Marek Olšák */ 11652d7be5d37e70d19df88be53222bf02def40e93e6Marek Olšák if (!force_tiling && !util_format_is_compressed(templ->format) && 11662d7be5d37e70d19df88be53222bf02def40e93e6Marek Olšák (!util_format_is_depth_or_stencil(templ->format) || 11672d7be5d37e70d19df88be53222bf02def40e93e6Marek Olšák templ->flags & R600_RESOURCE_FLAG_FLUSHED_DEPTH)) { 11682d7be5d37e70d19df88be53222bf02def40e93e6Marek Olšák if (rscreen->debug_flags & DBG_NO_TILING) 1169ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák return RADEON_SURF_MODE_LINEAR_ALIGNED; 1170ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák 1171cf05f9bf016c544fe15b7ac724f78d7524ce61deGrigori Goronzy /* Tiling doesn't work with the 422 (SUBSAMPLED) formats on R600+. */ 1172cf05f9bf016c544fe15b7ac724f78d7524ce61deGrigori Goronzy if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) 1173e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_LINEAR_ALIGNED; 1174e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1175e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* Cursors are linear on SI. 1176e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák * (XXX double-check, maybe also use RADEON_SURF_SCANOUT) */ 1177e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (rscreen->chip_class >= SI && 1178e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák (templ->bind & PIPE_BIND_CURSOR)) 1179e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_LINEAR_ALIGNED; 1180e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1181e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (templ->bind & PIPE_BIND_LINEAR) 1182e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_LINEAR_ALIGNED; 1183e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1184e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* Textures with a very small height are recommended to be linear. */ 1185e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (templ->target == PIPE_TEXTURE_1D || 1186e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák templ->target == PIPE_TEXTURE_1D_ARRAY || 1187e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák templ->height0 <= 4) 1188e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_LINEAR_ALIGNED; 1189e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1190e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* Textures likely to be mapped often. */ 1191e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (templ->usage == PIPE_USAGE_STAGING || 1192e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák templ->usage == PIPE_USAGE_STREAM) 1193e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_LINEAR_ALIGNED; 1194e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák } 1195e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1196e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* Make small textures 1D tiled. */ 1197ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák if (templ->width0 <= 16 || templ->height0 <= 16 || 1198ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák (rscreen->debug_flags & DBG_NO_2D_TILING)) 1199e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_1D; 1200e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1201e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák /* The allocator will switch to 1D if needed. */ 1202e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák return RADEON_SURF_MODE_2D; 1203e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák} 1204e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 1205e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšákstruct pipe_resource *r600_texture_create(struct pipe_screen *screen, 1206e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák const struct pipe_resource *templ) 1207e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák{ 1208e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_common_screen *rscreen = (struct r600_common_screen*)screen; 1209a582b22c6382f24d921e9fe8a24917100c1396f1Marek Olšák struct radeon_surf surface = {0}; 1210d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák bool is_flushed_depth = templ->flags & R600_RESOURCE_FLAG_FLUSHED_DEPTH; 1211d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák bool tc_compatible_htile = 1212d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák rscreen->chip_class >= VI && 1213d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák (templ->flags & PIPE_RESOURCE_FLAG_TEXTURING_MORE_LIKELY) && 1214d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák !(rscreen->debug_flags & DBG_NO_HYPERZ) && 1215d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák !is_flushed_depth && 1216d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák templ->nr_samples <= 1 && /* TC-compat HTILE is less efficient with MSAA */ 1217d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák util_format_is_depth_or_stencil(templ->format); 1218d4d9ec55c589156df4edc227a86b4a8c41048d58Marek Olšák 1219e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák int r; 1220089aa0ba247cee908ae689f8e4f3ffc457ce7627Dave Airlie 1221e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák r = r600_init_surface(rscreen, &surface, templ, 122228d237d63d8161124e62b5dab6f864de494cd652Marek Olšák r600_choose_tiling(rscreen, templ), 0, 0, 122328d237d63d8161124e62b5dab6f864de494cd652Marek Olšák false, false, is_flushed_depth, 122428d237d63d8161124e62b5dab6f864de494cd652Marek Olšák tc_compatible_htile); 1225c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (r) { 1226c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse return NULL; 1227c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 122881a95946dab730c1cfcf04ac1373cea5f7908f65Marek Olšák 122928d237d63d8161124e62b5dab6f864de494cd652Marek Olšák return (struct pipe_resource *) 123028d237d63d8161124e62b5dab6f864de494cd652Marek Olšák r600_texture_create_object(screen, templ, NULL, &surface); 123172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 123272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1233a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšákstatic struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen, 1234a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák const struct pipe_resource *templ, 123582db518f1519cec9e3842f23455a105e2006afbdMarek Olšák struct winsys_handle *whandle, 123682db518f1519cec9e3842f23455a105e2006afbdMarek Olšák unsigned usage) 123772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 1238e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_common_screen *rscreen = (struct r600_common_screen*)screen; 12396101b6d442b06a347c001fe85848d636ab7df260Marek Olšák struct pb_buffer *buf = NULL; 124004bc082f6a8bfc3b3774bb102d3200317609432eChristian König unsigned stride = 0, offset = 0; 1241e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák unsigned array_mode; 1242a582b22c6382f24d921e9fe8a24917100c1396f1Marek Olšák struct radeon_surf surface; 1243c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse int r; 1244260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák struct radeon_bo_metadata metadata = {}; 1245d95f59375886a18f6f9fb211fc839cf30c110d81Marek Olšák struct r600_texture *rtex; 124672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 124772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse /* Support only 2D textures without mipmaps */ 1248ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri if ((templ->target != PIPE_TEXTURE_2D && templ->target != PIPE_TEXTURE_RECT) || 1249ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri templ->depth0 != 1 || templ->last_level != 0) 125072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse return NULL; 1251b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák 125204bc082f6a8bfc3b3774bb102d3200317609432eChristian König buf = rscreen->ws->buffer_from_handle(rscreen->ws, whandle, &stride, &offset); 12536101b6d442b06a347c001fe85848d636ab7df260Marek Olšák if (!buf) 1254ac2bddb9f2c40effb16db321db0177decea81a92Tilman Sauerbeck return NULL; 12556101b6d442b06a347c001fe85848d636ab7df260Marek Olšák 1256bd1feb28273e8d7047304e5a2a02ca3d71de5533Marek Olšák rscreen->ws->buffer_get_metadata(buf, &metadata); 1257260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák 1258c8aac4fc0dce61a8061bccb8d63a94f1eacd5348Marek Olšák surface.pipe_config = metadata.pipe_config; 1259260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák surface.bankw = metadata.bankw; 1260260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák surface.bankh = metadata.bankh; 1261260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák surface.tile_split = metadata.tile_split; 1262260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák surface.mtilea = metadata.mtilea; 1263dc970c4f4e03e17e32132734c1707d845ab610c9Marek Olšák surface.num_banks = metadata.num_banks; 12646101b6d442b06a347c001fe85848d636ab7df260Marek Olšák 1265260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák if (metadata.macrotile == RADEON_LAYOUT_TILED) 1266e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák array_mode = RADEON_SURF_MODE_2D; 1267260ef9c9bec8695d5988a91443988516d39d0240Marek Olšák else if (metadata.microtile == RADEON_LAYOUT_TILED) 1268e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák array_mode = RADEON_SURF_MODE_1D; 12696101b6d442b06a347c001fe85848d636ab7df260Marek Olšák else 1270e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED; 1271ac2bddb9f2c40effb16db321db0177decea81a92Tilman Sauerbeck 127228d237d63d8161124e62b5dab6f864de494cd652Marek Olšák r = r600_init_surface(rscreen, &surface, templ, array_mode, stride, 127328d237d63d8161124e62b5dab6f864de494cd652Marek Olšák offset, true, metadata.scanout, false, false); 1274c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (r) { 1275c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse return NULL; 1276c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1277e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 127828d237d63d8161124e62b5dab6f864de494cd652Marek Olšák rtex = r600_texture_create_object(screen, templ, buf, &surface); 1279d95f59375886a18f6f9fb211fc839cf30c110d81Marek Olšák if (!rtex) 1280d95f59375886a18f6f9fb211fc839cf30c110d81Marek Olšák return NULL; 1281d95f59375886a18f6f9fb211fc839cf30c110d81Marek Olšák 1282d95f59375886a18f6f9fb211fc839cf30c110d81Marek Olšák rtex->resource.is_shared = true; 1283d95f59375886a18f6f9fb211fc839cf30c110d81Marek Olšák rtex->resource.external_usage = usage; 1284095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák 1285095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák if (rscreen->apply_opaque_metadata) 1286095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák rscreen->apply_opaque_metadata(rscreen, rtex, &metadata); 1287095803a37aa67361fc68604e81f858f31ae59b1bMarek Olšák 1288d95f59375886a18f6f9fb211fc839cf30c110d81Marek Olšák return &rtex->resource.b.b; 128972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 129072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1291611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšákbool r600_init_flushed_depth_texture(struct pipe_context *ctx, 129237708479608af877986b76302a9c92611d1e23d0Vadim Girlin struct pipe_resource *texture, 1293951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture **staging) 12942f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie{ 1295951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)texture; 12962f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie struct pipe_resource resource; 1297951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture **flushed_depth_texture = staging ? 129837708479608af877986b76302a9c92611d1e23d0Vadim Girlin staging : &rtex->flushed_depth_texture; 129968fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle enum pipe_format pipe_format = texture->format; 130068fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle 130168fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle if (!staging) { 130268fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle if (rtex->flushed_depth_texture) 130368fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle return true; /* it's ready */ 130468fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle 130568fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle if (!rtex->can_sample_z && rtex->can_sample_s) { 130668fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle switch (pipe_format) { 130768fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 130868fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle /* Save memory by not allocating the S plane. */ 130968fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle pipe_format = PIPE_FORMAT_Z32_FLOAT; 131068fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle break; 131168fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle case PIPE_FORMAT_Z24_UNORM_S8_UINT: 131268fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle case PIPE_FORMAT_S8_UINT_Z24_UNORM: 131368fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle /* Save memory bandwidth by not copying the 131468fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle * stencil part during flush. 131568fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle * 131668fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle * This potentially increases memory bandwidth 131768fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle * if an application uses both Z and S texturing 131868fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle * simultaneously (a flushed Z24S8 texture 131968fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle * would be stored compactly), but how often 132068fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle * does that really happen? 132168fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle */ 132268fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle pipe_format = PIPE_FORMAT_Z24X8_UNORM; 132368fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle break; 132468fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle default:; 132568fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle } 132668fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle } else if (!rtex->can_sample_s && rtex->can_sample_z) { 132768fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle assert(util_format_has_stencil(util_format_description(pipe_format))); 13282f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie 132968fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle /* DB->CB copies to an 8bpp surface don't work. */ 133068fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle pipe_format = PIPE_FORMAT_X24S8_UINT; 133168fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle } 133268fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle } 13332f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie 1334495ba8884ad5047abc7e408b68165c0465a81ac0Rob Clark memset(&resource, 0, sizeof(resource)); 1335840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák resource.target = texture->target; 133668fe270e71cafcaa23825442228f03f269598476Nicolai Hähnle resource.format = pipe_format; 13372f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie resource.width0 = texture->width0; 13382f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie resource.height0 = texture->height0; 1339840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák resource.depth0 = texture->depth0; 1340840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák resource.array_size = texture->array_size; 13412271c793e8650e0e55c054301ab85b5b92b9bf11Dave Airlie resource.last_level = texture->last_level; 1342840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák resource.nr_samples = texture->nr_samples; 1343c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák resource.usage = staging ? PIPE_USAGE_STAGING : PIPE_USAGE_DEFAULT; 134437708479608af877986b76302a9c92611d1e23d0Vadim Girlin resource.bind = texture->bind & ~PIPE_BIND_DEPTH_STENCIL; 1345018e3f75d69490598d61059ece56d379867f3995Marek Olšák resource.flags = texture->flags | R600_RESOURCE_FLAG_FLUSHED_DEPTH; 134637708479608af877986b76302a9c92611d1e23d0Vadim Girlin 134737708479608af877986b76302a9c92611d1e23d0Vadim Girlin if (staging) 134837708479608af877986b76302a9c92611d1e23d0Vadim Girlin resource.flags |= R600_RESOURCE_FLAG_TRANSFER; 13492f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie 1350951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák *flushed_depth_texture = (struct r600_texture *)ctx->screen->resource_create(ctx->screen, &resource); 135137708479608af877986b76302a9c92611d1e23d0Vadim Girlin if (*flushed_depth_texture == NULL) { 135237708479608af877986b76302a9c92611d1e23d0Vadim Girlin R600_ERR("failed to create temporary texture to hold flushed depth\n"); 1353611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák return false; 13542f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie } 13552f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie 1356428e37c2da420f7dc14a2ea265f2387270f9bee1Marek Olšák (*flushed_depth_texture)->non_disp_tiling = false; 1357611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák return true; 1358da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák} 1359da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák 13604d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák/** 13614d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * Initialize the pipe_resource descriptor to be of the same size as the box, 13624d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * which is supposed to hold a subregion of the texture "orig" at the given 13634d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * mipmap level. 13644d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák */ 13654d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšákstatic void r600_init_temp_resource_from_box(struct pipe_resource *res, 13664d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák struct pipe_resource *orig, 13674d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák const struct pipe_box *box, 13684d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák unsigned level, unsigned flags) 13694d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák{ 13704d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák memset(res, 0, sizeof(*res)); 13714d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák res->format = orig->format; 13724d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák res->width0 = box->width; 13734d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák res->height0 = box->height; 13744d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák res->depth0 = 1; 13754d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák res->array_size = 1; 1376c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák res->usage = flags & R600_RESOURCE_FLAG_TRANSFER ? PIPE_USAGE_STAGING : PIPE_USAGE_DEFAULT; 13774d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák res->flags = flags; 13784d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 13794d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák /* We must set the correct texture target and dimensions for a 3D box. */ 1380871d2aff240662b2ef67b674018ea2a174f62f8eMarek Olšák if (box->depth > 1 && util_max_layer(orig, level) > 0) { 1381871d2aff240662b2ef67b674018ea2a174f62f8eMarek Olšák res->target = PIPE_TEXTURE_2D_ARRAY; 13824d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák res->array_size = box->depth; 1383871d2aff240662b2ef67b674018ea2a174f62f8eMarek Olšák } else { 1384871d2aff240662b2ef67b674018ea2a174f62f8eMarek Olšák res->target = PIPE_TEXTURE_2D; 13854d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák } 13864d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák} 13874d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 1388fc1479a95432f291623fa5bafe524701e77af3caMarek Olšákstatic bool r600_can_invalidate_texture(struct r600_common_screen *rscreen, 1389fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák struct r600_texture *rtex, 1390fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák unsigned transfer_usage, 1391fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák const struct pipe_box *box) 1392fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák{ 1393fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák /* r600g doesn't react to dirty_tex_descriptor_counter */ 1394fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák return rscreen->chip_class >= SI && 1395fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák !rtex->resource.is_shared && 1396fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák !(transfer_usage & PIPE_TRANSFER_READ) && 1397fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák rtex->resource.b.b.last_level == 0 && 1398fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák util_texrange_covers_whole_level(&rtex->resource.b.b, 0, 1399fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák box->x, box->y, box->z, 1400fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák box->width, box->height, 1401fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák box->depth); 1402fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák} 1403fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 1404532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšákstatic void r600_texture_invalidate_storage(struct r600_common_context *rctx, 1405614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák struct r600_texture *rtex) 1406614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák{ 1407532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák struct r600_common_screen *rscreen = rctx->screen; 1408532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák 1409614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák /* There is no point in discarding depth and tiled buffers. */ 1410614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák assert(!rtex->is_depth); 1411bf4d102ea3419ade6759bf9c3ad9d40c7f9b3c27Marek Olšák assert(rtex->surface.is_linear); 1412614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák 1413614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák /* Reallocate the buffer in the same pipe_resource. */ 14140d2e43fcb1198a6e67c85feadb1ca8c360ddc284Marek Olšák r600_alloc_resource(rscreen, &rtex->resource); 1415614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák 1416614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák /* Initialize the CMASK base address (needed even without CMASK). */ 1417614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák rtex->cmask.base_address_reg = 1418614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák (rtex->resource.gpu_address + rtex->cmask.offset) >> 8; 1419614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák 1420614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák r600_dirty_all_framebuffer_states(rscreen); 1421614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák p_atomic_inc(&rscreen->dirty_tex_descriptor_counter); 1422532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák 1423532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák rctx->num_alloc_tex_transfer_bytes += rtex->size; 1424614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák} 1425614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák 1426369e46888904c6d379b8b477d9242cff1608e30eMarek Olšákstatic void *r600_texture_transfer_map(struct pipe_context *ctx, 1427369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák struct pipe_resource *texture, 1428369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák unsigned level, 1429369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák unsigned usage, 1430369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák const struct pipe_box *box, 1431369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák struct pipe_transfer **ptransfer) 1432742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse{ 1433e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*)ctx; 1434951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)texture; 1435742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse struct r600_transfer *trans; 1436bff07638a86d36ac826fb287214eda9ce31c02adJerome Glisse struct r600_resource *buf; 1437369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák unsigned offset = 0; 1438369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák char *map; 14399927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák bool use_staging_texture = false; 1440369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák 1441f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák assert(!(texture->flags & R600_RESOURCE_FLAG_TRANSFER)); 1442f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák 14439927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák /* Depth textures use staging unconditionally. */ 14449927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák if (!rtex->is_depth) { 1445fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák /* Degrade the tile mode if we get too many transfers on APUs. 1446fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák * On dGPUs, the staging texture is always faster. 1447fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák * Only count uploads that are at least 4x4 pixels large. 1448fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák */ 1449fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák if (!rctx->screen->info.has_dedicated_vram && 1450fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák level == 0 && 1451fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák box->width >= 4 && box->height >= 4 && 1452fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák p_atomic_inc_return(&rtex->num_level0_transfers) == 10) { 1453fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák bool can_invalidate = 1454fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák r600_can_invalidate_texture(rctx->screen, rtex, 1455fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák usage, box); 1456fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 1457fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák r600_degrade_tile_mode_to_linear(rctx, rtex, 1458fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák can_invalidate); 1459fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák } 1460fc1479a95432f291623fa5bafe524701e77af3caMarek Olšák 14619927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák /* Tiled textures need to be converted into a linear texture for CPU 14629927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák * access. The staging texture is always linear and is placed in GART. 14639927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák * 14649927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák * Reading from VRAM is slow, always use the staging texture in 14659927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák * this case. 14669927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák * 14679927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák * Use the staging texture for uploads if the underlying BO 14689927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák * is busy. 14699927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák */ 1470bf4d102ea3419ade6759bf9c3ad9d40c7f9b3c27Marek Olšák if (!rtex->surface.is_linear) 14719927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák use_staging_texture = true; 14729927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák else if (usage & PIPE_TRANSFER_READ) 14739927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák use_staging_texture = (rtex->resource.domains & 14749927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák RADEON_DOMAIN_VRAM) != 0; 14759927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák /* Write & linear only: */ 14769927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák else if (r600_rings_is_buffer_referenced(rctx, rtex->resource.buf, 14779927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák RADEON_USAGE_READWRITE) || 14789927c8138ae09e99326eacc4ebf07aec8d141e0eMarek Olšák !rctx->ws->buffer_wait(rtex->resource.buf, 0, 1479614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák RADEON_USAGE_READWRITE)) { 1480614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák /* It's busy. */ 1481614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák if (r600_can_invalidate_texture(rctx->screen, rtex, 1482614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák usage, box)) 1483532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák r600_texture_invalidate_storage(rctx, rtex); 1484614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák else 1485614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák use_staging_texture = true; 1486614e3c62725ddeb160c74c551785f7ba8e9bdc2aMarek Olšák } 1487b4f0ab0b22625ac1bb3cf16342039557c086ebaeJerome Glisse } 1488119f00659c03c48cfab0f2770dd6b6fb89af31e4Jerome Glisse 1489742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse trans = CALLOC_STRUCT(r600_transfer); 149013eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan if (!trans) 1491742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse return NULL; 1492369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák trans->transfer.resource = texture; 14934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger trans->transfer.level = level; 1494742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse trans->transfer.usage = usage; 1495742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse trans->transfer.box = *box; 14964d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 1497d334d591a71c41d6a1eb4f2ea6cdabedc425e42fMarek Olšák if (rtex->is_depth) { 1498951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *staging_depth; 149937708479608af877986b76302a9c92611d1e23d0Vadim Girlin 150049f1104c449fb51ec4cc18aa5bd814afeb632415Marek Olšák if (rtex->resource.b.b.nr_samples > 1) { 15014d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák /* MSAA depth buffers need to be converted to single sample buffers. 15024d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * 15034d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * Mapping MSAA depth buffers can occur if ReadPixels is called 15044d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * with a multisample GLX visual. 15054d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * 15064d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * First downsample the depth buffer to a temporary texture, 15074d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák * then decompress the temporary one to staging. 1508ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák * 1509ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák * Only the region being mapped is transfered. 15104d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák */ 15114d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák struct pipe_resource resource; 151249f1104c449fb51ec4cc18aa5bd814afeb632415Marek Olšák 15134d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák r600_init_temp_resource_from_box(&resource, texture, box, level, 0); 15144d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 151594d294137eea57a5200a62e53abc5d5ae787b9ddMarek Olšák if (!r600_init_flushed_depth_texture(ctx, &resource, &staging_depth)) { 15164d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák R600_ERR("failed to create temporary texture to hold untiled copy\n"); 15174d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák FREE(trans); 15184d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák return NULL; 15194d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák } 15204d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 152194d294137eea57a5200a62e53abc5d5ae787b9ddMarek Olšák if (usage & PIPE_TRANSFER_READ) { 152294d294137eea57a5200a62e53abc5d5ae787b9ddMarek Olšák struct pipe_resource *temp = ctx->screen->resource_create(ctx->screen, &resource); 1523dea834e639715caa9517a695a3fb04d5de9aa069Marek Olšák if (!temp) { 1524dea834e639715caa9517a695a3fb04d5de9aa069Marek Olšák R600_ERR("failed to create a temporary depth texture\n"); 1525dea834e639715caa9517a695a3fb04d5de9aa069Marek Olšák FREE(trans); 1526dea834e639715caa9517a695a3fb04d5de9aa069Marek Olšák return NULL; 1527dea834e639715caa9517a695a3fb04d5de9aa069Marek Olšák } 15284d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 152994d294137eea57a5200a62e53abc5d5ae787b9ddMarek Olšák r600_copy_region_with_blit(ctx, temp, 0, 0, 0, 0, texture, level, box); 1530e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák rctx->blit_decompress_depth(ctx, (struct r600_texture*)temp, staging_depth, 1531e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 0, 0, 0, box->depth, 0, 0); 15327e43a280793af50e826fb6183670de8e3d427d74Edward O'Callaghan pipe_resource_reference(&temp, NULL); 153394d294137eea57a5200a62e53abc5d5ae787b9ddMarek Olšák } 15342f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie } 15354d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák else { 1536ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák /* XXX: only readback the rectangle which is being mapped? */ 1537ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák /* XXX: when discard is true, no need to read back from depth texture */ 15384d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák if (!r600_init_flushed_depth_texture(ctx, texture, &staging_depth)) { 15394d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák R600_ERR("failed to create temporary texture to hold untiled copy\n"); 15404d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák FREE(trans); 15414d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák return NULL; 15424d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák } 1543b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák 1544e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák rctx->blit_decompress_depth(ctx, rtex, staging_depth, 1545e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák level, level, 1546e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák box->z, box->z + box->depth - 1, 1547e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák 0, 0); 15484d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák 1549ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák offset = r600_texture_get_offset(staging_depth, level, box); 15504d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák } 1551b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák 1552e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák trans->transfer.stride = staging_depth->surface.level[level].nblk_x * 1553e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák staging_depth->surface.bpe; 1554e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák trans->transfer.layer_stride = staging_depth->surface.level[level].slice_size; 155537708479608af877986b76302a9c92611d1e23d0Vadim Girlin trans->staging = (struct r600_resource*)staging_depth; 1556f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák buf = trans->staging; 1557d4fab99c1c20334131b446b0032303a8b3c5c1a1Keith Whitwell } else if (use_staging_texture) { 15581aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák struct pipe_resource resource; 15591aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák struct r600_texture *staging; 15601aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák 15614d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák r600_init_temp_resource_from_box(&resource, texture, box, level, 15624d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák R600_RESOURCE_FLAG_TRANSFER); 156307c65b85eada8dd34019763b6e82ed4257a9b4a6Michel Dänzer resource.usage = (usage & PIPE_TRANSFER_READ) ? 156407c65b85eada8dd34019763b6e82ed4257a9b4a6Michel Dänzer PIPE_USAGE_STAGING : PIPE_USAGE_STREAM; 15651aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák 156636efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse /* Create the temporary texture. */ 15671aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák staging = (struct r600_texture*)ctx->screen->resource_create(ctx->screen, &resource); 156813eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan if (!staging) { 156936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse R600_ERR("failed to create temporary texture to hold untiled copy\n"); 157036efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse FREE(trans); 157136efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse return NULL; 157236efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse } 15731aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák trans->staging = &staging->resource; 1574e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák trans->transfer.stride = staging->surface.level[0].nblk_x * 1575e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák staging->surface.bpe; 15761aebb6911e9aa1bd8900868b58d1750ca83a20c7Marek Olšák trans->transfer.layer_stride = staging->surface.level[0].slice_size; 1577f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák 1578f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák if (usage & PIPE_TRANSFER_READ) 1579d4fab99c1c20334131b446b0032303a8b3c5c1a1Keith Whitwell r600_copy_to_staging_texture(ctx, trans); 1580f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák else 1581f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák usage |= PIPE_TRANSFER_UNSYNCHRONIZED; 1582f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák 1583f6742859b76de8c90a8593f2f308e7c22380a390Marek Olšák buf = trans->staging; 1584369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák } else { 1585ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák /* the resource is mapped directly */ 1586e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák trans->transfer.stride = rtex->surface.level[level].nblk_x * 1587e9c76eeeaa673331fec6056a4baa30095de42f5eMarek Olšák rtex->surface.bpe; 1588369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák trans->transfer.layer_stride = rtex->surface.level[level].slice_size; 1589ae87aae0c4bcc448be3c965319b88f50b2d6fe36Marek Olšák offset = r600_texture_get_offset(rtex, level, box); 1590bff07638a86d36ac826fb287214eda9ce31c02adJerome Glisse buf = &rtex->resource; 159137708479608af877986b76302a9c92611d1e23d0Vadim Girlin } 15922f8453eea3b5ff8d2818517753d3990490f699b8Dave Airlie 1593e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák if (!(map = r600_buffer_map_sync_with_rings(rctx, buf, usage))) { 1594d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&trans->staging, NULL); 1595369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák FREE(trans); 1596742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse return NULL; 1597742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse } 1598b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák 1599369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák *ptransfer = &trans->transfer; 1600d843bbfd3f92d5afea665c3ff16bcca0628f2e7bJerome Glisse return map + offset; 160172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 160272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1603369e46888904c6d379b8b477d9242cff1608e30eMarek Olšákstatic void r600_texture_transfer_unmap(struct pipe_context *ctx, 1604369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák struct pipe_transfer* transfer) 160572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{ 1606532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák struct r600_common_context *rctx = (struct r600_common_context*)ctx; 160736efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse struct r600_transfer *rtransfer = (struct r600_transfer*)transfer; 1608369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák struct pipe_resource *texture = transfer->resource; 1609369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák struct r600_texture *rtex = (struct r600_texture*)texture; 1610b8fb1d75ce95fe5d404b301ab31ca0c323967d14Marek Olšák 1611369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák if ((transfer->usage & PIPE_TRANSFER_WRITE) && rtransfer->staging) { 16124d59258856a3601fb7fbb4c4d80f64491f0cb5c7Marek Olšák if (rtex->is_depth && rtex->resource.b.b.nr_samples <= 1) { 1613369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák ctx->resource_copy_region(ctx, texture, transfer->level, 1614369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák transfer->box.x, transfer->box.y, transfer->box.z, 1615369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák &rtransfer->staging->b.b, transfer->level, 1616369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák &transfer->box); 1617369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák } else { 1618369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák r600_copy_from_staging_texture(ctx, rtransfer); 1619369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák } 1620369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák } 1621369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák 1622532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák if (rtransfer->staging) { 1623532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák rctx->num_alloc_tex_transfer_bytes += rtransfer->staging->buf->size; 1624d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&rtransfer->staging, NULL); 1625532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák } 1626532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák 1627532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák /* Heuristic for {upload, draw, upload, draw, ..}: 1628532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * 1629532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * Flush the gfx IB if we've allocated too much texture storage. 1630532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * 1631532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * The idea is that we don't want to build IBs that use too much 1632532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * memory and put pressure on the kernel memory manager and we also 1633532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * want to make temporary and invalidated buffers go idle ASAP to 1634532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * decrease the total memory usage or make them reusable. The memory 1635532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * usage will be slightly higher than given here because of the buffer 1636532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * cache in the winsys. 1637532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * 1638532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák * The result is that the kernel memory manager is never a bottleneck. 1639532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák */ 1640532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák if (rctx->num_alloc_tex_transfer_bytes > rctx->screen->info.gart_size / 4) { 1641532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák rctx->gfx.flush(rctx, RADEON_FLUSH_ASYNC, NULL); 1642532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák rctx->num_alloc_tex_transfer_bytes = 0; 1643532a5af47fbc585c4132f9ad15f5e0a57c59320bMarek Olšák } 1644369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák 1645369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák FREE(transfer); 164672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse} 164772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse 1648369e46888904c6d379b8b477d9242cff1608e30eMarek Olšákstatic const struct u_resource_vtbl r600_texture_vtbl = 1649369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák{ 1650a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák NULL, /* get_handle */ 1651369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák r600_texture_destroy, /* resource_destroy */ 1652369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák r600_texture_transfer_map, /* transfer_map */ 1653b409524fef1b02c717b4cc1fef70d5710781f824Marek Olšák u_default_transfer_flush_region, /* transfer_flush_region */ 1654369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák r600_texture_transfer_unmap, /* transfer_unmap */ 1655369e46888904c6d379b8b477d9242cff1608e30eMarek Olšák}; 1656a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák 165721de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák/* DCC channel type categories within which formats can be reinterpreted 165821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák * while keeping the same DCC encoding. The swizzle must also match. */ 165921de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšákenum dcc_channel_type { 1660758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_float32, 1661758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_uint32, 1662758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_sint32, 166321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák dcc_channel_float16, 1664758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_uint16, 1665758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_sint16, 1666758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_uint_10_10_10_2, 1667758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_uint8, 1668758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák dcc_channel_sint8, 166921de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák dcc_channel_incompatible, 167021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák}; 167121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 167221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák/* Return the type of DCC encoding. */ 167321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšákstatic enum dcc_channel_type 167421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšákvi_get_dcc_channel_type(const struct util_format_description *desc) 167521de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák{ 167621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák int i; 167721de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 167821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák /* Find the first non-void channel. */ 167921de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák for (i = 0; i < desc->nr_channels; i++) 168021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) 168121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák break; 168221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (i == desc->nr_channels) 168321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák return dcc_channel_incompatible; 168421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 168521de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák switch (desc->channel[i].size) { 168621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák case 32: 1687758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) 1688758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_float32; 1689758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) 1690758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_uint32; 1691758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_sint32; 169221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák case 16: 169321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) 169421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák return dcc_channel_float16; 1695758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) 1696758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_uint16; 1697758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_sint16; 169821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák case 10: 1699758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_uint_10_10_10_2; 170021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák case 8: 1701758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) 1702758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_uint8; 1703758bc52959e8132e7972b4e7086c1220e0497d61Marek Olšák return dcc_channel_sint8; 170421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák default: 170521de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák return dcc_channel_incompatible; 170621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák } 170721de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák} 170821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 170921de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák/* Return if it's allowed to reinterpret one format as another with DCC enabled. */ 171021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšákbool vi_dcc_formats_compatible(enum pipe_format format1, 171121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák enum pipe_format format2) 171221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák{ 171321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák const struct util_format_description *desc1, *desc2; 171421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák enum dcc_channel_type type1, type2; 171521de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák int i; 171621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 171721de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (format1 == format2) 171821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák return true; 171921de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 172021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák desc1 = util_format_description(format1); 172121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák desc2 = util_format_description(format2); 172221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 172321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (desc1->nr_channels != desc2->nr_channels) 172421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák return false; 172521de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 172621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák /* Swizzles must be the same. */ 172721de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák for (i = 0; i < desc1->nr_channels; i++) 172821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (desc1->swizzle[i] <= PIPE_SWIZZLE_W && 172921de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák desc2->swizzle[i] <= PIPE_SWIZZLE_W && 173021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák desc1->swizzle[i] != desc2->swizzle[i]) 173121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák return false; 173221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 173321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák type1 = vi_get_dcc_channel_type(desc1); 173421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák type2 = vi_get_dcc_channel_type(desc2); 173521de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 173621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák return type1 != dcc_channel_incompatible && 173721de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák type2 != dcc_channel_incompatible && 173821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák type1 == type2; 173921de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák} 174021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 174121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšákvoid vi_dcc_disable_if_incompatible_format(struct r600_common_context *rctx, 174221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák struct pipe_resource *tex, 174321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák unsigned level, 174421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák enum pipe_format view_format) 174521de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák{ 174621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák struct r600_texture *rtex = (struct r600_texture *)tex; 174721de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 174821de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (rtex->dcc_offset && 1749692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák level < rtex->surface.num_dcc_levels && 175021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák !vi_dcc_formats_compatible(tex->format, view_format)) 175121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák if (!r600_texture_disable_dcc(rctx, (struct r600_texture*)tex)) 175221de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák rctx->decompress_dcc(&rctx->b, rtex); 175321de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák} 175421de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 17559855477e903e00f7457adb15594048416444b992Marek Olšákstruct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe, 17569855477e903e00f7457adb15594048416444b992Marek Olšák struct pipe_resource *texture, 17579855477e903e00f7457adb15594048416444b992Marek Olšák const struct pipe_surface *templ, 17589855477e903e00f7457adb15594048416444b992Marek Olšák unsigned width, unsigned height) 17599855477e903e00f7457adb15594048416444b992Marek Olšák{ 176021de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*)pipe; 17619855477e903e00f7457adb15594048416444b992Marek Olšák struct r600_surface *surface = CALLOC_STRUCT(r600_surface); 17629855477e903e00f7457adb15594048416444b992Marek Olšák 176313eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan if (!surface) 17649855477e903e00f7457adb15594048416444b992Marek Olšák return NULL; 17659855477e903e00f7457adb15594048416444b992Marek Olšák 17669855477e903e00f7457adb15594048416444b992Marek Olšák assert(templ->u.tex.first_layer <= util_max_layer(texture, templ->u.tex.level)); 17679855477e903e00f7457adb15594048416444b992Marek Olšák assert(templ->u.tex.last_layer <= util_max_layer(texture, templ->u.tex.level)); 17689855477e903e00f7457adb15594048416444b992Marek Olšák 17699855477e903e00f7457adb15594048416444b992Marek Olšák pipe_reference_init(&surface->base.reference, 1); 17709855477e903e00f7457adb15594048416444b992Marek Olšák pipe_resource_reference(&surface->base.texture, texture); 17719855477e903e00f7457adb15594048416444b992Marek Olšák surface->base.context = pipe; 17729855477e903e00f7457adb15594048416444b992Marek Olšák surface->base.format = templ->format; 17739855477e903e00f7457adb15594048416444b992Marek Olšák surface->base.width = width; 17749855477e903e00f7457adb15594048416444b992Marek Olšák surface->base.height = height; 17759855477e903e00f7457adb15594048416444b992Marek Olšák surface->base.u = templ->u; 177621de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 1777b671909d2799b86fd30ae89a5ad1fe4973250680Jan Vesely if (texture->target != PIPE_BUFFER) 1778b671909d2799b86fd30ae89a5ad1fe4973250680Jan Vesely vi_dcc_disable_if_incompatible_format(rctx, texture, 1779b671909d2799b86fd30ae89a5ad1fe4973250680Jan Vesely templ->u.tex.level, 1780b671909d2799b86fd30ae89a5ad1fe4973250680Jan Vesely templ->format); 178121de3be8e62b2b093569a99550e6356ed2f106b4Marek Olšák 17829855477e903e00f7457adb15594048416444b992Marek Olšák return &surface->base; 17839855477e903e00f7457adb15594048416444b992Marek Olšák} 17849855477e903e00f7457adb15594048416444b992Marek Olšák 17859855477e903e00f7457adb15594048416444b992Marek Olšákstatic struct pipe_surface *r600_create_surface(struct pipe_context *pipe, 17869855477e903e00f7457adb15594048416444b992Marek Olšák struct pipe_resource *tex, 17879855477e903e00f7457adb15594048416444b992Marek Olšák const struct pipe_surface *templ) 17889855477e903e00f7457adb15594048416444b992Marek Olšák{ 17899855477e903e00f7457adb15594048416444b992Marek Olšák unsigned level = templ->u.tex.level; 17907dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle unsigned width = u_minify(tex->width0, level); 17917dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle unsigned height = u_minify(tex->height0, level); 17927dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle 17935b51b2e00013af70072106e9d34905326fc357fcJan Vesely if (tex->target != PIPE_BUFFER && templ->format != tex->format) { 17947dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle const struct util_format_description *tex_desc 17957dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle = util_format_description(tex->format); 17967dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle const struct util_format_description *templ_desc 17977dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle = util_format_description(templ->format); 17987dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle 17997dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle assert(tex_desc->block.bits == templ_desc->block.bits); 18007dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle 18017dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle /* Adjust size of surface if and only if the block width or 18027dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle * height is changed. */ 18037dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle if (tex_desc->block.width != templ_desc->block.width || 18047dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle tex_desc->block.height != templ_desc->block.height) { 18057dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle unsigned nblks_x = util_format_get_nblocksx(tex->format, width); 18067dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle unsigned nblks_y = util_format_get_nblocksy(tex->format, height); 18077dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle 18087dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle width = nblks_x * templ_desc->block.width; 18097dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle height = nblks_y * templ_desc->block.height; 18107dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle } 18117dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle } 18129855477e903e00f7457adb15594048416444b992Marek Olšák 18137dd31b81fee7fe40bd09cf3fbc324fcc32782479Nicolai Hähnle return r600_create_surface_custom(pipe, tex, templ, width, height); 18149855477e903e00f7457adb15594048416444b992Marek Olšák} 18159855477e903e00f7457adb15594048416444b992Marek Olšák 18169855477e903e00f7457adb15594048416444b992Marek Olšákstatic void r600_surface_destroy(struct pipe_context *pipe, 18179855477e903e00f7457adb15594048416444b992Marek Olšák struct pipe_surface *surface) 18189855477e903e00f7457adb15594048416444b992Marek Olšák{ 18199855477e903e00f7457adb15594048416444b992Marek Olšák struct r600_surface *surf = (struct r600_surface*)surface; 1820d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&surf->cb_buffer_fmask, NULL); 1821d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&surf->cb_buffer_cmask, NULL); 18229855477e903e00f7457adb15594048416444b992Marek Olšák pipe_resource_reference(&surface->texture, NULL); 18239855477e903e00f7457adb15594048416444b992Marek Olšák FREE(surface); 18249855477e903e00f7457adb15594048416444b992Marek Olšák} 18259855477e903e00f7457adb15594048416444b992Marek Olšák 1826739d526b0757fb544322d3e03447d11de9a51b40Marek Olšákstatic void r600_clear_texture(struct pipe_context *pipe, 1827739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák struct pipe_resource *tex, 1828739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák unsigned level, 1829739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák const struct pipe_box *box, 1830739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák const void *data) 1831739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák{ 1832739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák struct pipe_screen *screen = pipe->screen; 1833739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák struct r600_texture *rtex = (struct r600_texture*)tex; 1834739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák struct pipe_surface tmpl = {{0}}; 1835739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák struct pipe_surface *sf; 1836739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák const struct util_format_description *desc = 1837739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák util_format_description(tex->format); 1838739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 1839739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák tmpl.format = tex->format; 1840739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák tmpl.u.tex.first_layer = box->z; 1841739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák tmpl.u.tex.last_layer = box->z + box->depth - 1; 1842739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák tmpl.u.tex.level = level; 1843739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák sf = pipe->create_surface(pipe, tex, &tmpl); 1844739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák if (!sf) 1845739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák return; 1846739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 1847739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák if (rtex->is_depth) { 1848739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák unsigned clear; 1849739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák float depth; 1850739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák uint8_t stencil = 0; 1851739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 1852739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák /* Depth is always present. */ 1853739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák clear = PIPE_CLEAR_DEPTH; 1854739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák desc->unpack_z_float(&depth, 0, data, 0, 1, 1); 1855739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 1856739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák if (rtex->surface.flags & RADEON_SURF_SBUFFER) { 1857739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák clear |= PIPE_CLEAR_STENCIL; 1858739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák desc->unpack_s_8uint(&stencil, 0, data, 0, 1, 1); 1859739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák } 1860739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 1861739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák pipe->clear_depth_stencil(pipe, sf, clear, depth, stencil, 1862739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák box->x, box->y, 1863739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák box->width, box->height, false); 1864739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák } else { 1865739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák union pipe_color_union color; 1866739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 1867739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák /* pipe_color_union requires the full vec4 representation. */ 1868739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák if (util_format_is_pure_uint(tex->format)) 1869739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák desc->unpack_rgba_uint(color.ui, 0, data, 0, 1, 1); 1870739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák else if (util_format_is_pure_sint(tex->format)) 1871739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák desc->unpack_rgba_sint(color.i, 0, data, 0, 1, 1); 1872739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák else 1873739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák desc->unpack_rgba_float(color.f, 0, data, 0, 1, 1); 1874739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 1875739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák if (screen->is_format_supported(screen, tex->format, 1876739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák tex->target, 0, 1877739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák PIPE_BIND_RENDER_TARGET)) { 1878739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák pipe->clear_render_target(pipe, sf, &color, 1879739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák box->x, box->y, 1880739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák box->width, box->height, false); 1881739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák } else { 1882739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák /* Software fallback - just for R9G9B9E5_FLOAT */ 1883739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák util_clear_render_target(pipe, sf, &color, 1884739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák box->x, box->y, 1885739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák box->width, box->height); 1886739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák } 1887739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák } 1888739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák pipe_surface_reference(&sf, NULL); 1889739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák} 1890739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák 18912242dbe11d56b05ede7a928a9973adda4b145ad7Oded Gabbayunsigned r600_translate_colorswap(enum pipe_format format, bool do_endian_swap) 1892dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák{ 1893dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák const struct util_format_description *desc = util_format_description(format); 1894dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák 1895fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák#define HAS_SWIZZLE(chan,swz) (desc->swizzle[chan] == PIPE_SWIZZLE_##swz) 1896dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák 1897dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák if (format == PIPE_FORMAT_R11G11B10_FLOAT) /* isn't plain */ 1898dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_STD; 1899dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák 1900dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) 1901dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return ~0U; 1902dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák 1903dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák switch (desc->nr_channels) { 1904dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák case 1: 1905dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák if (HAS_SWIZZLE(0,X)) 1906dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_STD; /* X___ */ 1907dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák else if (HAS_SWIZZLE(3,X)) 1908dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_ALT_REV; /* ___X */ 1909dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák break; 1910dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák case 2: 1911dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák if ((HAS_SWIZZLE(0,X) && HAS_SWIZZLE(1,Y)) || 1912dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(1,NONE)) || 1913dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák (HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,Y))) 1914dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_STD; /* XY__ */ 1915dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák else if ((HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,X)) || 1916dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,NONE)) || 1917dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák (HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,X))) 1918c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay /* YX__ */ 1919c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay return (do_endian_swap ? V_0280A0_SWAP_STD : V_0280A0_SWAP_STD_REV); 1920dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák else if (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(3,Y)) 1921dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_ALT; /* X__Y */ 1922dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák else if (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(3,X)) 1923dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_ALT_REV; /* Y__X */ 1924dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák break; 1925dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák case 3: 1926dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák if (HAS_SWIZZLE(0,X)) 1927c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay return (do_endian_swap ? V_0280A0_SWAP_STD_REV : V_0280A0_SWAP_STD); 1928dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák else if (HAS_SWIZZLE(0,Z)) 1929dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_STD_REV; /* ZYX */ 1930dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák break; 1931dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák case 4: 1932dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák /* check the middle channels, the 1st and 4th channel can be NONE */ 1933c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,Z)) { 1934dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_STD; /* XYZW */ 1935c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay } else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,Y)) { 1936dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_STD_REV; /* WZYX */ 1937c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay } else if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,X)) { 1938dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return V_0280A0_SWAP_ALT; /* ZYXW */ 1939c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay } else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,W)) { 1940c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay /* YZWX */ 1941c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay if (desc->is_array) 1942c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay return V_0280A0_SWAP_ALT_REV; 1943c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay else 1944c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay return (do_endian_swap ? V_0280A0_SWAP_ALT : V_0280A0_SWAP_ALT_REV); 1945c86c761343885b157b122416b0e3d3641fc1061cOded Gabbay } 1946dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák break; 1947dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák } 1948dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák return ~0U; 1949dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák} 1950dff3eccd158d648482bb47118ef5d57a9186e5a4Marek Olšák 195149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák/* PIPELINE_STAT-BASED DCC ENABLEMENT FOR DISPLAYABLE SURFACES */ 195249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 195363f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšákstatic void vi_dcc_clean_up_context_slot(struct r600_common_context *rctx, 195463f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák int slot) 195563f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák{ 195663f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák int i; 195763f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák 195863f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák if (rctx->dcc_stats[slot].query_active) 195963f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák vi_separate_dcc_stop_query(&rctx->b, 196063f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák rctx->dcc_stats[slot].tex); 196163f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák 196263f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats[slot].ps_stats); i++) 196363f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák if (rctx->dcc_stats[slot].ps_stats[i]) { 196463f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák rctx->b.destroy_query(&rctx->b, 196563f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák rctx->dcc_stats[slot].ps_stats[i]); 196663f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák rctx->dcc_stats[slot].ps_stats[i] = NULL; 196763f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák } 196863f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák 196963f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák r600_texture_reference(&rctx->dcc_stats[slot].tex, NULL); 197063f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák} 197163f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák 197249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák/** 197349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * Return the per-context slot where DCC statistics queries for the texture live. 197449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 197549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákstatic unsigned vi_get_context_dcc_stats_index(struct r600_common_context *rctx, 197649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_texture *tex) 197749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák{ 197849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák int i, empty_slot = -1; 197949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 198063f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák /* Remove zombie textures (textures kept alive by this array only). */ 198163f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats); i++) 198263f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák if (rctx->dcc_stats[i].tex && 198363f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák rctx->dcc_stats[i].tex->resource.b.b.reference.count == 1) 198463f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák vi_dcc_clean_up_context_slot(rctx, i); 198563f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák 198663f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák /* Find the texture. */ 198749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats); i++) { 198849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Return if found. */ 198949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (rctx->dcc_stats[i].tex == tex) { 199049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[i].last_use_timestamp = os_time_get(); 199149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return i; 199249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } 199349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 199449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Record the first seen empty slot. */ 199549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (empty_slot == -1 && !rctx->dcc_stats[i].tex) 199649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák empty_slot = i; 199749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } 199849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 199949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Not found. Remove the oldest member to make space in the array. */ 200049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (empty_slot == -1) { 200149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák int oldest_slot = 0; 200249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 200349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Find the oldest slot. */ 200449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák for (i = 1; i < ARRAY_SIZE(rctx->dcc_stats); i++) 200549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (rctx->dcc_stats[oldest_slot].last_use_timestamp > 200649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[i].last_use_timestamp) 200749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák oldest_slot = i; 200849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 200949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Clean up the oldest slot. */ 201063f8d648f019c4df8d4870539ea2c3f4bd468917Marek Olšák vi_dcc_clean_up_context_slot(rctx, oldest_slot); 201149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák empty_slot = oldest_slot; 201249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } 201349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 201449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Add the texture to the new slot. */ 201536cf5a57c2b53b50778482f7341b7afcdc434dafMarek Olšák r600_texture_reference(&rctx->dcc_stats[empty_slot].tex, tex); 201649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[empty_slot].last_use_timestamp = os_time_get(); 201749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return empty_slot; 201849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák} 201949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 202049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákstatic struct pipe_query * 202149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákvi_create_resuming_pipestats_query(struct pipe_context *ctx) 202249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák{ 202349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_query_hw *query = (struct r600_query_hw*) 202449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák ctx->create_query(ctx, PIPE_QUERY_PIPELINE_STATISTICS, 0); 202549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 202649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák query->flags |= R600_QUERY_HW_FLAG_BEGIN_RESUMES; 202749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return (struct pipe_query*)query; 202849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák} 202949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 203049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák/** 203149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * Called when binding a color buffer. 203249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 203349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákvoid vi_separate_dcc_start_query(struct pipe_context *ctx, 203449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_texture *tex) 203549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák{ 203649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*)ctx; 203749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák unsigned i = vi_get_context_dcc_stats_index(rctx, tex); 203849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 203949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák assert(!rctx->dcc_stats[i].query_active); 204049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 204149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (!rctx->dcc_stats[i].ps_stats[0]) 204249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[i].ps_stats[0] = vi_create_resuming_pipestats_query(ctx); 204349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 204449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* begin or resume the query */ 204549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák ctx->begin_query(ctx, rctx->dcc_stats[i].ps_stats[0]); 204649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[i].query_active = true; 204749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák} 204849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 204949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák/** 205049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * Called when unbinding a color buffer. 205149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 205249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákvoid vi_separate_dcc_stop_query(struct pipe_context *ctx, 205349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_texture *tex) 205449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák{ 205549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*)ctx; 205649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák unsigned i = vi_get_context_dcc_stats_index(rctx, tex); 205749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 205849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák assert(rctx->dcc_stats[i].query_active); 205949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák assert(rctx->dcc_stats[i].ps_stats[0]); 206049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 206149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* pause or end the query */ 206249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák ctx->end_query(ctx, rctx->dcc_stats[i].ps_stats[0]); 206349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[i].query_active = false; 206449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák} 206549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 206649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákstatic bool vi_should_enable_separate_dcc(struct r600_texture *tex) 206749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák{ 206849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* The minimum number of fullscreen draws per frame that is required 206949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * to enable DCC. */ 207049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return tex->ps_draw_ratio + tex->num_slow_clears >= 5; 207149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák} 207249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 207349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák/* Called by fast clear. */ 207449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákstatic void vi_separate_dcc_try_enable(struct r600_common_context *rctx, 207549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_texture *tex) 207649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák{ 207749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* The intent is to use this with shared displayable back buffers, 207849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * but it's not strictly limited only to them. 207949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 208049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (!tex->resource.is_shared || 208149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák !(tex->resource.external_usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH) || 208249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->resource.b.b.target != PIPE_TEXTURE_2D || 2083b5118fe0543400295be5b1a65a5001882498831eMarek Olšák tex->resource.b.b.last_level > 0 || 208449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák !tex->surface.dcc_size) 208549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return; 208649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 208749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (tex->dcc_offset) 208849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return; /* already enabled */ 208949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 20909ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák /* Enable the DCC stat gathering. */ 20919ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák if (!tex->dcc_gather_statistics) { 20929ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák tex->dcc_gather_statistics = true; 20939ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák vi_separate_dcc_start_query(&rctx->b, tex); 20949ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák } 20959ae41227c24eac7245d90f27a3d024bccebbacd0Marek Olšák 209649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (!vi_should_enable_separate_dcc(tex)) 209749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return; /* stats show that DCC decompression is too expensive */ 209849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 2099692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák assert(tex->surface.num_dcc_levels); 210049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák assert(!tex->dcc_separate_buffer); 210149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 210249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák r600_texture_discard_cmask(rctx->screen, tex); 210349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 210449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Get a DCC buffer. */ 210549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (tex->last_dcc_separate_buffer) { 210649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák assert(tex->dcc_gather_statistics); 210749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák assert(!tex->dcc_separate_buffer); 210849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->dcc_separate_buffer = tex->last_dcc_separate_buffer; 210949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->last_dcc_separate_buffer = NULL; 211049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } else { 211149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->dcc_separate_buffer = (struct r600_resource*) 211249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák r600_aligned_buffer_create(rctx->b.screen, 0, 211349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák PIPE_USAGE_DEFAULT, 211449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->surface.dcc_size, 211549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->surface.dcc_alignment); 211649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (!tex->dcc_separate_buffer) 211749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák return; 211849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } 211949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 212049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* dcc_offset is the absolute GPUVM address. */ 212149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->dcc_offset = tex->dcc_separate_buffer->gpu_address; 212249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 212349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* no need to flag anything since this is called by fast clear that 212449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * flags framebuffer state 212549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 212649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák} 212749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 212849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák/** 212949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * Called by pipe_context::flush_resource, the place where DCC decompression 213049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * takes place. 213149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 213249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšákvoid vi_separate_dcc_process_and_reset_stats(struct pipe_context *ctx, 213349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_texture *tex) 213449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák{ 213549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák struct r600_common_context *rctx = (struct r600_common_context*)ctx; 213644906101c4bcd630733ee46fcd9a3b718314461dMarek Olšák struct pipe_query *tmp; 213749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák unsigned i = vi_get_context_dcc_stats_index(rctx, tex); 213849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák bool query_active = rctx->dcc_stats[i].query_active; 213949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák bool disable = false; 214049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 214149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (rctx->dcc_stats[i].ps_stats[2]) { 214249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák union pipe_query_result result; 214349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 214449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Read the results. */ 214549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák ctx->get_query_result(ctx, rctx->dcc_stats[i].ps_stats[2], 214649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák true, &result); 214744906101c4bcd630733ee46fcd9a3b718314461dMarek Olšák r600_query_hw_reset_buffers(rctx, 214844906101c4bcd630733ee46fcd9a3b718314461dMarek Olšák (struct r600_query_hw*) 214944906101c4bcd630733ee46fcd9a3b718314461dMarek Olšák rctx->dcc_stats[i].ps_stats[2]); 215049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 215149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Compute the approximate number of fullscreen draws. */ 215249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->ps_draw_ratio = 215349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák result.pipeline_statistics.ps_invocations / 215449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák (tex->resource.b.b.width0 * tex->resource.b.b.height0); 21556da92df538824d72e68ed4e290da57f51b00064aMarek Olšák rctx->last_tex_ps_draw_ratio = tex->ps_draw_ratio; 215649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 215749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák disable = tex->dcc_separate_buffer && 215849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák !vi_should_enable_separate_dcc(tex); 215949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } 216049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 216149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->num_slow_clears = 0; 216249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 216349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* stop the statistics query for ps_stats[0] */ 216449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (query_active) 216549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák vi_separate_dcc_stop_query(ctx, tex); 216649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 216749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Move the queries in the queue by one. */ 216844906101c4bcd630733ee46fcd9a3b718314461dMarek Olšák tmp = rctx->dcc_stats[i].ps_stats[2]; 216949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[i].ps_stats[2] = rctx->dcc_stats[i].ps_stats[1]; 217049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->dcc_stats[i].ps_stats[1] = rctx->dcc_stats[i].ps_stats[0]; 217144906101c4bcd630733ee46fcd9a3b718314461dMarek Olšák rctx->dcc_stats[i].ps_stats[0] = tmp; 217249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 217349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* create and start a new query as ps_stats[0] */ 217449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (query_active) 217549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák vi_separate_dcc_start_query(ctx, tex); 217649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 217749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (disable) { 217849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák assert(!tex->last_dcc_separate_buffer); 217949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->last_dcc_separate_buffer = tex->dcc_separate_buffer; 218049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->dcc_separate_buffer = NULL; 218149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->dcc_offset = 0; 218249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* no need to flag anything since this is called after 218349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * decompression that re-sets framebuffer state 218449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 218549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } 218649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák} 218749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 218849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák/* FAST COLOR CLEAR */ 218949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 219028eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšákstatic void evergreen_set_clear_color(struct r600_texture *rtex, 219128eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák enum pipe_format surface_format, 219228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák const union pipe_color_union *color) 219328eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák{ 219428eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák union util_color uc; 219528eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 219628eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák memset(&uc, 0, sizeof(uc)); 219728eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 2198c66a550385b4937b2aaba8484aeaa41cf77399b7Marek Olšák if (rtex->surface.bpe == 16) { 219946c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák /* DCC fast clear only: 220046c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák * CLEAR_WORD0 = R = G = B 220146c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák * CLEAR_WORD1 = A 220246c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák */ 220346c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák assert(color->ui[0] == color->ui[1] && 220446c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák color->ui[0] == color->ui[2]); 220546c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák uc.ui[0] = color->ui[0]; 220646c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák uc.ui[1] = color->ui[3]; 220746c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák } else if (util_format_is_pure_uint(surface_format)) { 220828eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák util_format_write_4ui(surface_format, color->ui, 0, &uc, 0, 0, 0, 1, 1); 220928eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } else if (util_format_is_pure_sint(surface_format)) { 221028eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák util_format_write_4i(surface_format, color->i, 0, &uc, 0, 0, 0, 1, 1); 221128eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } else { 221228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák util_pack_color(color->f, surface_format, &uc); 221328eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } 221428eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 221528eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák memcpy(rtex->color_clear_value, &uc, 2 * sizeof(uint32_t)); 221628eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák} 221728eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 221846c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšákstatic bool vi_get_fast_clear_parameters(enum pipe_format surface_format, 22196529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen const union pipe_color_union *color, 22206529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen uint32_t* reset_value, 22216529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen bool* clear_words_needed) 22226529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen{ 22236529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen bool values[4] = {}; 22246529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen int i; 22256529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen bool main_value = false; 22266529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen bool extra_value = false; 22276529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen int extra_channel; 22286529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen const struct util_format_description *desc = util_format_description(surface_format); 22296529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 223046c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák if (desc->block.bits == 128 && 223146c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák (color->ui[0] != color->ui[1] || 223246c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák color->ui[0] != color->ui[2])) 223346c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák return false; 223446c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák 22356529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen *clear_words_needed = true; 22366529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen *reset_value = 0x20202020U; 22376529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 22386529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen /* If we want to clear without needing a fast clear eliminate step, we 22396529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen * can set each channel to 0 or 1 (or 0/max for integer formats). We 22406529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen * have two sets of flags, one for the last or first channel(extra) and 22416529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen * one for the other channels(main). 22426529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen */ 22436529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 22446529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (surface_format == PIPE_FORMAT_R11G11B10_FLOAT || 22456529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen surface_format == PIPE_FORMAT_B5G6R5_UNORM || 22466529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen surface_format == PIPE_FORMAT_B5G6R5_SRGB) { 22476529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen extra_channel = -1; 22486529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen } else if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN) { 22497db10093d3ee26b0a5050ae01750465da1a76970Marek Olšák if(r600_translate_colorswap(surface_format, false) <= 1) 22506529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen extra_channel = desc->nr_channels - 1; 22516529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen else 22526529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen extra_channel = 0; 22536529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen } else 225446c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák return true; 22556529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 22566529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen for (i = 0; i < 4; ++i) { 2257fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák int index = desc->swizzle[i] - PIPE_SWIZZLE_X; 22586529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 2259fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák if (desc->swizzle[i] < PIPE_SWIZZLE_X || 2260fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák desc->swizzle[i] > PIPE_SWIZZLE_W) 22616529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen continue; 22626529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 2263831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák if (desc->channel[i].pure_integer && 2264831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 2265831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák /* Use the maximum value for clamping the clear color. */ 2266831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák int max = u_bit_consecutive(0, desc->channel[i].size - 1); 2267831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák 22686529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen values[i] = color->i[i] != 0; 2269831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák if (color->i[i] != 0 && MIN2(color->i[i], max) != max) 227046c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák return true; 2271831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák } else if (desc->channel[i].pure_integer && 2272831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 2273831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák /* Use the maximum value for clamping the clear color. */ 2274831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák unsigned max = u_bit_consecutive(0, desc->channel[i].size); 2275831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák 22766529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen values[i] = color->ui[i] != 0U; 2277831c0c80f121c10e873bdc08a07f2c8bad39a6deMarek Olšák if (color->ui[i] != 0U && MIN2(color->ui[i], max) != max) 227846c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák return true; 22796529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen } else { 22806529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen values[i] = color->f[i] != 0.0F; 22816529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (color->f[i] != 0.0F && color->f[i] != 1.0F) 228246c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák return true; 22836529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen } 22846529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 22856529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (index == extra_channel) 22866529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen extra_value = values[i]; 22876529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen else 22886529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen main_value = values[i]; 22896529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen } 22906529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 22916529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen for (int i = 0; i < 4; ++i) 22926529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (values[i] != main_value && 2293fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák desc->swizzle[i] - PIPE_SWIZZLE_X != extra_channel && 2294fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák desc->swizzle[i] >= PIPE_SWIZZLE_X && 2295fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák desc->swizzle[i] <= PIPE_SWIZZLE_W) 229646c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák return true; 22976529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 22986529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen *clear_words_needed = false; 22996529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (main_value) 23006529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen *reset_value |= 0x80808080U; 23016529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 23026529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (extra_value) 23036529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen *reset_value |= 0x40404040U; 230446c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák return true; 23056529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen} 23066529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 23079a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšákvoid vi_dcc_clear_level(struct r600_common_context *rctx, 23089a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák struct r600_texture *rtex, 23099a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák unsigned level, unsigned clear_value) 23109a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák{ 23119124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák struct pipe_resource *dcc_buffer; 23129124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák uint64_t dcc_offset; 23139a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák 2314692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák assert(rtex->dcc_offset && level < rtex->surface.num_dcc_levels); 23159a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák 23169124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák if (rtex->dcc_separate_buffer) { 23179124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák dcc_buffer = &rtex->dcc_separate_buffer->b.b; 23189124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák dcc_offset = 0; 23199124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák } else { 23209124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák dcc_buffer = &rtex->resource.b.b; 23219124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák dcc_offset = rtex->dcc_offset; 23229124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák } 23239124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák 23249124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák dcc_offset += rtex->surface.level[level].dcc_offset; 23259124457bff70686ea804d7e35fb63bea5db5a8a2Marek Olšák 23269a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák rctx->clear_buffer(&rctx->b, dcc_buffer, dcc_offset, 23279a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák rtex->surface.level[level].dcc_fast_clear_size, 23289a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák clear_value, R600_COHERENCY_CB_META); 23299a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák} 23309a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák 23314eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák/* Set the same micro tile mode as the destination of the last MSAA resolve. 23324eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák * This allows hitting the MSAA resolve fast path, which requires that both 23334eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák * src and dst micro tile modes match. 23344eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák */ 23354eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšákstatic void si_set_optimal_micro_tile_mode(struct r600_common_screen *rscreen, 23364eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák struct r600_texture *rtex) 23374eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák{ 23384eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák if (rtex->resource.is_shared || 2339b5118fe0543400295be5b1a65a5001882498831eMarek Olšák rtex->resource.b.b.nr_samples <= 1 || 23404eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.micro_tile_mode == rtex->last_msaa_resolve_target_micro_mode) 23414eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák return; 23424eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák 23434eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák assert(rtex->surface.level[0].mode == RADEON_SURF_MODE_2D); 2344b5118fe0543400295be5b1a65a5001882498831eMarek Olšák assert(rtex->resource.b.b.last_level == 0); 23454eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák 23464eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák /* These magic numbers were copied from addrlib. It doesn't use any 23474eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák * definitions for them either. They are all 2D_TILED_THIN1 modes with 23484eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák * different bpp and micro tile mode. 23494eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák */ 23504eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák if (rscreen->chip_class >= CIK) { 23514eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák switch (rtex->last_msaa_resolve_target_micro_mode) { 23527786f8c63564f1eb421a8636cdbd15c471ec8632Marek Olšák case RADEON_MICRO_MODE_DISPLAY: 23534eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 10; 23544eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23557786f8c63564f1eb421a8636cdbd15c471ec8632Marek Olšák case RADEON_MICRO_MODE_THIN: 23564eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 14; 23574eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23587786f8c63564f1eb421a8636cdbd15c471ec8632Marek Olšák case RADEON_MICRO_MODE_ROTATED: 23594eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 28; 23604eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23614eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák default: /* depth, thick */ 23624eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák assert(!"unexpected micro mode"); 23634eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák return; 23644eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák } 23654eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák } else { /* SI */ 23664eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák switch (rtex->last_msaa_resolve_target_micro_mode) { 23677786f8c63564f1eb421a8636cdbd15c471ec8632Marek Olšák case RADEON_MICRO_MODE_DISPLAY: 23684eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák switch (rtex->surface.bpe) { 23698a21f52d73936e23a314a288a36782a698c7c1b9Marek Olšák case 1: 23704eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 10; 23714eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23728a21f52d73936e23a314a288a36782a698c7c1b9Marek Olšák case 2: 23734eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 11; 23744eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23758a21f52d73936e23a314a288a36782a698c7c1b9Marek Olšák default: /* 4, 8 */ 23764eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 12; 23774eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23784eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák } 23794eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23807786f8c63564f1eb421a8636cdbd15c471ec8632Marek Olšák case RADEON_MICRO_MODE_THIN: 23814eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák switch (rtex->surface.bpe) { 23828a21f52d73936e23a314a288a36782a698c7c1b9Marek Olšák case 1: 23834eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 14; 23844eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23858a21f52d73936e23a314a288a36782a698c7c1b9Marek Olšák case 2: 23864eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 15; 23874eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23888a21f52d73936e23a314a288a36782a698c7c1b9Marek Olšák case 4: 23894eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 16; 23904eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23918a21f52d73936e23a314a288a36782a698c7c1b9Marek Olšák default: /* 8, 16 */ 23924eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.tiling_index[0] = 17; 23934eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23944eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák } 23954eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák break; 23964eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák default: /* depth, thick */ 23974eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák assert(!"unexpected micro mode"); 23984eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák return; 23994eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák } 24004eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák } 24014eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák 24024eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák rtex->surface.micro_tile_mode = rtex->last_msaa_resolve_target_micro_mode; 24034eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák 24044eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák p_atomic_inc(&rscreen->dirty_fb_counter); 24054eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák p_atomic_inc(&rscreen->dirty_tex_descriptor_counter); 24064eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák} 24074eea710b0d050275b532dbc117da97f569e5fb1eMarek Olšák 240828eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšákvoid evergreen_do_fast_color_clear(struct r600_common_context *rctx, 240928eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák struct pipe_framebuffer_state *fb, 241028eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák struct r600_atom *fb_state, 24110c2eed0edec877584c9362bd9cb9004ff10a8b91Marek Olšák unsigned *buffers, unsigned *dirty_cbufs, 241228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák const union pipe_color_union *color) 241328eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák{ 241428eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák int i; 241528eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 2416a640ad15e1fff3eb51f42bf30c31eafe02a921e2Oded Gabbay /* This function is broken in BE, so just disable this path for now */ 2417a640ad15e1fff3eb51f42bf30c31eafe02a921e2Oded Gabbay#ifdef PIPE_ARCH_BIG_ENDIAN 2418a640ad15e1fff3eb51f42bf30c31eafe02a921e2Oded Gabbay return; 2419a640ad15e1fff3eb51f42bf30c31eafe02a921e2Oded Gabbay#endif 2420a640ad15e1fff3eb51f42bf30c31eafe02a921e2Oded Gabbay 2421eb0d3e8a90df3f6a39a3ffc911a335554fc8cd98Marek Olšák if (rctx->render_cond) 2422bf701a84eb000910015a3c3ee9860141cde4990dMarek Olšák return; 2423bf701a84eb000910015a3c3ee9860141cde4990dMarek Olšák 242428eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák for (i = 0; i < fb->nr_cbufs; i++) { 242528eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák struct r600_texture *tex; 242628eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák unsigned clear_bit = PIPE_CLEAR_COLOR0 << i; 242728eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 242828eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák if (!fb->cbufs[i]) 242928eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák continue; 243028eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 243128eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák /* if this colorbuffer is not being cleared */ 243228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák if (!(*buffers & clear_bit)) 243328eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák continue; 243428eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 243528eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák tex = (struct r600_texture *)fb->cbufs[i]->texture; 243628eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 243728eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák /* the clear is allowed if all layers are bound */ 243828eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák if (fb->cbufs[i]->u.tex.first_layer != 0 || 243928eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák fb->cbufs[i]->u.tex.last_layer != util_max_layer(&tex->resource.b.b, 0)) { 244028eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák continue; 244128eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } 244228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 244328eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák /* cannot clear mipmapped textures */ 244428eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák if (fb->cbufs[i]->texture->last_level != 0) { 244528eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák continue; 244628eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } 244728eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 244828eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák /* only supported on tiled surfaces */ 2449bf4d102ea3419ade6759bf9c3ad9d40c7f9b3c27Marek Olšák if (tex->surface.is_linear) { 245028eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák continue; 245128eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } 245228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 2453abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák /* shared textures can't use fast clear without an explicit flush, 2454abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák * because there is no way to communicate the clear color among 2455abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák * all clients 2456abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák */ 2457abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák if (tex->resource.is_shared && 2458abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák !(tex->resource.external_usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)) 2459abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák continue; 2460abac6bf67a85310908c79187d102a86ee8fe6dd6Marek Olšák 24614d641803e8f8763dcf4a262c6bcf2d1ba0431ca2Marek Olšák /* fast color clear with 1D tiling doesn't work on old kernels and CIK */ 24621a4e0162fc5b2f54bc1db1cd7914200ccac506f1Marek Olšák if (rctx->chip_class == CIK && 24631a4e0162fc5b2f54bc1db1cd7914200ccac506f1Marek Olšák tex->surface.level[0].mode == RADEON_SURF_MODE_1D && 24648ba70e0a7405005c079eb72f94999245c992aa91Marek Olšák rctx->screen->info.drm_major == 2 && 24658ba70e0a7405005c079eb72f94999245c992aa91Marek Olšák rctx->screen->info.drm_minor < 38) { 2466011569b5b74d878fedf3ab07b18a730493468e8fMarek Olšák continue; 2467011569b5b74d878fedf3ab07b18a730493468e8fMarek Olšák } 2468011569b5b74d878fedf3ab07b18a730493468e8fMarek Olšák 246949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Fast clear is the most appropriate place to enable DCC for 247049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * displayable surfaces. 247149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 24729fd4eff43c0c1d0e5cb58fafbaa39c7b08bb715aMarek Olšák if (rctx->chip_class >= VI && 24739fd4eff43c0c1d0e5cb58fafbaa39c7b08bb715aMarek Olšák !(rctx->screen->debug_flags & DBG_NO_DCC_FB)) { 247449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák vi_separate_dcc_try_enable(rctx, tex); 247549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 247649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Stoney can't do a CMASK-based clear, so all clears are 247749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * considered to be hypothetically slow clears, which 247849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák * is weighed when determining to enable separate DCC. 247949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák */ 248049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák if (tex->dcc_gather_statistics && 248149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák rctx->family == CHIP_STONEY) 248249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->num_slow_clears++; 248349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák } 248449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák 248549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák /* Try to clear DCC first, otherwise try CMASK. */ 2486692f2640ab0c4c923a5ba12ff8526d2d1a3eefb1Marek Olšák if (tex->dcc_offset && tex->surface.num_dcc_levels) { 24876529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen uint32_t reset_value; 24886529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen bool clear_words_needed; 2489bb77467df9863c522c8d8550e295e2ad7bbef37cBas Nieuwenhuizen 24903aebc596b339b1b787ed0dfc27793263d48b2819Marek Olšák if (rctx->screen->debug_flags & DBG_NO_DCC_CLEAR) 24913aebc596b339b1b787ed0dfc27793263d48b2819Marek Olšák continue; 24923aebc596b339b1b787ed0dfc27793263d48b2819Marek Olšák 249346c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák if (!vi_get_fast_clear_parameters(fb->cbufs[i]->format, 249446c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák color, &reset_value, 249546c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák &clear_words_needed)) 249646c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák continue; 249746c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák 24989a472a3e0b20923e9a42d362c6fad546c591f3d1Marek Olšák vi_dcc_clear_level(rctx, tex, 0, reset_value); 24996529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 25006529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (clear_words_needed) 25016529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen tex->dirty_level_mask |= 1 << fb->cbufs[i]->u.tex.level; 250249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák tex->separate_dcc_dirty = true; 25036529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen } else { 250446c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák /* 128-bit formats are unusupported */ 2505c66a550385b4937b2aaba8484aeaa41cf77399b7Marek Olšák if (tex->surface.bpe > 8) { 250646c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák continue; 250746c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák } 250846c425e7c8bbc07b435e59834ed5f379f3f69bdfMarek Olšák 25090d68b91220475620424869810d618ff3225c03d4Marek Olšák /* Stoney/RB+ doesn't work with CMASK fast clear. */ 25100d68b91220475620424869810d618ff3225c03d4Marek Olšák if (rctx->family == CHIP_STONEY) 2511de887ba90ce077a0243269aa0c72a1ab0d2d3ff4Marek Olšák continue; 2512de887ba90ce077a0243269aa0c72a1ab0d2d3ff4Marek Olšák 25136529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen /* ensure CMASK is enabled */ 25146529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen r600_texture_alloc_cmask_separate(rctx->screen, tex); 25156529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen if (tex->cmask.size == 0) { 25166529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen continue; 25176529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen } 25186529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 25196529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen /* Do the fast clear. */ 25206529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen rctx->clear_buffer(&rctx->b, &tex->cmask_buffer->b.b, 2521f564b61d33fd8fd23211e1762e2b04c25495b8fdMarek Olšák tex->cmask.offset, tex->cmask.size, 0, 2522f564b61d33fd8fd23211e1762e2b04c25495b8fdMarek Olšák R600_COHERENCY_CB_META); 25236529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen 25246529daca391912246c13e6f76e885026d2ce88beBas Nieuwenhuizen tex->dirty_level_mask |= 1 << fb->cbufs[i]->u.tex.level; 252528eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } 252628eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 25270fbaf749779b5ac6d242c2b6745c20be98567499Marek Olšák /* We can change the micro tile mode before a full clear. */ 25280fbaf749779b5ac6d242c2b6745c20be98567499Marek Olšák if (rctx->screen->chip_class >= SI) 25290fbaf749779b5ac6d242c2b6745c20be98567499Marek Olšák si_set_optimal_micro_tile_mode(rctx->screen, tex); 25300fbaf749779b5ac6d242c2b6745c20be98567499Marek Olšák 253128eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák evergreen_set_clear_color(tex, fb->cbufs[i]->format, color); 253228eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 25330c2eed0edec877584c9362bd9cb9004ff10a8b91Marek Olšák if (dirty_cbufs) 25340c2eed0edec877584c9362bd9cb9004ff10a8b91Marek Olšák *dirty_cbufs |= 1 << i; 25353206d4ed44e761186fee3c679801e57f8ce923cbGrazvydas Ignotas rctx->set_atom_dirty(rctx, fb_state, true); 253628eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák *buffers &= ~clear_bit; 253728eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák } 253828eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák} 253928eb0bcf19a2a82166f685bf68bb0366bc560ba9Marek Olšák 25409855477e903e00f7457adb15594048416444b992Marek Olšákvoid r600_init_screen_texture_functions(struct r600_common_screen *rscreen) 2541a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák{ 2542a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák rscreen->b.resource_from_handle = r600_texture_from_handle; 2543a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák rscreen->b.resource_get_handle = r600_texture_get_handle; 2544a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák} 25459855477e903e00f7457adb15594048416444b992Marek Olšák 25469855477e903e00f7457adb15594048416444b992Marek Olšákvoid r600_init_context_texture_functions(struct r600_common_context *rctx) 25479855477e903e00f7457adb15594048416444b992Marek Olšák{ 25489855477e903e00f7457adb15594048416444b992Marek Olšák rctx->b.create_surface = r600_create_surface; 25499855477e903e00f7457adb15594048416444b992Marek Olšák rctx->b.surface_destroy = r600_surface_destroy; 2550739d526b0757fb544322d3e03447d11de9a51b40Marek Olšák rctx->b.clear_texture = r600_clear_texture; 25519855477e903e00f7457adb15594048416444b992Marek Olšák} 2552