nv50_tex.c revision f80c03e1875fe96ff2f4c022e3cb76357828140d
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 3044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillerstatic INLINE uint32_t 3144570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillernv50_tic_swizzle(uint32_t tc, unsigned swz) 3244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller{ 33f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (swz) { 34f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_RED: 35f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPR__MASK) >> NV50_TIC_0_MAPR__SHIFT; 36f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_GREEN: 37f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPG__MASK) >> NV50_TIC_0_MAPG__SHIFT; 38f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_BLUE: 39f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPB__MASK) >> NV50_TIC_0_MAPB__SHIFT; 40f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_ALPHA: 41f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (tc & NV50_TIC_0_MAPA__MASK) >> NV50_TIC_0_MAPA__SHIFT; 42f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_ONE: 43f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_TIC_MAP_ONE; 44f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_SWIZZLE_ZERO: 45f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 46f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_TIC_MAP_ZERO; 47f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 4844570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 4944570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 50f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstruct pipe_sampler_view * 51f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_create_sampler_view(struct pipe_context *pipe, 52f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *texture, 53f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_sampler_view *templ) 547c745de74997e859d7e2640092bda9ad900e28a9Ben Skeggs{ 55f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct util_format_description *desc; 56f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t *tic; 57f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t swz[4]; 58f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t depth; 59f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *view; 60f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(texture); 61f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 62f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view = MALLOC_STRUCT(nv50_tic_entry); 63f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!view) 64f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 65f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 66f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe = *templ; 67f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.reference.count = 1; 68f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.texture = NULL; 69f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->pipe.context = pipe; 70f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 71f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller view->id = -1; 72f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&view->pipe.texture, texture); 74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 75f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic = &view->tic[0]; 76f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 77f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller desc = util_format_description(mt->base.base.format); 78f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 79f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* TIC[0] */ 80f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 81f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[0] = nv50_format_table[view->pipe.format].tic; 82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 83f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller swz[0] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_r); 84f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller swz[1] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_g); 85f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller swz[2] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_b); 86f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller swz[3] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_a); 87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[0] = (tic[0] & ~NV50_TIC_0_SWIZZLE__MASK) | 88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[0] << NV50_TIC_0_MAPR__SHIFT) | 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[1] << NV50_TIC_0_MAPG__SHIFT) | 90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[2] << NV50_TIC_0_MAPB__SHIFT) | 91f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (swz[3] << NV50_TIC_0_MAPA__SHIFT); 92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 93f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* tic[1] = mt->base.bo->offset; */ 94f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] = /* mt->base.bo->offset >> 32 */ 0; 95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 96f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= 0x10001000 | /* NV50_TIC_2_NO_BORDER */ 0x40000000; 97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_COLORSPACE_SRGB; 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mt->base.base.target != PIPE_TEXTURE_RECT) 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_NORMALIZED_COORDS; 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= 105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ((mt->base.bo->tile_mode & 0x0f) << (22 - 0)) | 106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ((mt->base.bo->tile_mode & 0xf0) << (25 - 4)); 107f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 108f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth = MAX2(mt->base.base.array_size, mt->base.base.depth0); 109f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 110f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (mt->base.base.target) { 111f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_1D: 112f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_1D; 113f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 114f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_2D: 115f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_2D; 116f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 117f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_RECT: 118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_RECT; 119f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 120f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_3D: 121f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_3D; 122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_CUBE: 124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth /= 6; 125f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (depth > 1) 126f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_CUBE_ARRAY; 127f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_CUBE; 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_1D_ARRAY: 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_1D_ARRAY; 132f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEXTURE_2D_ARRAY: 134f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_2D_ARRAY; 135f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_BUFFER: 137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[2] |= NV50_TIC_2_TARGET_BUFFER | /* NV50_TIC_2_LINEAR */ (1 << 18); 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("invalid texture target: %d\n", mt->base.base.target); 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return FALSE; 141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 142f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 143f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mt->base.base.target == PIPE_BUFFER) 144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[3] = mt->base.base.width0; 145f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 146f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[3] = 0x00300000; 147f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 148f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[4] = (1 << 31) | mt->base.base.width0; 149f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 150f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[5] = mt->base.base.height0 & 0xffff; 151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[5] |= depth << 16; 152f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[5] |= mt->base.base.last_level << 28; 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[6] = 0x03000000; 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level; 157f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return &view->pipe; 15944570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 1606a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic boolean 162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_validate_tic(struct nv50_context *nv50, int s) 16362100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs{ 164f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = nv50->screen->base.channel; 165f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *txc = nv50->screen->txc; 166f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush = FALSE; 168f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 169f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50->num_textures[s]; ++i) { 170f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *tic = nv50_tic_entry(nv50->textures[s][i]); 171f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_resource *res; 172f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 173f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!tic) { 174f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TIC(s)), 1); 175f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 1) | 0); 176f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 177f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 178f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller res = &nv50_miptree(tic->pipe.texture)->base; 179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tic->id < 0) { 181f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tic->id = nv50_screen_tic_alloc(nv50->screen, tic); 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller MARK_RING (chan, 24 + 8, 4); 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(DST_FORMAT), 2); 185f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, NV50_SURFACE_FORMAT_R8_UNORM); 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(DST_PITCH), 5); 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 262144); 189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 65536); 190f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 191f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, txc, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 192f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, txc, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(SIFC_BITMAP_ENABLE), 2); 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 195f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, NV50_SURFACE_FORMAT_R8_UNORM); 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(SIFC_WIDTH), 10); 197f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 32); 198f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 202f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 203f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 204f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, tic->id * 32); 205f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 206f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 207f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING_NI(chan, RING_2D(SIFC_DATA), 8); 208f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, tic->tic[0]); 209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, res->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOC (chan, res->bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | 211f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_BO_HIGH | NOUVEAU_BO_OR, tic->tic[2], tic->tic[2]); 212f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGp (chan, &tic->tic[3], 5); 213f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 214f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = TRUE; 215f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 216f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32); 217f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 218f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_add_resident(nv50, NV50_BUFCTX_TEXTURES, res, 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 221f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TIC(s)), 1); 222f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (tic->id << 9) | (i << 1) | 1); 223f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 224f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->state.num_textures[s]; ++i) { 225f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TIC(s)), 1); 226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 1) | 0); 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 228f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->state.num_textures[s] = nv50->num_textures[s]; 229f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 230f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return need_flush; 2316a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 232f1edfa09ea50e8833ddbf241da4d36fd38685e9dBen Skeggs 233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid nv50_validate_textures(struct nv50_context *nv50) 234ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs{ 235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush; 236f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 237f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = nv50_validate_tic(nv50, 0); 238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush |= nv50_validate_tic(nv50, 2); 239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (need_flush) { 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(nv50->screen->base.channel, RING_3D(TIC_FLUSH), 1); 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (nv50->screen->base.channel, 0); 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 244ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs} 245ac2b35fd2d5008a39fa394b7b04fd29b899d3e55Ben Skeggs 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic boolean 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_validate_tsc(struct nv50_context *nv50, int s) 248948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller{ 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = nv50->screen->base.channel; 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush = FALSE; 252f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 253f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50->num_samplers[s]; ++i) { 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *tsc = nv50_tsc_entry(nv50->samplers[s][i]); 255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!tsc) { 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TSC(s)), 1); 258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 4) | 0); 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 260f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tsc->id < 0) { 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tsc->id = nv50_screen_tsc_alloc(nv50->screen, tsc); 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_sifc_linear_u8(nv50, nv50->screen->txc, NOUVEAU_BO_VRAM, 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 65536 + tsc->id * 32, 32, tsc->tsc); 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = TRUE; 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32); 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TSC(s)), 1); 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (tsc->id << 12) | (i << 4) | 1); 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->state.num_samplers[s]; ++i) { 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(BIND_TSC(s)), 1); 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 4) | 0); 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->state.num_samplers[s] = nv50->num_samplers[s]; 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return need_flush; 280948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller} 281948e9f7c887158835c82881c73d4f728937d19f7Christoph Bumiller 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid nv50_validate_samplers(struct nv50_context *nv50) 2836a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller boolean need_flush; 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush = nv50_validate_tsc(nv50, 0); 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller need_flush |= nv50_validate_tsc(nv50, 2); 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (need_flush) { 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(nv50->screen->base.channel, RING_3D(TSC_FLUSH), 1); 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (nv50->screen->base.channel, 0); 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 29362100692b8ad7fa868743c4698dac109beceaf7fBen Skeggs} 294