14c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller/* 24c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * Copyright 2008 Ben Skeggs 34c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * 44c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * Permission is hereby granted, free of charge, to any person obtaining a 54c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * copy of this software and associated documentation files (the "Software"), 64c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * to deal in the Software without restriction, including without limitation 74c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * the rights to use, copy, modify, merge, publish, distribute, sublicense, 84c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * and/or sell copies of the Software, and to permit persons to whom the 94c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * Software is furnished to do so, subject to the following conditions: 104c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * 114c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * The above copyright notice and this permission notice shall be included in 124c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * all copies or substantial portions of the Software. 134c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * 144c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 154c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 164c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 173d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 183d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 193d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 203d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER DEALINGS IN THE SOFTWARE. 214c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller */ 224c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 235eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nvc0/nvc0_context.h" 245eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nvc0/nvc0_resource.h" 2597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs#include "nvc0/gm107_texture.xml.h" 26fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset#include "nvc0/nvc0_compute.xml.h" 27ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs#include "nv50/g80_texture.xml.h" 28e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs#include "nv50/g80_defs.xml.h" 294c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 304c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller#include "util/u_format.h" 314c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 32e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller#define NVE4_TIC_ENTRY_INVALID 0x000fffff 33e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller#define NVE4_TSC_ENTRY_INVALID 0xfff00000 34e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 35a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t 36733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggsnv50_tic_swizzle(const struct nvc0_format *fmt, unsigned swz, bool tex_int) 374c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{ 384c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller switch (swz) { 39fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_X : return fmt->tic.src_x; 40fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_Y: return fmt->tic.src_y; 41fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_Z : return fmt->tic.src_z; 42fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_W: return fmt->tic.src_w; 43fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_1: 44ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs return tex_int ? G80_TIC_SOURCE_ONE_INT : G80_TIC_SOURCE_ONE_FLOAT; 45fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák case PIPE_SWIZZLE_0: 464c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller default: 47ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs return G80_TIC_SOURCE_ZERO; 484c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 494c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller} 504c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 514c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillerstruct pipe_sampler_view * 524c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillernvc0_create_sampler_view(struct pipe_context *pipe, 5336ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller struct pipe_resource *res, 544c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller const struct pipe_sampler_view *templ) 554c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{ 5636ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller uint32_t flags = 0; 5736ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller 5895058bdec31d3faa76be01731a26939f3039a66bIlia Mirkin if (templ->target == PIPE_TEXTURE_RECT || templ->target == PIPE_BUFFER) 5936ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller flags |= NV50_TEXVIEW_SCALED_COORDS; 6036ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller 6195058bdec31d3faa76be01731a26939f3039a66bIlia Mirkin return nvc0_create_texture_view(pipe, res, templ, flags, templ->target); 6236ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller} 6336ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller 6497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsstatic struct pipe_sampler_view * 6597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsgm107_create_texture_view(struct pipe_context *pipe, 6697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs struct pipe_resource *texture, 6797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs const struct pipe_sampler_view *templ, 6897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint32_t flags, 6997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs enum pipe_texture_target target) 7097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs{ 7197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs const struct util_format_description *desc; 7297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs const struct nvc0_format *fmt; 7397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint64_t address; 7497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint32_t *tic; 7597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint32_t swz[4]; 7697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint32_t width, height; 7797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint32_t depth; 7897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs struct nv50_tic_entry *view; 7997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs struct nv50_miptree *mt; 8097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs bool tex_int; 8197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 8297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs view = MALLOC_STRUCT(nv50_tic_entry); 8397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (!view) 8497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs return NULL; 8597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs mt = nv50_miptree(texture); 8697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 8797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs view->pipe = *templ; 8897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs view->pipe.reference.count = 1; 8997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs view->pipe.texture = NULL; 9097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs view->pipe.context = pipe; 9197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 9297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs view->id = -1; 9397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 9497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs pipe_resource_reference(&view->pipe.texture, texture); 9597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 9697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic = &view->tic[0]; 9797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 9897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs desc = util_format_description(view->pipe.format); 9997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tex_int = util_format_is_pure_integer(view->pipe.format); 10097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 10197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs fmt = &nvc0_format_table[view->pipe.format]; 10297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs swz[0] = nv50_tic_swizzle(fmt, view->pipe.swizzle_r, tex_int); 10397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs swz[1] = nv50_tic_swizzle(fmt, view->pipe.swizzle_g, tex_int); 10497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs swz[2] = nv50_tic_swizzle(fmt, view->pipe.swizzle_b, tex_int); 10597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs swz[3] = nv50_tic_swizzle(fmt, view->pipe.swizzle_a, tex_int); 10697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 10797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] = fmt->tic.format << GM107_TIC2_0_COMPONENTS_SIZES__SHIFT; 10897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= fmt->tic.type_r << GM107_TIC2_0_R_DATA_TYPE__SHIFT; 10997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= fmt->tic.type_g << GM107_TIC2_0_G_DATA_TYPE__SHIFT; 11097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= fmt->tic.type_b << GM107_TIC2_0_B_DATA_TYPE__SHIFT; 11197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= fmt->tic.type_a << GM107_TIC2_0_A_DATA_TYPE__SHIFT; 11297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= swz[0] << GM107_TIC2_0_X_SOURCE__SHIFT; 11397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= swz[1] << GM107_TIC2_0_Y_SOURCE__SHIFT; 11497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= swz[2] << GM107_TIC2_0_Z_SOURCE__SHIFT; 11597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[0] |= swz[3] << GM107_TIC2_0_W_SOURCE__SHIFT; 11697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 11797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs address = mt->base.address; 11897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 11997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[3] = GM107_TIC2_3_LOD_ANISO_QUALITY_2; 12097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] = GM107_TIC2_4_SECTOR_PROMOTION_PROMOTE_TO_2_V; 12197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_BORDER_SIZE_SAMPLER_COLOR; 12297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 12397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 12497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_SRGB_CONVERSION; 12597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 12697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (!(flags & NV50_TEXVIEW_SCALED_COORDS)) 12797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[5] = GM107_TIC2_5_NORMALIZED_COORDS; 12897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs else 12997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[5] = 0; 13097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 13197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs /* check for linear storage type */ 13297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (unlikely(!nouveau_bo_memtype(nv04_resource(texture)->bo))) { 13397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (texture->target == PIPE_BUFFER) { 13497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs assert(!(tic[5] & GM107_TIC2_5_NORMALIZED_COORDS)); 1357cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák width = view->pipe.u.buf.size / (desc->block.bits / 8) - 1; 13697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs address += 1377cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák view->pipe.u.buf.offset; 13897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[2] = GM107_TIC2_2_HEADER_VERSION_ONE_D_BUFFER; 13997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[3] |= width >> 16; 14097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_ONE_D_BUFFER; 14197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= width & 0xffff; 14297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } else { 14397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs assert(!(mt->level[0].pitch & 0x1f)); 14497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs /* must be 2D texture without mip maps */ 14597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[2] = GM107_TIC2_2_HEADER_VERSION_PITCH; 14697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_TWO_D_NO_MIPMAP; 14797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[3] |= mt->level[0].pitch >> 5; 14897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= mt->base.base.width0 - 1; 14997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[5] |= 0 << GM107_TIC2_5_DEPTH_MINUS_ONE__SHIFT; 15097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[5] |= mt->base.base.height0 - 1; 15197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } 15297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[1] = address; 15397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[2] |= address >> 32; 15497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[6] = 0; 15597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[7] = 0; 15697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs return &view->pipe; 15797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } 15897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 15997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[2] = GM107_TIC2_2_HEADER_VERSION_BLOCKLINEAR; 16097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[3] |= 16197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs ((mt->level[0].tile_mode & 0x0f0) >> 4 << 3) | 16297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs ((mt->level[0].tile_mode & 0xf00) >> 8 << 6); 16397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 16497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs depth = MAX2(mt->base.base.array_size, mt->base.base.depth0); 16597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 16697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (mt->base.base.array_size > 1) { 16797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs /* there doesn't seem to be a base layer field in TIC */ 16897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs address += view->pipe.u.tex.first_layer * mt->layer_stride; 16997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs depth = view->pipe.u.tex.last_layer - view->pipe.u.tex.first_layer + 1; 17097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } 17197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[1] = address; 17297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[2] |= address >> 32; 17397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 17497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs switch (target) { 17597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_1D: 17697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_ONE_D; 17797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 17897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_2D: 17997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_TWO_D; 18097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 18197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_RECT: 18297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_TWO_D; 18397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 18497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_3D: 18597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_THREE_D; 18697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 18797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_CUBE: 18897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs depth /= 6; 18997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_CUBEMAP; 19097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 19197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_1D_ARRAY: 19297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_ONE_D_ARRAY; 19397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 19497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_2D_ARRAY: 19597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_TWO_D_ARRAY; 19697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 19797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs case PIPE_TEXTURE_CUBE_ARRAY: 19897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs depth /= 6; 19997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= GM107_TIC2_4_TEXTURE_TYPE_CUBE_ARRAY; 20097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs break; 20197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs default: 20297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs unreachable("unexpected/invalid texture target"); 20397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } 20497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 20597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[3] |= (flags & NV50_TEXVIEW_FILTER_MSAA8) ? 20697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs GM107_TIC2_3_USE_HEADER_OPT_CONTROL : 20797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs GM107_TIC2_3_LOD_ANISO_QUALITY_HIGH | 20897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs GM107_TIC2_3_LOD_ISO_QUALITY_HIGH; 20997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 21097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (flags & NV50_TEXVIEW_ACCESS_RESOLVE) { 21197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs width = mt->base.base.width0 << mt->ms_x; 21297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs height = mt->base.base.height0 << mt->ms_y; 21397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } else { 21497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs width = mt->base.base.width0; 21597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs height = mt->base.base.height0; 21697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } 21797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 21897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[4] |= width - 1; 21997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 22097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[5] |= (height - 1) & 0xffff; 22197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[5] |= (depth - 1) << GM107_TIC2_5_DEPTH_MINUS_ONE__SHIFT; 22297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[3] |= mt->base.base.last_level << GM107_TIC2_3_MAX_MIP_LEVEL__SHIFT; 22397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 22497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs /* sampling points: (?) */ 22597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if ((flags & NV50_TEXVIEW_ACCESS_RESOLVE) && mt->ms_x > 1) { 22697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[6] = GM107_TIC2_6_ANISO_FINE_SPREAD_MODIFIER_CONST_TWO; 22797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[6] |= GM107_TIC2_6_MAX_ANISOTROPY_2_TO_1; 22897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } else { 22997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[6] = GM107_TIC2_6_ANISO_FINE_SPREAD_FUNC_TWO; 23097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[6] |= GM107_TIC2_6_ANISO_COARSE_SPREAD_FUNC_ONE; 23197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs } 23297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 23397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level; 23497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs tic[7] |= mt->ms_mode << GM107_TIC2_7_MULTI_SAMPLE_COUNT__SHIFT; 23597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 23697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs return &view->pipe; 23797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs} 23897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 2392ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoisetstruct pipe_sampler_view * 2402ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoisetgm107_create_texture_view_from_image(struct pipe_context *pipe, 2412ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset const struct pipe_image_view *view) 2422ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset{ 2432ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset struct nv04_resource *res = nv04_resource(view->resource); 2442ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset struct pipe_sampler_view templ = {}; 2452ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset enum pipe_texture_target target; 2462ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset uint32_t flags = 0; 2472ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 2482ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset if (!res) 2492ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset return NULL; 2502ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset target = res->base.target; 2512ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 2522ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset if (target == PIPE_TEXTURE_CUBE || target == PIPE_TEXTURE_CUBE_ARRAY) 2532ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset target = PIPE_TEXTURE_2D_ARRAY; 2542ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 2552ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.format = view->format; 2562ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.swizzle_r = PIPE_SWIZZLE_X; 2572ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.swizzle_g = PIPE_SWIZZLE_Y; 2582ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.swizzle_b = PIPE_SWIZZLE_Z; 2592ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.swizzle_a = PIPE_SWIZZLE_W; 2602ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 2612ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset if (target == PIPE_BUFFER) { 262325379096f54dde39171d1b8804e29a8003bb3c7Marek Olšák templ.u.buf.offset = view->u.buf.offset; 263325379096f54dde39171d1b8804e29a8003bb3c7Marek Olšák templ.u.buf.size = view->u.buf.size; 2642ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset } else { 2652ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.u.tex.first_layer = view->u.tex.first_layer; 2662ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.u.tex.last_layer = view->u.tex.last_layer; 2672ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset templ.u.tex.first_level = templ.u.tex.last_level = view->u.tex.level; 2682ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset } 2692ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 2702ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset flags = NV50_TEXVIEW_SCALED_COORDS; 2712ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 2722ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset return nvc0_create_texture_view(pipe, &res->base, &templ, flags, target); 2732ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset} 2742ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 27597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsstatic struct pipe_sampler_view * 27697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsgf100_create_texture_view(struct pipe_context *pipe, 27797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs struct pipe_resource *texture, 27897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs const struct pipe_sampler_view *templ, 27997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint32_t flags, 28097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs enum pipe_texture_target target) 28136ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller{ 2824c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller const struct util_format_description *desc; 283733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs const struct nvc0_format *fmt; 2846d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller uint64_t address; 2854c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller uint32_t *tic; 2864c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller uint32_t swz[4]; 2874da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller uint32_t width, height; 288ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller uint32_t depth; 2894bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin uint32_t tex_fmt; 2901f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller struct nv50_tic_entry *view; 29128271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller struct nv50_miptree *mt; 292cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset bool tex_int; 2934c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 2941f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller view = MALLOC_STRUCT(nv50_tic_entry); 2954c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (!view) 2964c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller return NULL; 2976d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller mt = nv50_miptree(texture); 2984c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 2994c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller view->pipe = *templ; 3004c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller view->pipe.reference.count = 1; 3014c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller view->pipe.texture = NULL; 3024c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller view->pipe.context = pipe; 3034c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 3044c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller view->id = -1; 3054c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 3064c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller pipe_resource_reference(&view->pipe.texture, texture); 3074c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 3084c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller tic = &view->tic[0]; 3094c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 310b0698396dcc70f6c8a16090dfb1674996538db3aChristoph Bumiller desc = util_format_description(view->pipe.format); 3114c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 312733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs fmt = &nvc0_format_table[view->pipe.format]; 3134c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 3149934bfe28d3c0f6551ba2cc806a7fe8e0a16ed7cChristoph Bumiller tex_int = util_format_is_pure_integer(view->pipe.format); 3154bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin tex_fmt = fmt->tic.format & 0x3f; 316e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller 317733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs swz[0] = nv50_tic_swizzle(fmt, view->pipe.swizzle_r, tex_int); 318733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs swz[1] = nv50_tic_swizzle(fmt, view->pipe.swizzle_g, tex_int); 319733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs swz[2] = nv50_tic_swizzle(fmt, view->pipe.swizzle_b, tex_int); 320733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs swz[3] = nv50_tic_swizzle(fmt, view->pipe.swizzle_a, tex_int); 3214bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin tic[0] = (tex_fmt << G80_TIC_0_COMPONENTS_SIZES__SHIFT) | 322733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs (fmt->tic.type_r << G80_TIC_0_R_DATA_TYPE__SHIFT) | 323733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs (fmt->tic.type_g << G80_TIC_0_G_DATA_TYPE__SHIFT) | 324733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs (fmt->tic.type_b << G80_TIC_0_B_DATA_TYPE__SHIFT) | 325733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs (fmt->tic.type_a << G80_TIC_0_A_DATA_TYPE__SHIFT) | 326733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs (swz[0] << G80_TIC_0_X_SOURCE__SHIFT) | 327733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs (swz[1] << G80_TIC_0_Y_SOURCE__SHIFT) | 328733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs (swz[2] << G80_TIC_0_Z_SOURCE__SHIFT) | 3294bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin (swz[3] << G80_TIC_0_W_SOURCE__SHIFT) | 3304bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin ((fmt->tic.format & 0x40) << (GK20A_TIC_0_USE_COMPONENT_SIZES_EXTENDED__SHIFT - 6)); 3314c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 3326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller address = mt->base.address; 3334c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 334ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] = 0x10001000 | G80_TIC_2_BORDER_SOURCE_COLOR; 3354c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 3364c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 337ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_SRGB_CONVERSION; 3384c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 339f0a0d59f0fdceb756838ad6dad012852ba48362eChristoph Bumiller if (!(flags & NV50_TEXVIEW_SCALED_COORDS)) 340ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_NORMALIZED_COORDS; 341f0a0d59f0fdceb756838ad6dad012852ba48362eChristoph Bumiller 34228271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller /* check for linear storage type */ 3436d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (unlikely(!nouveau_bo_memtype(nv04_resource(texture)->bo))) { 34428271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller if (texture->target == PIPE_BUFFER) { 345ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs assert(!(tic[2] & G80_TIC_2_NORMALIZED_COORDS)); 3466d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller address += 3477cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák view->pipe.u.buf.offset; 348ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_LAYOUT_PITCH | G80_TIC_2_TEXTURE_TYPE_ONE_D_BUFFER; 34928271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller tic[3] = 0; 35028271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller tic[4] = /* width */ 3517cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák view->pipe.u.buf.size / (desc->block.bits / 8); 3526d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller tic[5] = 0; 35328271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller } else { 35428271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller /* must be 2D texture without mip maps */ 355ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_LAYOUT_PITCH | G80_TIC_2_TEXTURE_TYPE_TWO_D_NO_MIPMAP; 35628271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller tic[3] = mt->level[0].pitch; 35728271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller tic[4] = mt->base.base.width0; 35828271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller tic[5] = (1 << 16) | mt->base.base.height0; 35928271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller } 36028271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller tic[6] = 36128271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller tic[7] = 0; 3626d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller tic[1] = address; 3636d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller tic[2] |= address >> 32; 36428271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller return &view->pipe; 36528271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller } 36628271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller 3674c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller tic[2] |= 3686d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller ((mt->level[0].tile_mode & 0x0f0) << (22 - 4)) | 3696d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller ((mt->level[0].tile_mode & 0xf00) << (25 - 8)); 370ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller 371ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller depth = MAX2(mt->base.base.array_size, mt->base.base.depth0); 3724c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 3738828004e674b2036c23dd6b4a26cf94b98327792Christoph Bumiller if (mt->base.base.array_size > 1) { 3744fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller /* there doesn't seem to be a base layer field in TIC */ 3756d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller address += view->pipe.u.tex.first_layer * mt->layer_stride; 3764fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller depth = view->pipe.u.tex.last_layer - view->pipe.u.tex.first_layer + 1; 3774fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller } 3786d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller tic[1] = address; 3796d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller tic[2] |= address >> 32; 3804fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller 38136ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller switch (target) { 3824c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller case PIPE_TEXTURE_1D: 383ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_ONE_D; 3844c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller break; 3854c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller case PIPE_TEXTURE_2D: 386ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_TWO_D; 3874c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller break; 3884c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller case PIPE_TEXTURE_RECT: 389ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_TWO_D; 3904c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller break; 3914c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller case PIPE_TEXTURE_3D: 392ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_THREE_D; 3934c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller break; 3944c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller case PIPE_TEXTURE_CUBE: 395ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller depth /= 6; 396ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_CUBEMAP; 397ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller break; 398ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller case PIPE_TEXTURE_1D_ARRAY: 399ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_ONE_D_ARRAY; 400ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller break; 401ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller case PIPE_TEXTURE_2D_ARRAY: 402ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_TWO_D_ARRAY; 4034c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller break; 404f7599b2c32185535b4c215de0ba0454129fa523fChristoph Bumiller case PIPE_TEXTURE_CUBE_ARRAY: 405f7599b2c32185535b4c215de0ba0454129fa523fChristoph Bumiller depth /= 6; 406ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs tic[2] |= G80_TIC_2_TEXTURE_TYPE_CUBE_ARRAY; 407f7599b2c32185535b4c215de0ba0454129fa523fChristoph Bumiller break; 4084c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller default: 4093f7462b792a5bd517a1d2958d1aeb630ed253246Samuel Pitoiset unreachable("unexpected/invalid texture target"); 4104c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 4114c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 4124da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller tic[3] = (flags & NV50_TEXVIEW_FILTER_MSAA8) ? 0x20000000 : 0x00300000; 4134da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller 4144da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller if (flags & NV50_TEXVIEW_ACCESS_RESOLVE) { 4154da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller width = mt->base.base.width0 << mt->ms_x; 4164da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller height = mt->base.base.height0 << mt->ms_y; 4174da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller } else { 4184da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller width = mt->base.base.width0; 4194da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller height = mt->base.base.height0; 4204da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller } 4214c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 4224da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller tic[4] = (1 << 31) | width; 4234c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 4244da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller tic[5] = height & 0xffff; 425ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller tic[5] |= depth << 16; 4264c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller tic[5] |= mt->base.base.last_level << 28; 4274c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 4284da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller /* sampling points: (?) */ 4294da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller if (flags & NV50_TEXVIEW_ACCESS_RESOLVE) 4304da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller tic[6] = (mt->ms_x > 1) ? 0x88000000 : 0x03000000; 4314da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller else 4324da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller tic[6] = 0x03000000; 4334c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 434ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level; 4354da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller tic[7] |= mt->ms_mode << 12; 436b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 4374c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller return &view->pipe; 4384c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller} 4394c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 44097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsstruct pipe_sampler_view * 44197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsnvc0_create_texture_view(struct pipe_context *pipe, 44297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs struct pipe_resource *texture, 44397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs const struct pipe_sampler_view *templ, 44497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs uint32_t flags, 44597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs enum pipe_texture_target target) 44697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs{ 44797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs if (nvc0_context(pipe)->screen->tic.maxwell) 44897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs return gm107_create_texture_view(pipe, texture, templ, flags, target); 44997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs return gf100_create_texture_view(pipe, texture, templ, flags, target); 45097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs} 45197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs 4529444d71611b97a1f3102ba60b94ce1860a9961e9Ilia Mirkinvoid 453323c91250682ac931941047f282a613c74b1ba26Ilia Mirkinnvc0_update_tic(struct nvc0_context *nvc0, struct nv50_tic_entry *tic, 454323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin struct nv04_resource *res) 455323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin{ 456323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin uint64_t address = res->address; 457323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin if (res->base.target != PIPE_BUFFER) 458323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin return; 4597cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák address += tic->pipe.u.buf.offset; 460323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin if (tic->tic[1] == (uint32_t)address && 461323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin (tic->tic[2] & 0xff) == address >> 32) 462323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin return; 463323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin 464323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin nvc0_screen_tic_unlock(nvc0->screen, tic); 465323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin tic->id = -1; 466323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin tic->tic[1] = address; 467323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin tic->tic[2] &= 0xffffff00; 468323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin tic->tic[2] |= address >> 32; 469323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin} 470323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin 471fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoisetbool 4724c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillernvc0_validate_tic(struct nvc0_context *nvc0, int s) 4734c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{ 474784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller uint32_t commands[32]; 4756d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nvc0->base.pushbuf; 4764c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller unsigned i; 477784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller unsigned n = 0; 478cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset bool need_flush = false; 4794c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 4804c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller for (i = 0; i < nvc0->num_textures[s]; ++i) { 4811f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller struct nv50_tic_entry *tic = nv50_tic_entry(nvc0->textures[s][i]); 4824826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs struct nv04_resource *res; 483cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset const bool dirty = !!(nvc0->textures_dirty[s] & (1 << i)); 4844c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 4854c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (!tic) { 486784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller if (dirty) 487784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller commands[n++] = (i << 1) | 0; 4884c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller continue; 4894c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 49028271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller res = nv04_resource(tic->pipe.texture); 491323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin nvc0_update_tic(nvc0, tic, res); 4924c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 4934c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (tic->id < 0) { 4944c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller tic->id = nvc0_screen_tic_alloc(nvc0->screen, tic); 4954c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 496126bd159409f61cb58e208dfc615c957d3d35a30Samuel Pitoiset nvc0_m2mf_push_linear(&nvc0->base, nvc0->screen->txc, tic->id * 32, 497126bd159409f61cb58e208dfc615c957d3d35a30Samuel Pitoiset NV_VRAM_DOMAIN(&nvc0->screen->base), 32, 498126bd159409f61cb58e208dfc615c957d3d35a30Samuel Pitoiset tic->tic); 499cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset need_flush = true; 50067c7aefea33a7935e42ede30463eb7ca5009b068Christoph Bumiller } else 5014826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) { 502fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset if (unlikely(s == 5)) 503bbff97ae3918f0dd89d461b1eb51c53829befda1Samuel Pitoiset BEGIN_NVC0(push, NVC0_CP(TEX_CACHE_CTL), 1); 504fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset else 505fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(TEX_CACHE_CTL), 1); 5066d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (tic->id << 4) | 1); 507198f514aa6f08bc43a3002519843b0fe94f340bdChristoph Bumiller NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_cache_flush_count, 1); 5084c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 5094c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller nvc0->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32); 5104c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 5114826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING; 5124826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 51367c7aefea33a7935e42ede30463eb7ca5009b068Christoph Bumiller 514784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller if (!dirty) 515784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller continue; 516784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller commands[n++] = (tic->id << 9) | (i << 1) | 1; 5174c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 518fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset if (unlikely(s == 5)) 519fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset BCTX_REFN(nvc0->bufctx_cp, CP_TEX(i), res, RD); 520fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset else 5212999257e0fe703f73d32620fed88040d29ac5bacSamuel Pitoiset BCTX_REFN(nvc0->bufctx_3d, 3D_TEX(s, i), res, RD); 5224c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 523784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller for (; i < nvc0->state.num_textures[s]; ++i) 524784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller commands[n++] = (i << 1) | 0; 525784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller 5264c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller nvc0->state.num_textures[s] = nvc0->num_textures[s]; 5274c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 528784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller if (n) { 529fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset if (unlikely(s == 5)) 530bbff97ae3918f0dd89d461b1eb51c53829befda1Samuel Pitoiset BEGIN_NIC0(push, NVC0_CP(BIND_TIC), n); 531fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset else 532fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset BEGIN_NIC0(push, NVC0_3D(BIND_TIC(s)), n); 533784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller PUSH_DATAp(push, commands, n); 534784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller } 535784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller nvc0->textures_dirty[s] = 0; 536784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller 5374c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller return need_flush; 5384c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller} 5394c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 540cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetstatic bool 541e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillernve4_validate_tic(struct nvc0_context *nvc0, unsigned s) 542e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller{ 543e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller struct nouveau_pushbuf *push = nvc0->base.pushbuf; 544e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller unsigned i; 545cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset bool need_flush = false; 546e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 547e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller for (i = 0; i < nvc0->num_textures[s]; ++i) { 548e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller struct nv50_tic_entry *tic = nv50_tic_entry(nvc0->textures[s][i]); 549e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller struct nv04_resource *res; 550cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset const bool dirty = !!(nvc0->textures_dirty[s] & (1 << i)); 551e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 552e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (!tic) { 553e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] |= NVE4_TIC_ENTRY_INVALID; 554e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller continue; 555e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 556e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller res = nv04_resource(tic->pipe.texture); 557323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin nvc0_update_tic(nvc0, tic, res); 558e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 559e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (tic->id < 0) { 560e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller tic->id = nvc0_screen_tic_alloc(nvc0->screen, tic); 561e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 562c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset nve4_p2mf_push_linear(&nvc0->base, nvc0->screen->txc, tic->id * 32, 563c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset NV_VRAM_DOMAIN(&nvc0->screen->base), 32, 564c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset tic->tic); 565cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset need_flush = true; 566e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } else 567e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) { 568e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller BEGIN_NVC0(push, NVC0_3D(TEX_CACHE_CTL), 1); 569e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller PUSH_DATA (push, (tic->id << 4) | 1); 570e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 571e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32); 572e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 573e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING; 574e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 575e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 576e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] &= ~NVE4_TIC_ENTRY_INVALID; 577e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] |= tic->id; 578e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (dirty) 5792999257e0fe703f73d32620fed88040d29ac5bacSamuel Pitoiset BCTX_REFN(nvc0->bufctx_3d, 3D_TEX(s, i), res, RD); 580e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 581c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller for (; i < nvc0->state.num_textures[s]; ++i) { 582e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] |= NVE4_TIC_ENTRY_INVALID; 583c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller nvc0->textures_dirty[s] |= 1 << i; 584c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller } 585e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 586e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->state.num_textures[s] = nvc0->num_textures[s]; 587e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 588e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller return need_flush; 589e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller} 590e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 5914c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillervoid nvc0_validate_textures(struct nvc0_context *nvc0) 5924c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{ 593f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin bool need_flush = false; 594f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin int i; 5954c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 596f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin for (i = 0; i < 5; i++) { 597f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin if (nvc0->screen->base.class_3d >= NVE4_3D_CLASS) 598f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin need_flush |= nve4_validate_tic(nvc0, i); 599f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin else 600f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin need_flush |= nvc0_validate_tic(nvc0, i); 601e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 6024c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 6034c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (need_flush) { 6046d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NVC0(nvc0->base.pushbuf, NVC0_3D(TIC_FLUSH), 1); 6056d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (nvc0->base.pushbuf, 0); 6064c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 607e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset 608a227b0a4f1354f145ff49183b687dd7541a24c86Samuel Pitoiset /* Invalidate all CP textures because they are aliased. */ 609a227b0a4f1354f145ff49183b687dd7541a24c86Samuel Pitoiset for (int i = 0; i < nvc0->num_textures[5]; i++) 6107b2712c367891e96384226a1fa94679a814235d0Samuel Pitoiset nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_TEX(i)); 611a227b0a4f1354f145ff49183b687dd7541a24c86Samuel Pitoiset nvc0->textures_dirty[5] = ~0; 612a227b0a4f1354f145ff49183b687dd7541a24c86Samuel Pitoiset nvc0->dirty_cp |= NVC0_NEW_CP_TEXTURES; 6134c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller} 6144c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 615fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoisetbool 6164c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillernvc0_validate_tsc(struct nvc0_context *nvc0, int s) 6174c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{ 618784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller uint32_t commands[16]; 6196d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nvc0->base.pushbuf; 6204c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller unsigned i; 621784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller unsigned n = 0; 622cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset bool need_flush = false; 6234c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 6244c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller for (i = 0; i < nvc0->num_samplers[s]; ++i) { 6251f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller struct nv50_tsc_entry *tsc = nv50_tsc_entry(nvc0->samplers[s][i]); 6264c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 627784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller if (!(nvc0->samplers_dirty[s] & (1 << i))) 628784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller continue; 6294c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (!tsc) { 630784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller commands[n++] = (i << 4) | 0; 6314c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller continue; 6324c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 6331d1ddfe5f887980acfb1283cf1c0b1240b3a60a6Ilia Mirkin nvc0->seamless_cube_map = tsc->seamless_cube_map; 6344c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (tsc->id < 0) { 6354c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller tsc->id = nvc0_screen_tsc_alloc(nvc0->screen, tsc); 6364c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 6371ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs nvc0_m2mf_push_linear(&nvc0->base, nvc0->screen->txc, 638da8300cb03e8cf1f37b5573a2db026fd28e0a3c5Alexandre Courbot 65536 + tsc->id * 32, NV_VRAM_DOMAIN(&nvc0->screen->base), 6394826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs 32, tsc->tsc); 640cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset need_flush = true; 6414c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 6424c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller nvc0->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32); 6434c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 644784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller commands[n++] = (tsc->id << 12) | (i << 4) | 1; 6454c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 646784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller for (; i < nvc0->state.num_samplers[s]; ++i) 647784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller commands[n++] = (i << 4) | 0; 648784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller 6494c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller nvc0->state.num_samplers[s] = nvc0->num_samplers[s]; 6504c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 651784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller if (n) { 652fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset if (unlikely(s == 5)) 653bbff97ae3918f0dd89d461b1eb51c53829befda1Samuel Pitoiset BEGIN_NIC0(push, NVC0_CP(BIND_TSC), n); 654fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset else 655fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset BEGIN_NIC0(push, NVC0_3D(BIND_TSC(s)), n); 656784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller PUSH_DATAp(push, commands, n); 657784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller } 658784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller nvc0->samplers_dirty[s] = 0; 659784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller 6604c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller return need_flush; 6614c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller} 6624c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 663cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetbool 664e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillernve4_validate_tsc(struct nvc0_context *nvc0, int s) 665e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller{ 666e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller unsigned i; 667cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset bool need_flush = false; 668e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 669e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller for (i = 0; i < nvc0->num_samplers[s]; ++i) { 670e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller struct nv50_tsc_entry *tsc = nv50_tsc_entry(nvc0->samplers[s][i]); 671e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 672e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (!tsc) { 673e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] |= NVE4_TSC_ENTRY_INVALID; 674e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller continue; 675e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 676e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (tsc->id < 0) { 677e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller tsc->id = nvc0_screen_tsc_alloc(nvc0->screen, tsc); 678e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 679c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset nve4_p2mf_push_linear(&nvc0->base, nvc0->screen->txc, 680c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset 65536 + tsc->id * 32, 681c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset NV_VRAM_DOMAIN(&nvc0->screen->base), 682c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset 32, tsc->tsc); 683cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset need_flush = true; 684e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 685e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32); 686e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 687e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] &= ~NVE4_TSC_ENTRY_INVALID; 688e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] |= tsc->id << 20; 689e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 690c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller for (; i < nvc0->state.num_samplers[s]; ++i) { 691e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->tex_handles[s][i] |= NVE4_TSC_ENTRY_INVALID; 692c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller nvc0->samplers_dirty[s] |= 1 << i; 693c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller } 694e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 695e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->state.num_samplers[s] = nvc0->num_samplers[s]; 696e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 697e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller return need_flush; 698e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller} 699e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 7004c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillervoid nvc0_validate_samplers(struct nvc0_context *nvc0) 7014c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{ 702f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin bool need_flush = false; 703f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin int i; 7044c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 705f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin for (i = 0; i < 5; i++) { 706f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin if (nvc0->screen->base.class_3d >= NVE4_3D_CLASS) 707f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin need_flush |= nve4_validate_tsc(nvc0, i); 708f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin else 709f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin need_flush |= nvc0_validate_tsc(nvc0, i); 710e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 7114c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller 7124c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller if (need_flush) { 7136d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NVC0(nvc0->base.pushbuf, NVC0_3D(TSC_FLUSH), 1); 7146d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (nvc0->base.pushbuf, 0); 7154c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller } 716e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset 717a227b0a4f1354f145ff49183b687dd7541a24c86Samuel Pitoiset /* Invalidate all CP samplers because they are aliased. */ 718a227b0a4f1354f145ff49183b687dd7541a24c86Samuel Pitoiset nvc0->samplers_dirty[5] = ~0; 719a227b0a4f1354f145ff49183b687dd7541a24c86Samuel Pitoiset nvc0->dirty_cp |= NVC0_NEW_CP_SAMPLERS; 7204c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller} 721e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 722e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller/* Upload the "diagonal" entries for the possible texture sources ($t == $s). 723e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller * At some point we might want to get a list of the combinations used by a 724e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller * shader and fill in those entries instead of having it extract the handles. 725e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller */ 726e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillervoid 727e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillernve4_set_tex_handles(struct nvc0_context *nvc0) 728e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller{ 729e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller struct nouveau_pushbuf *push = nvc0->base.pushbuf; 730902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset struct nvc0_screen *screen = nvc0->screen; 731e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller unsigned s; 732e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 733e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (nvc0->screen->base.class_3d < NVE4_3D_CLASS) 734e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller return; 735e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 736902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset for (s = 0; s < 5; ++s) { 737e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller uint32_t dirty = nvc0->textures_dirty[s] | nvc0->samplers_dirty[s]; 738e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (!dirty) 739e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller continue; 740e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); 7419bc083284f3d4eb6148237eec3d9032d32ff1451Samuel Pitoiset PUSH_DATA (push, NVC0_CB_AUX_SIZE); 742902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset PUSH_DATAh(push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s)); 743902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset PUSH_DATA (push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s)); 744e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller do { 745e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller int i = ffs(dirty) - 1; 746e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller dirty &= ~(1 << i); 747e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 748e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller BEGIN_NVC0(push, NVC0_3D(CB_POS), 2); 749e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller PUSH_DATA (push, (8 + i) * 4); 750e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller PUSH_DATA (push, nvc0->tex_handles[s][i]); 751e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } while (dirty); 752e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 753e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->textures_dirty[s] = 0; 754e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller nvc0->samplers_dirty[s] = 0; 755e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 756e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller} 757e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 758e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 759e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint8_t nve4_su_format_map[PIPE_FORMAT_COUNT]; 760e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_su_format_aux_map[PIPE_FORMAT_COUNT]; 761e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_suldp_lib_offset[PIPE_FORMAT_COUNT]; 762e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 7631eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoisetstatic void 7641eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoisetnvc0_get_surface_dims(struct pipe_image_view *view, int *width, int *height, 7651eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset int *depth) 7661eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset{ 7671eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset struct nv04_resource *res = nv04_resource(view->resource); 7681eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset int level; 7691eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset 7701eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset *width = *height = *depth = 1; 7711eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset if (res->base.target == PIPE_BUFFER) { 772325379096f54dde39171d1b8804e29a8003bb3c7Marek Olšák *width = view->u.buf.size / util_format_get_blocksize(view->format); 7731eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset return; 7741eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset } 7751eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset 7761eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset level = view->u.tex.level; 7771eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset *width = u_minify(view->resource->width0, level); 7781eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset *height = u_minify(view->resource->height0, level); 7791eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset *depth = u_minify(view->resource->depth0, level); 7801eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset 7811eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset switch (res->base.target) { 7821eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_1D_ARRAY: 7831eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_2D_ARRAY: 7841eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_CUBE: 7851eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_CUBE_ARRAY: 7861eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset *depth = view->u.tex.last_layer - view->u.tex.first_layer + 1; 7871eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset break; 7881eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_1D: 7891eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_2D: 7901eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_RECT: 7911eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset case PIPE_TEXTURE_3D: 7921eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset break; 7931eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset default: 7941eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset assert(!"unexpected texture target"); 7951eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset break; 7961eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset } 7971eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset} 7981eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset 799e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillervoid 80028590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoisetnvc0_mark_image_range_valid(const struct pipe_image_view *view) 80128590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset{ 80228590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset struct nv04_resource *res = (struct nv04_resource *)view->resource; 80328590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset 80428590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset assert(view->resource->target == PIPE_BUFFER); 80528590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset 80628590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset util_range_add(&res->valid_buffer_range, 807325379096f54dde39171d1b8804e29a8003bb3c7Marek Olšák view->u.buf.offset, 808325379096f54dde39171d1b8804e29a8003bb3c7Marek Olšák view->u.buf.offset + view->u.buf.size); 80928590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset} 81028590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset 81128590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoisetvoid 812e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernve4_set_surface_info(struct nouveau_pushbuf *push, 8131eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset struct pipe_image_view *view, 8140d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset struct nvc0_context *nvc0) 815e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{ 8160d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset struct nvc0_screen *screen = nvc0->screen; 817e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller struct nv04_resource *res; 818e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller uint64_t address; 819e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller uint32_t *const info = push->cur; 8201eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset int width, height, depth; 821e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller uint8_t log2cpp; 822e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 8231eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset if (view && !nve4_su_format_map[view->format]) 824e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller NOUVEAU_ERR("unsupported surface format, try is_format_supported() !\n"); 825e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 826e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller push->cur += 16; 827e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 8281eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset if (!view || !nve4_su_format_map[view->format]) { 829e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller memset(info, 0, 16 * sizeof(*info)); 830e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 831e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[0] = 0xbadf0000; 832e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[1] = 0x80004000; 833e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[12] = nve4_suldp_lib_offset[PIPE_FORMAT_R32G32B32A32_UINT] + 834e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller screen->lib_code->start; 835e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller return; 836e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } 8371eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset res = nv04_resource(view->resource); 8381eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset 8391eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset address = res->address; 840e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 8411eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset /* get surface dimensions based on the target. */ 8421eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset nvc0_get_surface_dims(view, &width, &height, &depth); 843e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 8441eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[8] = width; 8451eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[9] = height; 8461eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[10] = depth; 847e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller switch (res->base.target) { 848e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case PIPE_TEXTURE_1D_ARRAY: 849e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[11] = 1; 850e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller break; 851e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case PIPE_TEXTURE_2D: 852e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case PIPE_TEXTURE_RECT: 853e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[11] = 2; 854e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller break; 855e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case PIPE_TEXTURE_3D: 856e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[11] = 3; 857e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller break; 858e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case PIPE_TEXTURE_2D_ARRAY: 859e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case PIPE_TEXTURE_CUBE: 860e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case PIPE_TEXTURE_CUBE_ARRAY: 861e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[11] = 4; 862e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller break; 863e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller default: 864e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[11] = 0; 865e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller break; 866e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } 8671eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset log2cpp = (0xf000 & nve4_su_format_aux_map[view->format]) >> 12; 868e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 8696fc6d548ed66caf4395190718163d964d9c0fe25Samuel Pitoiset /* Stick the blockwidth (ie. number of bytes per pixel) to check if the 8706fc6d548ed66caf4395190718163d964d9c0fe25Samuel Pitoiset * format doesn't mismatch. */ 8716fc6d548ed66caf4395190718163d964d9c0fe25Samuel Pitoiset info[12] = util_format_get_blocksize(view->format); 872e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 873e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller /* limit in bytes for raw access */ 8741eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[13] = (0x06 << 22) | ((width << log2cpp) - 1); 875e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 8761eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[1] = nve4_su_format_map[view->format]; 877e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 878e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller#if 0 8791eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset switch (util_format_get_blocksizebits(view->format)) { 880e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case 16: info[1] |= 1 << 16; break; 881e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case 32: info[1] |= 2 << 16; break; 882e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case 64: info[1] |= 3 << 16; break; 883e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller case 128: info[1] |= 4 << 16; break; 884e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller default: 885e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller break; 886e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } 887e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller#else 888e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[1] |= log2cpp << 16; 889e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[1] |= 0x4000; 8901eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[1] |= (0x0f00 & nve4_su_format_aux_map[view->format]); 891e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller#endif 892e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 893e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller if (res->base.target == PIPE_BUFFER) { 894325379096f54dde39171d1b8804e29a8003bb3c7Marek Olšák address += view->u.buf.offset; 895da8171dc7580db75d65e0f89e1c20ee45c3ef3e7Samuel Pitoiset 896e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[0] = address >> 8; 8971eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[2] = width - 1; 8981eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[2] |= (0xff & nve4_su_format_aux_map[view->format]) << 22; 899e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[3] = 0; 900e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[4] = 0; 901e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[5] = 0; 902e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[6] = 0; 903e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[7] = 0; 904e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[14] = 0; 905e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[15] = 0; 906e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } else { 907e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(&res->base); 9081eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset struct nv50_miptree_level *lvl = &mt->level[view->u.tex.level]; 9091eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset const unsigned z = view->u.tex.first_layer; 910e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 911e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller if (z) { 912e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller if (mt->layout_3d) { 9131eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset address += nvc0_mt_zslice_offset(mt, view->u.tex.level, z); 914e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller /* doesn't work if z passes z-tile boundary */ 9150d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset if (depth > 1) { 9160d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset pipe_debug_message(&nvc0->base.debug, CONFORMANCE, 9170d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset "3D images are not really supported!"); 9180d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset debug_printf("3D images are not really supported!\n"); 9190d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset } 920e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } else { 921e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller address += mt->layer_stride * z; 922e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } 923e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } 924285f2edd14f82538d27f4df76055a3f154da3b29Samuel Pitoiset address += lvl->offset; 9251eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset 926e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[0] = address >> 8; 927b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin info[2] = (width << mt->ms_x) - 1; 928e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller /* NOTE: this is really important: */ 9291eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[2] |= (0xff & nve4_su_format_aux_map[view->format]) << 22; 930e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[3] = (0x88 << 24) | (lvl->pitch / 64); 931b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin info[4] = (height << mt->ms_y) - 1; 932e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[4] |= (lvl->tile_mode & 0x0f0) << 25; 933e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[4] |= NVC0_TILE_SHIFT_Y(lvl->tile_mode) << 22; 934e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[5] = mt->layer_stride >> 8; 9351eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset info[6] = depth - 1; 936e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[6] |= (lvl->tile_mode & 0xf00) << 21; 937e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[6] |= NVC0_TILE_SHIFT_Z(lvl->tile_mode) << 22; 938e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[7] = 0; 939e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[14] = mt->ms_x; 940e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller info[15] = mt->ms_y; 941e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } 942e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller} 943e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 944a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 945879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetnvc0_set_surface_info(struct nouveau_pushbuf *push, 946879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct pipe_image_view *view, uint64_t address, 947879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset int width, int height, int depth) 948879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset{ 949879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct nv04_resource *res; 950879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset uint32_t *const info = push->cur; 951879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 952879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset push->cur += 16; 953879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 954879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset /* Make sure to always initialize the surface information area because it's 955879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset * used to check if the given image is bound or not. */ 956879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset memset(info, 0, 16 * sizeof(*info)); 957879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 958879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (!view || !view->resource) 959879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset return; 960879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset res = nv04_resource(view->resource); 961879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 962879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset /* Stick the image dimensions for the imageSize() builtin. */ 963879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[8] = width; 964879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[9] = height; 965879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[10] = depth; 966879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 967879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset /* Stick the blockwidth (ie. number of bytes per pixel) to calculate pixel 968879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset * offset and to check if the format doesn't mismatch. */ 969879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[12] = util_format_get_blocksize(view->format); 970879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 971879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (res->base.target == PIPE_BUFFER) { 972879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[0] = address >> 8; 973879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[2] = width; 974879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } else { 975879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct nv50_miptree *mt = nv50_miptree(&res->base); 976879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 977879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[0] = address >> 8; 978879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[2] = width; 979879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[4] = height; 980879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[5] = mt->layer_stride >> 8; 981879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[6] = depth; 982879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[14] = mt->ms_x; 983879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset info[15] = mt->ms_y; 984879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } 985879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset} 986879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 987879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetvoid 988879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetnvc0_validate_suf(struct nvc0_context *nvc0, int s) 989879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset{ 990879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct nouveau_pushbuf *push = nvc0->base.pushbuf; 991879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct nvc0_screen *screen = nvc0->screen; 992879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 993879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset for (int i = 0; i < NVC0_MAX_IMAGES; ++i) { 994879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct pipe_image_view *view = &nvc0->images[s][i]; 995879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset int width, height, depth; 996879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset uint64_t address = 0; 997879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 998879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (s == 5) 999879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BEGIN_NVC0(push, NVC0_CP(IMAGE(i)), 6); 1000879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset else 1001879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(IMAGE(i)), 6); 1002879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1003879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (view->resource) { 1004879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct nv04_resource *res = nv04_resource(view->resource); 1005879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset unsigned rt = nvc0_format_table[view->format].rt; 1006879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1007879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (util_format_is_depth_or_stencil(view->format)) 1008879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset rt = rt << 12; 1009879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset else 1010879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset rt = (rt << 4) | (0x14 << 12); 1011879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1012879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset /* get surface dimensions based on the target. */ 1013879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset nvc0_get_surface_dims(view, &width, &height, &depth); 1014879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1015879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset address = res->address; 1016879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (res->base.target == PIPE_BUFFER) { 1017879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset unsigned blocksize = util_format_get_blocksize(view->format); 1018879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1019325379096f54dde39171d1b8804e29a8003bb3c7Marek Olšák address += view->u.buf.offset; 1020879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset assert(!(address & 0xff)); 1021879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 102228590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset if (view->access & PIPE_IMAGE_ACCESS_WRITE) 102328590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset nvc0_mark_image_range_valid(view); 102428590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset 1025879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATAh(push, address); 1026879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, address); 1027879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, align(width * blocksize, 0x100)); 1028879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, NVC0_3D_IMAGE_HEIGHT_LINEAR | 1); 1029879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, rt); 1030879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, 0); 1031879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } else { 1032879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct nv50_miptree *mt = nv50_miptree(view->resource); 1033879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset struct nv50_miptree_level *lvl = &mt->level[view->u.tex.level]; 1034879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset const unsigned z = view->u.tex.first_layer; 1035879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1036879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (mt->layout_3d) { 1037879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset address += nvc0_mt_zslice_offset(mt, view->u.tex.level, z); 1038879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (depth >= 1) { 1039879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset pipe_debug_message(&nvc0->base.debug, CONFORMANCE, 1040879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset "3D images are not supported!"); 1041879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset debug_printf("3D images are not supported!\n"); 1042879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } 1043879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } else { 1044879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset address += mt->layer_stride * z; 1045879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } 1046879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset address += lvl->offset; 1047879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1048879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATAh(push, address); 1049879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, address); 1050b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin PUSH_DATA (push, width << mt->ms_x); 1051b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin PUSH_DATA (push, height << mt->ms_y); 1052879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, rt); 1053879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, lvl->tile_mode & 0xff); /* mask out z-tiling */ 1054879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } 1055879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1056879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (s == 5) 1057879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BCTX_REFN(nvc0->bufctx_cp, CP_SUF, res, RDWR); 1058879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset else 1059879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BCTX_REFN(nvc0->bufctx_3d, 3D_SUF, res, RDWR); 1060879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } else { 1061879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA(push, 0); 1062879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA(push, 0); 1063879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA(push, 0); 1064879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA(push, 0); 1065879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA(push, 0x14000); 1066879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA(push, 0); 1067879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } 1068879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1069879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset /* stick surface information into the driver constant buffer */ 1070879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (s == 5) 1071879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BEGIN_NVC0(push, NVC0_CP(CB_SIZE), 3); 1072879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset else 1073879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); 10749bc083284f3d4eb6148237eec3d9032d32ff1451Samuel Pitoiset PUSH_DATA (push, NVC0_CB_AUX_SIZE); 1075879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATAh(push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s)); 1076879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s)); 1077879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset if (s == 5) 1078879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BEGIN_1IC0(push, NVC0_CP(CB_POS), 1 + 16); 1079879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset else 1080879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset BEGIN_1IC0(push, NVC0_3D(CB_POS), 1 + 16); 1081879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset PUSH_DATA (push, NVC0_CB_AUX_SU_INFO(i)); 1082879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1083879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset nvc0_set_surface_info(push, view, address, width, height, depth); 1084879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset } 1085879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset} 1086879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1087879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetstatic inline void 1088e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernvc0_update_surface_bindings(struct nvc0_context *nvc0) 1089e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{ 1090879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset nvc0_validate_suf(nvc0, 4); 1091879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset 1092879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset /* Invalidate all COMPUTE images because they are aliased with FRAGMENT. */ 1093be365f34f04112572550337f387b61ed1ba69acdSamuel Pitoiset nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_SUF); 1094879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset nvc0->dirty_cp |= NVC0_NEW_CP_SURFACES; 1095879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset nvc0->images_dirty[5] |= nvc0->images_valid[5]; 1096e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller} 1097e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 10982ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoisetstatic void 10992ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoisetgm107_validate_surfaces(struct nvc0_context *nvc0, 11002ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset struct pipe_image_view *view, int stage, int slot) 11012ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset{ 11022ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset struct nv04_resource *res = nv04_resource(view->resource); 11032ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset struct nouveau_pushbuf *push = nvc0->base.pushbuf; 11042ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset struct nvc0_screen *screen = nvc0->screen; 11052ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset struct nv50_tic_entry *tic; 11062ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11072ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset tic = nv50_tic_entry(nvc0->images_tic[stage][slot]); 11082ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11092ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset res = nv04_resource(tic->pipe.texture); 11102ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset nvc0_update_tic(nvc0, tic, res); 11112ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11122ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset if (tic->id < 0) { 11132ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset tic->id = nvc0_screen_tic_alloc(nvc0->screen, tic); 11142ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11152ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset /* upload the texture view */ 1116c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset nve4_p2mf_push_linear(&nvc0->base, nvc0->screen->txc, tic->id * 32, 1117c5236f0eccd5ce07cb18b751c6a48b2baf811aa0Samuel Pitoiset NV_VRAM_DOMAIN(&nvc0->screen->base), 32, tic->tic); 11182ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11192ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(TIC_FLUSH), 1); 11202ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, 0); 11212ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset } else 11222ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) { 11232ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(TEX_CACHE_CTL), 1); 11242ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, (tic->id << 4) | 1); 11252ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset } 11262ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset nvc0->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32); 11272ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11282ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING; 11292ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 11302ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11312ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset BCTX_REFN(nvc0->bufctx_3d, 3D_SUF, res, RD); 11322ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11332ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset /* upload the texture handle */ 11342ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); 11352ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, NVC0_CB_AUX_SIZE); 11362ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATAh(push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(stage)); 11372ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(stage)); 11382ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(CB_POS), 2); 11392ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, NVC0_CB_AUX_TEX_INFO(slot + 32)); 11402ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, tic->id); 11412ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset} 11422ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 1143a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void 1144e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernve4_update_surface_bindings(struct nvc0_context *nvc0) 1145e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{ 1146e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset struct nouveau_pushbuf *push = nvc0->base.pushbuf; 1147e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset struct nvc0_screen *screen = nvc0->screen; 1148e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset int i, j, s; 1149e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset 1150e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset for (s = 0; s < 5; s++) { 1151e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset if (!nvc0->images_dirty[s]) 1152e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset continue; 1153e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset 1154e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset for (i = 0; i < NVC0_MAX_IMAGES; ++i) { 1155e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset struct pipe_image_view *view = &nvc0->images[s][i]; 11562ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11572ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); 11582ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, NVC0_CB_AUX_SIZE); 11592ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATAh(push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s)); 11602ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s)); 11612ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset BEGIN_1IC0(push, NVC0_3D(CB_POS), 1 + 16); 11622ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset PUSH_DATA (push, NVC0_CB_AUX_SU_INFO(i)); 11632ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 1164e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset if (view->resource) { 1165e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset struct nv04_resource *res = nv04_resource(view->resource); 1166e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset 116728590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset if (res->base.target == PIPE_BUFFER) { 116828590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset if (view->access & PIPE_IMAGE_ACCESS_WRITE) 116928590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset nvc0_mark_image_range_valid(view); 117028590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset } 117128590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset 11720d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset nve4_set_surface_info(push, view, nvc0); 1173e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset BCTX_REFN(nvc0->bufctx_3d, 3D_SUF, res, RDWR); 11742ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset 11752ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset if (nvc0->screen->base.class_3d >= GM107_3D_CLASS) 11762ae4b5d6229ac1961cb09794e06a6cb1c73e14d3Samuel Pitoiset gm107_validate_surfaces(nvc0, view, s, i); 1177e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset } else { 1178e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset for (j = 0; j < 16; j++) 1179e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset PUSH_DATA(push, 0); 1180e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset } 1181e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset } 1182e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset } 1183e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller} 1184e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1185e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillervoid 1186e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernvc0_validate_surfaces(struct nvc0_context *nvc0) 1187e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{ 1188e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller if (nvc0->screen->base.class_3d >= NVE4_3D_CLASS) { 1189e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller nve4_update_surface_bindings(nvc0); 1190e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } else { 1191e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller nvc0_update_surface_bindings(nvc0); 1192e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller } 1193e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller} 1194e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1195e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1196e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint8_t nve4_su_format_map[PIPE_FORMAT_COUNT] = 1197e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{ 1198e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32G32B32A32_FLOAT] = GK104_IMAGE_FORMAT_RGBA32_FLOAT, 1199e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32G32B32A32_SINT] = GK104_IMAGE_FORMAT_RGBA32_SINT, 1200e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32G32B32A32_UINT] = GK104_IMAGE_FORMAT_RGBA32_UINT, 1201e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16B16A16_FLOAT] = GK104_IMAGE_FORMAT_RGBA16_FLOAT, 1202e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16B16A16_UNORM] = GK104_IMAGE_FORMAT_RGBA16_UNORM, 1203e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16B16A16_SNORM] = GK104_IMAGE_FORMAT_RGBA16_SNORM, 1204e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16B16A16_SINT] = GK104_IMAGE_FORMAT_RGBA16_SINT, 1205e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16B16A16_UINT] = GK104_IMAGE_FORMAT_RGBA16_UINT, 12068e7893eb53213254997a1a3beb0575be11821f83Ilia Mirkin [PIPE_FORMAT_B8G8R8A8_UNORM] = GK104_IMAGE_FORMAT_BGRA8_UNORM, 1207e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8B8A8_UNORM] = GK104_IMAGE_FORMAT_RGBA8_UNORM, 1208e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8B8A8_SNORM] = GK104_IMAGE_FORMAT_RGBA8_SNORM, 1209e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8B8A8_SINT] = GK104_IMAGE_FORMAT_RGBA8_SINT, 1210e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8B8A8_UINT] = GK104_IMAGE_FORMAT_RGBA8_UINT, 1211e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R11G11B10_FLOAT] = GK104_IMAGE_FORMAT_R11G11B10_FLOAT, 1212e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R10G10B10A2_UNORM] = GK104_IMAGE_FORMAT_RGB10_A2_UNORM, 12139bc18a48f3b5f311fd46946cac1efefac0de1f46Samuel Pitoiset [PIPE_FORMAT_R10G10B10A2_UINT] = GK104_IMAGE_FORMAT_RGB10_A2_UINT, 1214e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32G32_FLOAT] = GK104_IMAGE_FORMAT_RG32_FLOAT, 1215e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32G32_SINT] = GK104_IMAGE_FORMAT_RG32_SINT, 1216e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32G32_UINT] = GK104_IMAGE_FORMAT_RG32_UINT, 1217e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16_FLOAT] = GK104_IMAGE_FORMAT_RG16_FLOAT, 1218e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16_UNORM] = GK104_IMAGE_FORMAT_RG16_UNORM, 1219e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16_SNORM] = GK104_IMAGE_FORMAT_RG16_SNORM, 1220e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16_SINT] = GK104_IMAGE_FORMAT_RG16_SINT, 1221e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16G16_UINT] = GK104_IMAGE_FORMAT_RG16_UINT, 1222e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8_UNORM] = GK104_IMAGE_FORMAT_RG8_UNORM, 1223e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8_SNORM] = GK104_IMAGE_FORMAT_RG8_SNORM, 1224e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8_SINT] = GK104_IMAGE_FORMAT_RG8_SINT, 1225e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8G8_UINT] = GK104_IMAGE_FORMAT_RG8_UINT, 1226e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32_FLOAT] = GK104_IMAGE_FORMAT_R32_FLOAT, 1227e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32_SINT] = GK104_IMAGE_FORMAT_R32_SINT, 1228e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R32_UINT] = GK104_IMAGE_FORMAT_R32_UINT, 1229e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16_FLOAT] = GK104_IMAGE_FORMAT_R16_FLOAT, 1230e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16_UNORM] = GK104_IMAGE_FORMAT_R16_UNORM, 1231e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16_SNORM] = GK104_IMAGE_FORMAT_R16_SNORM, 1232e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16_SINT] = GK104_IMAGE_FORMAT_R16_SINT, 1233e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R16_UINT] = GK104_IMAGE_FORMAT_R16_UINT, 1234e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8_UNORM] = GK104_IMAGE_FORMAT_R8_UNORM, 1235e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8_SNORM] = GK104_IMAGE_FORMAT_R8_SNORM, 1236e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8_SINT] = GK104_IMAGE_FORMAT_R8_SINT, 1237e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs [PIPE_FORMAT_R8_UINT] = GK104_IMAGE_FORMAT_R8_UINT, 1238e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller}; 1239e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1240e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller/* Auxiliary format description values for surface instructions. 1241e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller * (log2(bytes per pixel) << 12) | (unk8 << 8) | unk22 1242e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller */ 1243e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_su_format_aux_map[PIPE_FORMAT_COUNT] = 1244e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{ 1245e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32B32A32_FLOAT] = 0x4842, 1246e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32B32A32_SINT] = 0x4842, 1247e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32B32A32_UINT] = 0x4842, 1248e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1249e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_UNORM] = 0x3933, 1250e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_SNORM] = 0x3933, 1251e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_SINT] = 0x3933, 1252e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_UINT] = 0x3933, 1253e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_FLOAT] = 0x3933, 1254e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1255e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32_FLOAT] = 0x3433, 1256e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32_SINT] = 0x3433, 1257e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32_UINT] = 0x3433, 1258e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1259e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R10G10B10A2_UNORM] = 0x2a24, 12609bc18a48f3b5f311fd46946cac1efefac0de1f46Samuel Pitoiset [PIPE_FORMAT_R10G10B10A2_UINT] = 0x2a24, 12618e7893eb53213254997a1a3beb0575be11821f83Ilia Mirkin [PIPE_FORMAT_B8G8R8A8_UNORM] = 0x2a24, 1262e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_UNORM] = 0x2a24, 1263e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_SNORM] = 0x2a24, 1264e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_SINT] = 0x2a24, 1265e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_UINT] = 0x2a24, 1266e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R11G11B10_FLOAT] = 0x2a24, 1267e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1268e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_UNORM] = 0x2524, 1269e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_SNORM] = 0x2524, 1270e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_SINT] = 0x2524, 1271e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_UINT] = 0x2524, 1272e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_FLOAT] = 0x2524, 1273e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1274e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32_SINT] = 0x2024, 1275e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32_UINT] = 0x2024, 1276e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32_FLOAT] = 0x2024, 1277e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1278e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_UNORM] = 0x1615, 1279e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_SNORM] = 0x1615, 1280e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_SINT] = 0x1615, 1281e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_UINT] = 0x1615, 1282e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1283e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_UNORM] = 0x1115, 1284e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_SNORM] = 0x1115, 1285e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_SINT] = 0x1115, 1286e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_UINT] = 0x1115, 1287e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_FLOAT] = 0x1115, 1288e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1289e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_UNORM] = 0x0206, 1290e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_SNORM] = 0x0206, 1291e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_SINT] = 0x0206, 1292e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_UINT] = 0x0206 1293e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller}; 1294e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller 1295e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller/* NOTE: These are hardcoded offsets for the shader library. 1296e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller * TODO: Automate them. 1297e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller */ 1298e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_suldp_lib_offset[PIPE_FORMAT_COUNT] = 1299e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{ 1300e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32B32A32_FLOAT] = 0x218, 1301e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32B32A32_SINT] = 0x218, 1302e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32B32A32_UINT] = 0x218, 1303e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_UNORM] = 0x248, 1304e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_SNORM] = 0x2b8, 1305e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_SINT] = 0x330, 1306e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_UINT] = 0x388, 1307e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16B16A16_FLOAT] = 0x3d8, 1308e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32_FLOAT] = 0x428, 1309e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32_SINT] = 0x468, 1310e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32G32_UINT] = 0x468, 1311e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R10G10B10A2_UNORM] = 0x4a8, 13129bc18a48f3b5f311fd46946cac1efefac0de1f46Samuel Pitoiset [PIPE_FORMAT_R10G10B10A2_UINT] = 0x530, 1313e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_UNORM] = 0x588, 1314e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_SNORM] = 0x5f8, 1315e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_SINT] = 0x670, 1316e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8B8A8_UINT] = 0x6c8, 1317e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_B5G6R5_UNORM] = 0x718, 1318e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_B5G5R5X1_UNORM] = 0x7a0, 1319e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_UNORM] = 0x828, 1320e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_SNORM] = 0x890, 1321e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_SINT] = 0x8f0, 1322e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_UINT] = 0x948, 1323e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16G16_FLOAT] = 0x998, 1324e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32_FLOAT] = 0x9e8, 1325e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32_SINT] = 0xa30, 1326e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R32_UINT] = 0xa30, 1327e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_UNORM] = 0xa78, 1328e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_SNORM] = 0xae0, 1329e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_UINT] = 0xb48, 1330e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8G8_SINT] = 0xb98, 1331e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_UNORM] = 0xbe8, 1332e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_SNORM] = 0xc48, 1333e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_SINT] = 0xca0, 1334e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_UINT] = 0xce8, 1335e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R16_FLOAT] = 0xd30, 1336e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_UNORM] = 0xd88, 1337e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_SNORM] = 0xde0, 1338e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_SINT] = 0xe38, 1339e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R8_UINT] = 0xe88, 1340e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller [PIPE_FORMAT_R11G11B10_FLOAT] = 0xed0 1341e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller}; 1342