15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2008 Ben Skeggs
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the "Software"),
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to deal in the Software without restriction, including without limitation
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the rights to use, copy, modify, merge, publish, distribute, sublicense,
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and/or sell copies of the Software, and to permit persons to whom the
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Software is furnished to do so, subject to the following conditions:
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice shall be included in
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies or substantial portions of the Software.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOFTWARE.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pipe/p_defines.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_inlines.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_pack_color.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_format.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_surface.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nvc0_context.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nvc0_resource.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nv50/nv50_defs.xml.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nv50/nv50_texture.xml.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NVC0_ENG2D_SUPPORTED_FORMATS 0xff9ccfe1cce3ccc9ULL
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* return TRUE for formats that can be converted among each other by NVC0_2D */
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static INLINE boolean
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_2d_format_faithful(enum pipe_format format)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint8_t id = nvc0_format_table[format].rt;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (id >= 0xc0) && (NVC0_ENG2D_SUPPORTED_FORMATS & (1ULL << (id - 0xc0)));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static INLINE uint8_t
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_2d_format(enum pipe_format format)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint8_t id = nvc0_format_table[format].rt;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Hardware values for color formats range from 0xc0 to 0xff,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * but the 2D engine doesn't support all of them.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (nvc0_2d_format_faithful(format))
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return id;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (util_format_get_blocksize(format)) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 1:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NV50_SURFACE_FORMAT_R8_UNORM;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 2:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NV50_SURFACE_FORMAT_R16_UNORM;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 4:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NV50_SURFACE_FORMAT_BGRA8_UNORM;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 8:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NV50_SURFACE_FORMAT_RGBA16_UNORM;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case 16:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NV50_SURFACE_FORMAT_RGBA32_FLOAT;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_2d_texture_set(struct nouveau_pushbuf *push, boolean dst,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    struct nv50_miptree *mt, unsigned level, unsigned layer)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nouveau_bo *bo = mt->base.bo;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t width, height, depth;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t format;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t mthd = dst ? NVC0_2D_DST_FORMAT : NVC0_2D_SRC_FORMAT;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t offset = mt->level[level].offset;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   format = nvc0_2d_format(mt->base.base.format);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!format) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOUVEAU_ERR("invalid/unsupported surface format: %s\n",
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  util_format_name(mt->base.base.format));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   width = u_minify(mt->base.base.width0, level) << mt->ms_x;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   height = u_minify(mt->base.base.height0, level) << mt->ms_y;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   depth = u_minify(mt->base.base.depth0, level);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* layer has to be < depth, and depth > tile depth / 2 */
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!mt->layout_3d) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset += mt->layer_stride * layer;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layer = 0;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      depth = 1;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!dst) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset += nvc0_mt_zslice_offset(mt, level, layer);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layer = 0;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (nouveau_bo_memtype(bo)) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, SUBC_2D(mthd), 2);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, format);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, 1);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, SUBC_2D(mthd + 0x14), 5);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, mt->level[level].pitch);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, width);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, height);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATAh(push, bo->offset + offset);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, bo->offset + offset);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, SUBC_2D(mthd), 5);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, format);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, 0);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, mt->level[level].tile_mode);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, depth);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, layer);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, SUBC_2D(mthd + 0x18), 4);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, width);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, height);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATAh(push, bo->offset + offset);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, bo->offset + offset);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (dst) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, SUBC_2D(NVC0_2D_CLIP_X), 4);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, 0);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, 0);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, width);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, height);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return 0;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_2d_texture_do_copy(struct nouveau_pushbuf *push,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        struct nv50_miptree *dst, unsigned dst_level,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        unsigned dx, unsigned dy, unsigned dz,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        struct nv50_miptree *src, unsigned src_level,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        unsigned sx, unsigned sy, unsigned sz,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        unsigned w, unsigned h)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   static const uint32_t duvdxy[5] =
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x40000000, 0x80000000, 0x00000001, 0x00000002, 0x00000004
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   };
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int ret;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t ctrl = 0x00;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ret = PUSH_SPACE(push, 2 * 16 + 32);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ret;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ret = nvc0_2d_texture_set(push, TRUE, dst, dst_level, dz);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ret;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ret = nvc0_2d_texture_set(push, FALSE, src, src_level, sz);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ret)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ret;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* NOTE: 2D engine doesn't work for MS8 */
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (src->ms_x)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ctrl = 0x11;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* 0/1 = CENTER/CORNER, 00/10 = POINT/BILINEAR */
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_2D(BLIT_CONTROL), 1);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, ctrl);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_2D(BLIT_DST_X), 4);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, dx << dst->ms_x);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, dy << dst->ms_y);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, w << dst->ms_x);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, h << dst->ms_y);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_2D(BLIT_DU_DX_FRACT), 4);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, duvdxy[2 + ((int)src->ms_x - (int)dst->ms_x)] & 0xf0000000);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, duvdxy[2 + ((int)src->ms_x - (int)dst->ms_x)] & 0x0000000f);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, duvdxy[2 + ((int)src->ms_y - (int)dst->ms_y)] & 0xf0000000);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, duvdxy[2 + ((int)src->ms_y - (int)dst->ms_y)] & 0x0000000f);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_2D(BLIT_SRC_X_FRACT), 4);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, sx << src->ms_x);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, sy << src->ms_x);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return 0;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_resource_copy_region(struct pipe_context *pipe,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          struct pipe_resource *dst, unsigned dst_level,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          unsigned dstx, unsigned dsty, unsigned dstz,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          struct pipe_resource *src, unsigned src_level,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const struct pipe_box *src_box)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_context *nvc0 = nvc0_context(pipe);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int ret;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   boolean m2mf;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned dst_layer = dstz, src_layer = src_box->z;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Fallback for buffers. */
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                src, src_level, src_box);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* 0 and 1 are equal, only supporting 0/1, 2, 4 and 8 */
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert((src->nr_samples | 1) == (dst->nr_samples | 1));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   m2mf = (src->format == dst->format) ||
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (util_format_get_blocksizebits(src->format) ==
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       util_format_get_blocksizebits(dst->format));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nv04_resource(dst)->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (m2mf) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nv50_m2mf_rect drect, srect;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned i;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned nx = util_format_get_nblocksx(src->format, src_box->width);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned ny = util_format_get_nblocksy(src->format, src_box->height);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nv50_m2mf_rect_setup(&drect, dst, dst_level, dstx, dsty, dstz);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nv50_m2mf_rect_setup(&srect, src, src_level,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           src_box->x, src_box->y, src_box->z);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < src_box->depth; ++i) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         nvc0->m2mf_copy_rect(nvc0, &drect, &srect, nx, ny);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (nv50_miptree(dst)->layout_3d)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            drect.z++;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            drect.base += nv50_miptree(dst)->layer_stride;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (nv50_miptree(src)->layout_3d)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            srect.z++;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            srect.base += nv50_miptree(src)->layer_stride;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(nvc0_2d_format_faithful(src->format));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(nvc0_2d_format_faithful(dst->format));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BCTX_REFN(nvc0->bufctx, 2D, nv04_resource(src), RD);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BCTX_REFN(nvc0->bufctx, 2D, nv04_resource(dst), WR);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nouveau_pushbuf_validate(nvc0->base.pushbuf);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (; dst_layer < dstz + src_box->depth; ++dst_layer, ++src_layer) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ret = nvc0_2d_texture_do_copy(nvc0->base.pushbuf,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    nv50_miptree(dst), dst_level,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    dstx, dsty, dst_layer,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    nv50_miptree(src), src_level,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    src_box->x, src_box->y, src_layer,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    src_box->width, src_box->height);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ret)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nouveau_bufctx_reset(nvc0->bufctx, 0);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_clear_render_target(struct pipe_context *pipe,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         struct pipe_surface *dst,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const union pipe_color_union *color,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         unsigned dstx, unsigned dsty,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         unsigned width, unsigned height)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_context *nvc0 = nvc0_context(pipe);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nv50_surface *sf = nv50_surface(dst);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nv04_resource *res = nv04_resource(sf->base.texture);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned z;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(CLEAR_COLOR(0)), 4);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, color->f[0]);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, color->f[1]);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, color->f[2]);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, color->f[3]);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(SCREEN_SCISSOR_HORIZ), 2);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, ( width << 16) | dstx);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, (height << 16) | dsty);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(RT_CONTROL), 1);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 1);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(0)), 9);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAh(push, res->address + sf->offset);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, res->address + sf->offset);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (likely(nouveau_bo_memtype(res->bo))) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nv50_miptree *mt = nv50_miptree(dst->texture);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, sf->width);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, sf->height);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, nvc0_format_table[dst->format].rt);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, (mt->layout_3d << 16) |
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               mt->level[sf->base.u.tex.level].tile_mode);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, dst->u.tex.first_layer + sf->depth);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, mt->layer_stride >> 2);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, dst->u.tex.first_layer);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (res->base.target == PIPE_BUFFER) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         PUSH_DATA(push, 262144);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         PUSH_DATA(push, 1);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         PUSH_DATA(push, nv50_miptree(&res->base)->level[0].pitch);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         PUSH_DATA(push, sf->height);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, nvc0_format_table[sf->base.format].rt);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, 1 << 12);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, 1);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, 0);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA(push, 0);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IMMED_NVC0(push, NVC0_3D(ZETA_ENABLE), 0);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* tiled textures don't have to be fenced, they're not mapped directly */
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0_resource_fence(res, NOUVEAU_BO_WR);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (z = 0; z < sf->depth; ++z) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, 0x3c |
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (z << NVC0_3D_CLEAR_BUFFERS_LAYER__SHIFT));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->dirty |= NVC0_NEW_FRAMEBUFFER;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_clear_depth_stencil(struct pipe_context *pipe,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         struct pipe_surface *dst,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         unsigned clear_flags,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         double depth,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         unsigned stencil,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         unsigned dstx, unsigned dsty,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         unsigned width, unsigned height)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct nvc0_context *nvc0 = nvc0_context(pipe);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct nouveau_pushbuf *push = nvc0->base.pushbuf;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct nv50_miptree *mt = nv50_miptree(dst->texture);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	struct nv50_surface *sf = nv50_surface(dst);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	uint32_t mode = 0;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int unk = mt->base.base.target == PIPE_TEXTURE_2D;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	unsigned z;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (clear_flags & PIPE_CLEAR_DEPTH) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BEGIN_NVC0(push, NVC0_3D(CLEAR_DEPTH), 1);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PUSH_DATAf(push, depth);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		mode |= NVC0_3D_CLEAR_BUFFERS_Z;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (clear_flags & PIPE_CLEAR_STENCIL) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BEGIN_NVC0(push, NVC0_3D(CLEAR_STENCIL), 1);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PUSH_DATA (push, stencil & 0xff);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		mode |= NVC0_3D_CLEAR_BUFFERS_S;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BEGIN_NVC0(push, NVC0_3D(SCREEN_SCISSOR_HORIZ), 2);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, ( width << 16) | dstx);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, (height << 16) | dsty);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BEGIN_NVC0(push, NVC0_3D(ZETA_ADDRESS_HIGH), 5);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATAh(push, mt->base.address + sf->offset);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, mt->base.address + sf->offset);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, nvc0_format_table[dst->format].rt);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, mt->level[sf->base.u.tex.level].tile_mode);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, mt->layer_stride >> 2);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BEGIN_NVC0(push, NVC0_3D(ZETA_ENABLE), 1);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, 1);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BEGIN_NVC0(push, NVC0_3D(ZETA_HORIZ), 3);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, sf->width);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, sf->height);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, (unk << 16) | (dst->u.tex.first_layer + sf->depth));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	BEGIN_NVC0(push, NVC0_3D(ZETA_BASE_LAYER), 1);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	PUSH_DATA (push, dst->u.tex.first_layer);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (z = 0; z < sf->depth; ++z) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		PUSH_DATA (push, mode |
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   (z << NVC0_3D_CLEAR_BUFFERS_LAYER__SHIFT));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nvc0->dirty |= NVC0_NEW_FRAMEBUFFER;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_clear(struct pipe_context *pipe, unsigned buffers,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           const union pipe_color_union *color,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           double depth, unsigned stencil)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_context *nvc0 = nvc0_context(pipe);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_framebuffer_state *fb = &nvc0->framebuffer;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned i;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t mode = 0;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* don't need NEW_BLEND, COLOR_MASK doesn't affect CLEAR_BUFFERS */
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!nvc0_state_validate(nvc0, NVC0_NEW_FRAMEBUFFER, 9 + (fb->nr_cbufs * 2)))
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, NVC0_3D(CLEAR_COLOR(0)), 4);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATAf(push, color->f[0]);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATAf(push, color->f[1]);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATAf(push, color->f[2]);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATAf(push, color->f[3]);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode =
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         NVC0_3D_CLEAR_BUFFERS_R | NVC0_3D_CLEAR_BUFFERS_G |
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         NVC0_3D_CLEAR_BUFFERS_B | NVC0_3D_CLEAR_BUFFERS_A;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (buffers & PIPE_CLEAR_DEPTH) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, NVC0_3D(CLEAR_DEPTH), 1);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, fui(depth));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode |= NVC0_3D_CLEAR_BUFFERS_Z;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (buffers & PIPE_CLEAR_STENCIL) {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, NVC0_3D(CLEAR_STENCIL), 1);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, stencil & 0xff);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode |= NVC0_3D_CLEAR_BUFFERS_S;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, mode);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = 1; i < fb->nr_cbufs; i++) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PUSH_DATA (push, (i << 6) | 0x3c);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct nvc0_blitctx
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_screen *screen;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct pipe_framebuffer_state fb;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nvc0_program *vp;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nvc0_program *tcp;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nvc0_program *tep;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nvc0_program *gp;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nvc0_program *fp;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned num_textures[5];
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned num_samplers[5];
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct pipe_sampler_view *texture[2];
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct nv50_tsc_entry *sampler[2];
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned dirty;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } saved;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_program vp;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_program fp;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nv50_tsc_entry sampler[2]; /* nearest, bilinear */
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint32_t fp_offset;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint16_t color_mask;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uint8_t filter;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_make_vp(struct nvc0_blitctx *blit)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   static const uint32_t code[] =
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff01c66, 0x06000080, /* vfetch b128 { $r0 $r1 $r2 $r3 } a[0x80] */
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff11c26, 0x06000090, /* vfetch b64 { $r4 $r5 } a[0x90]*/
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x03f01c66, 0x0a7e0070, /* export b128 o[0x70] { $r0 $r1 $r2 $r3 } */
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x13f01c26, 0x0a7e0080, /* export b64 o[0x80] { $r4 $r5 } */
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de7, 0x80000000, /* exit */
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   };
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.type = PIPE_SHADER_VERTEX;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.translated = TRUE;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.code = (uint32_t *)code; /* no relocations -> no modification */
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.code_size = sizeof(code);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.max_gpr = 6;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.vp.edgeflag = PIPE_MAX_ATTRIBS;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.hdr[0]  = 0x00020461; /* vertprog magic */
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.hdr[4]  = 0x000ff000; /* no outputs read */
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.hdr[6]  = 0x0000003f; /* a[0x80], a[0x90] */
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->vp.hdr[13] = 0x0003f000; /* o[0x70], o[0x80] */
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_make_fp(struct nvc0_blitctx *blit)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   static const uint32_t code_nvc0[] = /* use nvc0dis */
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* 2 coords RGBA in, RGBA out, also for Z32_FLOAT(_S8X24_UINT)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * NOTE:
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * NVC0 doesn't like tex 3d on non-3d textures, but there should
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * only be 2d and 2d-array MS resources anyway.
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff01c00, 0xc07e0080,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff05c00, 0xc07e0084,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001e86, 0x8013c000,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de7, 0x80000000,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* size: 0x70 + padding  */
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, 0, 0, 0,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* 2 coords ZS in, S encoded in R, Z encoded in GBA (8_UNORM)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * Setup float outputs in a way that conversion to UNORM yields the
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * desired byte value.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* NOTE: need to repeat header */
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00021462, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x80000000, 0x0000000f, 0x00000000, 0x00000000, 0x00000000,
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x0000000f, 0x00000000,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff09c00, 0xc07e0080,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff0dc00, 0xc07e0084,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00201e86, 0x80104000,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00205f06, 0x80104101,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc009c02, 0x312dffff,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x05001c88,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09009e88,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04001c02, 0x30ee0202,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc205c02, 0x38000003,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0020dc02, 0x3803fc00,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00209c02, 0x380003fc,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x05005c88,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0d00dc88,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09209e04, 0x18000000,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04105c02, 0x30ee0202,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0430dc02, 0x30ce0202,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04209c02, 0x30de0202,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de7, 0x80000000,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* size: 0xd0 + padding */
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* 2 coords ZS in, Z encoded in RGB, S encoded in A (U8_UNORM) */
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00021462, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x80000000, 0x0000000f, 0x00000000, 0x00000000, 0x00000000,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x0000000f, 0x00000000,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff09c00, 0xc07e0080,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff0dc00, 0xc07e0084,
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00201e86, 0x80104000,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00205f06, 0x80104101,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc009c02, 0x312dffff,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0500dc88,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09009e88,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0430dc02, 0x30ee0202,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc201c02, 0x38000003,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00205c02, 0x380003fc,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00209c02, 0x3803fc00,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x01001c88,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x05005c88,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09209e04, 0x18000000,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04001c02, 0x30ee0202,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04105c02, 0x30de0202,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04209c02, 0x30ce0202,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de7, 0x80000000,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   };
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   static const uint32_t code_nve4[] = /* use nvc0dis */
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* 2 coords RGBA in, RGBA out, also for Z32_FLOAT(_S8X24_UINT)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * NOTE:
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * NVC0 doesn't like tex 3d on non-3d textures, but there should
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * only be 2d and 2d-array MS resources anyway.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x2202e237, 0x200002ec,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff01c00, 0xc07e0080,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff05c00, 0xc07e0084,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001e86, 0x8013c000,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de6, 0xf0000000,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de7, 0x80000000,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* size: 0x80 */
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* 2 coords ZS in, S encoded in R, Z encoded in GBA (8_UNORM)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * Setup float outputs in a way that conversion to UNORM yields the
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * desired byte value.
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* NOTE: need to repeat header */
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00021462, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x80000000, 0x0000000f, 0x00000000, 0x00000000, 0x00000000,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x0000000f, 0x00000000,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0202e237, 0x22804c22,
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff09c00, 0xc07e0080,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff0dc00, 0xc07e0084,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00201e86, 0x80104008,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00205f06, 0x80104009,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de6, 0xf0000000,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc009c02, 0x312dffff,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x05201e04, 0x18000000,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00428047, 0x22020272,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09209c84, 0x14000000,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04001c02, 0x30ee0202,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc205c02, 0x38000003,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0020dc02, 0x3803fc00,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00209c02, 0x380003fc,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x05205e04, 0x18000000,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0d20de04, 0x18000000,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x42004277, 0x200002e0,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09209e04, 0x18000000,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04105c02, 0x30ee0202,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0430dc02, 0x30ce0202,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04209c02, 0x30de0202,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de7, 0x80000000,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* size: 0x100 */
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* 2 coords ZS in, Z encoded in RGB, S encoded in A (U8_UNORM) */
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00021462, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x80000000, 0x0000000f, 0x00000000, 0x00000000, 0x00000000,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00000000, 0x00000000, 0x00000000, 0x0000000f, 0x00000000,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0202e237, 0x22804c22,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff09c00, 0xc07e0080,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfff0dc00, 0xc07e0084,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00201e86, 0x80104008,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00205f06, 0x80104009,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de6, 0xf0000000,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc009c02, 0x312dffff,
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0520de04, 0x18000000,
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00428047, 0x22020272,
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09209c84, 0x14000000,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x0430dc02, 0x30ee0202,
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xfc201c02, 0x38000003,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00205c02, 0x380003fc,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00209c02, 0x3803fc00,
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x01201e04, 0x18000000,
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x05205e04, 0x18000000,
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x42004277, 0x200002e0,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x09209e04, 0x18000000,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04001c02, 0x30ee0202,
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04105c02, 0x30de0202,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x04209c02, 0x30ce0202,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x00001de7, 0x80000000,
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   };
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->fp.type = PIPE_SHADER_FRAGMENT;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->fp.translated = TRUE;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (blit->screen->base.class_3d >= NVE4_3D_CLASS) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->fp.code = (uint32_t *)code_nve4; /* const_cast */
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->fp.code_size = sizeof(code_nve4);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->fp.code = (uint32_t *)code_nvc0; /* const_cast */
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->fp.code_size = sizeof(code_nvc0);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->fp.max_gpr = 4;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->fp.hdr[0]  = 0x00021462; /* fragprog magic */
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->fp.hdr[5]  = 0x80000000;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->fp.hdr[6]  = 0x0000000f; /* 2 linear */
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->fp.hdr[18] = 0x0000000f; /* 1 colour output */
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_make_sampler(struct nvc0_blitctx *blit)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* clamp to edge, min/max lod = 0, nearest filtering */
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->sampler[0].id = -1;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->sampler[0].tsc[0] = NV50_TSC_0_SRGB_CONVERSION_ALLOWED |
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (NV50_TSC_WRAP_CLAMP_TO_EDGE << NV50_TSC_0_WRAPS__SHIFT) |
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (NV50_TSC_WRAP_CLAMP_TO_EDGE << NV50_TSC_0_WRAPT__SHIFT) |
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (NV50_TSC_WRAP_CLAMP_TO_EDGE << NV50_TSC_0_WRAPR__SHIFT);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->sampler[0].tsc[1] =
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NV50_TSC_1_MAGF_NEAREST | NV50_TSC_1_MINF_NEAREST | NV50_TSC_1_MIPF_NONE;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* clamp to edge, min/max lod = 0, bilinear filtering */
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->sampler[1].id = -1;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->sampler[1].tsc[0] = blit->sampler[0].tsc[0];
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->sampler[1].tsc[1] =
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NV50_TSC_1_MAGF_LINEAR | NV50_TSC_1_MINF_LINEAR | NV50_TSC_1_MIPF_NONE;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Since shaders cannot export stencil, we cannot copy stencil values when
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rendering to ZETA, so we attach the ZS surface to a colour render target.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static INLINE enum pipe_format
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blit_zeta_to_colour_format(enum pipe_format format)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (format) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_Z16_UNORM:               return PIPE_FORMAT_R16_UNORM;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_S8_UINT_Z24_UNORM:
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_Z24X8_UNORM:             return PIPE_FORMAT_R8G8B8A8_UNORM;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_Z32_FLOAT:               return PIPE_FORMAT_R32_FLOAT;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:    return PIPE_FORMAT_R32G32_FLOAT;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(0);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PIPE_FORMAT_NONE;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_get_color_mask_and_fp(struct nvc0_blitctx *blit,
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   enum pipe_format format, uint8_t mask)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->color_mask = 0;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (format) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_Z24X8_UNORM:
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->fp_offset = 0x180;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & PIPE_MASK_Z)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         blit->color_mask |= 0x0111;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & PIPE_MASK_S)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         blit->color_mask |= 0x1000;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case PIPE_FORMAT_S8_UINT_Z24_UNORM:
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->fp_offset = 0x80;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & PIPE_MASK_Z)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         blit->color_mask |= 0x1110;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & PIPE_MASK_S)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         blit->color_mask |= 0x0001;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->fp_offset = 0;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & (PIPE_MASK_R | PIPE_MASK_Z)) blit->color_mask |= 0x0001;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & (PIPE_MASK_G | PIPE_MASK_S)) blit->color_mask |= 0x0010;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & PIPE_MASK_B) blit->color_mask |= 0x0100;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (mask & PIPE_MASK_A) blit->color_mask |= 0x1000;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blit_set_dst(struct nvc0_context *nvc0,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  struct pipe_resource *res, unsigned level, unsigned layer)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_context *pipe = &nvc0->base.pipe;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_surface templ;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (util_format_is_depth_or_stencil(res->format))
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      templ.format = nvc0_blit_zeta_to_colour_format(res->format);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      templ.format = res->format;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.usage = PIPE_USAGE_STREAM;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.u.tex.level = level;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.u.tex.first_layer = templ.u.tex.last_layer = layer;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.cbufs[0] = nvc0_miptree_surface_new(pipe, res, &templ);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.nr_cbufs = 1;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.zsbuf = NULL;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.width = nvc0->framebuffer.cbufs[0]->width;
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.height = nvc0->framebuffer.cbufs[0]->height;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static INLINE void
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blit_fixup_tic_entry(struct pipe_sampler_view *view, const boolean filter)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nv50_tic_entry *ent = nv50_tic_entry(view);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ent->tic[2] &= ~(1 << 31); /* scaled coordinates, ok with 3d textures ? */
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* magic: */
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (filter) {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* affects quality of near vertical edges in MS8: */
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ent->tic[3] = 0x20000000;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ent->tic[3] = 0;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ent->tic[6] = 0;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blit_set_src(struct nvc0_context *nvc0,
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  struct pipe_resource *res, unsigned level, unsigned layer,
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const boolean filter)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_context *pipe = &nvc0->base.pipe;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_sampler_view templ;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int s;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.format = res->format;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.u.tex.first_layer = templ.u.tex.last_layer = layer;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.u.tex.first_level = templ.u.tex.last_level = level;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.swizzle_r = PIPE_SWIZZLE_RED;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.swizzle_g = PIPE_SWIZZLE_GREEN;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.swizzle_b = PIPE_SWIZZLE_BLUE;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.swizzle_a = PIPE_SWIZZLE_ALPHA;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->textures[4][0] = nvc0_create_sampler_view(pipe, res, &templ);
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->textures[4][1] = NULL;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blit_fixup_tic_entry(nvc0->textures[4][0], filter);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (s = 0; s <= 3; ++s)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->num_textures[s] = 0;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->num_textures[4] = 1;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.format = nv50_zs_to_s_format(res->format);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (templ.format != res->format) {
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->textures[4][1] = nvc0_create_sampler_view(pipe, res, &templ);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0_blit_fixup_tic_entry(nvc0->textures[4][1], filter);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->num_textures[4] = 2;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_prepare_state(struct nvc0_blitctx *blit)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nouveau_pushbuf *push = blit->screen->base.pushbuf;
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* TODO: maybe make this a MACRO (if we need more logic) ? */
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* blend state */
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(COLOR_MASK(0)), 1);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, blit->color_mask);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(BLEND_ENABLE(0)), 1);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(LOGIC_OP_ENABLE), 0);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* rasterizer state */
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(FRAG_COLOR_CLAMP_EN), 1);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(MULTISAMPLE_ENABLE), 0);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(MSAA_MASK(0)), 4);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0xffff);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0xffff);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0xffff);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0xffff);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(MACRO_POLYGON_MODE_FRONT), 1);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, NVC0_3D_MACRO_POLYGON_MODE_FRONT_FILL);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(MACRO_POLYGON_MODE_BACK), 1);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, NVC0_3D_MACRO_POLYGON_MODE_BACK_FILL);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(POLYGON_SMOOTH_ENABLE), 0);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(POLYGON_OFFSET_FILL_ENABLE), 0);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(POLYGON_STIPPLE_ENABLE), 0);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(CULL_FACE_ENABLE), 0);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* zsa state */
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(DEPTH_TEST_ENABLE), 0);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(STENCIL_ENABLE), 0);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(ALPHA_TEST_ENABLE), 0);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* disable transform feedback */
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(TFB_ENABLE), 0);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_pre_blit(struct nvc0_blitctx *blit, struct nvc0_context *nvc0)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int s;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.fb.width = nvc0->framebuffer.width;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.fb.height = nvc0->framebuffer.height;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.fb.nr_cbufs = nvc0->framebuffer.nr_cbufs;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.fb.cbufs[0] = nvc0->framebuffer.cbufs[0];
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.fb.zsbuf = nvc0->framebuffer.zsbuf;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.vp = nvc0->vertprog;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.tcp = nvc0->tctlprog;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.tep = nvc0->tevlprog;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.gp = nvc0->gmtyprog;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.fp = nvc0->fragprog;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->vertprog = &blit->vp;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->fragprog = &blit->fp;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->tctlprog = NULL;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->tevlprog = NULL;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->gmtyprog = NULL;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (s = 0; s <= 4; ++s) {
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->saved.num_textures[s] = nvc0->num_textures[s];
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blit->saved.num_samplers[s] = nvc0->num_samplers[s];
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->textures_dirty[s] = (1 << nvc0->num_textures[s]) - 1;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->samplers_dirty[s] = (1 << nvc0->num_samplers[s]) - 1;
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.texture[0] = nvc0->textures[4][0];
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.texture[1] = nvc0->textures[4][1];
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.sampler[0] = nvc0->samplers[4][0];
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.sampler[1] = nvc0->samplers[4][1];
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->samplers[4][0] = &blit->sampler[blit->filter];
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->samplers[4][1] = &blit->sampler[blit->filter];
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (s = 0; s <= 3; ++s)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->num_samplers[s] = 0;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->num_samplers[4] = 2;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->saved.dirty = nvc0->dirty;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->textures_dirty[4] |= 3;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->samplers_dirty[4] |= 3;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->dirty = NVC0_NEW_FRAMEBUFFER |
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NVC0_NEW_VERTPROG | NVC0_NEW_FRAGPROG |
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NVC0_NEW_TCTLPROG | NVC0_NEW_TEVLPROG | NVC0_NEW_GMTYPROG |
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NVC0_NEW_TEXTURES | NVC0_NEW_SAMPLERS;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_post_blit(struct nvc0_context *nvc0, struct nvc0_blitctx *blit)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int s;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe_surface_reference(&nvc0->framebuffer.cbufs[0], NULL);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.width = blit->saved.fb.width;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.height = blit->saved.fb.height;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.nr_cbufs = blit->saved.fb.nr_cbufs;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.cbufs[0] = blit->saved.fb.cbufs[0];
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->framebuffer.zsbuf = blit->saved.fb.zsbuf;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->vertprog = blit->saved.vp;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->tctlprog = blit->saved.tcp;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->tevlprog = blit->saved.tep;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->gmtyprog = blit->saved.gp;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->fragprog = blit->saved.fp;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe_sampler_view_reference(&nvc0->textures[4][0], NULL);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe_sampler_view_reference(&nvc0->textures[4][1], NULL);
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (s = 0; s <= 4; ++s) {
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->num_textures[s] = blit->saved.num_textures[s];
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->num_samplers[s] = blit->saved.num_samplers[s];
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->textures_dirty[s] = (1 << nvc0->num_textures[s]) - 1;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nvc0->samplers_dirty[s] = (1 << nvc0->num_samplers[s]) - 1;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->textures[4][0] = blit->saved.texture[0];
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->textures[4][1] = blit->saved.texture[1];
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->samplers[4][0] = blit->saved.sampler[0];
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->samplers[4][1] = blit->saved.sampler[1];
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->textures_dirty[4] |= 3;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->samplers_dirty[4] |= 3;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0->dirty = blit->saved.dirty |
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (NVC0_NEW_FRAMEBUFFER | NVC0_NEW_SCISSOR | NVC0_NEW_SAMPLE_MASK |
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       NVC0_NEW_RASTERIZER | NVC0_NEW_ZSA | NVC0_NEW_BLEND |
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       NVC0_NEW_TEXTURES | NVC0_NEW_SAMPLERS |
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       NVC0_NEW_VERTPROG | NVC0_NEW_FRAGPROG |
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       NVC0_NEW_TCTLPROG | NVC0_NEW_TEVLPROG | NVC0_NEW_GMTYPROG |
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       NVC0_NEW_TFB_TARGETS);
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_resource_resolve(struct pipe_context *pipe,
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const struct pipe_resolve_info *info)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_context *nvc0 = nvc0_context(pipe);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_screen *screen = nvc0->screen;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nvc0_blitctx *blit = screen->blitctx;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct nouveau_pushbuf *push = screen->base.pushbuf;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_resource *src = info->src.res;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_resource *dst = info->dst.res;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   float x0, x1, y0, y1;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   float x_range, y_range;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Would need more shader variants or, better, just change the TIC target.
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * But no API creates 3D MS textures ...
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (src->target == PIPE_TEXTURE_3D)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blitctx_get_color_mask_and_fp(blit, dst->format, info->mask);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   blit->filter = util_format_is_depth_or_stencil(dst->format) ? 0 : 1;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blitctx_pre_blit(blit, nvc0);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blit_set_dst(nvc0, dst, info->dst.level, info->dst.layer);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blit_set_src(nvc0, src, 0,               info->src.layer, blit->filter);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blitctx_prepare_state(blit);
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_state_validate(nvc0, ~0, 36);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   x_range =
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (float)(info->src.x1 - info->src.x0) /
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (float)(info->dst.x1 - info->dst.x0);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   y_range =
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (float)(info->src.y1 - info->src.y0) /
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (float)(info->dst.y1 - info->dst.y0);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   x0 = (float)info->src.x0 - x_range * (float)info->dst.x0;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   y0 = (float)info->src.y0 - y_range * (float)info->dst.y0;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   x1 = x0 + 16384.0f * x_range;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   y1 = y0 + 16384.0f * y_range;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   x0 *= (float)(1 << nv50_miptree(src)->ms_x);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   x1 *= (float)(1 << nv50_miptree(src)->ms_x);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   y0 *= (float)(1 << nv50_miptree(src)->ms_y);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   y1 *= (float)(1 << nv50_miptree(src)->ms_y);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(SP_START_ID(5)), 1);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push,
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              blit->fp.code_base + blit->fp_offset);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 0);
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Draw a large triangle in screen coordinates covering the whole
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * render target, with scissors defining the destination region.
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * The vertex is supplied with non-normalized texture coordinates
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * arranged in a way to yield the desired offset and scale.
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(SCISSOR_HORIZ(0)), 2);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, (info->dst.x1 << 16) | info->dst.x0);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, (info->dst.y1 << 16) | info->dst.y0);
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL),
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_TRIANGLES);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0x74201);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, x0);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, y0);
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0x74200);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, 0.0f);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, 0.0f);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0x74201);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, x1);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, y0);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0x74200);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, 16384 << nv50_miptree(dst)->ms_x);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, 0.0f);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3);
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0x74201);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, x0);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, y1);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATA (push, 0x74200);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, 0.0f);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   PUSH_DATAf(push, 16384 << nv50_miptree(dst)->ms_y);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(VERTEX_END_GL), 0);
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* re-enable normally constant state */
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   IMMED_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 1);
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blitctx_post_blit(nvc0, blit);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)boolean
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_blitctx_create(struct nvc0_screen *screen)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   screen->blitctx = CALLOC_STRUCT(nvc0_blitctx);
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!screen->blitctx) {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOUVEAU_ERR("failed to allocate blit context\n");
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   screen->blitctx->screen = screen;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blitctx_make_vp(screen->blitctx);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blitctx_make_fp(screen->blitctx);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   nvc0_blitctx_make_sampler(screen->blitctx);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   screen->blitctx->color_mask = 0x1111;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return TRUE;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nvc0_init_surface_functions(struct nvc0_context *nvc0)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_context *pipe = &nvc0->base.pipe;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->resource_copy_region = nvc0_resource_copy_region;
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->resource_resolve = nvc0_resource_resolve;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->clear_render_target = nvc0_clear_render_target;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   pipe->clear_depth_stencil = nvc0_clear_depth_stencil;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)