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