1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Ben Skeggs 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_context.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_resource.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_texture.xml.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_defs.xml.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_TIC_0_SWIZZLE__MASK \ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (NV50_TIC_0_MAPA__MASK | NV50_TIC_0_MAPB__MASK | \ 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TIC_0_MAPG__MASK | NV50_TIC_0_MAPR__MASK) 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint32_t 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_tic_swizzle(uint32_t tc, unsigned swz, boolean tex_int) 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (swz) { 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SWIZZLE_RED: 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (tc & NV50_TIC_0_MAPR__MASK) >> NV50_TIC_0_MAPR__SHIFT; 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SWIZZLE_GREEN: 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (tc & NV50_TIC_0_MAPG__MASK) >> NV50_TIC_0_MAPG__SHIFT; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SWIZZLE_BLUE: 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (tc & NV50_TIC_0_MAPB__MASK) >> NV50_TIC_0_MAPB__SHIFT; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SWIZZLE_ALPHA: 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (tc & NV50_TIC_0_MAPA__MASK) >> NV50_TIC_0_MAPA__SHIFT; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SWIZZLE_ONE: 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tex_int ? NV50_TIC_MAP_ONE_INT : NV50_TIC_MAP_ONE_FLOAT; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SWIZZLE_ZERO: 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV50_TIC_MAP_ZERO; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_init_tic_entry_linear(uint32_t *tic, struct pipe_resource *res) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res->target == PIPE_BUFFER) { 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_LINEAR | NV50_TIC_2_TARGET_BUFFER; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[4] = res->width0; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_miptree *mt = nv50_miptree(res); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_LINEAR | NV50_TIC_2_TARGET_RECT; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res->target != PIPE_TEXTURE_RECT) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_NORMALIZED_COORDS; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[3] = mt->level[0].pitch; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[4] = res->width0; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[5] = (1 << 16) | res->height0; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_sampler_view * 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_create_sampler_view(struct pipe_context *pipe, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *texture, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_sampler_view *templ) 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t addr; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *tic; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t swz[4]; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t depth; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_tic_entry *view; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_miptree *mt = nv50_miptree(texture); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean tex_int; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = MALLOC_STRUCT(nv50_tic_entry); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!view) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->pipe = *templ; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->pipe.reference.count = 1; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->pipe.texture = NULL; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->pipe.context = pipe; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view->id = -1; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&view->pipe.texture, texture); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic = &view->tic[0]; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = util_format_description(view->pipe.format); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TIC[0] */ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[0] = nv50_format_table[view->pipe.format].tic; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_int = util_format_is_pure_integer(view->pipe.format); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swz[0] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_r, tex_int); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swz[1] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_g, tex_int); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swz[2] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_b, tex_int); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swz[3] = nv50_tic_swizzle(tic[0], view->pipe.swizzle_a, tex_int); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[0] = (tic[0] & ~NV50_TIC_0_SWIZZLE__MASK) | 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (swz[0] << NV50_TIC_0_MAPR__SHIFT) | 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (swz[1] << NV50_TIC_0_MAPG__SHIFT) | 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (swz[2] << NV50_TIC_0_MAPB__SHIFT) | 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (swz[3] << NV50_TIC_0_MAPA__SHIFT); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addr = mt->base.address; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mt->base.base.target == PIPE_TEXTURE_1D_ARRAY || 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mt->base.base.target == PIPE_TEXTURE_2D_ARRAY) { 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addr += view->pipe.u.tex.first_layer * mt->layer_stride; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = view->pipe.u.tex.last_layer - view->pipe.u.tex.first_layer + 1; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = mt->base.base.depth0; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[1] = addr; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] = (addr >> 32) & 0xff; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= 0x10001000 | NV50_TIC_2_NO_BORDER; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_COLORSPACE_SRGB; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(!nouveau_bo_memtype(nv04_resource(texture)->bo))) { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_init_tic_entry_linear(tic, texture); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &view->pipe; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mt->base.base.target != PIPE_TEXTURE_RECT) 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_NORMALIZED_COORDS; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((mt->level[0].tile_mode & 0x0f0) << (22 - 4)) | 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((mt->level[0].tile_mode & 0xf00) << (25 - 8)); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mt->base.base.target) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_1D; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_2D; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_RECT: 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_RECT; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_3D: 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_3D; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_CUBE: 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth /= 6; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth > 1) 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_CUBE_ARRAY; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_CUBE; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D_ARRAY: 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_1D_ARRAY; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D_ARRAY: 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_2D_ARRAY; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BUFFER: 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); /* should be linear and handled above ! */ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[2] |= NV50_TIC_2_TARGET_BUFFER | NV50_TIC_2_LINEAR; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("invalid texture target: %d\n", mt->base.base.target); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[3] = 0x00300000; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[4] = (1 << 31) | (mt->base.base.width0 << mt->ms_x); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[5] = (mt->base.base.height0 << mt->ms_y) & 0xffff; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[5] |= depth << 16; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[5] |= mt->base.base.last_level << 28; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[6] = (mt->ms_x > 1) ? 0x88000000 : 0x03000000; /* sampling points */ 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &view->pipe; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_validate_tic(struct nv50_context *nv50, int s) 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_bo *txc = nv50->screen->txc; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean need_flush = FALSE; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nv50->num_textures[s]; ++i) { 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_tic_entry *tic = nv50_tic_entry(nv50->textures[s][i]); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *res; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tic) { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(BIND_TIC(s)), 1); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (i << 1) | 0); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = &nv50_miptree(tic->pipe.texture)->base; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tic->id < 0) { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tic->id = nv50_screen_tic_alloc(nv50->screen, tic); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(DST_FORMAT), 2); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(DST_PITCH), 5); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 262144); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 65536); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAh(push, txc->offset); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, txc->offset); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(SIFC_BITMAP_ENABLE), 2); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_2D(SIFC_WIDTH), 10); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 32); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 1); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, tic->id * 32); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NI04(push, NV50_2D(SIFC_DATA), 8); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATAp(push, &tic->tic[0], 8); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_flush = TRUE; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) { 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(TEX_CACHE_CTL), 1); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, 0x20); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->status &= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BCTX_REFN(nv50->bufctx_3d, TEXTURES, res, RD); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(BIND_TIC(s)), 1); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (tic->id << 9) | (i << 1) | 1); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < nv50->state.num_textures[s]; ++i) { 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(BIND_TIC(s)), 1); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (i << 1) | 0); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.num_textures[s] = nv50->num_textures[s]; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return need_flush; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid nv50_validate_textures(struct nv50_context *nv50) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean need_flush; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_flush = nv50_validate_tic(nv50, 0); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_flush |= nv50_validate_tic(nv50, 2); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (need_flush) { 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(nv50->base.pushbuf, NV50_3D(TIC_FLUSH), 1); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (nv50->base.pushbuf, 0); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_validate_tsc(struct nv50_context *nv50, int s) 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_pushbuf *push = nv50->base.pushbuf; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean need_flush = FALSE; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nv50->num_samplers[s]; ++i) { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_tsc_entry *tsc = nv50_tsc_entry(nv50->samplers[s][i]); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tsc) { 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(BIND_TSC(s)), 1); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (i << 4) | 0); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tsc->id < 0) { 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tsc->id = nv50_screen_tsc_alloc(nv50->screen, tsc); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_sifc_linear_u8(&nv50->base, nv50->screen->txc, 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65536 + tsc->id * 32, 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_BO_VRAM, 32, tsc->tsc); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_flush = TRUE; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(BIND_TSC(s)), 1); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (tsc->id << 12) | (i << 4) | 1); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < nv50->state.num_samplers[s]; ++i) { 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(push, NV50_3D(BIND_TSC(s)), 1); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (push, (i << 4) | 0); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50->state.num_samplers[s] = nv50->num_samplers[s]; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return need_flush; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid nv50_validate_samplers(struct nv50_context *nv50) 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean need_flush; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_flush = nv50_validate_tsc(nv50, 0); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_flush |= nv50_validate_tsc(nv50, 2); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (need_flush) { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NV04(nv50->base.pushbuf, NV50_3D(TSC_FLUSH), 1); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (nv50->base.pushbuf, 0); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 335