nvc0_tex.c revision b2b5075e04bbe6c6462fd01711524abd80380f45
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));
13597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs         width = view->pipe.u.buf.last_element - view->pipe.u.buf.first_element;
13697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs         address +=
13797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs            view->pipe.u.buf.first_element * desc->block.bits / 8;
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
23997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsstatic struct pipe_sampler_view *
24097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsgf100_create_texture_view(struct pipe_context *pipe,
24197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                          struct pipe_resource *texture,
24297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                          const struct pipe_sampler_view *templ,
24397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                          uint32_t flags,
24497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                          enum pipe_texture_target target)
24536ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller{
2464c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   const struct util_format_description *desc;
247733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs   const struct nvc0_format *fmt;
2486d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   uint64_t address;
2494c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   uint32_t *tic;
2504c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   uint32_t swz[4];
2514da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   uint32_t width, height;
252ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller   uint32_t depth;
2534bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin   uint32_t tex_fmt;
2541f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller   struct nv50_tic_entry *view;
25528271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller   struct nv50_miptree *mt;
256cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset   bool tex_int;
2574c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
2581f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller   view = MALLOC_STRUCT(nv50_tic_entry);
2594c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   if (!view)
2604c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      return NULL;
2616d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   mt = nv50_miptree(texture);
2624c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
2634c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   view->pipe = *templ;
2644c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   view->pipe.reference.count = 1;
2654c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   view->pipe.texture = NULL;
2664c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   view->pipe.context = pipe;
2674c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
2684c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   view->id = -1;
2694c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
2704c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   pipe_resource_reference(&view->pipe.texture, texture);
2714c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
2724c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   tic = &view->tic[0];
2734c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
274b0698396dcc70f6c8a16090dfb1674996538db3aChristoph Bumiller   desc = util_format_description(view->pipe.format);
2754c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
276733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs   fmt = &nvc0_format_table[view->pipe.format];
2774c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
2789934bfe28d3c0f6551ba2cc806a7fe8e0a16ed7cChristoph Bumiller   tex_int = util_format_is_pure_integer(view->pipe.format);
2794bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin   tex_fmt = fmt->tic.format & 0x3f;
280e4c968cdbbdc020afbf869d12b536c0a0dbf9de8Christoph Bumiller
281733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs   swz[0] = nv50_tic_swizzle(fmt, view->pipe.swizzle_r, tex_int);
282733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs   swz[1] = nv50_tic_swizzle(fmt, view->pipe.swizzle_g, tex_int);
283733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs   swz[2] = nv50_tic_swizzle(fmt, view->pipe.swizzle_b, tex_int);
284733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs   swz[3] = nv50_tic_swizzle(fmt, view->pipe.swizzle_a, tex_int);
2854bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin   tic[0] = (tex_fmt << G80_TIC_0_COMPONENTS_SIZES__SHIFT) |
286733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs            (fmt->tic.type_r << G80_TIC_0_R_DATA_TYPE__SHIFT) |
287733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs            (fmt->tic.type_g << G80_TIC_0_G_DATA_TYPE__SHIFT) |
288733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs            (fmt->tic.type_b << G80_TIC_0_B_DATA_TYPE__SHIFT) |
289733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs            (fmt->tic.type_a << G80_TIC_0_A_DATA_TYPE__SHIFT) |
290733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs            (swz[0] << G80_TIC_0_X_SOURCE__SHIFT) |
291733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs            (swz[1] << G80_TIC_0_Y_SOURCE__SHIFT) |
292733c8f8c7396a24ad21555853883221f5f5cd9d4Ben Skeggs            (swz[2] << G80_TIC_0_Z_SOURCE__SHIFT) |
2934bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin            (swz[3] << G80_TIC_0_W_SOURCE__SHIFT) |
2944bc3b1ca487df6072aec13dbfbf724c0de9995c5Ilia Mirkin            ((fmt->tic.format & 0x40) << (GK20A_TIC_0_USE_COMPONENT_SIZES_EXTENDED__SHIFT - 6));
2954c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
2966d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   address = mt->base.address;
2974c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
298ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs   tic[2] = 0x10001000 | G80_TIC_2_BORDER_SOURCE_COLOR;
2994c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
3004c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
301ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_SRGB_CONVERSION;
3024c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
303f0a0d59f0fdceb756838ad6dad012852ba48362eChristoph Bumiller   if (!(flags & NV50_TEXVIEW_SCALED_COORDS))
304ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_NORMALIZED_COORDS;
305f0a0d59f0fdceb756838ad6dad012852ba48362eChristoph Bumiller
30628271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller   /* check for linear storage type */
3076d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   if (unlikely(!nouveau_bo_memtype(nv04_resource(texture)->bo))) {
30828271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller      if (texture->target == PIPE_BUFFER) {
309ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs         assert(!(tic[2] & G80_TIC_2_NORMALIZED_COORDS));
3106d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         address +=
31128271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller            view->pipe.u.buf.first_element * desc->block.bits / 8;
312ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs         tic[2] |= G80_TIC_2_LAYOUT_PITCH | G80_TIC_2_TEXTURE_TYPE_ONE_D_BUFFER;
31328271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller         tic[3] = 0;
31428271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller         tic[4] = /* width */
31528271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller            view->pipe.u.buf.last_element - view->pipe.u.buf.first_element + 1;
3166d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         tic[5] = 0;
31728271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller      } else {
31828271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller         /* must be 2D texture without mip maps */
319ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs         tic[2] |= G80_TIC_2_LAYOUT_PITCH | G80_TIC_2_TEXTURE_TYPE_TWO_D_NO_MIPMAP;
32028271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller         tic[3] = mt->level[0].pitch;
32128271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller         tic[4] = mt->base.base.width0;
32228271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller         tic[5] = (1 << 16) | mt->base.base.height0;
32328271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller      }
32428271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller      tic[6] =
32528271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller      tic[7] = 0;
3266d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      tic[1] = address;
3276d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      tic[2] |= address >> 32;
32828271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller      return &view->pipe;
32928271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller   }
33028271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller
3314c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   tic[2] |=
3326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      ((mt->level[0].tile_mode & 0x0f0) << (22 - 4)) |
3336d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      ((mt->level[0].tile_mode & 0xf00) << (25 - 8));
334ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller
335ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller   depth = MAX2(mt->base.base.array_size, mt->base.base.depth0);
3364c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
3378828004e674b2036c23dd6b4a26cf94b98327792Christoph Bumiller   if (mt->base.base.array_size > 1) {
3384fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller      /* there doesn't seem to be a base layer field in TIC */
3396d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      address += view->pipe.u.tex.first_layer * mt->layer_stride;
3404fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller      depth = view->pipe.u.tex.last_layer - view->pipe.u.tex.first_layer + 1;
3414fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller   }
3426d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   tic[1] = address;
3436d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   tic[2] |= address >> 32;
3444fae7da9a3a3849ca08ffc6fcbdccc6a9c065ad2Christoph Bumiller
34536ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller   switch (target) {
3464c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   case PIPE_TEXTURE_1D:
347ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_ONE_D;
3484c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      break;
3494c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   case PIPE_TEXTURE_2D:
350ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_TWO_D;
3514c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      break;
3524c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   case PIPE_TEXTURE_RECT:
353ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_TWO_D;
3544c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      break;
3554c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   case PIPE_TEXTURE_3D:
356ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_THREE_D;
3574c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      break;
3584c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   case PIPE_TEXTURE_CUBE:
359ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller      depth /= 6;
360ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_CUBEMAP;
361ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller      break;
362ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller   case PIPE_TEXTURE_1D_ARRAY:
363ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_ONE_D_ARRAY;
364ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller      break;
365ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller   case PIPE_TEXTURE_2D_ARRAY:
366ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_TWO_D_ARRAY;
3674c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      break;
368f7599b2c32185535b4c215de0ba0454129fa523fChristoph Bumiller   case PIPE_TEXTURE_CUBE_ARRAY:
369f7599b2c32185535b4c215de0ba0454129fa523fChristoph Bumiller      depth /= 6;
370ff1af29dd94cc2eab83090f297a669de7f6f91e4Ben Skeggs      tic[2] |= G80_TIC_2_TEXTURE_TYPE_CUBE_ARRAY;
371f7599b2c32185535b4c215de0ba0454129fa523fChristoph Bumiller      break;
3724c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   default:
3733f7462b792a5bd517a1d2958d1aeb630ed253246Samuel Pitoiset      unreachable("unexpected/invalid texture target");
3744c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   }
3754c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
3764da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   tic[3] = (flags & NV50_TEXVIEW_FILTER_MSAA8) ? 0x20000000 : 0x00300000;
3774da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller
3784da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   if (flags & NV50_TEXVIEW_ACCESS_RESOLVE) {
3794da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller      width = mt->base.base.width0 << mt->ms_x;
3804da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller      height = mt->base.base.height0 << mt->ms_y;
3814da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   } else {
3824da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller      width = mt->base.base.width0;
3834da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller      height = mt->base.base.height0;
3844da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   }
3854c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
3864da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   tic[4] = (1 << 31) | width;
3874c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
3884da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   tic[5] = height & 0xffff;
389ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller   tic[5] |= depth << 16;
3904c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   tic[5] |= mt->base.base.last_level << 28;
3914c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
3924da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   /* sampling points: (?) */
3934da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   if (flags & NV50_TEXVIEW_ACCESS_RESOLVE)
3944da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller      tic[6] = (mt->ms_x > 1) ? 0x88000000 : 0x03000000;
3954da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   else
3964da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller      tic[6] = 0x03000000;
3974c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
398ca5deb0c355cc4a120b754a228ff5f51007fbceaChristoph Bumiller   tic[7] = (view->pipe.u.tex.last_level << 4) | view->pipe.u.tex.first_level;
3994da54c91d24da891c56957f29274e7821c8254f6Christoph Bumiller   tic[7] |= mt->ms_mode << 12;
400b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller
4014c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   return &view->pipe;
4024c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller}
4034c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
40497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsstruct pipe_sampler_view *
40597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggsnvc0_create_texture_view(struct pipe_context *pipe,
40697fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                         struct pipe_resource *texture,
40797fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                         const struct pipe_sampler_view *templ,
40897fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                         uint32_t flags,
40997fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs                         enum pipe_texture_target target)
41097fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs{
41197fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs   if (nvc0_context(pipe)->screen->tic.maxwell)
41297fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs      return gm107_create_texture_view(pipe, texture, templ, flags, target);
41397fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs   return gf100_create_texture_view(pipe, texture, templ, flags, target);
41497fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs}
41597fc3fd559629caaac5173cd28986fe9e83ca5e9Ben Skeggs
4169444d71611b97a1f3102ba60b94ce1860a9961e9Ilia Mirkinvoid
417323c91250682ac931941047f282a613c74b1ba26Ilia Mirkinnvc0_update_tic(struct nvc0_context *nvc0, struct nv50_tic_entry *tic,
418323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin                struct nv04_resource *res)
419323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin{
420323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   uint64_t address = res->address;
421323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   if (res->base.target != PIPE_BUFFER)
422323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin      return;
423323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   address += tic->pipe.u.buf.first_element *
424323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin      util_format_get_blocksize(tic->pipe.format);
425323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   if (tic->tic[1] == (uint32_t)address &&
426323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin       (tic->tic[2] & 0xff) == address >> 32)
427323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin      return;
428323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin
429323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   nvc0_screen_tic_unlock(nvc0->screen, tic);
430323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   tic->id = -1;
431323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   tic->tic[1] = address;
432323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   tic->tic[2] &= 0xffffff00;
433323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin   tic->tic[2] |= address >> 32;
434323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin}
435323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin
436fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoisetbool
4374c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillernvc0_validate_tic(struct nvc0_context *nvc0, int s)
4384c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{
439784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   uint32_t commands[32];
4406d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
44192f3642a4fe71b272b4ceb6953fbf55d1efcbeb5Christoph Bumiller   struct nouveau_bo *txc = nvc0->screen->txc;
4424c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   unsigned i;
443784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   unsigned n = 0;
444cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset   bool need_flush = false;
4454c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
4464c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   for (i = 0; i < nvc0->num_textures[s]; ++i) {
4471f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller      struct nv50_tic_entry *tic = nv50_tic_entry(nvc0->textures[s][i]);
4484826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs      struct nv04_resource *res;
449cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset      const bool dirty = !!(nvc0->textures_dirty[s] & (1 << i));
4504c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
4514c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      if (!tic) {
452784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller         if (dirty)
453784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller            commands[n++] = (i << 1) | 0;
4544c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller         continue;
4554c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      }
45628271fd00dc5dd83f95b5cb890e0ab2c0ff6159dChristoph Bumiller      res = nv04_resource(tic->pipe.texture);
457323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin      nvc0_update_tic(nvc0, tic, res);
4584c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
4594c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      if (tic->id < 0) {
4604c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller         tic->id = nvc0_screen_tic_alloc(nvc0->screen, tic);
4614c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
4626d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_SPACE(push, 17);
4636d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         BEGIN_NVC0(push, NVC0_M2MF(OFFSET_OUT_HIGH), 2);
4646d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_DATAh(push, txc->offset + (tic->id * 32));
4656d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_DATA (push, txc->offset + (tic->id * 32));
4666d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         BEGIN_NVC0(push, NVC0_M2MF(LINE_LENGTH_IN), 2);
4676d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_DATA (push, 32);
4686d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_DATA (push, 1);
4696d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         BEGIN_NVC0(push, NVC0_M2MF(EXEC), 1);
4706d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_DATA (push, 0x100111);
4716d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         BEGIN_NIC0(push, NVC0_M2MF(DATA), 8);
4726d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_DATAp(push, &tic->tic[0], 8);
47392f3642a4fe71b272b4ceb6953fbf55d1efcbeb5Christoph Bumiller
474cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset         need_flush = true;
47567c7aefea33a7935e42ede30463eb7ca5009b068Christoph Bumiller      } else
4764826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs      if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) {
477fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset         if (unlikely(s == 5))
478bbff97ae3918f0dd89d461b1eb51c53829befda1Samuel Pitoiset            BEGIN_NVC0(push, NVC0_CP(TEX_CACHE_CTL), 1);
479fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset         else
480fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset            BEGIN_NVC0(push, NVC0_3D(TEX_CACHE_CTL), 1);
4816d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         PUSH_DATA (push, (tic->id << 4) | 1);
482198f514aa6f08bc43a3002519843b0fe94f340bdChristoph Bumiller         NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_cache_flush_count, 1);
4834c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      }
4844c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      nvc0->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32);
4854c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
4864826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs      res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING;
4874826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs      res->status |=  NOUVEAU_BUFFER_STATUS_GPU_READING;
48867c7aefea33a7935e42ede30463eb7ca5009b068Christoph Bumiller
489784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      if (!dirty)
490784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller         continue;
491784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      commands[n++] = (tic->id << 9) | (i << 1) | 1;
4924c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
493fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset      if (unlikely(s == 5))
494fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset         BCTX_REFN(nvc0->bufctx_cp, CP_TEX(i), res, RD);
495fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset      else
4962999257e0fe703f73d32620fed88040d29ac5bacSamuel Pitoiset         BCTX_REFN(nvc0->bufctx_3d, 3D_TEX(s, i), res, RD);
4974c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   }
498784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   for (; i < nvc0->state.num_textures[s]; ++i)
499784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      commands[n++] = (i << 1) | 0;
500784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller
5014c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   nvc0->state.num_textures[s] = nvc0->num_textures[s];
5024c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
503784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   if (n) {
504fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset      if (unlikely(s == 5))
505bbff97ae3918f0dd89d461b1eb51c53829befda1Samuel Pitoiset         BEGIN_NIC0(push, NVC0_CP(BIND_TIC), n);
506fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset      else
507fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset         BEGIN_NIC0(push, NVC0_3D(BIND_TIC(s)), n);
508784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      PUSH_DATAp(push, commands, n);
509784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   }
510784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   nvc0->textures_dirty[s] = 0;
511784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller
5124c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   return need_flush;
5134c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller}
5144c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
515cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetstatic bool
516e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillernve4_validate_tic(struct nvc0_context *nvc0, unsigned s)
517e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller{
518e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   struct nouveau_bo *txc = nvc0->screen->txc;
519e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
520e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   unsigned i;
521cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset   bool need_flush = false;
522e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
523e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   for (i = 0; i < nvc0->num_textures[s]; ++i) {
524e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      struct nv50_tic_entry *tic = nv50_tic_entry(nvc0->textures[s][i]);
525e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      struct nv04_resource *res;
526cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset      const bool dirty = !!(nvc0->textures_dirty[s] & (1 << i));
527e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
528e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      if (!tic) {
529e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         nvc0->tex_handles[s][i] |= NVE4_TIC_ENTRY_INVALID;
530e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         continue;
531e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      }
532e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      res = nv04_resource(tic->pipe.texture);
533323c91250682ac931941047f282a613c74b1ba26Ilia Mirkin      nvc0_update_tic(nvc0, tic, res);
534e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
535e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      if (tic->id < 0) {
536e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         tic->id = nvc0_screen_tic_alloc(nvc0->screen, tic);
537e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
538e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_SPACE(push, 16);
53972283020093525ca5248d7f408e88b0bcba1e52bIlia Mirkin         BEGIN_NVC0(push, NVE4_P2MF(UPLOAD_DST_ADDRESS_HIGH), 2);
540e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATAh(push, txc->offset + (tic->id * 32));
541e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, txc->offset + (tic->id * 32));
54272283020093525ca5248d7f408e88b0bcba1e52bIlia Mirkin         BEGIN_NVC0(push, NVE4_P2MF(UPLOAD_LINE_LENGTH_IN), 2);
543e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, 32);
544e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, 1);
54572283020093525ca5248d7f408e88b0bcba1e52bIlia Mirkin         BEGIN_1IC0(push, NVE4_P2MF(UPLOAD_EXEC), 9);
546e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, 0x1001);
547e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATAp(push, &tic->tic[0], 8);
548e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
549cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset         need_flush = true;
550e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      } else
551e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) {
552e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         BEGIN_NVC0(push, NVC0_3D(TEX_CACHE_CTL), 1);
553e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, (tic->id << 4) | 1);
554e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      }
555e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->screen->tic.lock[tic->id / 32] |= 1 << (tic->id % 32);
556e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
557e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING;
558e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      res->status |=  NOUVEAU_BUFFER_STATUS_GPU_READING;
559e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
560e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->tex_handles[s][i] &= ~NVE4_TIC_ENTRY_INVALID;
561e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->tex_handles[s][i] |= tic->id;
562e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      if (dirty)
5632999257e0fe703f73d32620fed88040d29ac5bacSamuel Pitoiset         BCTX_REFN(nvc0->bufctx_3d, 3D_TEX(s, i), res, RD);
564e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   }
565c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller   for (; i < nvc0->state.num_textures[s]; ++i) {
566e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->tex_handles[s][i] |= NVE4_TIC_ENTRY_INVALID;
567c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller      nvc0->textures_dirty[s] |= 1 << i;
568c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller   }
569e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
570e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   nvc0->state.num_textures[s] = nvc0->num_textures[s];
571e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
572e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   return need_flush;
573e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller}
574e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
5754c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillervoid nvc0_validate_textures(struct nvc0_context *nvc0)
5764c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{
577f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin   bool need_flush = false;
578f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin   int i;
5794c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
580f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin   for (i = 0; i < 5; i++) {
581f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin      if (nvc0->screen->base.class_3d >= NVE4_3D_CLASS)
582f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin         need_flush |= nve4_validate_tic(nvc0, i);
583f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin      else
584f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin         need_flush |= nvc0_validate_tic(nvc0, i);
585e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   }
5864c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
5874c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   if (need_flush) {
5886d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      BEGIN_NVC0(nvc0->base.pushbuf, NVC0_3D(TIC_FLUSH), 1);
5896d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_DATA (nvc0->base.pushbuf, 0);
5904c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   }
591e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset
592e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset   if (nvc0->screen->base.class_3d < NVE4_3D_CLASS) {
593e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset      /* Invalidate all CP textures because they are aliased. */
594e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset      for (int i = 0; i < nvc0->num_textures[5]; i++)
595e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset         nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_CP_TEX(i));
596e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset      nvc0->textures_dirty[5] = ~0;
597e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset      nvc0->dirty_cp |= NVC0_NEW_CP_TEXTURES;
598e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset   }
5994c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller}
6004c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
601fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoisetbool
6024c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillernvc0_validate_tsc(struct nvc0_context *nvc0, int s)
6034c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{
604784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   uint32_t commands[16];
6056d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
6064c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   unsigned i;
607784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   unsigned n = 0;
608cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset   bool need_flush = false;
6094c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
6104c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   for (i = 0; i < nvc0->num_samplers[s]; ++i) {
6111f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumiller      struct nv50_tsc_entry *tsc = nv50_tsc_entry(nvc0->samplers[s][i]);
6124c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
613784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      if (!(nvc0->samplers_dirty[s] & (1 << i)))
614784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller         continue;
6154c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      if (!tsc) {
616784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller         commands[n++] = (i << 4) | 0;
6174c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller         continue;
6184c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      }
6191d1ddfe5f887980acfb1283cf1c0b1240b3a60a6Ilia Mirkin      nvc0->seamless_cube_map = tsc->seamless_cube_map;
6204c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      if (tsc->id < 0) {
6214c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller         tsc->id = nvc0_screen_tsc_alloc(nvc0->screen, tsc);
6224c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
6231ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs         nvc0_m2mf_push_linear(&nvc0->base, nvc0->screen->txc,
624da8300cb03e8cf1f37b5573a2db026fd28e0a3c5Alexandre Courbot                               65536 + tsc->id * 32, NV_VRAM_DOMAIN(&nvc0->screen->base),
6254826cd0f6125b071530026143ffd8205d84b3d5eBen Skeggs                               32, tsc->tsc);
626cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset         need_flush = true;
6274c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      }
6284c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller      nvc0->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32);
6294c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
630784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      commands[n++] = (tsc->id << 12) | (i << 4) | 1;
6314c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   }
632784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   for (; i < nvc0->state.num_samplers[s]; ++i)
633784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      commands[n++] = (i << 4) | 0;
634784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller
6354c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   nvc0->state.num_samplers[s] = nvc0->num_samplers[s];
6364c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
637784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   if (n) {
638fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset      if (unlikely(s == 5))
639bbff97ae3918f0dd89d461b1eb51c53829befda1Samuel Pitoiset         BEGIN_NIC0(push, NVC0_CP(BIND_TSC), n);
640fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset      else
641fa7333a742d8f816c0502e79503a7ad33ab0a9a5Samuel Pitoiset         BEGIN_NIC0(push, NVC0_3D(BIND_TSC(s)), n);
642784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller      PUSH_DATAp(push, commands, n);
643784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   }
644784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller   nvc0->samplers_dirty[s] = 0;
645784f49e69624cba07616fd5a22ccb80ad3b5111bChristoph Bumiller
6464c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   return need_flush;
6474c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller}
6484c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
649cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoisetbool
650e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillernve4_validate_tsc(struct nvc0_context *nvc0, int s)
651e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller{
652e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   struct nouveau_bo *txc = nvc0->screen->txc;
653e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
654e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   unsigned i;
655cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset   bool need_flush = false;
656e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
657e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   for (i = 0; i < nvc0->num_samplers[s]; ++i) {
658e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      struct nv50_tsc_entry *tsc = nv50_tsc_entry(nvc0->samplers[s][i]);
659e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
660e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      if (!tsc) {
661e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         nvc0->tex_handles[s][i] |= NVE4_TSC_ENTRY_INVALID;
662e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         continue;
663e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      }
664e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      if (tsc->id < 0) {
665e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         tsc->id = nvc0_screen_tsc_alloc(nvc0->screen, tsc);
666e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
667e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_SPACE(push, 16);
66872283020093525ca5248d7f408e88b0bcba1e52bIlia Mirkin         BEGIN_NVC0(push, NVE4_P2MF(UPLOAD_DST_ADDRESS_HIGH), 2);
669e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATAh(push, txc->offset + 65536 + (tsc->id * 32));
670e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, txc->offset + 65536 + (tsc->id * 32));
67172283020093525ca5248d7f408e88b0bcba1e52bIlia Mirkin         BEGIN_NVC0(push, NVE4_P2MF(UPLOAD_LINE_LENGTH_IN), 2);
672e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, 32);
673e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, 1);
67472283020093525ca5248d7f408e88b0bcba1e52bIlia Mirkin         BEGIN_1IC0(push, NVE4_P2MF(UPLOAD_EXEC), 9);
675e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, 0x1001);
676e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATAp(push, &tsc->tsc[0], 8);
677e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
678cd0dec0d9dfab642c51774c3f5788cbdf00b8c9bSamuel Pitoiset         need_flush = true;
679e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      }
680e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->screen->tsc.lock[tsc->id / 32] |= 1 << (tsc->id % 32);
681e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
682e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->tex_handles[s][i] &= ~NVE4_TSC_ENTRY_INVALID;
683e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->tex_handles[s][i] |= tsc->id << 20;
684e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   }
685c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller   for (; i < nvc0->state.num_samplers[s]; ++i) {
686e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->tex_handles[s][i] |= NVE4_TSC_ENTRY_INVALID;
687c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller      nvc0->samplers_dirty[s] |= 1 << i;
688c321b1bef15e2807de3f6225c4abcbf48969997aChristoph Bumiller   }
689e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
690e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   nvc0->state.num_samplers[s] = nvc0->num_samplers[s];
691e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
692e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   return need_flush;
693e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller}
694e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
6954c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumillervoid nvc0_validate_samplers(struct nvc0_context *nvc0)
6964c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller{
697f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin   bool need_flush = false;
698f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin   int i;
6994c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
700f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin   for (i = 0; i < 5; i++) {
701f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin      if (nvc0->screen->base.class_3d >= NVE4_3D_CLASS)
702f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin         need_flush |= nve4_validate_tsc(nvc0, i);
703f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin      else
704f97c14f9e4ff5ae2b7313eb0098f99816fead71dIlia Mirkin         need_flush |= nvc0_validate_tsc(nvc0, i);
705e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   }
7064c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller
7074c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   if (need_flush) {
7086d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      BEGIN_NVC0(nvc0->base.pushbuf, NVC0_3D(TSC_FLUSH), 1);
7096d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_DATA (nvc0->base.pushbuf, 0);
7104c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller   }
711e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset
712e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset   if (nvc0->screen->base.class_3d < NVE4_3D_CLASS) {
713e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset      /* Invalidate all CP samplers because they are aliased. */
714e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset      nvc0->samplers_dirty[5] = ~0;
715e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset      nvc0->dirty_cp |= NVC0_NEW_CP_SAMPLERS;
716e01a48218205adc280d3da00720dfb3d1ca5bde5Samuel Pitoiset   }
7174c2247538394a313e1e90bfcd07c1ab9c7d41281Christoph Bumiller}
718e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
719e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller/* Upload the "diagonal" entries for the possible texture sources ($t == $s).
720e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller * At some point we might want to get a list of the combinations used by a
721e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller * shader and fill in those entries instead of having it extract the handles.
722e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller */
723e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillervoid
724e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumillernve4_set_tex_handles(struct nvc0_context *nvc0)
725e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller{
726e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
727902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset   struct nvc0_screen *screen = nvc0->screen;
728e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   unsigned s;
729e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
730e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   if (nvc0->screen->base.class_3d < NVE4_3D_CLASS)
731e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      return;
732e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
733902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset   for (s = 0; s < 5; ++s) {
734e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      uint32_t dirty = nvc0->textures_dirty[s] | nvc0->samplers_dirty[s];
735e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      if (!dirty)
736e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         continue;
737e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
738c6b3c346d15b834d17c97aa4a45714c18f219351Samuel Pitoiset      PUSH_DATA (push, 2048);
739902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset      PUSH_DATAh(push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s));
740902bbda81b31bacb2a8c60ca6a8ba8ca34ae73d3Samuel Pitoiset      PUSH_DATA (push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s));
741e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      do {
742e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         int i = ffs(dirty) - 1;
743e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         dirty &= ~(1 << i);
744e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
745e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         BEGIN_NVC0(push, NVC0_3D(CB_POS), 2);
746e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, (8 + i) * 4);
747e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller         PUSH_DATA (push, nvc0->tex_handles[s][i]);
748e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      } while (dirty);
749e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller
750e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->textures_dirty[s] = 0;
751e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller      nvc0->samplers_dirty[s] = 0;
752e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller   }
753e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller}
754e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
755e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
756e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint8_t nve4_su_format_map[PIPE_FORMAT_COUNT];
757e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_su_format_aux_map[PIPE_FORMAT_COUNT];
758e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_suldp_lib_offset[PIPE_FORMAT_COUNT];
759e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
7601eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoisetstatic void
7611eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoisetnvc0_get_surface_dims(struct pipe_image_view *view, int *width, int *height,
7621eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset                      int *depth)
7631eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset{
7641eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   struct nv04_resource *res = nv04_resource(view->resource);
7651eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   int level;
7661eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset
7671eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   *width = *height = *depth = 1;
7681eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   if (res->base.target == PIPE_BUFFER) {
7691eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      *width = view->u.buf.last_element - view->u.buf.first_element + 1;
7701eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      return;
7711eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   }
7721eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset
7731eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   level = view->u.tex.level;
7741eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   *width = u_minify(view->resource->width0, level);
7751eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   *height = u_minify(view->resource->height0, level);
7761eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   *depth = u_minify(view->resource->depth0, level);
7771eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset
7781eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   switch (res->base.target) {
7791eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_1D_ARRAY:
7801eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_2D_ARRAY:
7811eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_CUBE:
7821eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_CUBE_ARRAY:
7831eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      *depth = view->u.tex.last_layer - view->u.tex.first_layer + 1;
7841eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      break;
7851eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_1D:
7861eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_2D:
7871eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_RECT:
7881eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   case PIPE_TEXTURE_3D:
7891eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      break;
7901eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   default:
7911eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      assert(!"unexpected texture target");
7921eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      break;
7931eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   }
7941eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset}
7951eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset
796e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillervoid
79728590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoisetnvc0_mark_image_range_valid(const struct pipe_image_view *view)
79828590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset{
79928590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset   struct nv04_resource *res = (struct nv04_resource *)view->resource;
80028590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset   const struct util_format_description *desc;
80128590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset   unsigned stride;
80228590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset
80328590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset   assert(view->resource->target == PIPE_BUFFER);
80428590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset
80528590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset   desc = util_format_description(view->format);
80628590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset   stride = desc->block.bits / 8;
80728590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset
80828590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset   util_range_add(&res->valid_buffer_range,
80928590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset                  stride * (view->u.buf.first_element),
81028590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset                  stride * (view->u.buf.last_element + 1));
81128590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset}
81228590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset
81328590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoisetvoid
814e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernve4_set_surface_info(struct nouveau_pushbuf *push,
8151eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset                      struct pipe_image_view *view,
8160d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset                      struct nvc0_context *nvc0)
817e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{
8180d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset   struct nvc0_screen *screen = nvc0->screen;
819e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   struct nv04_resource *res;
820e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   uint64_t address;
821e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   uint32_t *const info = push->cur;
8221eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   int width, height, depth;
823e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   uint8_t log2cpp;
824e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
8251eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   if (view && !nve4_su_format_map[view->format])
826e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      NOUVEAU_ERR("unsupported surface format, try is_format_supported() !\n");
827e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
828e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   push->cur += 16;
829e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
8301eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   if (!view || !nve4_su_format_map[view->format]) {
831e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      memset(info, 0, 16 * sizeof(*info));
832e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
833e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[0] = 0xbadf0000;
834e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[1] = 0x80004000;
835e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[12] = nve4_suldp_lib_offset[PIPE_FORMAT_R32G32B32A32_UINT] +
836e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller         screen->lib_code->start;
837e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      return;
838e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   }
8391eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   res = nv04_resource(view->resource);
8401eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset
8411eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   address = res->address;
842e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
8431eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   /* get surface dimensions based on the target. */
8441eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   nvc0_get_surface_dims(view, &width, &height, &depth);
845e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
8461eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   info[8] = width;
8471eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   info[9] = height;
8481eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   info[10] = depth;
849e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   switch (res->base.target) {
850e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case PIPE_TEXTURE_1D_ARRAY:
851e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[11] = 1;
852e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      break;
853e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case PIPE_TEXTURE_2D:
854e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case PIPE_TEXTURE_RECT:
855e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[11] = 2;
856e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      break;
857e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case PIPE_TEXTURE_3D:
858e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[11] = 3;
859e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      break;
860e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case PIPE_TEXTURE_2D_ARRAY:
861e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case PIPE_TEXTURE_CUBE:
862e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case PIPE_TEXTURE_CUBE_ARRAY:
863e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[11] = 4;
864e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      break;
865e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   default:
866e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[11] = 0;
867e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      break;
868e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   }
8691eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   log2cpp = (0xf000 & nve4_su_format_aux_map[view->format]) >> 12;
870e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
8716fc6d548ed66caf4395190718163d964d9c0fe25Samuel Pitoiset   /* Stick the blockwidth (ie. number of bytes per pixel) to check if the
8726fc6d548ed66caf4395190718163d964d9c0fe25Samuel Pitoiset    * format doesn't mismatch. */
8736fc6d548ed66caf4395190718163d964d9c0fe25Samuel Pitoiset   info[12] = util_format_get_blocksize(view->format);
874e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
875e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   /* limit in bytes for raw access */
8761eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   info[13] = (0x06 << 22) | ((width << log2cpp) - 1);
877e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
8781eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   info[1] = nve4_su_format_map[view->format];
879e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
880e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller#if 0
8811eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   switch (util_format_get_blocksizebits(view->format)) {
882e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case  16: info[1] |= 1 << 16; break;
883e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case  32: info[1] |= 2 << 16; break;
884e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case  64: info[1] |= 3 << 16; break;
885e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   case 128: info[1] |= 4 << 16; break;
886e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   default:
887e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      break;
888e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   }
889e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller#else
890e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   info[1] |= log2cpp << 16;
891e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   info[1] |=  0x4000;
8921eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset   info[1] |= (0x0f00 & nve4_su_format_aux_map[view->format]);
893e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller#endif
894e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
895e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   if (res->base.target == PIPE_BUFFER) {
896da8171dc7580db75d65e0f89e1c20ee45c3ef3e7Samuel Pitoiset      unsigned blocksize = util_format_get_blocksize(view->format);
897da8171dc7580db75d65e0f89e1c20ee45c3ef3e7Samuel Pitoiset
898da8171dc7580db75d65e0f89e1c20ee45c3ef3e7Samuel Pitoiset      address += view->u.buf.first_element * blocksize;
899da8171dc7580db75d65e0f89e1c20ee45c3ef3e7Samuel Pitoiset
900e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[0]  = address >> 8;
9011eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      info[2]  = width - 1;
9021eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      info[2] |= (0xff & nve4_su_format_aux_map[view->format]) << 22;
903e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[3]  = 0;
904e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[4]  = 0;
905e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[5]  = 0;
906e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[6]  = 0;
907e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[7]  = 0;
908e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[14] = 0;
909e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[15] = 0;
910e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   } else {
911e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      struct nv50_miptree *mt = nv50_miptree(&res->base);
9121eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      struct nv50_miptree_level *lvl = &mt->level[view->u.tex.level];
9131eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      const unsigned z = view->u.tex.first_layer;
914e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
915e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      if (z) {
916e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller         if (mt->layout_3d) {
9171eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset            address += nvc0_mt_zslice_offset(mt, view->u.tex.level, z);
918e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller            /* doesn't work if z passes z-tile boundary */
9190d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset            if (depth > 1) {
9200d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset               pipe_debug_message(&nvc0->base.debug, CONFORMANCE,
9210d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset                                  "3D images are not really supported!");
9220d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset               debug_printf("3D images are not really supported!\n");
9230d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset            }
924e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller         } else {
925e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller            address += mt->layer_stride * z;
926e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller         }
927e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      }
928285f2edd14f82538d27f4df76055a3f154da3b29Samuel Pitoiset      address += lvl->offset;
9291eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset
930e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[0]  = address >> 8;
931b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin      info[2]  = (width << mt->ms_x) - 1;
932e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      /* NOTE: this is really important: */
9331eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      info[2] |= (0xff & nve4_su_format_aux_map[view->format]) << 22;
934e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[3]  = (0x88 << 24) | (lvl->pitch / 64);
935b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin      info[4]  = (height << mt->ms_y) - 1;
936e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[4] |= (lvl->tile_mode & 0x0f0) << 25;
937e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[4] |= NVC0_TILE_SHIFT_Y(lvl->tile_mode) << 22;
938e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[5]  = mt->layer_stride >> 8;
9391eca4c51a2c3fcaf4e39e5bad8eefcea547530faSamuel Pitoiset      info[6]  = depth - 1;
940e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[6] |= (lvl->tile_mode & 0xf00) << 21;
941e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[6] |= NVC0_TILE_SHIFT_Z(lvl->tile_mode) << 22;
942e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[7]  = 0;
943e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[14] = mt->ms_x;
944e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      info[15] = mt->ms_y;
945e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   }
946e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller}
947e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
948a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
949879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetnvc0_set_surface_info(struct nouveau_pushbuf *push,
950879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset                      struct pipe_image_view *view, uint64_t address,
951879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset                      int width, int height, int depth)
952879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset{
953879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   struct nv04_resource *res;
954879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   uint32_t *const info = push->cur;
955879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
956879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   push->cur += 16;
957879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
958879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   /* Make sure to always initialize the surface information area because it's
959879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset    * used to check if the given image is bound or not. */
960879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   memset(info, 0, 16 * sizeof(*info));
961879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
962879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   if (!view || !view->resource)
963879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      return;
964879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   res = nv04_resource(view->resource);
965879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
966879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   /* Stick the image dimensions for the imageSize() builtin. */
967879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   info[8] = width;
968879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   info[9] = height;
969879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   info[10] = depth;
970879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
971879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   /* Stick the blockwidth (ie. number of bytes per pixel) to calculate pixel
972879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset    * offset and to check if the format doesn't mismatch. */
973879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   info[12] = util_format_get_blocksize(view->format);
974879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
975879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   if (res->base.target == PIPE_BUFFER) {
976879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[0]  = address >> 8;
977879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[2]  = width;
978879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   } else {
979879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      struct nv50_miptree *mt = nv50_miptree(&res->base);
980879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
981879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[0]  = address >> 8;
982879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[2]  = width;
983879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[4]  = height;
984879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[5]  = mt->layer_stride >> 8;
985879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[6]  = depth;
986879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[14] = mt->ms_x;
987879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      info[15] = mt->ms_y;
988879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   }
989879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset}
990879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
991879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetvoid
992879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetnvc0_validate_suf(struct nvc0_context *nvc0, int s)
993879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset{
994879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
995879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   struct nvc0_screen *screen = nvc0->screen;
996879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
997879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   for (int i = 0; i < NVC0_MAX_IMAGES; ++i) {
998879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      struct pipe_image_view *view = &nvc0->images[s][i];
999879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      int width, height, depth;
1000879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      uint64_t address = 0;
1001879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1002879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      if (s == 5)
1003879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         BEGIN_NVC0(push, NVC0_CP(IMAGE(i)), 6);
1004879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      else
1005879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         BEGIN_NVC0(push, NVC0_3D(IMAGE(i)), 6);
1006879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1007879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      if (view->resource) {
1008879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         struct nv04_resource *res = nv04_resource(view->resource);
1009879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         unsigned rt = nvc0_format_table[view->format].rt;
1010879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1011879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         if (util_format_is_depth_or_stencil(view->format))
1012879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            rt = rt << 12;
1013879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         else
1014879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            rt = (rt << 4) | (0x14 << 12);
1015879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1016879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         /* get surface dimensions based on the target. */
1017879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         nvc0_get_surface_dims(view, &width, &height, &depth);
1018879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1019879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         address = res->address;
1020879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         if (res->base.target == PIPE_BUFFER) {
1021879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            unsigned blocksize = util_format_get_blocksize(view->format);
1022879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1023879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            address += view->u.buf.first_element * blocksize;
1024879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            assert(!(address & 0xff));
1025879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
102628590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset            if (view->access & PIPE_IMAGE_ACCESS_WRITE)
102728590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset               nvc0_mark_image_range_valid(view);
102828590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset
1029879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATAh(push, address);
1030879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, address);
1031879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, align(width * blocksize, 0x100));
1032879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, NVC0_3D_IMAGE_HEIGHT_LINEAR | 1);
1033879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, rt);
1034879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, 0);
1035879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         } else {
1036879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            struct nv50_miptree *mt = nv50_miptree(view->resource);
1037879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            struct nv50_miptree_level *lvl = &mt->level[view->u.tex.level];
1038879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            const unsigned z = view->u.tex.first_layer;
1039879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1040879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            if (mt->layout_3d) {
1041879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset               address += nvc0_mt_zslice_offset(mt, view->u.tex.level, z);
1042879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset               if (depth >= 1) {
1043879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset                  pipe_debug_message(&nvc0->base.debug, CONFORMANCE,
1044879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset                                     "3D images are not supported!");
1045879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset                  debug_printf("3D images are not supported!\n");
1046879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset               }
1047879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            } else {
1048879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset               address += mt->layer_stride * z;
1049879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            }
1050879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            address += lvl->offset;
1051879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1052879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATAh(push, address);
1053879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, address);
1054b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin            PUSH_DATA (push, width << mt->ms_x);
1055b2b5075e04bbe6c6462fd01711524abd80380f45Ilia Mirkin            PUSH_DATA (push, height << mt->ms_y);
1056879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, rt);
1057879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            PUSH_DATA (push, lvl->tile_mode & 0xff); /* mask out z-tiling */
1058879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         }
1059879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1060879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         if (s == 5)
1061879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            BCTX_REFN(nvc0->bufctx_cp, CP_SUF, res, RDWR);
1062879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         else
1063879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset            BCTX_REFN(nvc0->bufctx_3d, 3D_SUF, res, RDWR);
1064879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      } else {
1065879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         PUSH_DATA(push, 0);
1066879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         PUSH_DATA(push, 0);
1067879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         PUSH_DATA(push, 0);
1068879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         PUSH_DATA(push, 0);
1069879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         PUSH_DATA(push, 0x14000);
1070879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         PUSH_DATA(push, 0);
1071879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      }
1072879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1073879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      /* stick surface information into the driver constant buffer */
1074879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      if (s == 5)
1075879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         BEGIN_NVC0(push, NVC0_CP(CB_SIZE), 3);
1076879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      else
1077879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
1078879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      PUSH_DATA (push, 2048);
1079879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      PUSH_DATAh(push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s));
1080879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      PUSH_DATA (push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s));
1081879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      if (s == 5)
1082879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         BEGIN_1IC0(push, NVC0_CP(CB_POS), 1 + 16);
1083879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      else
1084879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset         BEGIN_1IC0(push, NVC0_3D(CB_POS), 1 + 16);
1085879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      PUSH_DATA (push, NVC0_CB_AUX_SU_INFO(i));
1086879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1087879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset      nvc0_set_surface_info(push, view, address, width, height, depth);
1088879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   }
1089879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset}
1090879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1091879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoisetstatic inline void
1092e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernvc0_update_surface_bindings(struct nvc0_context *nvc0)
1093e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{
1094879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   nvc0_validate_suf(nvc0, 4);
1095879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset
1096879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   /* Invalidate all COMPUTE images because they are aliased with FRAGMENT. */
1097be365f34f04112572550337f387b61ed1ba69acdSamuel Pitoiset   nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_SUF);
1098879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   nvc0->dirty_cp |= NVC0_NEW_CP_SURFACES;
1099879bd2ea0c7809ffc4b316f50652dc9cf7291004Samuel Pitoiset   nvc0->images_dirty[5] |= nvc0->images_valid[5];
1100e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller}
1101e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1102a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
1103e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernve4_update_surface_bindings(struct nvc0_context *nvc0)
1104e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{
1105e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
1106e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset   struct nvc0_screen *screen = nvc0->screen;
1107e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset   int i, j, s;
1108e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset
1109e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset   for (s = 0; s < 5; s++) {
1110e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      if (!nvc0->images_dirty[s])
1111e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset         continue;
1112e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset
1113e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
1114e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      PUSH_DATA (push, 2048);
1115e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      PUSH_DATAh(push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s));
1116e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      PUSH_DATA (push, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(s));
1117e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      BEGIN_1IC0(push, NVC0_3D(CB_POS), 1 + 16 * NVC0_MAX_IMAGES);
1118e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      PUSH_DATA (push, NVC0_CB_AUX_SU_INFO(0));
1119e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset
1120e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      for (i = 0; i < NVC0_MAX_IMAGES; ++i) {
1121e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset         struct pipe_image_view *view = &nvc0->images[s][i];
1122e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset         if (view->resource) {
1123e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset            struct nv04_resource *res = nv04_resource(view->resource);
1124e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset
112528590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset            if (res->base.target == PIPE_BUFFER) {
112628590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset               if (view->access & PIPE_IMAGE_ACCESS_WRITE)
112728590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset                  nvc0_mark_image_range_valid(view);
112828590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset            }
112928590eb9492f2e06c95483df7bd7f67b0fee7b8eSamuel Pitoiset
11300d64d39e8188c797bc4f4bc7603cff6478972ae3Samuel Pitoiset            nve4_set_surface_info(push, view, nvc0);
1131e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset            BCTX_REFN(nvc0->bufctx_3d, 3D_SUF, res, RDWR);
1132e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset         } else {
1133e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset            for (j = 0; j < 16; j++)
1134e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset               PUSH_DATA(push, 0);
1135e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset         }
1136e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset      }
1137e28f247e249946d8c311b359d83ce34fd29e4a67Samuel Pitoiset   }
1138e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller}
1139e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1140e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillervoid
1141e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillernvc0_validate_surfaces(struct nvc0_context *nvc0)
1142e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{
1143e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   if (nvc0->screen->base.class_3d >= NVE4_3D_CLASS) {
1144e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      nve4_update_surface_bindings(nvc0);
1145e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   } else {
1146e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller      nvc0_update_surface_bindings(nvc0);
1147e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   }
1148e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller}
1149e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1150e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1151e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint8_t nve4_su_format_map[PIPE_FORMAT_COUNT] =
1152e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{
1153e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32G32B32A32_FLOAT] = GK104_IMAGE_FORMAT_RGBA32_FLOAT,
1154e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32G32B32A32_SINT] = GK104_IMAGE_FORMAT_RGBA32_SINT,
1155e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32G32B32A32_UINT] = GK104_IMAGE_FORMAT_RGBA32_UINT,
1156e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16B16A16_FLOAT] = GK104_IMAGE_FORMAT_RGBA16_FLOAT,
1157e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16B16A16_UNORM] = GK104_IMAGE_FORMAT_RGBA16_UNORM,
1158e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16B16A16_SNORM] = GK104_IMAGE_FORMAT_RGBA16_SNORM,
1159e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16B16A16_SINT] = GK104_IMAGE_FORMAT_RGBA16_SINT,
1160e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16B16A16_UINT] = GK104_IMAGE_FORMAT_RGBA16_UINT,
1161e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8B8A8_UNORM] = GK104_IMAGE_FORMAT_RGBA8_UNORM,
1162e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8B8A8_SNORM] = GK104_IMAGE_FORMAT_RGBA8_SNORM,
1163e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8B8A8_SINT] = GK104_IMAGE_FORMAT_RGBA8_SINT,
1164e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8B8A8_UINT] = GK104_IMAGE_FORMAT_RGBA8_UINT,
1165e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R11G11B10_FLOAT] = GK104_IMAGE_FORMAT_R11G11B10_FLOAT,
1166e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R10G10B10A2_UNORM] = GK104_IMAGE_FORMAT_RGB10_A2_UNORM,
11679bc18a48f3b5f311fd46946cac1efefac0de1f46Samuel Pitoiset   [PIPE_FORMAT_R10G10B10A2_UINT] = GK104_IMAGE_FORMAT_RGB10_A2_UINT,
1168e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32G32_FLOAT] = GK104_IMAGE_FORMAT_RG32_FLOAT,
1169e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32G32_SINT] = GK104_IMAGE_FORMAT_RG32_SINT,
1170e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32G32_UINT] = GK104_IMAGE_FORMAT_RG32_UINT,
1171e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16_FLOAT] = GK104_IMAGE_FORMAT_RG16_FLOAT,
1172e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16_UNORM] = GK104_IMAGE_FORMAT_RG16_UNORM,
1173e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16_SNORM] = GK104_IMAGE_FORMAT_RG16_SNORM,
1174e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16_SINT] = GK104_IMAGE_FORMAT_RG16_SINT,
1175e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16G16_UINT] = GK104_IMAGE_FORMAT_RG16_UINT,
1176e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8_UNORM] = GK104_IMAGE_FORMAT_RG8_UNORM,
1177e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8_SNORM] = GK104_IMAGE_FORMAT_RG8_SNORM,
1178e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8_SINT] = GK104_IMAGE_FORMAT_RG8_SINT,
1179e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8G8_UINT] = GK104_IMAGE_FORMAT_RG8_UINT,
1180e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32_FLOAT] = GK104_IMAGE_FORMAT_R32_FLOAT,
1181e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32_SINT] = GK104_IMAGE_FORMAT_R32_SINT,
1182e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R32_UINT] = GK104_IMAGE_FORMAT_R32_UINT,
1183e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16_FLOAT] = GK104_IMAGE_FORMAT_R16_FLOAT,
1184e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16_UNORM] = GK104_IMAGE_FORMAT_R16_UNORM,
1185e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16_SNORM] = GK104_IMAGE_FORMAT_R16_SNORM,
1186e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16_SINT] = GK104_IMAGE_FORMAT_R16_SINT,
1187e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R16_UINT] = GK104_IMAGE_FORMAT_R16_UINT,
1188e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8_UNORM] = GK104_IMAGE_FORMAT_R8_UNORM,
1189e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8_SNORM] = GK104_IMAGE_FORMAT_R8_SNORM,
1190e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8_SINT] = GK104_IMAGE_FORMAT_R8_SINT,
1191e8eda47898e10c78ea02640ecb0537840a21f4fbBen Skeggs   [PIPE_FORMAT_R8_UINT] = GK104_IMAGE_FORMAT_R8_UINT,
1192e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller};
1193e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1194e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller/* Auxiliary format description values for surface instructions.
1195e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller * (log2(bytes per pixel) << 12) | (unk8 << 8) | unk22
1196e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller */
1197e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_su_format_aux_map[PIPE_FORMAT_COUNT] =
1198e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{
1199e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32B32A32_FLOAT] = 0x4842,
1200e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32B32A32_SINT] = 0x4842,
1201e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32B32A32_UINT] = 0x4842,
1202e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1203e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_UNORM] = 0x3933,
1204e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_SNORM] = 0x3933,
1205e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_SINT] = 0x3933,
1206e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_UINT] = 0x3933,
1207e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_FLOAT] = 0x3933,
1208e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1209e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32_FLOAT] = 0x3433,
1210e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32_SINT] = 0x3433,
1211e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32_UINT] = 0x3433,
1212e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1213e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R10G10B10A2_UNORM] = 0x2a24,
12149bc18a48f3b5f311fd46946cac1efefac0de1f46Samuel Pitoiset   [PIPE_FORMAT_R10G10B10A2_UINT] = 0x2a24,
1215e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_UNORM] = 0x2a24,
1216e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_SNORM] = 0x2a24,
1217e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_SINT] = 0x2a24,
1218e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_UINT] = 0x2a24,
1219e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R11G11B10_FLOAT] = 0x2a24,
1220e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1221e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_UNORM] = 0x2524,
1222e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_SNORM] = 0x2524,
1223e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_SINT] = 0x2524,
1224e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_UINT] = 0x2524,
1225e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_FLOAT] = 0x2524,
1226e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1227e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32_SINT] = 0x2024,
1228e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32_UINT] = 0x2024,
1229e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32_FLOAT] = 0x2024,
1230e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1231e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_UNORM] = 0x1615,
1232e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_SNORM] = 0x1615,
1233e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_SINT] = 0x1615,
1234e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_UINT] = 0x1615,
1235e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1236e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_UNORM] = 0x1115,
1237e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_SNORM] = 0x1115,
1238e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_SINT] = 0x1115,
1239e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_UINT] = 0x1115,
1240e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_FLOAT] = 0x1115,
1241e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1242e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_UNORM] = 0x0206,
1243e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_SNORM] = 0x0206,
1244e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_SINT] = 0x0206,
1245e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_UINT] = 0x0206
1246e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller};
1247e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller
1248e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller/* NOTE: These are hardcoded offsets for the shader library.
1249e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller * TODO: Automate them.
1250e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller */
1251e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumillerstatic const uint16_t nve4_suldp_lib_offset[PIPE_FORMAT_COUNT] =
1252e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller{
1253e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32B32A32_FLOAT] = 0x218,
1254e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32B32A32_SINT]  = 0x218,
1255e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32B32A32_UINT]  = 0x218,
1256e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_UNORM] = 0x248,
1257e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_SNORM] = 0x2b8,
1258e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_SINT]  = 0x330,
1259e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_UINT]  = 0x388,
1260e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16B16A16_FLOAT] = 0x3d8,
1261e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32_FLOAT]       = 0x428,
1262e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32_SINT]        = 0x468,
1263e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32G32_UINT]        = 0x468,
1264e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R10G10B10A2_UNORM]  = 0x4a8,
12659bc18a48f3b5f311fd46946cac1efefac0de1f46Samuel Pitoiset   [PIPE_FORMAT_R10G10B10A2_UINT]   = 0x530,
1266e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_UNORM]     = 0x588,
1267e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_SNORM]     = 0x5f8,
1268e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_SINT]      = 0x670,
1269e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8B8A8_UINT]      = 0x6c8,
1270e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_B5G6R5_UNORM]       = 0x718,
1271e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_B5G5R5X1_UNORM]     = 0x7a0,
1272e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_UNORM]       = 0x828,
1273e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_SNORM]       = 0x890,
1274e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_SINT]        = 0x8f0,
1275e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_UINT]        = 0x948,
1276e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16G16_FLOAT]       = 0x998,
1277e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32_FLOAT]          = 0x9e8,
1278e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32_SINT]           = 0xa30,
1279e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R32_UINT]           = 0xa30,
1280e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_UNORM]         = 0xa78,
1281e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_SNORM]         = 0xae0,
1282e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_UINT]          = 0xb48,
1283e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8G8_SINT]          = 0xb98,
1284e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_UNORM]          = 0xbe8,
1285e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_SNORM]          = 0xc48,
1286e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_SINT]           = 0xca0,
1287e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_UINT]           = 0xce8,
1288e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R16_FLOAT]          = 0xd30,
1289e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_UNORM]           = 0xd88,
1290e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_SNORM]           = 0xde0,
1291e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_SINT]            = 0xe38,
1292e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R8_UINT]            = 0xe88,
1293e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller   [PIPE_FORMAT_R11G11B10_FLOAT]    = 0xed0
1294e066f2f62f6043d43385bcdce4e7fa07ffa3ecbeChristoph Bumiller};
1295