nv50_tex.c revision 0a3f0ff2645d03d5f572cc26932595b8df400505
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; 78f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t *tic; 79f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t swz[4]; 80f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t depth; 81f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *view; 82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(texture); 83e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller boolean tex_int; 84f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 85f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view = MALLOC_STRUCT(nv50_tic_entry); 86f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!view) 87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe = *templ; 90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.reference.count = 1; 91f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.texture = NULL; 92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.context = pipe; 93f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 94f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->id = -1; 95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 96f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&view->pipe.texture, texture); 97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic = &view->tic[0]; 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 100b0698396dcc70f6c8a16090dfb1674996538db3aChristoph Bumiller desc = util_format_description(view->pipe.format); 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* TIC[0] */ 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[0] = nv50_format_table[view->pipe.format].tic; 105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 106e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller tex_int = FALSE; /* XXX: integer textures */ 107e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller 108e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[0] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_r, tex_int); 109e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[1] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_g, tex_int); 110e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[2] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_b, tex_int); 111e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller swz[3] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_a, tex_int); 112f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[0] = (tic[0] & ~NV50_TIC_0_SWIZZLE__MASK) | 113f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[0] << NV50_TIC_0_MAPR__SHIFT) | 114f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[1] << NV50_TIC_0_MAPG__SHIFT) | 115f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[2] << NV50_TIC_0_MAPB__SHIFT) | 116f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[3] << NV50_TIC_0_MAPA__SHIFT); 117f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1184fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller tic[1] = /* mt->base.bo->offset; */ 0; 119f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] = /* mt->base.bo->offset >> 32 */ 0; 120f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 121e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller tic[2] |= 0x10001000 | NV50_TIC_2_NO_BORDER; 122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_COLORSPACE_SRGB; 125f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1260a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller if (unlikely(!nouveau_bo_tile_layout(nv04_resource(texture)->bo))) { 1270a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller nv50_init_tic_entry_linear(tic, texture); 1280a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller return &view->pipe; 1290a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller } 1300a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mt->base.base.target != PIPE_TEXTURE_RECT) 132f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_NORMALIZED_COORDS; 133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 134f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= 135f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ((mt->base.bo->tile_mode & 0x0f) << (22 - 0)) | 136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ((mt->base.bo->tile_mode & 0xf0) << (25 - 4)); 137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth = MAX2(mt->base.base.array_size, mt->base.base.depth0); 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1404fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller if (mt->base.base.target == PIPE_TEXTURE_1D_ARRAY || 1414fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller mt->base.base.target == PIPE_TEXTURE_2D_ARRAY) { 1424fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller tic[1] = view->pipe.u.tex.first_layer * mt->layer_stride; 1434fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller depth = view->pipe.u.tex.last_layer - view->pipe.u.tex.first_layer + 1; 1444fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller } 1454fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller 146f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (mt->base.base.target) { 147f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_1D: 148f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_1D; 149f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 150f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_2D: 151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_2D; 152f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_RECT: 154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_RECT; 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_3D: 157f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_3D; 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_CUBE: 160f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth /= 6; 161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (depth > 1) 162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_CUBE_ARRAY; 163f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 164f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_CUBE; 165f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 166f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_1D_ARRAY: 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_1D_ARRAY; 168f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 169f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_2D_ARRAY: 170f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_2D_ARRAY; 171f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 172f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_BUFFER: 1730a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller assert(0); /* should be linear and handled above ! */ 174e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller tic[2] |= NV50_TIC_2_TARGET_BUFFER | NV50_TIC_2_LINEAR; 1751f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller break; 176f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 177f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("invalid texture target: %d\n", mt->base.base.target); 178f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return FALSE; 179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1810a3f0ff2645d03d5f572cc26932595b8df400505Christoph Bumiller tic[3] = 0x00300000; 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 183b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tic[4] = (1 << 31) | (mt->base.base.width0 << mt->ms_x); 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 185b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tic[5] = (mt->base.base.height0 << mt->ms_y) & 0xffff; 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[5] |= depth << 16; 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[5] |= mt->base.base.last_level << 28; 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 189b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tic[6] = (mt->ms_x > 1) ? 0x88000000 : 0x03000000; /* sampling points */ 190f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 191f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level; 192f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return &view->pipe; 19444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 1956a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic boolean 197f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_validate_tic(struct nv50_context *nv50, int s) 19862100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs{ 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = nv50->screen->base.channel; 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *txc = nv50->screen->txc; 201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 202f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush = FALSE; 203f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 204f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50->num_textures[s]; ++i) { 205f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *tic = nv50_tic_entry(nv50->textures[s][i]); 20679079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs struct nv04_resource *res; 207f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 208f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!tic) { 209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TIC(s)), 1); 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 1) | 0); 211f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 212f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 213f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller res = &nv50_miptree(tic->pipe.texture)->base; 214f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 215f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tic->id < 0) { 2164fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller uint32_t offset = tic->tic[1]; 2174fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller 218f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic->id = nv50_screen_tic_alloc(nv50->screen, tic); 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller MARK_RING (chan, 24 + 8, 4); 221f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(DST_FORMAT), 2); 222f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, NV50_SURFACE_FORMAT_R8_UNORM); 223f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 224f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(DST_PITCH), 5); 225f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 262144); 226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 65536); 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 228f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, txc, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 229f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, txc, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 230f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(SIFC_BITMAP_ENABLE), 2); 231f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 232f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, NV50_SURFACE_FORMAT_R8_UNORM); 233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(SIFC_WIDTH), 10); 234f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 32); 235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 236f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 237f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, tic->id * 32); 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING_NI(chan, RING_2D(SIFC_DATA), 8); 245f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, tic->tic[0]); 2464fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller OUT_RELOCl(chan, res->bo, offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); 2474fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller OUT_RELOC (chan, res->bo, offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 248f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_BO_HIGH | NOUVEAU_BO_OR, tic->tic[2], tic->tic[2]); 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGp (chan, &tic->tic[3], 5); 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = TRUE; 252be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs } else 253be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) { 254be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs BEGIN_RING(chan, RING_3D(TEX_CACHE_CTL), 1); 255be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs OUT_RING (chan, 0x20); //(tic->id << 4) | 1); 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 257be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs 258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32); 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 260be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs res->status &= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 261be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 262be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_add_resident(nv50, NV50_BUFCTX_TEXTURES, res, 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TIC(s)), 1); 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (tic->id << 9) | (i << 1) | 1); 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->state.num_textures[s]; ++i) { 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TIC(s)), 1); 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 1) | 0); 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->state.num_textures[s] = nv50->num_textures[s]; 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return need_flush; 2766a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 277f1edfa09ea50e8833ddbf241da4d36fd38685e9dBen Skeggs 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid nv50_validate_textures(struct nv50_context *nv50) 279ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs{ 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush; 281f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = nv50_validate_tic(nv50, 0); 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush |= nv50_validate_tic(nv50, 2); 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (need_flush) { 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(nv50->screen->base.channel, RING_3D(TIC_FLUSH), 1); 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (nv50->screen->base.channel, 0); 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 289ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs} 290ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic boolean 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_validate_tsc(struct nv50_context *nv50, int s) 293948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller{ 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = nv50->screen->base.channel; 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush = FALSE; 297f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 298f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50->num_samplers[s]; ++i) { 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *tsc = nv50_tsc_entry(nv50->samplers[s][i]); 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!tsc) { 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TSC(s)), 1); 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 4) | 0); 304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 306f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tsc->id < 0) { 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tsc->id = nv50_screen_tsc_alloc(nv50->screen, tsc); 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 3091ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs nv50_sifc_linear_u8(&nv50->base, nv50->screen->txc, 31079079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs 65536 + tsc->id * 32, 31179079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs NOUVEAU_BO_VRAM, 32, tsc->tsc); 312f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = TRUE; 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32); 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 316f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TSC(s)), 1); 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (tsc->id << 12) | (i << 4) | 1); 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->state.num_samplers[s]; ++i) { 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TSC(s)), 1); 321f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 4) | 0); 322f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->state.num_samplers[s] = nv50->num_samplers[s]; 324f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 325f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return need_flush; 326948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller} 327948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid nv50_validate_samplers(struct nv50_context *nv50) 3296a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush; 331f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 332f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = nv50_validate_tsc(nv50, 0); 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush |= nv50_validate_tsc(nv50, 2); 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (need_flush) { 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(nv50->screen->base.channel, RING_3D(TSC_FLUSH), 1); 337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (nv50->screen->base.channel, 0); 338f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 33962100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs} 340