nv50_surface.c revision e5b82c8222ef29c162d51a7ca9f553d85a63be22
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"
27287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "nv50_resource.h"
2847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_defines.h"
2928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
30e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger#include "util/u_pack_color.h"
31f302fca5eb63e4bca8af5b35c585451486143e6aBen Skeggs
32f302fca5eb63e4bca8af5b35c585451486143e6aBen Skeggs#include "util/u_tile.h"
33e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller#include "util/u_format.h"
3447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
3575ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller/* return TRUE for formats that can be converted among each other by NV50_2D */
3675ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillerstatic INLINE boolean
3775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillernv50_2d_format_faithful(enum pipe_format format)
3875ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller{
3975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	switch (format) {
4075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B8G8R8A8_UNORM:
4175ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B8G8R8X8_UNORM:
4275ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B8G8R8A8_SRGB:
4375ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B8G8R8X8_SRGB:
4475ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B5G6R5_UNORM:
4575ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B5G5R5A1_UNORM:
4675ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B10G10R10A2_UNORM:
4775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_R8_UNORM:
4875ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_R32G32B32A32_FLOAT:
4975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_R32G32B32_FLOAT:
5075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller		return TRUE;
5175ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	default:
5275ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller		return FALSE;
5375ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	}
5475ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller}
5575ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller
5613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic INLINE int
5713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_format(enum pipe_format format)
5813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{
5913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	switch (format) {
60c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca	case PIPE_FORMAT_B8G8R8A8_UNORM:
61987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
62c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca	case PIPE_FORMAT_B8G8R8X8_UNORM:
63987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_X8R8G8B8_UNORM;
64e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B8G8R8A8_SRGB:
65e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_A8R8G8B8_SRGB;
66e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B8G8R8X8_SRGB:
67e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_X8R8G8B8_SRGB;
68c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca	case PIPE_FORMAT_B5G6R5_UNORM:
69987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_R5G6B5_UNORM;
70e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B5G5R5A1_UNORM:
71e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_A1R5G5B5_UNORM;
7275ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_B10G10R10A2_UNORM:
7375ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller		return NV50_2D_DST_FORMAT_A2R10G10B10_UNORM;
7413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	case PIPE_FORMAT_A8_UNORM:
75e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_I8_UNORM:
76e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_L8_UNORM:
7775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	case PIPE_FORMAT_R8_UNORM:
78987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller		return NV50_2D_DST_FORMAT_R8_UNORM;
79e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R32G32B32A32_FLOAT:
80e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R32G32B32A32_FLOAT;
81e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R32G32B32_FLOAT:
82e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R32G32B32X32_FLOAT;
83e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_Z32_FLOAT:
84e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R32_FLOAT;
85e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller
86e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	/* only because we require src format == dst format: */
87e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R16G16_SNORM:
88e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_R16G16_UNORM:
896fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger	case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
906fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger	case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
91e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
92e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_L8A8_UNORM:
93e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	case PIPE_FORMAT_B4G4R4A4_UNORM:
94e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		return NV50_2D_DST_FORMAT_R16_UNORM;
95e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller
9613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	default:
9713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return -1;
9813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	}
9913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs}
10013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
10113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic int
10213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
10313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{
10463a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs	struct nv50_miptree *mt = nv50_miptree(ps->texture);
10580e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	struct nouveau_channel *chan = screen->eng2d->channel;
10613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nouveau_grobj *eng2d = screen->eng2d;
10702f32454487f2caba00931590254260d871ae795Ben Skeggs	struct nouveau_bo *bo = nv50_miptree(ps->texture)->base.bo;
10813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	int format, mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT;
10913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD);
110534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs
11113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	format = nv50_format(ps->format);
112e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	if (format < 0) {
113e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller		NOUVEAU_ERR("invalid/unsupported surface format: %s\n",
114e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller			    util_format_name(ps->format));
11513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		return 1;
116e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller	}
11718882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki
11840ed44991851a526f0e2cafd5dab6149cb7a3342Ben Skeggs 	if (!bo->tile_flags) {
11941b52aa3362665e08bdc2f75cc9bfdc4debc6eb0Maarten Maathuis		MARK_RING (chan, 9, 2); /* flush on lack of space or relocs */
12013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd, 2);
12113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, format);
12213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 1);
12313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd + 0x14, 5);
12418882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki		OUT_RING  (chan, mt->level[ps->level].pitch);
12513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->width);
12613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->height);
12713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCh(chan, bo, ps->offset, flags);
12813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCl(chan, bo, ps->offset, flags);
12913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	} else {
13041b52aa3362665e08bdc2f75cc9bfdc4debc6eb0Maarten Maathuis		MARK_RING (chan, 11, 2); /* flush on lack of space or relocs */
13113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd, 5);
13213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, format);
13313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
13418882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki		OUT_RING  (chan, mt->level[ps->level].tile_mode << 4);
13513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 1);
13613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
13713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, mthd + 0x18, 4);
13813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->width);
13913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, ps->height);
14013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCh(chan, bo, ps->offset, flags);
14113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RELOCl(chan, bo, ps->offset, flags);
14213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	}
14313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
14413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#if 0
14513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	if (dst) {
14613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		BEGIN_RING(chan, eng2d, NV50_2D_CLIP_X, 4);
14713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
14813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, 0);
14913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, surf->width);
15013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 		OUT_RING  (chan, surf->height);
15113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	}
15213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#endif
15313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
15413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 	return 0;
15513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs}
15613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
15732cd1a0345eaf1f4da8a60a4ac2145ff51383d59Younes Mantonint
15813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_surface_do_copy(struct nv50_screen *screen, struct pipe_surface *dst,
15913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		     int dx, int dy, struct pipe_surface *src, int sx, int sy,
16013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		     int w, int h)
16113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{
16280e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	struct nouveau_channel *chan = screen->eng2d->channel;
16313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nouveau_grobj *eng2d = screen->eng2d;
16413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	int ret;
16513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
16613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	WAIT_RING (chan, 32);
16713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
16813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	ret = nv50_surface_set(screen, dst, 1);
16913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (ret)
17013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return ret;
17113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
17213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	ret = nv50_surface_set(screen, src, 0);
17313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (ret)
17413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return ret;
17513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
17613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, 0x088c, 1);
17713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
17813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, NV50_2D_BLIT_DST_X, 4);
17913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, dx);
18013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, dy);
18113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, w);
18213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, h);
18313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, 0x08c0, 4);
18413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
18513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 1);
18613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
18713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 1);
18813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	BEGIN_RING(chan, eng2d, 0x08d0, 4);
18913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
19013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, sx);
19113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, 0);
19213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, sy);
19313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
19413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	return 0;
19513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs}
19613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
197b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void
198f500f3a72c6be61ff9b8e1166f734e408d00adedJakob Bornecrantznv50_surface_copy(struct pipe_context *pipe,
199b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger		  struct pipe_resource *dest, struct pipe_subresource subdst,
200b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger		  unsigned destx, unsigned desty, unsigned destz,
201b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger		  struct pipe_resource *src, struct pipe_subresource subsrc,
202b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger		  unsigned srcx, unsigned srcy, unsigned srcz,
20326add9288c88108e3485ffc57c51ea9bdc0ee719Ben Skeggs		  unsigned width, unsigned height)
204b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{
205caf40d5d145185d6a4c3ce8ff7c30ec93c040abdMaarten Maathuis	struct nv50_context *nv50 = nv50_context(pipe);
20613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nv50_screen *screen = nv50->screen;
207b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger	struct pipe_surface *ps_dst, *ps_src;
20813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
20975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	assert((src->format == dest->format) ||
21075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller	       (nv50_2d_format_faithful(src->format) &&
21175ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller		nv50_2d_format_faithful(dest->format)));
212b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs
213b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger	ps_src = nv50_miptree_surface_new(pipe->screen, dest, subsrc.face,
214b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger					  subsrc.level, srcz, 0 /* bind flags */);
215b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger	ps_dst = nv50_miptree_surface_new(pipe->screen, dest, subdst.face,
216b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger					  subdst.level, destz, 0 /* bindflags */);
217b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger
218b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger	nv50_surface_do_copy(screen, ps_dst, destx, desty, ps_src, srcx,
219b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger			     srcy, width, height);
220b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger
221b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger	nv50_miptree_surface_del(ps_src);
222b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger	nv50_miptree_surface_del(ps_dst);
22347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
22447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
225e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger/* XXX this should probably look more along the lines of nv50_clear */
226b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void
227e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheideggernv50_clearRT(struct pipe_context *pipe,
228e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	     struct pipe_surface *dst,
229e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	     const float *rgba,
230e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	     unsigned dstx, unsigned dsty,
231e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	     unsigned width, unsigned height)
232b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{
233caf40d5d145185d6a4c3ce8ff7c30ec93c040abdMaarten Maathuis	struct nv50_context *nv50 = nv50_context(pipe);
23413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nv50_screen *screen = nv50->screen;
23580e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	struct nouveau_channel *chan = screen->eng2d->channel;
23613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	struct nouveau_grobj *eng2d = screen->eng2d;
23713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	int format, ret;
238e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	union util_color uc;
239e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	util_pack_color(rgba, dst->format, &uc);
24013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
241e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	format = nv50_format(dst->format);
24213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (format < 0)
24313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return;
24413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
24513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	WAIT_RING (chan, 32);
24613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs
247e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	ret = nv50_surface_set(screen, dst, 1);
24813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	if (ret)
24913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs		return;
250b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs
251c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki	BEGIN_RING(chan, eng2d, NV50_2D_DRAW_SHAPE, 3);
252c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki	OUT_RING  (chan, NV50_2D_DRAW_SHAPE_RECTANGLES);
25313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, format);
254e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	OUT_RING  (chan, uc.ui);
255c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki	BEGIN_RING(chan, eng2d, NV50_2D_DRAW_POINT32_X(0), 4);
256e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	OUT_RING  (chan, dstx);
257e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	OUT_RING  (chan, dsty);
25813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, width);
25913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs	OUT_RING  (chan, height);
260b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger
261b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs}
26247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
26347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid
26447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_surface_functions(struct nv50_context *nv50)
26547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
266b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger	nv50->pipe.resource_copy_region = nv50_surface_copy;
267e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger	nv50->pipe.clearRT = nv50_clearRT;
26847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
26965ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs
27065ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs
271