nv50_surface.c revision e548babb1fc9230054674deb5e332f55319e5b91
1857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs/*
2857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Copyright 2008 Ben Skeggs
3857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * copy of this software and associated documentation files (the "Software"),
6857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * to deal in the Software without restriction, including without limitation
7857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Software is furnished to do so, subject to the following conditions:
10857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
11857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * The above copyright notice and this permission notice shall be included in
12857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * all copies or substantial portions of the Software.
13857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
14857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * SOFTWARE.
21857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs */
2247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
2313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#define __NOUVEAU_PUSH_H__
2413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#include <stdint.h>
2513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#include "nouveau/nouveau_pushbuf.h"
2647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "nv50_context.h"
2747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_defines.h"
2828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
29f302fca5eb63e4bca8af5b35c585451486143e6aBen Skeggs
30f302fca5eb63e4bca8af5b35c585451486143e6aBen Skeggs#include "util/u_tile.h"
31e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller#include "util/u_format.h"
3247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
3313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic INLINE int
3413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_format(enum pipe_format format)
3513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{
3613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	switch (format) {
37c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca	case PIPE_FORMAT_B8G8R8A8_UNORM:
38987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
39c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca	case PIPE_FORMAT_B8G8R8X8_UNORM:
40987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_X8R8G8B8_UNORM;
41e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B8G8R8A8_SRGB:
42e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_A8R8G8B8_SRGB;
43e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B8G8R8X8_SRGB:
44e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_X8R8G8B8_SRGB;
45c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca	case PIPE_FORMAT_B5G6R5_UNORM:
46987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_R5G6B5_UNORM;
47e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B5G5R5A1_UNORM:
48e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_A1R5G5B5_UNORM;
4913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	case PIPE_FORMAT_A8_UNORM:
50e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_I8_UNORM:
51e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_L8_UNORM:
52987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_R8_UNORM;
53e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R32G32B32A32_FLOAT:
54e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R32G32B32A32_FLOAT;
55e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R32G32B32_FLOAT:
56e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R32G32B32X32_FLOAT;
57e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_Z32_FLOAT:
58e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R32_FLOAT;
59e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller
60e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	/* only because we require src format == dst format: */
61e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R16G16_SNORM:
62e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R16G16_UNORM:
63e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_S8Z24_UNORM:
64e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_Z24S8_UNORM:
65e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
66e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_L8A8_UNORM:
67e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B4G4R4A4_UNORM:
68e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R16_UNORM;
69e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller
7013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	default:
7113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return -1;
7213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	}
7313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs}
7413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
7513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic int
7613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
7713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{
7863a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs	struct nv50_miptree *mt = nv50_miptree(ps->texture);
7980e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	struct nouveau_channel *chan = screen->eng2d->channel;
8013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nouveau_grobj *eng2d = screen->eng2d;
8102f32454487f2caba00931590254260d871ae795Ben Skeggs	struct nouveau_bo *bo = nv50_miptree(ps->texture)->base.bo;
8213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	int format, mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT;
8313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD);
84534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs
8513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	format = nv50_format(ps->format);
86e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	if (format < 0) {
87e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		NOUVEAU_ERR("invalid/unsupported surface format: %s\n",
88e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller			    util_format_name(ps->format));
8913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		return 1;
90e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	}
9118882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki
9240ed44991851a526f0e2cafd5dab6149cb7a3342Ben Skeggs 	if (!bo->tile_flags) {
9341b52aa3362665e08bdc2f75cc9bfdc4debc6eb0Maarten Maathuis		MARK_RING (chan, 9, 2); /* flush on lack of space or relocs */
9413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd, 2);
9513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, format);
9613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 1);
9713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd + 0x14, 5);
9818882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki		OUT_RING  (chan, mt->level[ps->level].pitch);
9913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->width);
10013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->height);
10113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCh(chan, bo, ps->offset, flags);
10213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCl(chan, bo, ps->offset, flags);
10313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	} else {
10441b52aa3362665e08bdc2f75cc9bfdc4debc6eb0Maarten Maathuis		MARK_RING (chan, 11, 2); /* flush on lack of space or relocs */
10513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd, 5);
10613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, format);
10713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
10818882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki		OUT_RING  (chan, mt->level[ps->level].tile_mode << 4);
10913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 1);
11013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
11113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd + 0x18, 4);
11213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->width);
11313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->height);
11413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCh(chan, bo, ps->offset, flags);
11513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCl(chan, bo, ps->offset, flags);
11613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	}
11713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
11813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#if 0
11913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	if (dst) {
12013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, NV50_2D_CLIP_X, 4);
12113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
12213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
12313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, surf->width);
12413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, surf->height);
12513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	}
12613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#endif
12713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
12813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	return 0;
12913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs}
13013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
13132cd1a0345eaf1f4da8a60a4ac2145ff51383d59Younes Mantonint
13213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_surface_do_copy(struct nv50_screen *screen, struct pipe_surface *dst,
13313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		     int dx, int dy, struct pipe_surface *src, int sx, int sy,
13413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		     int w, int h)
13513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{
13680e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	struct nouveau_channel *chan = screen->eng2d->channel;
13713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nouveau_grobj *eng2d = screen->eng2d;
13813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	int ret;
13913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
14013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	WAIT_RING (chan, 32);
14113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
14213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	ret = nv50_surface_set(screen, dst, 1);
14313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (ret)
14413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return ret;
14513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
14613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	ret = nv50_surface_set(screen, src, 0);
14713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (ret)
14813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return ret;
14913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
15013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, 0x088c, 1);
15113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
15213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, NV50_2D_BLIT_DST_X, 4);
15313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, dx);
15413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, dy);
15513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, w);
15613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, h);
15713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, 0x08c0, 4);
15813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
15913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 1);
16013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
16113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 1);
16213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, 0x08d0, 4);
16313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
16413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, sx);
16513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
16613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, sy);
16713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
16813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	return 0;
16913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs}
17013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
171b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void
172f500f3a72c6be61ff9b8e1166f734e408d00adedJakob Bornecrantznv50_surface_copy(struct pipe_context *pipe,
17326add9288c88108e3485ffc57c51ea9bdc0ee719Ben Skeggs		  struct pipe_surface *dest, unsigned destx, unsigned desty,
17426add9288c88108e3485ffc57c51ea9bdc0ee719Ben Skeggs		  struct pipe_surface *src, unsigned srcx, unsigned srcy,
17526add9288c88108e3485ffc57c51ea9bdc0ee719Ben Skeggs		  unsigned width, unsigned height)
176b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{
177caf40d5d145185d6a4c3ce8ff7c30ec93c040abdMaarten Maathuis	struct nv50_context *nv50 = nv50_context(pipe);
17813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nv50_screen *screen = nv50->screen;
17913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
18013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	assert(src->format == dest->format);
181b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs
182f500f3a72c6be61ff9b8e1166f734e408d00adedJakob Bornecrantz	nv50_surface_do_copy(screen, dest, destx, desty, src, srcx,
18313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs				     srcy, width, height);
18447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
18547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
186b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void
187b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsnv50_surface_fill(struct pipe_context *pipe, struct pipe_surface *dest,
188b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs		  unsigned destx, unsigned desty, unsigned width,
189b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs		  unsigned height, unsigned value)
190b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{
191caf40d5d145185d6a4c3ce8ff7c30ec93c040abdMaarten Maathuis	struct nv50_context *nv50 = nv50_context(pipe);
19213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nv50_screen *screen = nv50->screen;
19380e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	struct nouveau_channel *chan = screen->eng2d->channel;
19413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nouveau_grobj *eng2d = screen->eng2d;
19513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	int format, ret;
19613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
19713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	format = nv50_format(dest->format);
19813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (format < 0)
19913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return;
20013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
20113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	WAIT_RING (chan, 32);
20213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
20313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	ret = nv50_surface_set(screen, dest, 1);
20413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (ret)
20513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return;
206b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs
207c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki	BEGIN_RING(chan, eng2d, NV50_2D_DRAW_SHAPE, 3);
208c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki	OUT_RING  (chan, NV50_2D_DRAW_SHAPE_RECTANGLES);
20913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, format);
21013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, value);
211c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki	BEGIN_RING(chan, eng2d, NV50_2D_DRAW_POINT32_X(0), 4);
21213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, destx);
21313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, desty);
21413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, width);
21513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, height);
216b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs}
21747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
21847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid
21947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_surface_functions(struct nv50_context *nv50)
22047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
22165ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs	nv50->pipe.surface_copy = nv50_surface_copy;
22265ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs	nv50->pipe.surface_fill = nv50_surface_fill;
22347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
22465ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs
22565ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs
226