162100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs/* 262100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * Copyright 2008 Ben Skeggs 362100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * 462100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 562100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * copy of this software and associated documentation files (the "Software"), 662100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * to deal in the Software without restriction, including without limitation 762100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 862100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 962100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * Software is furnished to do so, subject to the following conditions: 1062100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * 1162100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * The above copyright notice and this permission notice shall be included in 1262100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * all copies or substantial portions of the Software. 1362100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * 1462100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1562100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1662100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1762100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 1862100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 1962100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 2062100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs * SOFTWARE. 2162100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs */ 2262100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs 2362100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs#include "nv50_context.h" 24287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "nv50_resource.h" 25f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_texture.xml.h" 26f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_defs.xml.h" 2762100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs 286fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol#include "util/u_format.h" 296fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol 30e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller#define NV50_TIC_0_SWIZZLE__MASK \ 31e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller (NV50_TIC_0_MAPA__MASK | NV50_TIC_0_MAPB__MASK | \ 32e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller NV50_TIC_0_MAPG__MASK | NV50_TIC_0_MAPR__MASK) 33e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller 3444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillerstatic INLINE uint32_t 35e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumillernv50_tic_swizzle(uint32_t tc, unsigned swz, boolean tex_int) 3644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller{ 37f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (swz) { 38f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_RED: 39f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPR__MASK) >> NV50_TIC_0_MAPR__SHIFT; 40f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_GREEN: 41f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPG__MASK) >> NV50_TIC_0_MAPG__SHIFT; 42f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_BLUE: 43f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPB__MASK) >> NV50_TIC_0_MAPB__SHIFT; 44f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_ALPHA: 45f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPA__MASK) >> NV50_TIC_0_MAPA__SHIFT; 46f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_ONE: 47e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller return tex_int ? NV50_TIC_MAP_ONE_INT : NV50_TIC_MAP_ONE_FLOAT; 48f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_ZERO: 49f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 50f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_TIC_MAP_ZERO; 51f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 5244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 5344570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 540a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumillerstatic void 550a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumillernv50_init_tic_entry_linear(uint32_t *tic, struct pipe_resource *res) 560a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller{ 570a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller if (res->target == PIPE_BUFFER) { 580a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[2] |= NV50_TIC_2_LINEAR | NV50_TIC_2_TARGET_BUFFER; 590a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[4] = res->width0; 600a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller } else { 610a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller struct nv50_miptree *mt = nv50_miptree(res); 620a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller 630a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[2] |= NV50_TIC_2_LINEAR | NV50_TIC_2_TARGET_RECT; 640a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller if (res->target != PIPE_TEXTURE_RECT) 650a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[2] |= NV50_TIC_2_NORMALIZED_COORDS; 660a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[3] = mt->level[0].pitch; 670a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[4] = res->width0; 680a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[5] = (1 << 16) | res->height0; 690a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller } 700a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller} 710a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller 72f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstruct pipe_sampler_view * 73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_create_sampler_view(struct pipe_context *pipe, 74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *texture, 75f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_sampler_view *templ) 767c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs{ 77f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct util_format_description *desc; 786d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller uint64_t addr; 79f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t *tic; 80f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t swz[4]; 81f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t depth; 82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *view; 83f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(texture); 84e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller boolean tex_int; 85f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 86f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view = MALLOC_STRUCT(nv50_tic_entry); 87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!view) 88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe = *templ; 91f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.reference.count = 1; 92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.texture = NULL; 93f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.context = pipe; 94f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->id = -1; 96f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&view->pipe.texture, texture); 98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic = &view->tic[0]; 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 101b0698396dcc70f6c8a16090dfb1674996538db3aChristoph Bumiller desc = util_format_description(view->pipe.format); 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* TIC[0] */ 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[0] = nv50_format_table[view->pipe.format].tic; 106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1079934bfe28d3c0f6551ba2cc806a7fe8e0a16ed7cChristoph Bumiller tex_int = util_format_is_pure_integer(view->pipe.format); 108e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller 109e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[0] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_r, tex_int); 110e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[1] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_g, tex_int); 111e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[2] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_b, tex_int); 112e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[3] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_a, tex_int); 113f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[0] = (tic[0] & ~NV50_TIC_0_SWIZZLE__MASK) | 114f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[0] << NV50_TIC_0_MAPR__SHIFT) | 115f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[1] << NV50_TIC_0_MAPG__SHIFT) | 116f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[2] << NV50_TIC_0_MAPB__SHIFT) | 117f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[3] << NV50_TIC_0_MAPA__SHIFT); 118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1196d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller addr = mt->base.address; 1206d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 1216d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (mt->base.base.target == PIPE_TEXTURE_1D_ARRAY || 1226d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller mt->base.base.target == PIPE_TEXTURE_2D_ARRAY) { 1236d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller addr += view->pipe.u.tex.first_layer * mt->layer_stride; 1246d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller depth = view->pipe.u.tex.last_layer - view->pipe.u.tex.first_layer + 1; 1256d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller } else { 1266d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller depth = mt->base.base.depth0; 1276d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller } 1286d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 1296d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller tic[1] = addr; 1306d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller tic[2] = (addr >> 32) & 0xff; 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 132e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller tic[2] |= 0x10001000 | NV50_TIC_2_NO_BORDER; 133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 134f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 135f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_COLORSPACE_SRGB; 136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1376d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (unlikely(!nouveau_bo_memtype(nv04_resource(texture)->bo))) { 1380a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller nv50_init_tic_entry_linear(tic, texture); 1390a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller return &view->pipe; 1400a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller } 1410a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller 142f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mt->base.base.target != PIPE_TEXTURE_RECT) 143f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_NORMALIZED_COORDS; 144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 145f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= 1466d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller ((mt->level[0].tile_mode & 0x0f0) << (22 - 4)) | 1476d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller ((mt->level[0].tile_mode & 0xf00) << (25 - 8)); 1484fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller 149f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (mt->base.base.target) { 150f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_1D: 151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_1D; 152f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_2D: 154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_2D; 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_RECT: 157f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_RECT; 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_3D: 160f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_3D; 161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_CUBE: 163f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth /= 6; 164f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (depth > 1) 165f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_CUBE_ARRAY; 166f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_CUBE; 168f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 169f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_1D_ARRAY: 170f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_1D_ARRAY; 171f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 172f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_2D_ARRAY: 173f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_2D_ARRAY; 174f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 175f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_BUFFER: 1760a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller assert(0); /* should be linear and handled above ! */ 177e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller tic[2] |= NV50_TIC_2_TARGET_BUFFER | NV50_TIC_2_LINEAR; 1781f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller break; 179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("invalid texture target: %d\n", mt->base.base.target); 181f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return FALSE; 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1840a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[3] = 0x00300000; 185f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 186b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tic[4] = (1 << 31) | (mt->base.base.width0 << mt->ms_x); 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 188b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tic[5] = (mt->base.base.height0 << mt->ms_y) & 0xffff; 189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[5] |= depth << 16; 190f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[5] |= mt->base.base.last_level << 28; 191f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 192b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tic[6] = (mt->ms_x > 1) ? 0x88000000 : 0x03000000; /* sampling points */ 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level; 195f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return &view->pipe; 19744570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 1986a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic boolean 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_validate_tic(struct nv50_context *nv50, int s) 20162100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs{ 2026d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nv50->base.pushbuf; 203f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *txc = nv50->screen->txc; 204f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 205f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush = FALSE; 206f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 207f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50->num_textures[s]; ++i) { 208f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *tic = nv50_tic_entry(nv50->textures[s][i]); 20979079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs struct nv04_resource *res; 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 211f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!tic) { 2126d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(BIND_TIC(s)), 1); 2136d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (i << 1) | 0); 214f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 215f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 216f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller res = &nv50_miptree(tic->pipe.texture)->base; 217f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 218f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tic->id < 0) { 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic->id = nv50_screen_tic_alloc(nv50->screen, tic); 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2216d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(DST_FORMAT), 2); 2226d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 2236d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 2246d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(DST_PITCH), 5); 2256d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 262144); 2266d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 65536); 2276d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 2286d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAh(push, txc->offset); 2296d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, txc->offset); 2306d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(SIFC_BITMAP_ENABLE), 2); 2316d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 2326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 2336d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(SIFC_WIDTH), 10); 2346d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 32); 2356d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 2366d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 2376d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 2386d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 2396d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 2406d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 2416d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, tic->id * 32); 2426d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 2436d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 2446d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NI04(push, NV50_2D(SIFC_DATA), 8); 2456d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAp(push, &tic->tic[0], 8); 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = TRUE; 248be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs } else 249be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) { 2506d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(TEX_CACHE_CTL), 1); 2516d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0x20); 252f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 253be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32); 255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 256be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs res->status &= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 257be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 258be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs 2596d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BCTX_REFN(nv50->bufctx_3d, TEXTURES, res, RD); 260f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2616d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(BIND_TIC(s)), 1); 2626d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (tic->id << 9) | (i << 1) | 1); 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->state.num_textures[s]; ++i) { 2656d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(BIND_TIC(s)), 1); 2666d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (i << 1) | 0); 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->state.num_textures[s] = nv50->num_textures[s]; 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return need_flush; 2716a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 272f1edfa09ea50e8833ddbf241da4d36fd38685e9dBen Skeggs 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid nv50_validate_textures(struct nv50_context *nv50) 274ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs{ 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush; 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = nv50_validate_tic(nv50, 0); 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush |= nv50_validate_tic(nv50, 2); 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (need_flush) { 2816d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(nv50->base.pushbuf, NV50_3D(TIC_FLUSH), 1); 2826d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (nv50->base.pushbuf, 0); 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 284ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs} 285ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic boolean 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_validate_tsc(struct nv50_context *nv50, int s) 288948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller{ 2896d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nv50->base.pushbuf; 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush = FALSE; 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50->num_samplers[s]; ++i) { 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *tsc = nv50_tsc_entry(nv50->samplers[s][i]); 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!tsc) { 2976d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(BIND_TSC(s)), 1); 2986d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (i << 4) | 0); 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tsc->id < 0) { 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tsc->id = nv50_screen_tsc_alloc(nv50->screen, tsc); 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 3041ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs nv50_sifc_linear_u8(&nv50->base, nv50->screen->txc, 30579079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs 65536 + tsc->id * 32, 30679079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs NOUVEAU_BO_VRAM, 32, tsc->tsc); 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = TRUE; 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32); 310f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 3116d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(BIND_TSC(s)), 1); 3126d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (tsc->id << 12) | (i << 4) | 1); 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->state.num_samplers[s]; ++i) { 3156d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(BIND_TSC(s)), 1); 3166d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (i << 4) | 0); 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->state.num_samplers[s] = nv50->num_samplers[s]; 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return need_flush; 321948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller} 322948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid nv50_validate_samplers(struct nv50_context *nv50) 3246a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 325f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush; 326f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = nv50_validate_tsc(nv50, 0); 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush |= nv50_validate_tsc(nv50, 2); 329f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (need_flush) { 3316d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(nv50->base.pushbuf, NV50_3D(TSC_FLUSH), 1); 3326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (nv50->base.pushbuf, 0); 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 33462100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs} 335